マップチップの座標のピクセル単位での移動

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゴンマサ

マップチップの座標のピクセル単位での移動

#1

投稿記事 by ゴンマサ » 10年前

お世話になっております。
またご意見をいただきたく投稿いたしました。

現在マップチップをドット単位でスクロールさせようとしているのですが、うまく動作しません

以下の記述では MapData[ y + MapDrawPointY ][ x + MapDrawPointX ]という形で
マップをスクロールさせていますが、これだとチップ単位での移動になってしまいます。
その後に続く DrawGraphの記述をいろいろと試してみましたが、描画される位置が変わるだけで
マップチップ自体がピクセル単位で移動しているわけではありませんでした。

他に、1ピクセルにつきマップチップを1チップとして、マップデータをファイルから読み込むようにしようかとも
思いましたが、いくらなんでもデータを作る手間がかかり過ぎると思い実行しておりません。

以下の記述は製作途中のものです。
右キーを押していると、プレイヤーがマップの中心部へと移動するのですが、
少しずつ座標がずれていってしまい、マップの左側ではマップチップとの衝突判定が起きなくなっています。
また、プレイヤーの上下の移動に対してもまだ補正を記述しておりません。

ですが、今そこの帳尻を合わせても、マップチップがピクセル単位で動かなければ
結局書き直すことになるだろうと思い、失礼ですが中途半端な状態で投稿させていただきました。

最終的には聖○伝説2のような上下左右に動くアクションRPGのようにしたいと思っています。
何かヒントをいただければ幸いです。
よろしくお願いいたします。

コード:

#include "DxLib.h"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define WINDOW_WIDTH 960        //ウインドウの大きさ
#define WINDOW_HEIGHT 704

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

#define idou 16//プレイヤーの移動距離

// マップのデータ
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, 1, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 0, 1, 1, 1, 0, 1, 0, 0, 0 ,  1, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
	{ 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 0, 0, 1, 0 } ,
	{ 0, 1, 1, 0, 1, 0, 1, 1, 1, 0 ,  0, 0, 0, 0, 0, 1, 0, 0, 1, 0 } ,
	{ 0, 1, 0, 0, 1, 1, 1, 1, 1, 0 ,  0, 0, 1, 1, 1, 1, 1, 0, 1, 0 } ,
	{ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 ,  1, 1, 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, 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 P_D_PointX,P_D_PointY;

// 描画するマップ座標値
int MapDrawPointX , MapDrawPointY ;		

//プレイヤーのカメラ内の座標
//マップが動かないときはこれを用いてプレイヤー座標を動かす
int P_DrawX,P_DrawY; 

//カメラ内でのマップチップに対しての座標
//またマップチップへの判定を判断する座標はこれに集約される
int coordinateX,coordinateY;

//方向キー入力の番号
int houkou;

//デバッグ文字列の色
int ty;

//プレイヤーがマップの中間を移動した分
//(カメラの移動分)
int Camera_Move_X,Camera_Move_Y;

// プレイヤーの描画関数

void P_Draw(void)
{
		DrawBox( (( PlayerX - MapDrawPointX )+ P_DrawX ) ,   
		     (( PlayerY - MapDrawPointY )+ P_DrawY )  ,
		     (( PlayerX - MapDrawPointX + MAP_SIZE ) + P_DrawX ) ,
		     (( PlayerY - MapDrawPointY + MAP_SIZE ) + P_DrawY )  ,
			   GetColor( 0 , 125 , 255 ) ,
			   TRUE ) ;//8,6
}




// マップの描画関数
void GraphDraw( void )
{
	int x , y ;
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数

	DrawMapChipNumX = WINDOW_WIDTH + MAP_SIZE  ;//1024
	DrawMapChipNumY = WINDOW_HEIGHT+ MAP_SIZE  ;//768

	MapDrawPointX = PlayerX +(Camera_Move_X/MAP_SIZE)- DrawMapChipNumX / 2  ;//512-1024/2
	MapDrawPointX = PlayerX +(Camera_Move_X/MAP_SIZE)- DrawMapChipNumX / 2  ;//512-1024/2

	// マップを描く
	for( y = 0 ; y < DrawMapChipNumY ; y ++ )
	{
		for( x = 0 ; x < DrawMapChipNumX ; x ++ )
		{

			
			// 画面からはみ出た位置なら描画しない
			if( x + MapDrawPointX < 0 || y + MapDrawPointY < 0 ||
				x + MapDrawPointX >= MAP_WIDTH || y + MapDrawPointY >= MAP_HEIGHT ) continue ;
				
			// マップデータが0だったら四角を描画する
			if( MapData[ y + MapDrawPointY ][ x + MapDrawPointX ] == 0 )
			{
				DrawBox( x * MAP_SIZE ,               
					     y * MAP_SIZE ,
					     x * MAP_SIZE + MAP_SIZE ,
					     y * MAP_SIZE + MAP_SIZE ,
						 GetColor( 255 , 0 , 0 ) ,
						 TRUE ) ;
			}
		}
	}
}
			//描画されていないだけで、マップ自体は隣接している
			//そしてマップ自体は無限ループしている


// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	int OldX , OldY ;	// 移動する前のプレイヤーの位置を保存する変数

	ty = GetColor(255,255,255);


	//デスクトップの解像度にあわせると、自動で全画面になる
	SetGraphMode( WINDOW_WIDTH , WINDOW_HEIGHT , 16 ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// プレイヤーの初期位置をセット
	PlayerX = 8 *64;
	PlayerY = 6 *64;


	//プレイヤーのカメラ内での初期位置をセット
	P_DrawX = 0;
	P_DrawY = 0; 


	// ループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面を初期化
		ClearDrawScreen() ;

		// キー入力を得る
		Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

		// 移動する前のプレイヤーの位置を保存
		OldX = coordinateX ; 
		OldY = coordinateY ;

		//左キーの記述
		if( Key & PAD_INPUT_LEFT ) 
		{
			houkou =1;
			//もしマップチップの座標Xが0で
			//カメラ内でのX位置が0の場合

		    //左側
			if(    MapDrawPointX == 0
				&& P_DrawX <1)
			{
				P_DrawX -= idou;
			}
			//中心
		    else if(    MapDrawPointX > 0
				&& P_DrawX ==0)
			{
				
                   PlayerX -= idou;
			}
			//右側
			else if(MapDrawPointX == 5
				&& P_DrawX > 0)
			{
				P_DrawX -= idou;
			}
		}



		//右キーの記述
		else if( Key & PAD_INPUT_RIGHT )
		{
			houkou = 2;
			//もしマップチップの座標が0,0で
			//カメラ内での位置が0,0のばあい
			//左側
			if(    MapDrawPointX == 0
				&& P_DrawX < 0)
			{
			        P_DrawX += idou;
		    }
			//中心
			else if(    MapDrawPointX < 5
				&& P_DrawX > -1)
			{
				Camera_Move_X+= idou ;
				//PlayerX += idou ;
		    }
			//右側
			else if(    MapDrawPointX == 5
				&& P_DrawX > -1)
			{
			        P_DrawX += idou;
		    }
		}

		//後に訂正
		//上キーの記述
		else if( Key & PAD_INPUT_UP ) 
		{
			houkou = 3;
			//上側
			if(MapDrawPointY == 0
				&& P_DrawY < 1)
			{
			    P_DrawY -= idou ;
			}
			//中心
			else if(MapDrawPointY < 6
				&& P_DrawY == 0)
			{
			    PlayerY -= idou ;
			}
			//下側
			else if(MapDrawPointY == 5
				&& P_DrawY > 0)
			{
			    P_DrawY -= idou;
			}
		}
		//下キーの記述
		else if( Key & PAD_INPUT_DOWN )
		{
			houkou = 4;
			//上側
			if( MapDrawPointY == 0
				&& P_DrawY < 0)
			{
			    P_DrawY += idou ;
			}
			//中心
			else if( MapDrawPointY < 5
				&& P_DrawY == 0)
			{
				PlayerY += idou;
			}
			//下側
			else if(MapDrawPointY == 5
				&& P_DrawY > -1)
			{
				P_DrawY += idou ;
			}
		}


		//座標の確認1
			coordinateX = (PlayerX + P_DrawX)/MAP_SIZE;
	        coordinateY = (PlayerY + P_DrawY)/MAP_SIZE;



		// 進入不可能なマップだった場合は移動できない
		if( MapData[ coordinateY ][ coordinateX ] == 0 )
		{
			if(houkou == 1)
			{
		    	P_DrawX += idou ;
			}
			else if(houkou == 2)
			{
			    P_DrawX -= idou ;
			}
			else if(houkou == 3)
			{
			    P_DrawY += idou ;
			}
			else if(houkou == 4)
			{
			    P_DrawY -= idou ;
			}
		}


		// マップを描画
		GraphDraw() ;

        //プレイヤーを描画
		P_Draw();

		//デバッグ用記述
		//カメラ内でのプレイヤーのドット上での位置

		P_D_PointX = (PlayerX + P_DrawX - MapDrawPointX) ;
		P_D_PointY = (PlayerY + P_DrawY - MapDrawPointY);

		//デバッグ文字列
		//マップチップ上でのカメラの中心
		DrawString(0,20,"マップチップ上でのカメラの中心",ty);
		DrawFormatString(0,40,ty,"PlayerX%d",PlayerX);
		DrawFormatString(0,60,ty,"PlayerY%d",PlayerY);

		//カメラに移っているマップチップの描画ポイント
		DrawString(0,100,"カメラに移っているマップチップの描画ポイント",ty);
		DrawFormatString(0,120,ty,"MapDrawPointX%d",MapDrawPointX);
		DrawFormatString(0,140,ty,"MapDrawPointY%d",MapDrawPointY);

		//カメラが止まっているときのカメラの中心からのプレイヤーの描画位置位置
		DrawString(0,180,"カメラが止まっているときのカメラの中心からのプレイヤーの描画位置位置",ty);
		DrawFormatString(0,200,ty,"P_DrawX%d",P_DrawX);
		DrawFormatString(0,220,ty,"P_DrawY%d",P_DrawY);		

		//マップチップ上でのプレイヤーの位置
		DrawString(0,260,"マップチップ上でのプレイヤーの位置",ty);
		DrawFormatString(0,280,ty,"coordinateX%d",coordinateX);	
		DrawFormatString(0,300,ty,"coordinateY%d",coordinateY);	

		//カメラ内でのプレイヤーのドット上での位置
		DrawString(0,340,"カメラ内でのプレイヤーのドット上での位置",ty);
		DrawFormatString(0,360,ty,"P_D_PointX%d",P_D_PointX);	
		DrawFormatString(0,380,ty,"P_D_PointY%d",P_D_PointY);


		// 裏画面の内容を表画面に映す
		ScreenFlip() ;

		// ウエイト
		WaitTimer( 100 ) ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}
 

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: マップチップの座標のピクセル単位での移動

#2

投稿記事 by usao » 10年前

>現在マップチップをドット単位でスクロールさせようとしているのですが、うまく動作しません

103行目~ の DrawBox() に与えている描画位置が常に MAP_SIZE(=64) の倍数になっていますから
描画位置が1ドット単位で変わらないのは当然なように思います.

(1)現在どのマップチップを描画すべきか
(2)そのマップチップをどの位置に描画するのか

という2つを切り分けて考えてみてはいかがでしょうか.

例えば,
DrawBox( x*MAP_SIZE + offset, ...
として offsetの値を1とか2とかにすれば,その分だけ描画位置がずれるわけですよね?

ゴンマサ

Re: マップチップの座標のピクセル単位での移動

#3

投稿記事 by ゴンマサ » 10年前

usao様

回答ありがとうございます。
ご指摘のとおりDrawBoxは四角を描画する位置の指定であり、
回答のとおりプレイヤーの移動距離を計算すればBoxの描画位置は動かすことができます。

ですが実際に衝突判定が起きる場所は
MapDrawPointX 、Yの部分の記述に左右されているように思うのです。

以下のコードはマップチップを描画する際に、一番左上の1チップ、最上段のチップ、一番左側のチップを
プレイヤーの移動距離に応じて伸び縮みするようにしたものです。
申し訳ありませんが開始位置から下に動くとマップの外に飛び出てしまいます。

これだと開始位置から右に動いた場合、描画されたマップはスクロールするのですが、
右の通路内で上キーを押した場合、そちらに移動してしまいます。

これはマップチップが動いていないわけではなく、
プレイヤーとマップの描画の関連付けの問題なのでしょうか。

コード:

 
// マップスクロール基本
#include "DxLib.h"

#define MAP_SIZE	64			// マップチップ一つのドットサイズ

#define WINDOW_WIDTH 960        //ウインドウの大きさ
#define WINDOW_HEIGHT 704

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

#define idou 16//プレイヤーの移動距離

// マップのデータ
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, 1, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 0, 1, 1, 1, 0, 1, 0, 0, 0 ,  1, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
	{ 0, 0, 1, 0, 1, 0, 1, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 0, 0, 1, 0 } ,
	{ 0, 1, 1, 0, 1, 0, 1, 1, 1, 0 ,  0, 0, 0, 0, 0, 1, 0, 0, 1, 0 } ,
	{ 0, 1, 0, 0, 1, 1, 1, 1, 1, 0 ,  0, 0, 0, 0, 1, 1, 1, 0, 1, 0 } ,
	{ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 ,  1, 1, 1, 1, 1, 1, 1, 0, 1, 0 } ,
	{ 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ,  0, 0, 0, 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 P_D_PointX,P_D_PointY;


// 描画するマップ座標値
int MapDrawPointX , MapDrawPointY ;		

//プレイヤーのカメラ内の座標
//マップが動かないときはこれを用いてプレイヤー座標を動かす
int P_DrawX,P_DrawY; 

//カメラ内でのマップチップに対しての座標
//またマップチップへの判定を判断する座標はこれに集約される
int coordinateX,coordinateY;

//マップとプレイヤーの描画の分離個別化に成功

//方向キー入力の番号
int houkou;


//デバッグ文字列の色
int ty;


//プレイヤーがマップの中間を移動した分
//(カメラの移動分)
int Camera_Move_X,Camera_Move_Y;

// プレイヤーの描画関数


void P_Draw(void)
{
		DrawBox( (( PlayerX - MapDrawPointX )+ P_DrawX ) ,   
		     (( PlayerY - MapDrawPointY )+ P_DrawY )  ,
		     (( PlayerX - MapDrawPointX + 64 ) + P_DrawX ) ,
		     (( PlayerY - MapDrawPointY + 64 ) + P_DrawY )  ,
			   GetColor( 0 , 125 , 255 ) ,
			   TRUE ) ;//8,6
}




// マップの描画関数
void GraphDraw( void )
{
	int x , y ;
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数

	// 描画するマップチップの数をセット

	DrawMapChipNumX = WINDOW_WIDTH + MAP_SIZE  ;//1024
	DrawMapChipNumY = WINDOW_HEIGHT+ MAP_SIZE  ;//768


	// 画面左上に描画するマップ座標をセット
	//(プレイヤーがカメラの中心に来るように、カメラの位置を設定する)

    MapDrawPointX = PlayerX - DrawMapChipNumX / 2  ;//512-1024/2
	MapDrawPointY = PlayerY - DrawMapChipNumY / 2 ;//

	// マップを描く
	for( y = 0 ; y < DrawMapChipNumY ; y ++ )
	{
		for( x = 0 ; x < DrawMapChipNumX ; x ++ )
		{

			
			// 画面からはみ出た位置なら描画しない
			if( x + MapDrawPointX < 0 || y + MapDrawPointY < 0 ||
				x + MapDrawPointX >= MAP_WIDTH || y + MapDrawPointY >= MAP_HEIGHT ) continue ;
				
			// マップデータが0だったら四角を描画する
			if( MapData[ y + MapDrawPointY ][ x + MapDrawPointX ] == 0 )

			{
					
				//マップチップの最上段と最左段を伸縮させる記述
				// Camera_Move_X,Camera_Move_Yを使用
				//最左上部
				if(y==0 && x==0)
				{
				    DrawBox(x*MAP_SIZE,
					        y*MAP_SIZE,
							x*MAP_SIZE + (MAP_SIZE - Camera_Move_X),
					        y*MAP_SIZE + (MAP_SIZE - Camera_Move_Y),
							GetColor( 128 , 128, 0 ) ,//黄土色
						    TRUE ) ;

				}
				//最上段
				else if(y==0 && x>0)
				{
				    DrawBox(x*MAP_SIZE - Camera_Move_X,
					        y*MAP_SIZE,
							x*MAP_SIZE + (MAP_SIZE - Camera_Move_X),
					        y*MAP_SIZE + (MAP_SIZE - Camera_Move_Y),
							GetColor( 0 , 128 , 0 ) ,//緑
						    TRUE ) ;
				}
				//最左段
				else if(y>0 && x==0)
				{
				    DrawBox(x*MAP_SIZE,
					        y*MAP_SIZE - Camera_Move_Y,
							x*MAP_SIZE + (MAP_SIZE - Camera_Move_X),
					        y*MAP_SIZE + (MAP_SIZE - Camera_Move_Y),
							GetColor( 128 , 0 , 128 ) ,//紫
						    TRUE ) ;
				}
				//その他
				else if(y>0 && x>0)
				{
				    DrawBox(x*MAP_SIZE - Camera_Move_X,
					        y*MAP_SIZE - Camera_Move_Y,
							x*MAP_SIZE - Camera_Move_X + MAP_SIZE,
					        y*MAP_SIZE - Camera_Move_Y + MAP_SIZE,
							GetColor( 255 , 0 , 0 ) ,//赤
						    TRUE ) ;
				}

			}
		}
	}
}



// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	int OldX , OldY ;	// 移動する前のプレイヤーの位置を保存する変数

	ty = GetColor(255,255,255);


	//デスクトップの解像度にあわせると、自動で全画面になる
	SetGraphMode( WINDOW_WIDTH , WINDOW_HEIGHT , 16 ) ;
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// プレイヤーの初期位置をセット
	//各、*64の値に戻すようにする、この場合は512、384となる
	//結果プレイヤーとマップの動きがちぐはぐになってしまった
	
	PlayerX = 8 *64;
	PlayerY = 6 *64;


	//プレイヤーのカメラ内での初期位置をセット
	P_DrawX = 0;
	P_DrawY = 0; 



	// ループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面を初期化
		ClearDrawScreen() ;

		// キー入力を得る
		Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

		// 移動する前のプレイヤーの位置を保存
		OldX = coordinateX ; 
		OldY = coordinateY ;


		//左キーの記述
		if( Key & PAD_INPUT_LEFT ) 
		{
			houkou =1;
			//もしマップチップの座標Xが0で
			//カメラ内でのX位置が0の場合

		    //左側
			if(    MapDrawPointX == 0
				&& P_DrawX <1)
			{
				P_DrawX -= idou;
			}
			//中心
		    else if(    MapDrawPointX > 0
				&& P_DrawX ==0)
			{
				
                   PlayerX -= idou;
			}
			//右側
			else if(MapDrawPointX == 5
				&& P_DrawX > 0)
			{
				P_DrawX -= idou;
			}
		}



		//右キーの記述
		else if( Key & PAD_INPUT_RIGHT )
		{
			houkou = 2;
			//もしマップチップの座標が0,0で
			//カメラ内での位置が0,0のばあい
			//左側
			if(    MapDrawPointX == 0
				&& P_DrawX < 0)
			{
			        P_DrawX += idou;
		    }
			//中心
			else if(    MapDrawPointX < 5
				&& P_DrawX > -1)
			{
				Camera_Move_X+= idou ;
				//PlayerX += idou ;
		    }
			//右側
			else if(    MapDrawPointX == 5
				&& P_DrawX > -1)
			{
			        P_DrawX += idou;
		    }
		}

		//上下は左右が完成した後に、それを参考に書く
		//上キーの記述
		else if( Key & PAD_INPUT_UP ) 
		{
			houkou = 3;
			//上側
			if(MapDrawPointY == 0
				&& P_DrawY < 1)
			{
			    P_DrawY -= idou ;
			}
			//中心
			else if(MapDrawPointY < 6
				&& P_DrawY == 0)
			{
			    PlayerY -= idou ;
			}
			//下側
			else if(MapDrawPointY == 5
				&& P_DrawY > 0)
			{
			    P_DrawY -= idou;
			}
		}
		//下キーの記述
		else if( Key & PAD_INPUT_DOWN )
		{
			houkou = 4;
			//上側
			if( MapDrawPointY == 0
				&& P_DrawY < 0)
			{
			    P_DrawY += idou ;
			}
			//中心
			else if( MapDrawPointY < 5
				&& P_DrawY == 0)
			{
				PlayerY += idou;
			}
			//下側
			else if(MapDrawPointY == 5
				&& P_DrawY > -1)
			{
				P_DrawY += idou ;
			}
		}


		//座標の確認1
			coordinateX = (PlayerX + P_DrawX)/MAP_SIZE;
	        coordinateY = (PlayerY + P_DrawY)/MAP_SIZE;



		// 進入不可能なマップだった場合は移動できない
		//再描画しない
		//P_DrawXがかかわっても反応するようにする
		if( MapData[ coordinateY ][ coordinateX ] == 0 )
		{

			if(houkou == 1)
			{
		    	P_DrawX += idou ;
			}
			else if(houkou == 2)
			{
			    P_DrawX -= idou ;
			}
			else if(houkou == 3)
			{
			    P_DrawY += idou ;
			}
			else if(houkou == 4)
			{
			    P_DrawY -= idou ;
			}
		}



		// マップを描画
		GraphDraw() ;

        //プレイヤーを描画
		P_Draw();

		//デバッグ用記述
		//カメラ内でのプレイヤーのドット上での位置
		P_D_PointX = (PlayerX + P_DrawX - MapDrawPointX) ;
		P_D_PointY = (PlayerY + P_DrawY - MapDrawPointY);

		//デバッグ文字列
		//マップチップ上でのカメラの中心
		DrawString(0,20,"マップチップ上でのカメラの中心",ty);
		DrawFormatString(0,40,ty,"PlayerX%d",PlayerX);
		DrawFormatString(0,60,ty,"PlayerY%d",PlayerY);

		//カメラに移っているマップチップの描画ポイント
		DrawString(0,100,"カメラに移っているマップチップの描画ポイント",ty);
		DrawFormatString(0,120,ty,"MapDrawPointX%d",MapDrawPointX);
		DrawFormatString(0,140,ty,"MapDrawPointY%d",MapDrawPointY);

		//カメラが止まっているときのカメラの中心からのプレイヤーの描画位置位置
		DrawString(0,180,"カメラが止まっているときのカメラの中心からのプレイヤーの描画位置位置",ty);
		DrawFormatString(0,200,ty,"P_DrawX%d",P_DrawX);
		DrawFormatString(0,220,ty,"P_DrawY%d",P_DrawY);		

		//マップチップ上でのプレイヤーの位置
		DrawString(0,260,"マップチップ上でのプレイヤーの位置",ty);
		DrawFormatString(0,280,ty,"coordinateX%d",coordinateX);	
		DrawFormatString(0,300,ty,"coordinateY%d",coordinateY);	

		//カメラ内でのプレイヤーのドット上での位置
		DrawString(0,340,"カメラ内でのプレイヤーのドット上での位置",ty);
		DrawFormatString(0,360,ty,"P_D_PointX%d",P_D_PointX);	
		DrawFormatString(0,380,ty,"P_D_PointY%d",P_D_PointY);

		// 裏画面の内容を表画面に映す
		ScreenFlip() ;

		// ウエイト
		WaitTimer( 100 ) ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: マップチップの座標のピクセル単位での移動

#4

投稿記事 by softya(ソフト屋) » 10年前

この掲示板で何度か書いてますが、まずマップでの移動と描画時の画面で表示される位置は切り分けで考えるとスッキリします。
なので、まずドット単位のキャラクタ移動とマップとの当たり判定を完成させて下さい。こちらで使う単位はマップ座標系と仮に名づけます。
その次にキャラクタを画面が追従することでスムーズなスクロール実現させます。こっちで使うのは描画座標系と仮に名づけます。
で、描画座標系は放置でスクロールなしの固定画面のままマップ座標系の処理を完成させましょう。

マップ座標系は、横(MAP_SIZE*MAP_WIDTH)と縦(MAP_SIZE*MAP_HEIGHT)のドットサイズを持つ座標系です。
画面に収まらなくても気にしなくてよいです。出来そうですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゴンマサ

Re: マップチップの座標のピクセル単位での移動

#5

投稿記事 by ゴンマサ » 10年前

softya(ソフト屋) 様

回答ありがとうございます。
頻出している回答を繰り返させてしまったようで申し訳ありませんでした。
頑張ります。
ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: マップチップの座標のピクセル単位での移動

#6

投稿記事 by softya(ソフト屋) » 10年前

このまま組めるかどうか、過去ログが参考になるかも問題ですので、どうしても分からない所は気にせずに聞いて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る