画像のスクロールと変更

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

画像のスクロールと変更

#1

投稿記事 by yoshitake » 14年前

アクションゲームとかでキャラクターに合わせて画面がスクロールさせる方法と例えば扉の前で上を押したりすると別の画面に切り替わるという方法がしりたいのですが教えてくれませんか。お願いします。

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

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

#2

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

画面スクロールは、自キャラのマップ上の位置から逆に画面表示する範囲を決めます。こうすれば自キャラは常に画面中心で、背景はスクロールすることになります。
「扉の前で上を押したりすると別の画面に切り替わる」方法は上が押されたときに背景にドアがあるか調べてドアがあればマップを切り替えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jinf

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

#3

投稿記事 by jinf » 14年前

定義の仕方の基本くらいは、わかるのですが、
横スクロールにした場合、定義する座標が640x480の範囲を超えた場合どのように定義すればよいのでしょうか?

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

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

#4

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

最初の質問の方と別の方でしょうか?
別質問していただけると助かります。
あと、ソースコードがあれば具体的に説明しやすいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

sperobo

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

#5

投稿記事 by sperobo » 14年前

通りすがりで失礼します。

プログラム始めて半年程ですが勉強がてらにちょっと考えてみました。
マップデータのどこを表示しているのかを変数や構造体にしてみるというのはどうでしょう?
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 );
こんな感じでウィンドウ表示位置に変換できると思います。
考えながら書いたので挙動は謎ですが、こんな感じでスクロールは実装できるんじゃないかと思います。

sperobo

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

#6

投稿記事 by sperobo » 14年前

すみません。コメントに書いてる事とコードが全然違ってました。インデントも;;
13&14ステップ目は
if( amariX ) looptimeX++; if( amariY ) looptimeY++;でした;;

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

閉鎖

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