キャラ同士の重なりについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
土門

Re: キャラ同士の重なりについて

#101

投稿記事 by 土門 » 7年前

何度も本当にありがとうございます。
自分の考えを変えたいので、
今一度このスレを読み込んで考えてみたいと思います。

とにかく、プレイヤーも敵も自分以外を見る必要が無いようにするんですよね。
でも、その両方を見ている存在はあるわけですよね?
その存在に、プレイヤーや敵は指示を仰ぐわけですよね
でも自分の作ったジャッジクラスの内容ではよくなかったということですよね。

ISLeさんに非常にためになることを教えて頂けてるのはわかるのに
すべてを理解出来ない自分が歯がゆいです。
ただ、牛歩かもしれませんが、 ISLeさんのレスのおかげで
自分の成長を感じてはおります。
今までのプログラムや考え方より、少しマシになっているのを自覚出来てますから。
ISLeさんのレスを無駄にしないよう、もう一度読込み、さらに成長したいと思います。
ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: キャラ同士の重なりについて

#102

投稿記事 by softya(ソフト屋) » 7年前

またまた横入りですが、1つのトピックが長くなり過ぎなのでトピックを変えてはいかがでしょう。
それと、ISLeさんに見せるために図や設計資料などを書かれたほうが良いと思います。

あと今までの内容は書きだして、整理しなおさないとごちゃごちゃになると思います。
仕事で言うところの要件定義の勉強になるので、やってみてください。
これもISleさんに見せたほうが良いと良いと思います。
特に堂々巡りとなっている部分は、要注意です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

土門

Re: キャラ同士の重なりについて

#103

投稿記事 by 土門 » 7年前

softya(ソフト屋)さん
 次は新しいトピを立てるつもりだったのですが、
 些細な質問になりますので、こちらでさせて下さい。


ISLeさんへ
お世話になります。解決出来ない障害にぶつかった時にご相談しようと思っていましたら
ISLeさんのおかげもあり、自分でバリバリ進めることが出来ました。ありがとうございます。
ゲームの方は大体が出来あがり、あとは自分にとっては最大?のスクロールとなりました。
スクロールについてはカメラclassを作ってplayerを中心に左右に動くようにしようとしてます。
過去にそんな感じでスクロールを組んだこともあり、基本は理解しているつもりですが、
やはり、今回の移動とアニメーションが分かれている形に
自分がまだ慣れていないせいか、スクロールがどうしてもうまくいきません。
今回のゲームではplayerに二次元配列座標と、画像描画用の16倍した座標とを扱わせていますが、
スクロールは描画用の座標に依存する感じで動かします。
その場合、ISLeさんのプログラムでいうところの
アニメーションの部分で、カメラも一緒に更新させることになるはずです。
しかし、アニメ用の座標の推移がどうしてもつかめず、うまくカメラの更新する値を決められません。
だんだんと二次元配列の座標とズレていってしまいます。
そのひとつに、ISLeさんが記載されてあります、画像用座標の移動
this->anim_X = posX*16+(prevposX*16-posX*16)*anim_count/30;(スクロールは左右なのでX座標のみ見ます)
こちらの処理が1フレームにいくつ値が増えているのかわ駆らない、という感じで、、、。
通常なら、プレイヤーの移動量と同じ値でカメラの移動量も計算してやればいいと思うのですが
カメラ::setカメラValue( カメラ::getカメラValue()+ (prevposX*16-posX*16)*anim_count/30);みたく記載しても
当たり前ですが、周りの画像がすっとんで行ってしまいます。
(ちゃんとカメラの移動量はプレイヤー以外のすべての描画に影響させていますので)
でも本来アニメはこのアニメカウントの間に、16マスずつ進んでますよね?
なぜ同じ処理を組み込んだはずのカメラの移動量だけ、すっとんでいく値になるんでしょうか、、、。

コード:

//フレームの横幅は512です。一マスのサイズは16×16です

void Player::Update(void){
	this->anim_X = prevposX*16;//描画用の座標設定
	this->anim_Y = prevposY*16;

	if (this->anim_count > 0) {	//アニメカウントが0じゃ無いか?
		if (this->isMoved()) {//前回位置と現在位置が同じじゃ無いなら動かす
				this->anim_Y = posY*16+(prevposY*16-posY*16)*anim_count/30;
				this->anim_X = posX*16+(prevposX*16-posX*16)*anim_count/30;

				if(this->muki==3 && this->anim_X > 512/2){
					ObjectMgr::getInstance()->Draw();//オブジェクトの画像更新
					Camera::setSCValue( Camera::getSCValue()+ 1);
                // ↑ 右にアニメするのだからカメラの移動量は同じループ数「+1」して
                //やればいいと考えたが、なぜかズレていきます
					this->anim_X = 512/2;//playerは画面の中央にくるとそこからはカメラと共に動く
				}
				this->anim_count--;//アニメカウントを減少
		} else {//前回位置と現在位置が同じなら
			this->anim_count = 0;//アニメカウントを0に
			this->muki=-1;//アニメが完了したら「向き」リセット
		}
		if (!isAnimate()) {				//アニメカウントが0になったら
			this->prevposX = this->posX;	//現在位置を前回位置に格納
			this->prevposY = this->posY;	//現在位置を前回位置に格納
		}
	}

   //playerがアニメ中じゃ無くてもplayerを中央に居させるために、記載しておく
	if(this->anim_X > 512/2){ //240を目指せ
		this->anim_X = (512/2);
	}

以後割愛

描画座標と二次元配列の座標がズレていってしまいます。
惜しいはずですが、ここからわかりません。

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: キャラ同士の重なりについて

#104

投稿記事 by ISLe » 7年前

わたしには些細な問題には見えません。
スクロール処理を根本的に間違っているように見えます。

カメラ(というかスクロールオフセット)座標が、プレイヤーの移動を前提にしていますね。

ボコスカウォーズはマップの先をスクロールして見る機能とかあったと思いますが、プレイヤーの移動を前提としてしまうとそのような機能を実装する際に邪魔になるでしょう。

わたしが作るとしたら、単純に基準座標を中心にスクロールするようカメラオブジェクトを作るでしょう。
スクロール処理とプレイヤー処理は無関係で、スクロール処理の際にプレイヤーの座標を使うというだけの関係です。


このコードだと、プレイヤーはどんな距離でも30フレームで移動します。
1マス分であれば16ピクセルを30フレームで移動するわけですから、1ピクセル動くときと動かないときがあります。
カメラは毎フレーム1ピクセルずつ動くのでズレます。

土門

Re: キャラ同士の重なりについて

#105

投稿記事 by 土門 » 7年前

ISLeさん
お返事ありがとうございます。
久しぶりなのですが、困っていたのですぐ返事が頂けてうれしいです。

>スクロール処理を根本的に間違っているように見えます。
>カメラ(というかスクロールオフセット)座標が、プレイヤーの移動を前提にしていますね。

playerの移動を前提にカメラ移動させるという考えが間違いということでしょうか。
ネットというか、スクロールを調べると結構playerの動き前提で書いてる感じが多いような気がしました。
そのひとつに、マップの後方にplayerがいる場合はスクロールが止まって
マップの後方端まで行ける、が、playerが前進しはじめたら、それに合わせてスクロールする、から
ではないでしょうか?プレイヤーの動きを見てるので前提状態になると思うのですが、、。


>ボコスカウォーズはマップの先をスクロールして見る機能とかあったと思いますが、

これは知りませんでした。(ちなみにファミコン版しか知りません。
まあ実装しようとは思いませんが、確かに実装しようものなら、
playerの動きが前提なのでダメですよね。

>わたしが作るとしたら、単純に基準座標を中心にスクロールするようカメラオブジェクトを作るでしょう。
>スクロール処理とプレイヤー処理は無関係で、スクロール処理の際にプレイヤーの座標を使う

なんか理想で「あこがれる形」ですが、初めて聞きました。
こちらのスクロールもその形なのでしょうか?
http://homepage2.nifty.com/natupaji/DxL ... am.html#N4
自分の基準座標というのがイメージ出来ませんが、
スクロールする定義をplayer関係なく、自由に自分で決めれる、という感じですか?
でもplayerを真ん中にとらえる、もしくは、マップ端の場合はスクロールを止める、など
playerの動きの前提無しでどう設定するのでしょう?


>このコードだと、プレイヤーはどんな距離でも30フレームで移動します。

ですよね??やっぱり、、そう思ったんです。
理解した後、この移動に関してちょっと強引というか変則的な感じだなと困惑しました。
でも ISLeさん自身、これは距離では無くcountで計っているみたいなこと、とおっしゃってましたもんね。
そこでちょっと興味でお聞きしたいのですが、仮に今のこの移動方法のままで
自分がやろうとしているplayerの移動量をカメラ移動量として取得しようとした場合
無理やりにでもそれが可能な方法ってあるんですか??


>基準座標を中心にスクロールするようカメラオブジェクト

これを学んで実装したいと思うんですが、簡単ですか?
特に、重要なのですが、今回のplayerの移動方法(入力フェーズ→移動フェーズ→アニメフェーズ)のまま
(ISLeさんが教えてくださったplayerの移動方法)、問題なくすんなり実装出来ますか?
個人的には、入力メソッドや移動メソッドそのものを組み換えなければならない、みたいになるのは
避けたいのですが、、、、どういう定義のカメラかまだ自分が想像出来てないので
失礼があったらすみませんです。

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: キャラ同士の重なりについて

#106

投稿記事 by ISLe » 7年前

土門 さんが書きました:ネットというか、スクロールを調べると結構playerの動き前提で書いてる感じが多いような気がしました。
そのひとつに、マップの後方にplayerがいる場合はスクロールが止まって
マップの後方端まで行ける、が、playerが前進しはじめたら、それに合わせてスクロールする、から
ではないでしょうか?プレイヤーの動きを見てるので前提状態になると思うのですが、、。
ネットで見付かるコードのほとんどはプロは使わないようなコードばかりですから。
基準座標がプレイヤー座標かどうかは関係ありません。
プレイヤー座標を使うとしてもあくまで基準座標です。
スクロールするかどうかは基準座標で判断します。
土門 さんが書きました:こちらのスクロールもその形なのでしょうか?
http://homepage2.nifty.com/natupaji/DxL ... am.html#N4
自分の基準座標というのがイメージ出来ませんが、
スクロールする定義をplayer関係なく、自由に自分で決めれる、という感じですか?
でもplayerを真ん中にとらえる、もしくは、マップ端の場合はスクロールを止める、など
playerの動きの前提無しでどう設定するのでしょう?
このコードがDXライブラリのサイトのサンプルだとは知りませんでしたけど、この掲示板で過去にそういう質問に回答した気がします。
とは言えサンプルコードの流用なのできちんと分離した形にできてたかどうかは覚えてません。
土門 さんが書きました:そこでちょっと興味でお聞きしたいのですが、仮に今のこの移動方法のままで
自分がやろうとしているplayerの移動量をカメラ移動量として取得しようとした場合
無理やりにでもそれが可能な方法ってあるんですか??
anim_Xの変化分を足すようにするだけです。

コード:

    int anim_X_old = anim_X;
    this->anim_X = posX*16+(prevposX*16-posX*16)*anim_count/30;
(中略)
        Camera::setSCValue( Camera::getSCValue() + (anim_X - anim_X_old));
土門 さんが書きました:特に、重要なのですが、今回のplayerの移動方法(入力フェーズ→移動フェーズ→アニメフェーズ)のまま
(ISLeさんが教えてくださったplayerの移動方法)、問題なくすんなり実装出来ますか?
個人的には、入力メソッドや移動メソッドそのものを組み換えなければならない、みたいになるのは
避けたいのですが、、、、どういう定義のカメラかまだ自分が想像出来てないので
スクロール処理は他の処理と一切関係を持ちません。
現在のスクロールオフセットを持ち、与えられた基準座標に対して近づくようにスクロールオフセットを変化させるだけのオブジェクトです。
離れていたら速くなるといった具合に距離に応じてスクロール速度が変化する場合でも内部で完結します。



新しくトピックを立ててください。

閉鎖

“C言語何でも質問掲示板” へ戻る