コード:
// 2D回転マップスクロール基本
#include "DxLib.h"
#include <math.h>
#define MAP_SIZE 64 // マップチップ一つのドットサイズ
#define MAP_WIDTH 20 // マップの幅
#define MAP_HEIGHT 16 // マップの縦長さ
#define MOVE_FRAME 32 // 移動にかけるフレーム数
// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
{ 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 } ,
} ;
// プレイヤーの位置
int PlayerX , PlayerY ;
int movx, movy ; // 移動先の座標
int Muki ; // 向き
int NowInput ; // 現在のフレームの入力
int State ; // 状態
int Count = 0 ;
int px,py;
int kabeGraph,tx,ty;
float Roll ;
int time=0;
float Roll_d;
// マップとプレイヤーの描画関数
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 ) ;
// マップを描く
px=320;py=240;
for( i = -1 ; i < DrawMapChipNumY ; i ++ )
{
for( j = -1 ; j < DrawMapChipNumX ; j ++ )
{
// 画面からはみ出た位置なら描画しない
if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 ||
j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;
// マップデータが0だったら四角を描画する
if( MapData[ i + MapDrawPointY ][ j + MapDrawPointX ] == 0 )
{
DrawRotaGraph2( px, py,px+32-j * MAP_SIZE-ScrollX,py-i * MAP_SIZE-ScrollY-24,1.5f,Roll+Roll_d,kabeGraph , TRUE,0 ) ;
}
}
}
}
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int ScrollX, ScrollY ;
int PlayerGraph;
int Map_Rote;
int movx=0, movy=0 ; // 移動先の座標
int Muki ; // 向き
int NowInput ; // 現在のキー入力
int State ; // 状態
int Count=0 ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画先画面を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 状態の初期化
State = 0 ;
Muki = 0 ;
PlayerGraph = LoadGraph( "Player.bmp" ) ;
kabeGraph=LoadGraph( "Tex3.bmp" ) ;
// プレイヤーの初期位置をセット
PlayerX = 2 ;
PlayerY = 2 ;
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClearDrawScreen() ;
// キー入力を得る
NowInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
// 状態によって処理を分岐
switch( State )
{
case 0 : // 入力待ち状態
// 上が押されたら向いている方向に移動する状態に移行する
if( ( NowInput & PAD_INPUT_UP ) != 0 )
{
// 向きによって移動方向が変わる
switch( Muki )
{
case 0 : movx = 0 ; movy = -1 ; break ; // 上方向
case 1 : movx = -1 ; movy = 0 ; break ; // 左方向
case 2 : movx = 0 ; movy = 1 ; break ; // 下方向
case 3 : movx = 1 ; movy = 0 ; break ; // 右方向
}
// 移動先のマスが道だったら移動する
if( MapData[ PlayerY + movy ][ PlayerX + movx ] == 1 )
{
// 状態を前進中にする
State = 1 ;
Count = 0 ;
}
}
// 下が押されたら向いている方向と逆方向に移動する
if( ( NowInput & PAD_INPUT_DOWN ) != 0 )
{
// 向きによって移動方向が変わる
switch( Muki )
{
case 0 : movx = 0 ; movy = 1 ; break ; // 下方向
case 1 : movx = 1 ; movy = 0 ; break ; // 右方向
case 2 : movx = 0 ; movy = -1 ; break ; // 上方向
case 3 : movx = -1 ; movy = 0 ; break ; // 左方向
}
// 移動先のマスが道だったら移動する
if( MapData[ PlayerY + movy ][ PlayerX + movx ] == 1 )
{
// 状態を後退中にする
State = 2 ;
Count = 0 ;
}
}
// 左が押されていたら向いている方向を左に90度変更する
if( ( NowInput & PAD_INPUT_LEFT ) != 0 )
{
// 状態を左旋回中にする
State = 3 ;
Count = 0 ;
}
// 右が押されていたら向いている方向を右に90度変更する
if( ( NowInput & PAD_INPUT_RIGHT ) != 0 )
{
// 状態を右旋回中にする
State = 4 ;
Count = 0 ;
}
break ;
case 1 : // 前進中状態
// カウントを進める
Count ++ ;
// カウントが移動時間に達したら実座標を移動して入力待ち状態に戻る
if( Count == MOVE_FRAME )
{
PlayerX += movx ;
PlayerY += movy ;
State = 0 ;
Count = 0 ;
}
break ;
case 2 : // 後退中状態
// カウントを進める
Count ++ ;
// カウントが移動時間に達したら実座標を移動して入力待ち状態に戻る
if( Count == MOVE_FRAME )
{
PlayerX += movx ;
PlayerY += movy ;
State = 0 ;
Count = 0 ;
}
break ;
case 3 : // 左旋回中状態
// カウントを進める
Count ++ ;
Map_Rote=1;
movx=0;
movy=0;
Roll_d=((float)Count/32.0f)*PHI_F/2*Map_Rote; //回転
// カウントが推移時間に達したら実方向を変更して入力待ち状態に戻る
if( Count == MOVE_FRAME )
{
if( Muki == 3 )
{
Muki = 0 ;
}
else
{
Muki ++ ;
}
ScrollX = 0 ;
ScrollY = 0 ;
Roll+=Roll_d;
Roll_d=0.0f;
State = 0 ;
Count = 0 ;
}
break ;
case 4 : // 右旋回中状態
// カウントを進める
Count ++ ;
Map_Rote=-1;
movx=0;
movy=0;
Roll_d=((float)Count/32.0f)*PHI_F/2*Map_Rote; //回転
// カウントが推移時間に達したら実方向を変更して入力待ち状態に戻る
if( Count == MOVE_FRAME )
{
if( Muki == 0 )
{
Muki = 3 ;
}
else
{
Muki -- ;
}
// 停止中は画面のスクロールは行わない
ScrollX = 0 ;
ScrollY = 0 ;
Roll+=Roll_d; //回転更新
Roll_d=0.0f; //回転+分をリセット
State = 0 ;
Count = 0 ;
}
break ;
}
// 経過時間からスクロール量を算出する
ScrollX = -(movx * MAP_SIZE * Count / MOVE_FRAME ) ;
ScrollY = -( movy * MAP_SIZE * Count / MOVE_FRAME ) ;
// マップとプレイヤーを描画
GraphDraw( ScrollX, ScrollY ) ;
// プレイヤーを描画する
DrawGraph( 320-16 , 240-32 , PlayerGraph , TRUE ) ;
// 裏画面の内容を表画面に映す
ScreenFlip() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}