ページ 11

スクロール

Posted: 2010年6月27日(日) 00:21
by リーじゅ
こんばんわ。
初めて質問させていただきます。

早速ですが、アクションゲームを作っていて、キャラを中心としてマップの障害物を動かしたいのですが、プログラミングをどうすればいいのでしょうか?

お願いします。 画像

Re:スクロール

Posted: 2010年6月27日(日) 04:44
by わふー
こんばんは。

if ( マップの障害物を動かしたい ){
マップの障害物を動かす();
}

こんな感じでどうでしょう!

Re:スクロール

Posted: 2010年6月27日(日) 10:32
by Tatu
私ならばスクロール時に全ての物体の座標を変化させるのは面倒なので
画面の左上の座標を記録する変数を用意し、
キャラクターの動きに応じて値が変わるようにします。

そして、描画関数の引数の座標を
(物体の座標)-(画面の左上の座標)とします。

キャラクターの動きに合わせてカメラを動かすようなものだと思ってください。

Re:スクロール

Posted: 2010年6月27日(日) 11:37
by KEYONN_
こんな感じでどうでしょう。
マップエディタは、C+WINAPIか、C#で作るか、フリーのものを使うとして、
Map[20][300];にマップチップ番号を代入してあげてください。

#define CHIP_SIZE 16
#define MAX_BLOCKX CHIP_SIZE*20
#define MAX_BLOCKY CHIP_SIZE*300
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320

typedef struct Map_{
int ChipNumber; //マップチップ
int ChipNumber2; //マップチップ2
int EnemyNumber; //敵の番号(例:Map[0][0].EnemyNumber=1)
}Map_;

Map_ Map[20][300];

//初期化関数
void Init()
{
FILE *fp;

fp=fopen("./data/mapdata01.txt","r");

for(i=0;i<300;i++){
for(j=0;j<20;j++){
if(j!=20)
fscanf(fp,"%d,",&Map[j].ChipNumber);
else
fscanf(fp,"%d",&Map[j].ChipNumber);
}
}
}

//スクロールを計算する関数
void CalcScroll(void)
{

//キャラクターが画面の中心にくるようにする
sx=Player.x-(SCREEN_WIDTH/2);
//sy=Player.y-(SCREEN_HEIGHT/2);

//sxが0より小さいなら0にする。(それ以上下がらないようにする)
if(ScrollX<0) ScrollX=0;
if(ScrollY<0) ScrollY=0;
if(ScrollX>(MAX_BLOCKX)-SCREEN_WIDTH) ScrollX=(MAX_BLOCKX)-SCREEN_WIDTH;
if(ScrollY>(MAX_BLOCKY)-SCREEN_HEIGHT) ScrollY=(MAX_BLOCKY)-SCREEN_HEIGHT;

}

//背景を描画する関数
void DrawBG()
{
int StartX=ScrollX/CHIP_SIZE,StartY=ScrollY/CHIP_SIZE;
int EndX=(ScrollX+SCREEN_WIDTH-1)/16,EndY=(ScrollY+SCREEN_HEIGHT-1)/16;

for(int i=StartY;i<=EndY;i++)
{
for(int j=StartX;j<=EndX;j++)
{
//マップチップを描画する
DrawChip(Map[j].ChipNumber,j*CHIP_SIZE-ScrollX,i*CHIP_SIZE-ScrollY);

}
}
}