// マップスクロール基本+マップ切り替え // // Create 2014/09/13 // // マップスクロール基本のプログラムを複数のマップに対応したプログラムです。 // スペースキーでマップを切り替えることができます。 // 1つのマップの情報を構造体に纏めて、その構造体の配列で複数のマップを扱っています。 #include "DxLib.h" #define MAP_NUM 3 // マップの数 #define MAP_SIZE 32 // マップチップ一つのドットサイズ #define MAP_WIDTH_MAX 40 // マップの最大幅 #define MAP_HEIGHT_MAX 40 // マップの最大縦長さ #define MOVE_FRAME 15 // 移動にかけるフレーム数 // マップの構造体 struct MAPDATA { // マップの幅 int Width ; // マップの高さ int Height ; // マップ int Data[ MAP_HEIGHT_MAX ][ MAP_WIDTH_MAX ] ; } ; // マップのデータ MAPDATA MapData[ MAP_NUM ] = { // マップ0 { 10, 8, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 0, 1, 1, 0, 1, 0 } , { 0, 0, 0, 1, 0, 1, 1, 0, 1, 0 } , { 0, 0, 0, 1, 0, 0, 1, 0, 1, 0 } , { 0, 0, 1, 1, 0, 0, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 0, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } }, // マップ1 { 20, 16, { { 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 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 } , { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 0, 0, 1, 0 } , { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 } , { 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 , 0, 0, 1, 1, 1, 1, 1, 0, 1, 0 } , { 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 , 0, 0, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 , 0, 0, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 , 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 , 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 0, 0, 1, 1, 0, 0, 1, 0, 0 , 0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 , 1, 1, 1, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } , { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } }, // マップ2 { 40, 32, { { 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, 0, 0 } , { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 } , { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } , { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 1, 1, 1, 0, 0, 0, 1, 0, 0 } , { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 0, 0, 0, 0, 1, 1, 1, 0, 0 } , { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 0, 1, 0, 1, 1, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 0, 1, 0, 1, 0, 0, 1, 1, 0 } , { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 0, 1, 0, 1, 0, 1, 1, 0, 0 } , { 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 0, 1, 0, 1, 1, 1, 0, 0, 0 } , { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 1, 1, 1, 0, 1, 0, 0, 1, 1, 0 } , { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 1, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 0, 0, 1, 1, 0 } , { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 , 1, 1, 1, 1, 1, 0, 0, 1, 1, 0 } , { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 , 0, 0, 0, 1, 0, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 , 1, 1, 0, 1, 0, 1, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 , 1, 1, 0, 1, 0, 1, 0, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 1, 1, 1, 0, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 0 , 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 0, 0, 1, 0 } , { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } , { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 0, 1, 0 } , { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 } , { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 0, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 1, 1, 0, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 , 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } , { 0, 1, 1, 0, 0, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 , 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 , 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 , 0, 1, 1, 1, 1, 1, 0, 0, 1, 1 , 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 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, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } }, } ; // 現在のマップ番号 int MapNo ; // プレイヤーの位置 int PlayerX , PlayerY ; // 移動しているかどうかのフラグ( 0:停止中 1:移動中 ) int Move ; // 各方向に移動する量 int MoveX, MoveY ; // 移動し始めてから何フレーム経過したかを保持する変数 int MoveCounter ; // マップとプレイヤーの描画関数 void GraphDraw( int ScrollX, int ScrollY ) { int j , i ; int MapDrawPointX , MapDrawPointY ; // 描画するマップ座標値 int DrawMapChipNumX , DrawMapChipNumY ; // 描画するマップチップの数 // 描画するマップチップの数をセット DrawMapChipNumX = 640 / MAP_SIZE + 2 ; DrawMapChipNumY = 480 / MAP_SIZE + 2 ; // 画面左上に描画するマップ座標をセット MapDrawPointX = PlayerX - ( DrawMapChipNumX / 2 - 1 ) ; MapDrawPointY = PlayerY - ( DrawMapChipNumY / 2 - 1 ) ; // マップを描く for( i = -1 ; i < DrawMapChipNumY ; i ++ ) { for( j = -1 ; j < DrawMapChipNumX ; j ++ ) { // 画面からはみ出た位置なら描画しない if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 || j + MapDrawPointX >= MapData[ MapNo ].Width || i + MapDrawPointY >= MapData[ MapNo ].Height ) continue ; // マップデータが0だったら四角を描画する if( MapData[ MapNo ].Data[ i + MapDrawPointY ][ j + MapDrawPointX ] == 0 ) { DrawBox(j * MAP_SIZE + ScrollX, i * MAP_SIZE + ScrollY, j * MAP_SIZE + MAP_SIZE + ScrollX, i * MAP_SIZE + MAP_SIZE + ScrollY, GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } // プレイヤーの描画 DrawBox( ( PlayerX - MapDrawPointX ) * MAP_SIZE , ( PlayerY - MapDrawPointY ) * MAP_SIZE , ( PlayerX - MapDrawPointX + 1 ) * MAP_SIZE , ( PlayerY - MapDrawPointY + 1 ) * MAP_SIZE , GetColor( 255 , 255 , 255 ) , TRUE ) ; } // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Key ; int ScrollX, ScrollY ; SetGraphMode( 640 , 480 , 16 ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先画面を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // プレイヤーの初期位置をセット PlayerX = 1 ; PlayerY = 1 ; // 最初は停止中(0)にしておく Move = 0 ; // ループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面を初期化 ClearDrawScreen() ; // スペースキーが押されたらマップ番号を切り変える if( GetInputChar( TRUE ) == ' ' ) { // プレイヤーの位置を初期化 PlayerX = 1 ; PlayerY = 1 ; // 停止中フラグも倒す Move = 0 ; // マップ番号を加算 MapNo ++ ; if( MapNo == MAP_NUM ) { MapNo = 0 ; } } // 移動中ではない場合キー入力を受け付ける if( Move == 0 ) { // キー入力を得る Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ; // キー入力に応じてプレイヤーの座標を移動 if( Key & PAD_INPUT_LEFT ) { Move = 1 ; MoveX = -1 ; MoveY = 0 ; } if( Key & PAD_INPUT_RIGHT ) { Move = 1 ; MoveX = 1 ; MoveY = 0 ; } if( Key & PAD_INPUT_UP ) { Move = 1 ; MoveX = 0 ; MoveY = -1 ; } if( Key & PAD_INPUT_DOWN ) { Move = 1 ; MoveX = 0 ; MoveY = 1 ; } // 進入不可能なマップだった場合は移動できない if( Move == 1 ) { if( MapData[ MapNo ].Data[ PlayerY + MoveY ][ PlayerX + MoveX ] == 0 ) { Move = 0 ; } else { MoveCounter = 0 ; } } // 停止中は画面のスクロールは行わない ScrollX = 0 ; ScrollY = 0 ; } // 移動中の場合は移動処理を行う if( Move == 1 ) { MoveCounter ++ ; // 移動処理が終了したら停止中にする if( MoveCounter == MOVE_FRAME ) { Move = 0 ; // プレイヤーの位置を変更する PlayerX += MoveX ; PlayerY += MoveY ; // 停止中は画面のスクロールは行わない ScrollX = 0 ; ScrollY = 0 ; } else { // 経過時間からスクロール量を算出する ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME ) ; ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME ) ; } } // マップとプレイヤーを描画 GraphDraw( ScrollX, ScrollY ) ; // 裏画面の内容を表画面に映す ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }