コード:
#include "DxLib.h"
typedef struct{
int img,muki;
}ch_t;
#define MAP_SIZE 40 // マップチップ一つのドットサイズ
#define MAP_WIDTH 20 // マップの幅
#define MAP_HEIGHT 15 // マップの縦長さ
// マップのデータ
int MapData[MAP_HEIGHT][MAP_WIDTH] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,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,1 },
{ 1,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,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1 },
{ 1,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,1 },
{ 1,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,1 },
{ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 },
{ 1,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 },
};
// プレイヤーの位置
int PlayerX , PlayerY ;
// 移動しているかどうかのフラグ( 0:停止中 1:移動中 )
int Move ;
// 各方向に移動する量
int MoveX, MoveY ;
// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
SetGraphMode( 800 , 600 , 32 ) ;
char Key[256];
int image[8],map,idouryou=4,hokou=0 ;
int ScrollX, ScrollY ;
ch_t ch;
ch.muki=2;
ChangeWindowMode( TRUE );
DxLib_Init();
// 描画先画面を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
LoadDivGraph( "画像/キャラ.png" , 8 , 2 , 4 , 40 , 41 , image ) ;
map = LoadGraph( "map/map.png" );
// プレイヤーの初期位置をセット
PlayerX = 1 ;
PlayerY = 1 ;
// 最初は停止中(0)にしておく
Move = 0 ;
// ループ
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
{
// 画面を初期化
ClearDrawScreen() ;
if( Move == 0 )
{
// キー入力に応じてプレイヤーの座標を移動
if( Key[ KEY_INPUT_LEFT ] == 1)
{
Move = 1 ;
MoveX = -1 ;
MoveY = 0 ;
ch.muki=1;
}
if( Key[ KEY_INPUT_RIGHT] == 1)
{
Move = 1 ;
MoveX = 1 ;
MoveY = 0 ;
ch.muki=3;
}
if( Key[ KEY_INPUT_UP ]==1 )
{
Move = 1 ;
MoveX = 0 ;
MoveY = -1 ;
ch.muki=0;
}
if( Key[ KEY_INPUT_DOWN ] == 1)
{
Move = 1 ;
MoveX = 0 ;
MoveY = 1 ;
ch.muki=2;
}
// 進入不可能なマップだった場合は移動できない
if( Move == 1 )
{
if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] == 1 )
{
Move = 0 ;
}
else
{
MoveCounter = 0 ;
}
}
// 停止中は画面のスクロールは行わない
ScrollX = 0 ;
ScrollY = 0 ;
}
// 移動中の場合は移動処理を行う
if( Move == 1 )
{
MoveCounter =MoveCounter+idouryou ;
// 移動処理が終了したら停止中にする
if( MoveCounter == MAP_SIZE )
{
Move = 0 ;
// プレイヤーの位置を変更する
PlayerX += MoveX ;
PlayerY += MoveY ;
// 停止中は画面のスクロールは行わない
ScrollX = 0 ;
ScrollY = 0 ;
}
else
{
// 経過時間からスクロール量を算出する
ScrollX = -( MoveX * MoveCounter ) ;
ScrollY = -( MoveY * MoveCounter ) ;
}
}
;
DrawGraph( 380-MAP_SIZE * PlayerX+ScrollX , 280-MAP_SIZE * PlayerY+ScrollY, map , TRUE ) ;
if(MoveCounter==40 || MoveCounter<=19 )hokou=0;
else hokou=1;
ch.img=image[hokou + ch.muki*2];
DrawGraph( 380 , 280 , ch.img , TRUE ) ;//画像を描画
// 裏画面の内容を表画面に映す
ScreenFlip() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
DrawGraph(DrawGraph( 380-MAP_SIZE * PlayerX+ScrollX , 280-MAP_SIZE * PlayerY+ScrollY, map , TRUE ) ;でマップを描画している部分の
+ScrollXと+ScrollYを外すと1マスの移動の間が描画されないのでがカクカクとした動きになりますが、その場合はマップが暗くならないので、この辺りに問題があるのだと思っていますが、原因が全然わかりません。