ページ 11

画像のスクロールと変更

Posted: 2012年1月04日(水) 19:51
by yoshitake
アクションゲームとかでキャラクターに合わせて画面がスクロールさせる方法と例えば扉の前で上を押したりすると別の画面に切り替わるという方法がしりたいのですが教えてくれませんか。お願いします。

Re: 画像のスクロールと変更

Posted: 2012年1月05日(木) 00:28
by softya(ソフト屋)
画面スクロールは、自キャラのマップ上の位置から逆に画面表示する範囲を決めます。こうすれば自キャラは常に画面中心で、背景はスクロールすることになります。
「扉の前で上を押したりすると別の画面に切り替わる」方法は上が押されたときに背景にドアがあるか調べてドアがあればマップを切り替えます。

Re: 画像のスクロールと変更

Posted: 2012年1月09日(月) 08:34
by jinf
定義の仕方の基本くらいは、わかるのですが、
横スクロールにした場合、定義する座標が640x480の範囲を超えた場合どのように定義すればよいのでしょうか?

Re: 画像のスクロールと変更

Posted: 2012年1月09日(月) 10:16
by softya(ソフト屋)
最初の質問の方と別の方でしょうか?
別質問していただけると助かります。
あと、ソースコードがあれば具体的に説明しやすいです。

Re: 画像のスクロールと変更

Posted: 2012年1月10日(火) 08:27
by sperobo
通りすがりで失礼します。

プログラム始めて半年程ですが勉強がてらにちょっと考えてみました。
マップデータのどこを表示しているのかを変数や構造体にしてみるというのはどうでしょう?
ViewX、ViewYみたいな感じで。

まず最初、私的にはステージの最初はマップデータの(0,0)を表示したいので、ViewX,ViewYともに0で初期化します。
その後、主人公が移動したらマップを同量スクロールさせたい訳ですから…
主人公が1ドット右に移動したらマップも1スクロールさせたい!→ ViewX += 1;
主人公が2ドット右に移動したらマップも2スクロールさせたい!→ ViewX += 2;
結果、ViewX += 主人公の移動量; でよくない?となる訳です。
常に主人公を中央に表示させたい場合は、ViewX = PlayerX - 320; ViewY = PlayerY - 240;としちゃってもよさそうですね。PlayerX,PlayerYは主人公の中心座標
(※ViewXがマップデータの外を参照してはダメなので、下限&上限をつける必要はあります)

1枚絵でマップを表示している場合は、表示したい画像のViewX ~ ViewX + 640をウィンドウの(0,0)にぺたっと貼り付けるだけで済みます。

マップチップで表示している場合は、
ViewXの値をマップチップのサイズで割った値が表示を開始するべき配列の要素番号となります。

例:
マップチップのサイズが32*32、画面サイズ640*480、画像配列はgraph[]、マップ配列はmap[x][y]で画像番号が格納されている事とします。

コード:

#define	MAPTIP_SIZE	32

ViewX = PlayerX - 320;
ViewY = PlayerY - 240;
//※ViewXとViewYには下限と上限をつける必要があります
int	sx = ViewX / MAPTIP_SIZE;
int	sy = ViewY / MAPTIP_SIZE;
int	amariX = ViewX % MAPTIP_SIZE;	//移動量 = チップサイズとは限らないので
int	amariY = ViewY % MAPTIP_SIZE;    //チップサイズで割った余りを使う
int	looptimeX = 20;			//X方向に貼るチップの枚数
int	looptimeY = 15;			//Y方向に貼るチップの枚数

if( amariX == 0 ) looptimeX++;		//表示位置がチップサイズで割り切れない場合は
if( amariY == 0 ) looptimeY++;		//張らなければならないチップが1枚増える…?

for( int i = 0; i < looptimeX; i++ )
{
	for( int j = 0; j < looptimeY; j++ )
	{
		//とりあえず描画にはDXライブラリを使用したり
                DrawGraph( ( i * MAPTIP_SIZE ) - amariX,
                                            ( j * MAPTIP_SIZE ) - amariY,
                                            graph[ map[i+sx][j+sy] ],
			     TRUE );
	}
}
敵とかを表示したい場合は、DrawGraph( enemyX - ViewX, enemyY - ViewY, 画像ID, TRUE );
こんな感じでウィンドウ表示位置に変換できると思います。
考えながら書いたので挙動は謎ですが、こんな感じでスクロールは実装できるんじゃないかと思います。

Re: 画像のスクロールと変更

Posted: 2012年1月10日(火) 19:37
by sperobo
すみません。コメントに書いてる事とコードが全然違ってました。インデントも;;
13&14ステップ目は
if( amariX ) looptimeX++; if( amariY ) looptimeY++;でした;;

言いたかったのはカメラ(上でいうViewXをメンバに持つ構造体やクラス)の様なものを作って、基準となるキャラや座標を追尾させ、撮影した画像をウィンドウの左上を基準に貼り付けるという事でした。
カメラがマップの640を超えた位置、例えばX座標1280の位置を撮影した場合には、マップのX座標1280~1919の画像をウィンドウに貼り付ければいいみたいな・・・