マップチップを使ってRPGのようなマップを製作しています。
マップチップの種類は、通行可、通行不可、斜めに通行する、の三種類です。
通行可、通行不可のマップチップは作成できたのですが、斜め移動の通行だけできません。
座標がマップチップ内に入ると、ただ通るだけになってしまいます。
以下のコードは、どこかで見つけたコードを元に改良したものです。
マップチップ3にプレイヤーが上から下に向けて進入していった時だけ斜め移動するように記述したつもりです。
また、最終的にマップチップごとの画像は準備せず、一枚絵を用意してマップチップごとの作用に対応させるようにするつもりです。
自分なりの考えとしては、坂として扱いたい座標からはみ出た分だけ動かせばいいと思いました。
下記のコードでは、上からマップチップ3に進入した場合、右へ4回に分けて移動させれば、結果として斜めに移動しているように見えると思い記述したものです。
しかし結果としては右に移動したのは左端から進入したときだけで、あとはまっすぐ下に通り抜けてしまいます。
何が足りないのか見当がつかなくなったため、質問させていただきました。
宜しくお願いいたします。
#include "DxLib.h"
#define GAME_WINDOW_WIDTH 320
#define GAME_WINDOW_HEIGHT 256
#define MAP_HEIGHT 10
#define MAP_WIDTH 13
#define MAPCHIP_SIZE 32
int kakunin;
int Umi;
int Kusa;
int Ana;
int Naname;
int player = LoadGraph("player.jpg");
int x,y;
int yoko,tate;//プレイヤーの座標
int idou;
//マップチップ
int MapData[MAP_HEIGHT][MAP_WIDTH]=
{
{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,0},
{0,1,1,2,1, 1,1,1,1,1, 0,1,0},
{0,1,1,1,1, 1,1,1,1,1, 1,1,0},
{0,1,1,1,1, 1,1,1,1,1, 1,1,0},
{0,3,1,1,1, 1,1,1,1,1, 1,1,0},
{0,0,3,1,1, 1,1,1,1,1, 1,1,0},
{0,0,0,0,0, 0,0,0,0,0, 0,0,0},
};
//右マップを増やした結果、スクロールはされないものの判定はある
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
SetGraphMode( GAME_WINDOW_WIDTH,GAME_WINDOW_HEIGHT, 16);
if( DxLib_Init() == -1 )
{
return -1;
}
SetDrawScreen( DX_SCREEN_BACK );
yoko = 32 * 4;
tate = 32 * 3;
idou = 8;
//メインループ
while(CheckHitKey(KEY_INPUT_ESCAPE) == 0){
ClearDrawScreen();
kakunin = LoadGraph("背景.png");
Naname = LoadGraph("斜め.png");
/*
Umi = LoadGraph("海.png");
Kusa = LoadGraph("草.png");
Ana = LoadGraph("穴.png");
*/
DrawGraph(0,0,kakunin,TRUE);
//マップチップを使った背景の描画
for( x = 0;x < MAP_HEIGHT; x++ )
{
for( y = 0; y < MAP_WIDTH; y++ )
{
if(MapData[y][x] == 0 )
{
DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE , Umi, TRUE);
}
else if(MapData[y][x]==1)
{
DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE, Kusa, TRUE);
}
else if(MapData[y][x]==2)
{
DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE, Ana , TRUE);
}
else if(MapData[y][x]==3)
{
DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE, Naname , TRUE);
}
}
}
//キャラクターの移動
//左への移動
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
if(MapData[tate/32][(yoko - idou)/32] != 0 && MapData[(tate + 31)/32][(yoko - idou)/32] != 0)
{
if(MapData[tate/32][(yoko - idou)/32] != 2 && MapData[(tate + 31)/32][(yoko - idou)/32] != 2)
{
yoko -= idou;
}
}
}
//右への移動
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
if(MapData[tate/32][(yoko + 31 + idou)/32] != 0 && MapData[(tate + 31)/32][(yoko +31+ idou)/32] != 0)
{
if(MapData[tate/32][(yoko + 31 + idou)/32] != 2 && MapData[(tate + 31)/32][(yoko +31+ idou)/32] != 2)
{
yoko += idou;
}
}
}
//上への移動
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
if(MapData[(tate - idou)/32][yoko/32] != 0 && MapData[(tate - idou)/32][(yoko + 31)/32] != 0)
{
if(MapData[(tate - idou)/32][yoko/32] != 2 && MapData[(tate - idou)/32][(yoko + 31)/32] != 2)
{
tate -= idou;
}
}
}
//下への移動
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
if(MapData[(tate + 31 + idou)/32][yoko/32] !=0 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] != 0)
{
if(MapData[(tate + 31 + idou)/32][yoko/32] !=2 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] != 2)
{
tate += idou;
}
}
}
//右下へ斜め移動するマップチップとの衝突判定
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
if(MapData[(tate + 31 + idou)/32][yoko/32] ==3 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] == 3)
{
tate += idou;
if((tate % 32) - (yoko % 32) == idou )
{
yoko += idou;
}
}
}
LoadGraphScreen( yoko,tate,"player.png",TRUE );
ScreenFlip();
WaitTimer(20);
}
DxLib_End();
return 0;
}