いくつかdxlibで簡単なゲーム(オセロなど)を作った程度のものですが、dxlibでC++を使った横スクロールのマリオ風ゲーム作成に挑戦したいと考えています。しかし、肝心の横スクロールのアルゴリズムがわからないという壁にぶち当たり悩んでおります。マップは二次元配列だからそれぞれの段で右から左の数に値を代入してみたりなどいろいろ試し、調べたのですが、カメラだかウィンドウだかの考え方がいまいちよく理解できません。お手数ですが、アホにもわかるように翻訳してください。参考になるページを紹介してくださるだけでも結構です。
質問させていただいている分際で申し訳ありませんが返信が遅れるかもしれません。悪しからず。
横スクロールのアルゴリズムについて
Re: 横スクロールのアルゴリズムについて
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;
}
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: 横スクロールのアルゴリズムについて
理解する時間をいただきたいです。
ですか。こちらはスクリーンの縦と横をそれぞれマップチップの一片で割った値で座標を計算し、四角形を並べているんですよね。
こちらはjiki(自機?)の座標や、スクロールの座標(おそらく画面左端の座標)を取得し、自機の座標が画面中央になるようスクロールの座標を変える、、、と言った感じでしょうか?
お手数ですが、違っていたらご指摘願います。
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: 横スクロールのアルゴリズムについて
A華仙 学 さんが書きました:理解する時間をいただきたいです。
Bですか。こちらはスクリーンの縦と横をそれぞれマップチップの一片で割った値で座標を計算し、四角形を並べているんですよね。
Cこちらはjiki(自機?)の座標や、スクロールの座標(おそらく画面左端の座標)を取得し、自機の座標が画面中央になるようスクロールの座標を変える、、、と言った感じでしょうか?
お手数ですが、違っていたらご指摘願います。
合っています。正解です。
では、スクリーンの縦と横をマップチップの一辺で割った値は、いくつになるかというと、
画面の幅と高さに依存します。もし本当に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: 横スクロールのアルゴリズムについて
つまりそのx1とy1をBに出ててくる二重for文でi、jそれぞれに代入するということでしょうか(そうすればスクロールの座標に比例して表示してくれるような気がするので、、、)?
Re: 横スクロールのアルゴリズムについて
はい、その通りです。華仙 学 さんが書きました:つまりそのx1とy1をBに出ててくる二重for文でi、jそれぞれに代入するということでしょうか(そうすればスクロールの座標に比例して表示してくれるような気がするので、、、)?
後は、内部のマップチップの描画部分で、x座標にScroll_Xを引いてやり、y座標にScroll_Yを引いてやれば
OKです。
後は、コーディングしてみてください。