横スクロールのアルゴリズムについて

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

横スクロールのアルゴリズムについて

#1

投稿記事 by 華仙 学 » 8年前

いくつかdxlibで簡単なゲーム(オセロなど)を作った程度のものですが、dxlibでC++を使った横スクロールのマリオ風ゲーム作成に挑戦したいと考えています。しかし、肝心の横スクロールのアルゴリズムがわからないという壁にぶち当たり悩んでおります。マップは二次元配列だからそれぞれの段で右から左の数に値を代入してみたりなどいろいろ試し、調べたのですが、カメラだかウィンドウだかの考え方がいまいちよく理解できません。お手数ですが、アホにもわかるように翻訳してください。参考になるページを紹介してくださるだけでも結構です。
質問させていただいている分際で申し訳ありませんが返信が遅れるかもしれません。悪しからず。

fm

Re: 横スクロールのアルゴリズムについて

#2

投稿記事 by fm » 8年前

int iw=SCREEN_WIDTH/MAPCHIP_WIDTH;
int jh=SCREEN_HEIGHT/MAPCHIP_HEIGHT;

for(i=0;i<iw;i++)
{
for(j=0;j<jh;j++)
{
DrawBox(i*MAPCHIP_SIZE,j*MAPCHIP_SIZE,(i+1)*MAPCHIP_SIZE,(j+1)*MAPCHIP_SIZE,RGB(255,0,0));
}
}

この↑のコードは理解できますか?

次のコードはどうでしょう?


void CalcScroll(int jiki_x,int jiki_y,int *Scroll_X,int *Scroll_Y)
{
*Scroll_X=jiki_X-SCREEN_WIDTH/2;
*Scroll_Y=jiki_y-SCREEN_HEIGHT/2;
if (*Scroll_X<0) *Scroll_X=0;
if (*Scroll_Y<0) *Scroll_Y=0;
if (*Scroll_X>CHIP_SIZE*MAX_BLOCK) *Scroll_X=CHIP_SIZE*MAX_BLOCK;
if (*Scroll_Y>CHIP_SIZE*MAX_BLOCK) *Scroll_Y=CHIIP_SIZE*MAX_BLOCK;
}

華仙 学

Re: 横スクロールのアルゴリズムについて

#3

投稿記事 by 華仙 学 » 8年前

理解する時間をいただきたいです。

コード:

int iw=SCREEN_WIDTH/MAPCHIP_WIDTH;
int jh=SCREEN_HEIGHT/MAPCHIP_HEIGHT;

for(i=0;i<iw;i++)
{
for(j=0;j<jh;j++)
{
DrawBox(i*MAPCHIP_SIZE,j*MAPCHIP_SIZE,(i+1)*MAPCHIP_SIZE,(j+1)*MAPCHIP_SIZE,RGB(255,0,0));
}
}
ですか。こちらはスクリーンの縦と横をそれぞれマップチップの一片で割った値で座標を計算し、四角形を並べているんですよね。

コード:

void CalcScroll(int jiki_x,int jiki_y,int *Scroll_X,int *Scroll_Y) 
{ 
*Scroll_X=jiki_X-SCREEN_WIDTH/2; 
*Scroll_Y=jiki_y-SCREEN_HEIGHT/2; 
if (*Scroll_X<0) *Scroll_X=0; 
if (*Scroll_Y<0) *Scroll_Y=0; 
if (*Scroll_X>CHIP_SIZE*MAX_BLOCK) *Scroll_X=CHIP_SIZE*MAX_BLOCK; 
if (*Scroll_Y>CHIP_SIZE*MAX_BLOCK) *Scroll_Y=CHIIP_SIZE*MAX_BLOCK; 
}
こちらはjiki(自機?)の座標や、スクロールの座標(おそらく画面左端の座標)を取得し、自機の座標が画面中央になるようスクロールの座標を変える、、、と言った感じでしょうか?
お手数ですが、違っていたらご指摘願います。

fm

Re: 横スクロールのアルゴリズムについて

#4

投稿記事 by fm » 8年前

華仙 学 さんが書きました:理解する時間をいただきたいです。
A
ですか。こちらはスクリーンの縦と横をそれぞれマップチップの一片で割った値で座標を計算し、四角形を並べているんですよね。
B

こちらはjiki(自機?)の座標や、スクロールの座標(おそらく画面左端の座標)を取得し、自機の座標が画面中央になるようスクロールの座標を変える、、、と言った感じでしょうか?
お手数ですが、違っていたらご指摘願います。
C

合っています。正解です。
では、スクリーンの縦と横をマップチップの一辺で割った値は、いくつになるかというと、
画面の幅と高さに依存します。もし本当にSCREEN_WIDTHとSCREEN_HEIGHTが画面の解像度と同じならば
ですが。

次に、考えるべきことは、確かにあなたが発言した方法だと、画面をカメラで見た場合、
固定になるので、差を考える必要はありませんが、
基本的には、画面がスクロールするゲームの場合、端の(大きい方)にいくほど、スクロールの値と
描画する値が大きくなります。また、端の(小さい方)にいくほど、スクロールの値と描画する値は小さく
なります。

そこで、回答のB、Cで分かったと思いますが、スクロールの端っこの小さいXと、小さいYを仮に、
int x1,y1;
大きい描画座標のXとYを
int x2,y2;
とすると
int x1=スクロールのX座標/マップチップ;int x2=スクロールのX座標+スクリーンの幅/マップチップサイズ;
int y1,y2;//TODO

として考えてみてください。

華仙 学

Re: 横スクロールのアルゴリズムについて

#5

投稿記事 by 華仙 学 » 8年前

つまりそのx1とy1をBに出ててくる二重for文でi、jそれぞれに代入するということでしょうか(そうすればスクロールの座標に比例して表示してくれるような気がするので、、、)?

fm

Re: 横スクロールのアルゴリズムについて

#6

投稿記事 by fm » 8年前

華仙 学 さんが書きました:つまりそのx1とy1をBに出ててくる二重for文でi、jそれぞれに代入するということでしょうか(そうすればスクロールの座標に比例して表示してくれるような気がするので、、、)?
はい、その通りです。

後は、内部のマップチップの描画部分で、x座標にScroll_Xを引いてやり、y座標にScroll_Yを引いてやれば
OKです。

後は、コーディングしてみてください。

華仙 学

Re: 横スクロールのアルゴリズムについて

#7

投稿記事 by 華仙 学 » 8年前

お付き合いくださりありがとうございました。おかげさまで理解することができました。

閉鎖

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