友人とアクションゲームを作ろうということになりまして、僕はプログラミング担当になりました。
週末に少しずつ作っていき、マップの表示、キャラクターの表示と操作ができました。
次にマップのスクロールを作ろうと思っているのですが、うまくいかずここでトピックを立てさせていただきました。
スクロールは右方向で、
・通常時はキャラクターを中央に配置して移動
・マップの端につくと、スクロールがとまりキャラクターだけが移動
というようなものを理想としてますが、どのようにしたらいいかさっぱりわからず困っています。
現時点でのコードを載せます。アドバイスいただけるとありがたいです。
C言語は1ヶ月ほど前から本(猫でもわかるC言語プログラミング)を購入し、基本的な事は理解したつもりです。
わからないことがでてきたら本やインターネットを使い調べるようにしています。
開発環境は、XPSP3、BCC Developer(Borland C++ Compiler)、DXライブラリを使っております。
#include "DxLib.h"
int MAP[15][40]=
{
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1},
};
char Key[256];
double PlayerX,PlayerY,Speed,JumpSpeed;
int ScrollX,OnGround;
void Map(){
int StartX,StartY,EndX,EndY;
StartX=ScrollX/16;
StartY=0;
EndX=(ScrollX+320)/16+1;
EndY=240/16;
for(int y=StartY;y<EndY;y++){
for(int x=StartX;x<EndX;x++){
if(MAP[y][x] == 1)DrawBox(x*16-ScrollX, y*16, x*16-ScrollX+16, y*16+16, GetColor(255,255,255),TRUE);
}
}
}
void Player(){
int maxspeed = 4.5;
int x1,x2,y1,y2;
//X入力
if(Key[KEY_INPUT_LEFT]){
Speed--;
if(Speed < -maxspeed) Speed=-maxspeed;
}else if(Speed<0)Speed++;
if(Key[KEY_INPUT_RIGHT]){
Speed++;
if(Speed > maxspeed) Speed=maxspeed;
}else if(Speed>0)Speed--;
PlayerX+=Speed;
x1=(ScrollX+PlayerX)/16;
y1=PlayerY/16;
x2=(ScrollX+PlayerX+15)/16;
y2=(PlayerY+15)/16;
if(MAP[y1][x1]!=0 || MAP[y2][x1]!=0){//左判定
PlayerX = x2*16;
Speed = 0;
}
if(MAP[y1][x2]!=0 || MAP[y2][x2]!=0){//右判定
PlayerX = x1*16;
Speed = 0;
}
//Y入力
if(Key[KEY_INPUT_SPACE] && OnGround){
JumpSpeed-=12;
}
JumpSpeed++;//自動落下
PlayerY+=JumpSpeed;
x1=(ScrollX+PlayerX)/16;
y1=PlayerY/16;
x2=(ScrollX+PlayerX+15)/16;
y2=(PlayerY+15)/16;
if(MAP[y1][x1]!=0 || MAP[y1][x2]!=0){//上判定
PlayerY=y2*16;
JumpSpeed=0;
}
if(MAP[y2][x1]!=0 || MAP[y2][x2]!=0){//下判定
PlayerY=y1*16;
JumpSpeed=0;
OnGround = TRUE;
}else OnGround = FALSE;
//キャラクター描画
DrawBox(PlayerX, PlayerY, PlayerX+16, PlayerY+16, GetColor(255,255,0), TRUE);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
SetMainWindowText("アクションゲーム");
ChangeWindowMode(TRUE);
SetGraphMode(320,240,32);
if( DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
PlayerX = 320/2;
PlayerY = 220/2;
while( ProcessMessage() == 0 && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
if(Key[KEY_INPUT_1]) ScrollX--;
if(Key[KEY_INPUT_2]) ScrollX++;
Map();
Player();
DrawFormatString(0,0,GetColor(255,255,255),"x:%lf",PlayerX);
DrawFormatString(0,20,GetColor(255,255,255),"y:%lf",PlayerY);
DrawFormatString(150,0,GetColor(255,255,255),"ScrollX:%d",ScrollX);
ScreenFlip();
}
DxLib_End();
return 0;
}