画像のスクロールと変更
-
yoshitake
画像のスクロールと変更
アクションゲームとかでキャラクターに合わせて画面がスクロールさせる方法と例えば扉の前で上を押したりすると別の画面に切り替わるという方法がしりたいのですが教えてくれませんか。お願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像のスクロールと変更
画面スクロールは、自キャラのマップ上の位置から逆に画面表示する範囲を決めます。こうすれば自キャラは常に画面中心で、背景はスクロールすることになります。
「扉の前で上を押したりすると別の画面に切り替わる」方法は上が押されたときに背景にドアがあるか調べてドアがあればマップを切り替えます。
「扉の前で上を押したりすると別の画面に切り替わる」方法は上が押されたときに背景にドアがあるか調べてドアがあればマップを切り替えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jinf
Re: 画像のスクロールと変更
定義の仕方の基本くらいは、わかるのですが、
横スクロールにした場合、定義する座標が640x480の範囲を超えた場合どのように定義すればよいのでしょうか?
横スクロールにした場合、定義する座標が640x480の範囲を超えた場合どのように定義すればよいのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像のスクロールと変更
最初の質問の方と別の方でしょうか?
別質問していただけると助かります。
あと、ソースコードがあれば具体的に説明しやすいです。
別質問していただけると助かります。
あと、ソースコードがあれば具体的に説明しやすいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
sperobo
Re: 画像のスクロールと変更
通りすがりで失礼します。
プログラム始めて半年程ですが勉強がてらにちょっと考えてみました。
マップデータのどこを表示しているのかを変数や構造体にしてみるというのはどうでしょう?
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]で画像番号が格納されている事とします。
敵とかを表示したい場合は、DrawGraph( enemyX - ViewX, enemyY - ViewY, 画像ID, TRUE );
こんな感じでウィンドウ表示位置に変換できると思います。
考えながら書いたので挙動は謎ですが、こんな感じでスクロールは実装できるんじゃないかと思います。
プログラム始めて半年程ですが勉強がてらにちょっと考えてみました。
マップデータのどこを表示しているのかを変数や構造体にしてみるというのはどうでしょう?
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 );
}
}
こんな感じでウィンドウ表示位置に変換できると思います。
考えながら書いたので挙動は謎ですが、こんな感じでスクロールは実装できるんじゃないかと思います。
-
sperobo
Re: 画像のスクロールと変更
すみません。コメントに書いてる事とコードが全然違ってました。インデントも;;
13&14ステップ目は
if( amariX ) looptimeX++; if( amariY ) looptimeY++;でした;;
言いたかったのはカメラ(上でいうViewXをメンバに持つ構造体やクラス)の様なものを作って、基準となるキャラや座標を追尾させ、撮影した画像をウィンドウの左上を基準に貼り付けるという事でした。
カメラがマップの640を超えた位置、例えばX座標1280の位置を撮影した場合には、マップのX座標1280~1919の画像をウィンドウに貼り付ければいいみたいな・・・
13&14ステップ目は
if( amariX ) looptimeX++; if( amariY ) looptimeY++;でした;;
言いたかったのはカメラ(上でいうViewXをメンバに持つ構造体やクラス)の様なものを作って、基準となるキャラや座標を追尾させ、撮影した画像をウィンドウの左上を基準に貼り付けるという事でした。
カメラがマップの640を超えた位置、例えばX座標1280の位置を撮影した場合には、マップのX座標1280~1919の画像をウィンドウに貼り付ければいいみたいな・・・