C++ DXLIBでキャラ移動

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

C++ DXLIBでキャラ移動

#1

投稿記事 by guran » 8年前

yahooの質問版に書いたのですが
こちらを使った方がいいと聞き
初投稿させていただきました。
規約を読んだうえで今回は相互リンクをします。

http://detail.chiebukuro.yahoo.co.jp/qa ... 1277289862

に質問内容を載せています。

簡単に言うとキャラの移動です。
フレームとかの概念を頭に入れながらやったら
混乱しています。
よろしければお願いします。

アバター
パコネコ
記事: 139
登録日時: 10年前
住所: 大阪

Re: C++ DXLIBでキャラ移動

#2

投稿記事 by パコネコ » 8年前

コード:

// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX, int ScrollY )
{
	int j , i ;
	int MapDrawPointX , MapDrawPointY ;
	int DrawMapChipNumX , DrawMapChipNumY ;
	int gh[12];
	LoadDivGraph("mainkyara.png",12,3,4,32,32,gh) ;

// 描画するマップチップの数をセット
	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 >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;

// マップデータが0だったら四角を描画する
			if( MapData[ 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 ) ;
			}
		}
	}
	DrawRotaGraph( ( PlayerX - MapDrawPointX ) * MAP_SIZE + 32, ( PlayerY - MapDrawPointY ) * MAP_SIZE +32, 1.0, 0.0, gh[1], TRUE ); // x,y の位置にキャラを描画
}
とりあえずインデントそろえました。

こちらから質問になってしまうのですが、
このプログラムは一度呼び出したらソレで終わりでしょうか?
もし、メインのプログラムから描写用に毎回呼び出しているのでしたら、問題があるのですが...
主にロード関係に...

言っている事がよくわかりませんでしたら、
このプログラムを呼び出しているプログラムも見せていただけると答えやすいです。
と、言っていると思ってくれていいです。

////////
一応、元の質問の解答としましては、

コード:

	DrawRotaGraph( ( PlayerX - MapDrawPointX ) * MAP_SIZE + 32, ( PlayerY - MapDrawPointY ) * MAP_SIZE +32, 1.0, 0.0, gh[1], TRUE ); // x,y の位置にキャラを描画

gh[]
の部分を書き換えて行います。
マス単位で移動なさっているのでしたら、
(マスからマスへ細かい移動を行っている)
gh[(PlayerX%32+PlayerY%32)/10%3+muki*3]
この場合モーション数がおそらく3で、向きパターンが4パターンと過程しました。
仕様が分からなければこのぐらいのことしか描けません。
合っているのか分からないので解説も今回はなしにします。
ニャン!!\(゜ロ\)(/ロ゜)/

guran

Re: C++ DXLIBでキャラ移動

#3

投稿記事 by guran » 8年前

返信ありがとうございます。

質問内容ですが
ゲームループはあります。
ゲームループ内で何度も呼び出されます。

モーションは3、向き4であっています。

コード:

// マップスクロール基本
#include "DxLib.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 ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;

// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX, int ScrollY )
{
	int j , i ;
	int MapDrawPointX , MapDrawPointY ;		// 描画するマップ座標値
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数
      int gh[12];
             LoadDivGraph("mainkyara.png",12,3,4,32,32,gh) ;
 
	// 描画するマップチップの数をセット
	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 >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;

			// マップデータが0だったら四角を描画する
			if( MapData[ 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 ) ;
			}
		}
	}

	// プレイヤーの描画
	DrawRotaGraph( ( PlayerX - MapDrawPointX ) * MAP_SIZE + 32, ( PlayerY - MapDrawPointY ) * MAP_SIZE +32, 1.0, 0.0, gh[1], TRUE ); // x,y の位置にキャラを描画
 }

// 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 = 2 ;
	PlayerY = 2 ;

	// 最初は停止中(0)にしておく
	Move = 0 ;

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

		// 移動中ではない場合キー入力を受け付ける
		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[ 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 ;					// ソフトの終了
}

これが現状のコードです。
GraphDrawにKeyを渡して
表示方法を変えてみたりしたのですが
うまくいきません。
やり方が悪いのは明白ですが
ぜんぜんわかりません・・・

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

Re: C++ DXLIBでキャラ移動

#4

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

いくつか問題がありますが、まず基本的なところから直して行きましょう。
・ SetGraphMode( 640 , 480 , 16 ) ;よほどパソコンに問題がない限りSetGraphMode( 640 , 480 , 32 ) ;の方が良いと思います。それに他のウィンドウサイズを切り替えられる害が出ないです。
・ChangeWindowMode(TRUE);で少なくともデバッガグ中はウィンドウモードにしましょう。起動が早くなります。
・LoadDivGraph()でGraphDraw()関数が呼び出される度に読み込んでいます。初期化専用の関数を用意しましょう。int gh[12];は関数の外に。
とりあえず、これを直して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: C++ DXLIBでキャラ移動

#5

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

>モーションは3、向き4であっています。

との事ですが、RPGツクール用の素材に詳しくないのでモーションをどの様な順番で表示して良いのか分かりません。
0→1→2とかまずアニメーションのパターンを整理しましょう。
それと向きをどうやって反映させるか考えないといけません。

わかりやすく配列に書くのも手です。
int pattern[4][3] = { ← 4つの方向と3つのパターンと言う意味になります。
{0,1,2}, //mukiが0の時に表示する画像の番号が3パターン
{3,4,5}, //mukiが1の時に表示する画像の番号が3パターン
{6,7,8}, //mukiが2の時に表示する画像の番号が3パターン
{9,10,11}, //mukiが3の時に表示する画像の番号が3パターン
};
これでこの配列を使ってやればアニメーションできますね。
gh[ pattern[muki][anim] ]

DrawRotaGraph( ( PlayerX - MapDrawPointX ) * MAP_SIZE + 32, ( PlayerY - MapDrawPointY ) * MAP_SIZE +32, 1.0, 0.0, gh[ pattern[muki][anim] ], TRUE );
としてやれば向きを変えて歩かせることができます。
ただ、animの数値が決まっていません。
何を基準に歩かせるべきでしょうか?
int anim = ?;
考えてみてください。

[追記]
おっと向きのデータ(muki)も無いですね。
mukiもどうやって作り出すか考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

guran

Re: C++ DXLIBでキャラ移動

#6

投稿記事 by guran » 8年前

softyaさんありがとうございます。
一応出来はしたのですが・・・

アニメーション(anim)は1→2→0→1です。

現在のコードです。

コード:

// マップスクロール基本
#include "DxLib.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 ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;

//キャラ画像を入れる配列
int gh[12];
int pattern[4][3]={
	{0,1,2},
	{3,4,5},
	{6,7,8},
	{9,10,11},
};

int muki=0;			//キャラの向き
int anim=1;			//アニメーション用変数


static void init()		//初期化関数
{	
	LoadDivGraph("mainkyara.png",12,3,4,32,32,gh);
}

// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX, int ScrollY )
{
	int j , i ;
	int MapDrawPointX , MapDrawPointY ;		// 描画するマップ座標値
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数

	init();		//初期化専用関数

	// 描画するマップチップの数をセット
	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 >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;

			// マップデータが0だったら四角を描画する
			if( MapData[ 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 ) ;
			}
		}
	}
	DrawRotaGraph( ( PlayerX - MapDrawPointX ) * MAP_SIZE + 32, ( PlayerY - MapDrawPointY ) * MAP_SIZE +32,
					1.0, 0.0, gh[pattern[muki][anim]], TRUE ); // x,y の位置にキャラを描画
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	int ScrollX, ScrollY ;
	ChangeWindowMode( TRUE ) ;

	SetGraphMode( 640 , 480 , 32 ) ;

	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}

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

	// プレイヤーの初期位置をセット
	PlayerX = 2 ;
	PlayerY = 2 ;

	// 最初は停止中(0)にしておく
	Move = 0 ;

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

		// 移動中ではない場合キー入力を受け付ける
		if( Move == 0 )
		{
			// キー入力を得る
			Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

			// キー入力に応じてプレイヤーの座標を移動
			if( Key & PAD_INPUT_LEFT )
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
				muki = 1;
			}
			if( Key & PAD_INPUT_RIGHT )
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
				muki = 2;
			}
			if( Key & PAD_INPUT_UP )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				muki = 3;
			}
			if( Key & PAD_INPUT_DOWN )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
				muki = 0;
			}

			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 )
			{
				if( MapData[ 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 ;

				anim=1;//止まってる画像は1なので1に直す
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;
				ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;

				//キャラ移動時のアニメーション
				if(MoveCounter == MOVE_FRAME/4 ||MoveCounter == MOVE_FRAME/4*2 ||MoveCounter == MOVE_FRAME/4*3 ){
					anim++;
					if(anim > 2){
						anim=0;
					}
				}
			}
		}

		// マップとプレイヤーを描画
		GraphDraw( ScrollX, ScrollY ) ;

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

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

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

移動までできました。
でもなんか少しぎこちない動きです。
(気のせいかな)
あとコードもこれできれいかどうか
わかりません。
何か少しでもおかしいところがあれば
是非教えてください。お願いします。

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

Re: C++ DXLIBでキャラ移動

#7

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

私の知る3コマパターンのアニメって、右・左・停の組み合わせで「右→停→左→停→くりかえし」とするのが定番かと思ってのですが違うんでしょうか?
違うのならそれで構いません。

[追記]調べてみたところRPGツクールは右・停・左のパターン様です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: C++ DXLIBでキャラ移動

#8

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

4パターンで1セットにしたい場合は、
#define ANIM_PATTERN_NUM 4
int pattern[4][ANIM_PATTERN_NUM]={
{1,2,0,1},//1→0→1→2
{3,4,5},//以下も修正して下さい。
{6,7,8},
{9,10,11},
};
でアニメの所はanim=0;にしてもらって
anim=(anim+1)%ANIM_PATTERN_NUM;
とすればすっきりします。
こうするとanimが0→1→2→3と変化すれば、patternから拾ってくるデータは1→0→1→2となるわけです。
とりあえず、アニメパターンはこれで直してみてください。

あとこれも簡単に出来ますので考えてみてください。%を使います。
if(MoveCounter == MOVE_FRAME/4 ||MoveCounter == MOVE_FRAME/4*2 ||MoveCounter == MOVE_FRAME/4*3 ){
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

guran

Re: C++ DXLIBでキャラ移動

#9

投稿記事 by guran » 8年前

なるほど、
これでアニメーションができました。
アドバイスありがとうございました!

guran

Re: C++ DXLIBでキャラ移動

#10

投稿記事 by guran » 8年前

っと;;
No8みずにNo9書いちゃいました;;
8番も参考にします、ありがとうございました!

閉鎖

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