マップデータの座標取得

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

マップデータの座標取得

#1

投稿記事 by gf » 6年前

マップデータからプレイヤーがいまいるxy座標を表示する方法はありますか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: マップデータの座標取得

#2

投稿記事 by みけCAT » 6年前

その「マップデータ」によるでしょう。
「プレイヤーがいまいるxy座標を表示する方法」がある「マップデータ」ならあるでしょうし、ない「マップデータ」ならないでしょう。

もしも具体的にあるかないか、およびその方法を考えてほしいのであれば、「マップデータ」の詳細を提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

gf

Re: マップデータの座標取得

#3

投稿記事 by gf » 6年前

失礼しました。こういったマップデータです。

// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } ,
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 } ,
{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0 } ,
{ 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 } ,
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
} ;

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: マップデータの座標取得

#4

投稿記事 by みけCAT » 6年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

このマップデータとプレイヤーがいまいるxy座標の関係がわからないので、わかりません。
そもそも「マップデータからプレイヤーがいまいるxy座標を表示する方法」の意味がよくわからない気がするので、もう少し詳しく説明していただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

gf

Re: マップデータの座標取得

#5

投稿記事 by gf » 6年前

失礼しました。
本サイトのサンプルプログラムですが、
このようなゲームにプレイヤーの現在地点の座標を常に表示されるようにしたいと思っています。


コード:

#include "DxLib.h"

#define BLOCK_SIZE		1000.0f		// ブロックのサイズ

#define BLOCK_NUM_X		16		// X方向のブロック数
#define BLOCK_NUM_Z		16		// Z方向のブロック数

#define CAMERA_Y		500.0f		// カメラの高さ

// マップ( 1:道  0:壁 )
char Map[ BLOCK_NUM_Z ][ BLOCK_NUM_X ] =
{
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,1,1,1,1,0,1,1,1,0,1,1,0,1,1,0,
	0,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,
	0,1,1,1,1,1,1,0,1,0,0,1,1,1,1,0,
	0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,
	0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,
	0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,
	0,0,0,1,1,1,0,1,0,0,0,1,0,0,1,0,
	0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,
	0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,
	0,0,0,1,1,1,1,1,0,0,0,1,0,0,1,0,
	0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,
	0,1,1,1,0,1,0,0,0,0,1,0,1,0,1,0,
	0,1,0,1,1,1,0,0,0,1,1,0,1,0,0,0,
	0,1,0,1,0,0,0,1,1,1,0,0,1,1,1,0,
	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
} ;

// WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	int KabeModel ;		// 壁モデル
	int x, z ;		// 位置
	int movx, movz ;	// 移動先の座標
	int Muki ;		// 向き( 0:x軸プラス方向  1:z軸マイナス方向  2:x軸マイナス方向  3:z軸プラス方向 )
	int NowInput ;		// 現在のフレームの入力
	int BackInput ;		// 一つ前のフレームの入力
	int EdgeInput ;		// 入力のエッジ
	int FrameNo ;		// フレーム番号
	int i, j ;		// カウンタ
	VECTOR CamPos ;		// カメラの座標
	VECTOR CamTarg ;	// カメラの注視点

	// ウインドウモードで起動
	ChangeWindowMode( TRUE );

	// DXライブラリの初期化
	if( DxLib_Init() < 0 ) return -1;

	// 壁モデルの読みこみ
	KabeModel = MV1LoadModel( "Kabe.mqo" ) ;

	// 位置と向きと入力状態の初期化
	x = 1 ;
	z = 1 ;
	Muki = 0 ;
	NowInput = 0 ;

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

	// メインループ
	// エスケープキーが押されるまでループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面をクリアする
		ClearDrawScreen() ;

		// 入力情報を一つ前のフレームの入力に代入する
		BackInput = NowInput ;

		// 現在の入力を取得する
		NowInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

		// 現在のフレームで初めて押されたボタンを算出する
		EdgeInput = NowInput & ~BackInput ;

		// 上が押されたら向いている方向に移動する
		if( ( EdgeInput & PAD_INPUT_UP ) != 0 )
		{
			// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx =  1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz = -1 ; break ;		// Z軸マイナス方向
			case 2 : movx = -1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz =  1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			}
		}

		// 下が押されたら向いている方向と逆方向に移動する
		if( ( EdgeInput & PAD_INPUT_DOWN ) != 0 )
		{
			// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx = -1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz =  1 ; break ;		// Z軸マイナス方向
			case 2 : movx =  1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz = -1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			}
		}

		// 左が押されていたら向いている方向を左に90度変更する
		if( ( EdgeInput & PAD_INPUT_LEFT ) != 0 )
		{
			if( Muki == 0 )
			{
				Muki = 3 ;
			}
			else
			{
				Muki -- ;
			}
		}

		// 右が押されていたら向いている方向を右に90度変更する
		if( ( EdgeInput & PAD_INPUT_RIGHT ) != 0 )
		{
			if( Muki == 3 )
			{
				Muki = 0 ;
			}
			else
			{
				Muki ++ ;
			}
		}

		// カメラの座標をセット
		CamPos = VGet( x * BLOCK_SIZE, CAMERA_Y, z * BLOCK_SIZE ) ;

		// カメラの注視点をセット
		switch( Muki )
		{
		case 0 : CamTarg = VGet(  1.0f, 0.0f,  0.0f ) ; break ;	// X軸プラス方向
		case 1 : CamTarg = VGet(  0.0f, 0.0f, -1.0f ) ; break ;	// Z軸マイナス方向
		case 2 : CamTarg = VGet( -1.0f, 0.0f,  0.0f ) ; break ;	// X軸マイナス方向
		case 3 : CamTarg = VGet(  0.0f, 0.0f,  1.0f ) ; break ;	// Z軸プラス方向
		}
		CamTarg = VAdd( CamPos, CamTarg ) ;

		// カメラの位置と向きをセットする
		SetCameraPositionAndTarget_UpVecY( CamPos, CamTarg ) ;

		// マップを描画する
		for( i = 0 ; i < BLOCK_NUM_Z ; i ++ )
		{
			for( j = 0 ; j < BLOCK_NUM_X ; j ++ )
			{
				// 道ではないところは描画しない
				if( Map[ i ][ j ] == 0 ) continue ;

				// 壁モデルの座標を変更する
				MV1SetPosition( KabeModel, VGet( j * BLOCK_SIZE, 0.0f, i * BLOCK_SIZE ) ) ; 

				// 4方の壁の状態で描画するフレーム番号を変更する
				FrameNo = 0 ;
				if( Map[ i     ][ j + 1 ] == 0 ) FrameNo += 1 ;
				if( Map[ i     ][ j - 1 ] == 0 ) FrameNo += 2 ;
				if( Map[ i + 1 ][ j     ] == 0 ) FrameNo += 4 ;
				if( Map[ i - 1 ][ j     ] == 0 ) FrameNo += 8 ;

				// 割り出した番号のフレームを描画する
				MV1DrawFrame( KabeModel, FrameNo ) ;
			}
		}

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

	// DXライブラリの後始末
	DxLib_End() ;

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

ロード
記事: 12
登録日時: 7年前

Re: マップデータの座標取得

#6

投稿記事 by ロード » 6年前

変数x,yがそのままプレイヤーのいる位置になってるように見えます。座標で見たかったらx*BLOCK_SIZE y*BLOCK_SIZEとしたら見えるんじゃないでしょうか

返信

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