移動とジャンプが上手く行きません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
keito940
記事: 105
登録日時: 7年前

移動とジャンプが上手く行きません。

#1

投稿記事 by keito940 » 7年前

DXライブラリの公式サイトにあるサンプルコードを参考にして、アクションゲームを作っていて、当たり判定のプログラムを完成させたはいいのですが、何かの不具合でジャンプするとどこまでも飛んでいってしまう上に、左右に移動しようとしても全く反応しません。(正確には1マス動いて止まります。)コードは以下のとおりです。

コード:

#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)

float PlayerX = 24.0F, PlayerY = 216.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int	PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey); 
		for (int i = 0; i < 256; i++){ 
			if (tmpKey[i] != 0) {
				Key[i]++;
			}
			else {
				Key[i] = 0;
			}
		}
	return 0;
}
char 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,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,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,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,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, 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,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,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};

//マップチップ確認
int GetChipParam(float X, float Y)
{
	int x, y;

	x = (int)X / CHIP_SIZE;
	y = (int)Y / CHIP_SIZE;

	if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;

	return MapData[y][x];
}
//マップの当たり判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
	float afX, afY;
	afX = X + *MoveX;
	afY = Y + *MoveY;

	if (GetChipParam(X, Y) == 1) {
		float blx, bty, brx, bby;
		//壁衝突確認
		blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
		brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定

		bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
		bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
		//上辺に当たったら3を返す
		if (*MoveY > 0.0F) {
			*MoveY = bty - Y - 1.0F;
			return 3;
		}
		//下辺に当たっていたら4を返す
		if (*MoveY < 0.0F) {
			*MoveY = bby - Y - 1.0F;
			return 4;
		}
		if (*MoveX > 0.0F) {
			*MoveX = blx - X - 1.0F;
			return 1;
		}
		if (*MoveX < 0.0F) {
			*MoveX = brx - X + 1.0F;
			return 2;
		}
		return 4;
	}
	return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
	float Dummy = 0.0F;
	float hsize;

	hsize = Size*0.5F;
	//上下移動成分をチェック
	{
		//左下
		if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
		//右下
		if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
		//左上
		if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
		//右上
		if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
		//問題がないのなら移動成分を加算する
		*Y += MoveY;
	}
	//左右移動成分、以下同順
	{
		MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
		MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
		MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
		MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
		*X += MoveX;
	}
	{
		//空中にいるなら、何もしない
		if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
		}
		//もし足場に着地したらジャンプ回数をリセットする
		else {
			JumpCount = 0;
			Gravity = 0;
			*JumpFlag = FALSE;
		}
		return 0;
	}
}
int main(void) {
	SetDrawScreen(DX_SCREEN_BACK);
	Input = 0;
	Time = GetNowCount();//カウント値を更新する
	PlayerHandle = LoadGraph("テスト用.png");
	LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
	dir = TRUE;
	DashFlag = FALSE;
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
		//カウント値を更新する
		Time = GetNowCount();
		//入力状態を更新する
		{
			int i;
			i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
			//チョン押しを確認する
			EdgeInput = i & ~Input;
			Input = i;
		}
		//ダッシュトリガー確認
		if ((Input&PAD_INPUT_1) == 0) {
			DashFlag = FALSE;
		}
		if (JumpCount >= 2) {
			JumpFlag = TRUE;
		}
		//移動処理
		{
			float MoveX, MoveY;
			MoveX = 0.0F;
			MoveY = 0.0F;
			//左に移動
			if ((Input&PAD_INPUT_LEFT) != 0) {
				dir = FALSE;
				MoveX -= 5.0F;
			}
			//右に移動
			if ((Input&PAD_INPUT_RIGHT) != 0) {
				dir = TRUE;
				MoveX += 5.0F;
			}
			//左ラン
			if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
				dir = FALSE;
				DashFlag = TRUE;
				MoveX -= 5.25F;
			}
			//右ラン
			if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
				dir = TRUE;
				DashFlag = TRUE;
				MoveX += 5.25F;
			}
			//ダッシュボタン
			if ((EdgeInput&PAD_INPUT_3) != 0) {

			}
			//ジャンプ処理
			if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
				//ジャンプできる状態にする
				DropPower = 0;
				//ジャンプ回数を増やす
				JumpCount += 1;
				//ジャンプする
				DropPower = -9.5F;
				//ジャンプするときの重力を決める
				Gravity = 0.5F;
			}
			if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
				DashFlag = TRUE;
				DropPower = 0;
				JumpCount += 1;
				DropPower = -12.0F;
				Gravity = 0.5F;
			}
			//落下処理
			DropPower += Gravity;
			//落下速度を移動量に追加する
			MoveY = DropPower;
			//当たり判定に基づく移動を行う
			MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
		}
		//マップの描画
		{
			int i, j;
			for (i = 0; i < MAP_HEIGHT; i++) {
				for (j = 0; j < MAP_WIDTH; j++) {
					if (MapData[i][j] == 1) {
						DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
					}
				}
			}
		}
		//キャラの描画
		{
			if (dir == TRUE)
				DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
			else
				DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
		}
	}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
	//初期化
	if (DxLib_Init() == -1) {
		return -1;
	}
	//メインプログラム
	main();
	//DXライブラリを終了する
	DxLib_End();
	return 0;
}

添付ファイル
テスト用の素材.zip
ファイルがないよと言われましたので…
(528 バイト) ダウンロード数: 108 回
最後に編集したユーザー keito940 on 2017年1月18日(水) 15:59 [ 編集 1 回目 ]

sadora3
記事: 175
登録日時: 11年前

Re: 移動とジャンプが上手く行きません。

#2

投稿記事 by sadora3 » 7年前

画像がないので、こちらで実行しても真っ暗な画面が描画されるだけでした。
DrawBoxやDrawCircle関数を使い、頑張って画像なしでも実行出来るようにするか、画像も一緒に添付してくれると助かります。
以下は憶測で回答します。

212~215行目辺りが怪しそうです。

コード:

            //落下処理
            DropPower -= Gravity;
            //落下速度を移動量に追加する
            MoveY += DropPower;
このように直したら、ジャンプは正常になりませんでしょうか?

追記:
あ、違いました。失礼しました。
131行目をコメントアウトすればジャンプ出来るようになると思います。

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

Re: 移動とジャンプが上手く行きません。

#3

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

sadora3 さんが書きました:画像がないので、こちらで実行しても真っ暗な画面が描画されるだけでした。
DrawBoxやDrawCircle関数を使い、頑張って画像なしでも実行出来るようにするか、画像も一緒に添付してくれると助かります。
自分で適当な画像を作ればいいのではないでしょうか?
例えばこんなの(添付)とか。
添付ファイル
gazou.zip
テスト用画像
(608 バイト) ダウンロード数: 108 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 移動とジャンプが上手く行きません。

#4

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

コンパイルしてみたところ、126行目

コード:

		if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
で、&&の右側のコンマ演算子の左辺「*X + Size*0.5」の計算結果が使われていない、という警告が出ました。
意図した処理になっているかを確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#5

投稿記事 by keito940 » 7年前

sadora3 さんが書きました:画像がないので、こちらで実行しても真っ暗な画面が描画されるだけでした。
DrawBoxやDrawCircle関数を使い、頑張って画像なしでも実行出来るようにするか、画像も一緒に添付してくれると助かります。
以下は憶測で回答します。

212~215行目辺りが怪しそうです。

コード:

            //落下処理
            DropPower -= Gravity;
            //落下速度を移動量に追加する
            MoveY += DropPower;
このように直したら、ジャンプは正常になりませんでしょうか?

追記:
あ、違いました。失礼しました。
131行目をコメントアウトすればジャンプ出来るようになると思います。
それを試しては見たのですが、着地するとキャラが震えて、移動しようとしても、ブルブル震えている上に見えない壁に阻まれているかのような動きをしてしまいます。
みけCAT さんが書きました:コンパイルしてみたところ、126行目

コード:

		if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
で、&&の右側のコンマ演算子の左辺「*X + Size*0.5」の計算結果が使われていない、という警告が出ました。
意図した処理になっているかを確認してください。
ああ、言われてみれば、と思って

コード:

int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag,char *AirFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int	PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey); 
		for (int i = 0; i < 256; i++){ 
			if (tmpKey[i] != 0) {
				Key[i]++;
			}
			else {
				Key[i] = 0;
			}
		}
	return 0;
}
char 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,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,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,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,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, 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,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,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};

//マップチップ確認
int GetChipParam(float X, float Y)
{
	int x, y;

	x = (int)X / CHIP_SIZE;
	y = (int)Y / CHIP_SIZE;

	if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;

	return MapData[y][x];
}
//マップの当たり判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
	float afX, afY;
	afX = X + *MoveX;
	afY = Y + *MoveY;

	if (GetChipParam(X, Y) == 1) {
		float blx, bty, brx, bby;
		//壁衝突確認
		blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
		brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定

		bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
		bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
		//上辺に当たったら3を返す
		if (*MoveY > 0.0F) {
			*MoveY = bty - Y - 1.0F;
			return 3;
		}
		//下辺に当たっていたら4を返す
		if (*MoveY < 0.0F) {
			*MoveY = bby - Y - 1.0F;
			return 4;
		}
		if (*MoveX > 0.0F) {
			*MoveX = blx - X - 1.0F;
			return 1;
		}
		if (*MoveX < 0.0F) {
			*MoveX = brx - X + 1.0F;
			return 2;
		}
		return 4;
	}
	return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag,char *AirFlag) {
	float Dummy = 0.0F;
	float hsize;

	hsize = Size*0.5F;
	//上下移動成分をチェック
	{
		//左下
		if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
		//右下
		if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
		//左上
		if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
		//右上
		if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
		//問題がないのなら移動成分を加算する
		*Y += MoveY;
	}
	//左右移動成分、以下同順
	{
		MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
		MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
		MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
		MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
		*X += MoveX;
	}
	{
		//空中にいるなら、何もしない
		if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5F, *Y + Size*0.5F)) {
			*AirFlag = TRUE;
		}
		//もし足場に着地したらジャンプ回数をリセットする
		else {
			JumpCount = 0;
			*JumpFlag = FALSE;
		}
		return 0;
	}
}
int main(void) {
	SetDrawScreen(DX_SCREEN_BACK);
	Input = 0;
	Time = GetNowCount();//カウント値を更新する
	PlayerHandle = LoadGraph("テスト用.png");
	LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
	dir = TRUE;
	DashFlag = FALSE;
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
		//カウント値を更新する
		Time = GetNowCount();
		//入力状態を更新する
		{
			int i;
			i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
			//チョン押しを確認する
			EdgeInput = i & ~Input;
			Input = i;
		}
		//ダッシュトリガー確認
		if ((Input&PAD_INPUT_1) == 0) {
			DashFlag = FALSE;
		}
		if (JumpCount >= 2) {
			JumpFlag = TRUE;
		}
		//移動処理
		{
			float MoveX, MoveY;
			MoveX = 0.0F;
			MoveY = 0.0F;
			//左に移動
			if ((Input&PAD_INPUT_LEFT) != 0) {
				dir = FALSE;
				MoveX -= 5.0F;
			}
			//右に移動
			if ((Input&PAD_INPUT_RIGHT) != 0) {
				dir = TRUE;
				MoveX += 5.0F;
			}
			//左ラン
			if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
				dir = FALSE;
				DashFlag = TRUE;
				MoveX -= 5.25F;
			}
			//右ラン
			if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
				dir = TRUE;
				DashFlag = TRUE;
				MoveX += 5.25F;
			}
			//ダッシュボタン
			if ((EdgeInput&PAD_INPUT_3) != 0) {

			}
			//ジャンプ処理
			if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
				//ジャンプできる状態にする
				DropPower = 0;
				//ジャンプ回数を増やす
				JumpCount += 1;
				//ジャンプする
				DropPower -= 9.5F;
				//ジャンプするときの重力を決める
				Gravity = 0.5F;
			}
			if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
				DashFlag = TRUE;
				DropPower = 0;
				JumpCount += 1;
				DropPower -= 12.0F;
				Gravity = 0.5F;
			}
			//落下処理
			DropPower += Gravity;
			//落下速度を移動量に追加する
			MoveY = DropPower;
			//当たり判定に基づく移動を行う
			MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag,&AirFlag);
		}
		//マップの描画
		{
			int i, j;
			for (i = 0; i < MAP_HEIGHT; i++) {
				for (j = 0; j < MAP_WIDTH; j++) {
					if (MapData[i][j] == 1) {
						DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
					}
				}
			}
		}
		//キャラの描画
		{
			if (dir == TRUE)
				DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
			else
				DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
		}
	}
}
にしたのですが、やはりだめでした。
質問したときに言い忘れてたのですが、ランボタンが一度ジャンプしないと使えない上に、カクカクした動きになってしまいます。

sadora3
記事: 175
登録日時: 11年前

Re: 移動とジャンプが上手く行きません。

#6

投稿記事 by sadora3 » 7年前

>>みけCATさん
画像の件ですが、確かにこちらでも用意できましたから、そうすればよかったですね。
ご指摘ありがとうございます。今度そうします。

>>keito940さん
ああ、私の回答で混乱させてしまい申し訳ありません。
私が指摘した部分は触ってはいけませんでした。
ですので、NO1のソースコード(最初に提示して頂いた方です)の方に戻してください。

みけCATさんが指摘してくれたように、126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
こいつがいけなかったようです。

以下のように修正すると、動くようになると思います。

・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。

・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうする。

これでkeito940さんが求めていた動作になりませんでしょうか?

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#7

投稿記事 by keito940 » 7年前

sadora3 さんが書きました:>>みけCATさん
以下のように修正すると、動くようになると思います。

・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。

・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうする。

これでkeito940さんが求めていた動作になりませんでしょうか?
そのコードを試してみて、移動自体はできたのですが、ジャンプして着地するとまた見えない壁に阻まれてしまいます。
しかも、最大二段のつもりなのに、何段もジャンプできてしまいます。

sadora3
記事: 175
登録日時: 11年前

Re: 移動とジャンプが上手く行きません。

#8

投稿記事 by sadora3 » 7年前

>>keito940さん
あれ、おかしいですね。こちらではジャンプ後も正常に移動出来ましたし、ジャンプの回数は最大で2回までしか出来ませんでしたよ。

NO.1のソースコード(最初に提示したコード)の方に戻してから、8行目と126行目を修正しましたか?そうすれば大丈夫なはずなのですが。
もし、そうしたのであれば、またソースコードを見せて頂きたいです。

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#9

投稿記事 by keito940 » 7年前

sadora3 さんが書きました:>>keito940さん
あれ、おかしいですね。こちらではジャンプ後も正常に移動出来ましたし、ジャンプの回数は最大で2回までしか出来ませんでしたよ。

NO.1のソースコード(最初に提示したコード)の方に戻してから、8行目と126行目を修正しましたか?そうすれば大丈夫なはずなのですが。
もし、そうしたのであれば、またソースコードを見せて頂きたいです。
実は、最初のコードに戻していなかったことに気づいて、戻してみて今言われたことをやってみましたが、やはりジャンプがどこまでも飛んでいってしまいます。
コードを貼り付けますので、どこが悪いのか教えてくれませんか?

コード:

#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
 
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
    char tmpKey[256];
    GetHitKeyStateAll(tmpKey); 
        for (int i = 0; i < 256; i++){ 
            if (tmpKey[i] != 0) {
                Key[i]++;
            }
            else {
                Key[i] = 0;
            }
        }
    return 0;
}
char 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,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,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,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,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, 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,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,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
//マップチップ確認
int GetChipParam(float X, float Y)
{
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
//マップの当たり判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
 
    if (GetChipParam(X, Y) == 1) {
        float blx, bty, brx, bby;
        //壁衝突確認
        blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
        brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
 
        bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
        bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
        //上辺に当たったら3を返す
        if (*MoveY > 0.0F) {
            *MoveY = bty - Y - 1.0F;
            return 3;
        }
        //下辺に当たっていたら4を返す
        if (*MoveY < 0.0F) {
            *MoveY = bby - Y + 1.0F;
            return 4;
        }
        if (*MoveX > 0.0F) {
            *MoveX = blx - X - 1.0F;
            return 1;
        }
        if (*MoveX < 0.0F) {
            *MoveX = brx - X + 1.0F;
            return 2;
        }
        return 4;
    }
    return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
    float Dummy = 0.0F;
    float hsize;
 
    hsize = Size*0.5F;
    //上下移動成分をチェック
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //問題がないのなら移動成分を加算する
        *Y += MoveY;
    }
    //左右移動成分、以下同順
    {
        MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
        *X += MoveX;
    }
    {
        //空中にいるなら、何もしない
        if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
        }
        //もし足場に着地したらジャンプ回数をリセットする
        else {
            JumpCount = 0;
            Gravity = 0;
            *JumpFlag = FALSE;
        }
        return 0;
    }
}
int main(void) {
    SetDrawScreen(DX_SCREEN_BACK);
    Input = 0;
    Time = GetNowCount();//カウント値を更新する
    PlayerHandle = LoadGraph("テスト用.png");
    LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
    dir = TRUE;
    DashFlag = FALSE;
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
        //カウント値を更新する
        Time = GetNowCount();
        //入力状態を更新する
        {
            int i;
            i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
            //チョン押しを確認する
            EdgeInput = i & ~Input;
            Input = i;
        }
        //ダッシュトリガー確認
        if ((Input&PAD_INPUT_1) == 0) {
            DashFlag = FALSE;
        }
        if (JumpCount >= 2) {
            JumpFlag = TRUE;
        }
        //移動処理
        {
            float MoveX, MoveY;
            MoveX = 0.0F;
            MoveY = 0.0F;
            //左に移動
            if ((Input&PAD_INPUT_LEFT) != 0) {
                dir = FALSE;
                MoveX -= 5.0F;
            }
            //右に移動
            if ((Input&PAD_INPUT_RIGHT) != 0) {
                dir = TRUE;
                MoveX += 5.0F;
            }
            //左ラン
            if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = FALSE;
                DashFlag = TRUE;
                MoveX -= 5.25F;
            }
            //右ラン
            if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = TRUE;
                DashFlag = TRUE;
                MoveX += 5.25F;
            }
            //ダッシュボタン
            if ((EdgeInput&PAD_INPUT_3) != 0) {
 
            }
            //ジャンプ処理
            if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
                //ジャンプできる状態にする
                DropPower = 0;
                //ジャンプ回数を増やす
                JumpCount += 1;
                //ジャンプする
                DropPower = -9.5F;
                //ジャンプするときの重力を決める
                Gravity = 0.5F;
            }
            if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
                DashFlag = TRUE;
                DropPower = 0;
                JumpCount += 1;
                DropPower = -12.0F;
                Gravity = 0.5F;
            }
            //落下処理
            DropPower += Gravity;
            //落下速度を移動量に追加する
            MoveY = DropPower;
            //当たり判定に基づく移動を行う
            MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
        }
        //マップの描画
        {
            int i, j;
            for (i = 0; i < MAP_HEIGHT; i++) {
                for (j = 0; j < MAP_WIDTH; j++) {
                    if (MapData[i][j] == 1) {
                        DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
                    }
                }
            }
        }
        //キャラの描画
        {
            if (dir == TRUE)
                DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
            else
                DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
        }
    }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
    //初期化
    if (DxLib_Init() == -1) {
        return -1;
    }
    //メインプログラム
    main();
    //DXライブラリを終了する
    DxLib_End();
    return 0;
}
追記:サンプルコード見ておかしい点があったのでそれも修正しました。

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

Re: 移動とジャンプが上手く行きません。

#10

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

keito940 さんが書きました:

コード:

        //空中にいるなら、何もしない
        if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
        }
まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#11

投稿記事 by keito940 » 7年前

みけCAT さんが書きました: まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。
なるほど、当たり判定チェックにおかしい部分があるわけですね。
なお、コンマ演算子については自分で調べてみたので、なんとなくわかったんですが、具体的にどういうことか、コード付きで教えてください。
追記:ちなみに先程の書き込みは削除しました。質問の仕方が悪かったですね…。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 移動とジャンプが上手く行きません。

#12

投稿記事 by usao » 7年前

コード:

if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){
}
これの && の右側部分が,不幸にも(?)カンマ演算子がどうのという形として解釈されてコンパイルが通ってしまっているけども,
本当にやりたいことを書いた状態にするには

>・126行目の、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
>これを、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
>こうする。

なのでは? という指摘がなされている状態… ということだと思います.

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#13

投稿記事 by keito940 » 7年前

usao さんが書きました:

コード:

if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){
}
これの && の右側部分が,不幸にも(?)カンマ演算子がどうのという形として解釈されてコンパイルが通ってしまっているけども,
本当にやりたいことを書いた状態にするには

>・126行目の、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
>これを、
>if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
>こうする。

なのでは? という指摘がなされている状態… ということだと思います.
コードを調べてみたのですけど、ジャンプするとどこまでも飛んで行くというバグの原因はそういうことではないようですよ。

sadora3
記事: 175
登録日時: 11年前

Re: 移動とジャンプが上手く行きません。

#14

投稿記事 by sadora3 » 7年前

NO.9のソースコードを見ましたが、NO.1のソースコードに戻っていないように思われます。

http://difff.jp/
こちらのサイトでNO.9のコードと、NO.1のコードを比較しましたが、8行目と、126行目以外の行が書き換わっていました。具体的には、
82行目の
*MoveY = bby - Y - 1.0F;
が、
*MoveY = bby - Y + 1.0F;
に書き換わっていたり、110行目の
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
が、
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
に書き換わっていたりしています。


本当に、NO.1のソースコード(最初に提示して頂いた方です)の方に戻してから
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうしたのでしょうか?
これ以外の行の書き換えをしないで、一度実行してみてください。

それでもエラーや、不具合・自分が思った処理と違ったら、その内容を詳しく記述し、自分はどういう処理がしたいのかを書いて、ソースコードを見せてください。

[追記]
あと、みけCATさんがおっしゃっていた
「まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。」
というのは、

if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
こちらと下記のコードをよく見比べてみてください。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
論理演算子(&&)の右側に、GetChipParamをつけ忘れていますよ、という意味だと思います。

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#15

投稿記事 by keito940 » 7年前

sadora3 さんが書きました:NO.9のソースコードを見ましたが、NO.1のソースコードに戻っていないように思われます。

http://difff.jp/
こちらのサイトでNO.9のコードと、NO.1のコードを比較しましたが、8行目と、126行目以外の行が書き換わっていました。具体的には、
82行目の
*MoveY = bby - Y - 1.0F;
が、
*MoveY = bby - Y + 1.0F;
に書き換わっていたり、110行目の
if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
が、
if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
に書き換わっていたりしています。
そこは自分から気づいて直しました。
sadora3 さんが書きました:本当に、NO.1のソースコード(最初に提示して頂いた方です)の方に戻してから
・8行目のPlayerYの初期化子を、「216.0F」ではなく、「214.0F」にする。
・126行目の、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F) && (*X + Size*0.5, *Y + Size*0.5F)) {
これを、
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
こうしたのでしょうか?
これ以外の行の書き換えをしないで、一度実行してみてください。

それでもエラーや、不具合・自分が思った処理と違ったら、その内容を詳しく記述し、自分はどういう処理がしたいのかを書いて、ソースコードを見せてください。

[追記]
あと、みけCATさんがおっしゃっていた
「まだコンマ演算子の左辺、*X + Size*0.5Fを投げ捨てるコードのままですね。」
というのは、

if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
こちらと下記のコードをよく見比べてみてください。
if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F + 1.0f) == 0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F + 1.0f) == 0) {
論理演算子(&&)の右側に、GetChipParamをつけ忘れていますよ、という意味だと思います。
了解です!!!

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#16

投稿記事 by keito940 » 7年前

一応、これで解決なのですが、どうしても、キャラが2ドット浮いてしまいます。地面にしっかり着地していないとアクションゲームにはなりません。その上二段ジャンプも設計しているので、必然的に何か動き回りすぎると地面に埋まってしまいます。また、壁にぶつかるとそこにも埋まってしまいます。どうすればいいのでしょうか?

コード:

#include "dxlib.h"
#define SCREEN_WIDTH (320)
#define SCREEN_HEIGHT (240)
#define CHIP_SIZE (16)
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)
 
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag, AirFlag, DashTrigger;
int GetChipParam(float X, float Y);
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size, char *JumpFlag,char *AirFlag);
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);
int PlayerHandle, MapChipHandle[2], JumpCount, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() {
    char tmpKey[256];
    GetHitKeyStateAll(tmpKey); 
        for (int i = 0; i < 256; i++){ 
            if (tmpKey[i] != 0) {
                Key[i]++;
            }
            else {
                Key[i] = 0;
            }
        }
    return 0;
}
char 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,
    1,0,0,0,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,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,
    1,0,0,0,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,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,
    1,0,0,0,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,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,
 
    1,0,0,0,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,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,
    1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
    1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
//マップチップ確認
int GetChipParam(float X, float Y)
{
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
//マップの当たり判定
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
 
    if (GetChipParam(X, Y) == 1) {
        float blx, bty, brx, bby;		
        //壁衝突確認
        blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
        brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
 
        bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
        bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
        //上辺に当たったら3を返す
        if (*MoveY > 0.0F) {
			*MoveX = 0.0F;
            *MoveY = bty - Y - 1.0F;
            return 3;
        }
        //下辺に当たっていたら4を返す
        if (*MoveY < 0.0F) {
			*MoveX = 0.0F;
            *MoveY = bby - Y + 1.0F;
            return 4;
        }
        if (*MoveX > 0.0F) {
			*MoveY = 0.0F;
            *MoveX = blx - X - 1.0F;
            return 1;
        }
        if (*MoveX < 0.0F) {
			*MoveY = 0.0F;
            *MoveX = brx - X + 1.0F;
            return 2;
        }
        return 4;
    }
    return 0;
}
//当たり判定チェック
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag,char *AirFlag) {
    float Dummy = 0.0F;
    float hsize;

    hsize = Size*0.5F;
    //上下移動成分をチェック
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //問題がないのなら移動成分を加算する
        *Y += MoveY;
    }
    //左右移動成分、以下同順
    {
        MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
        *X += MoveX;
    }
    {
        //空中にいるなら、空中にいるとみなす
        if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && GetChipParam(*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0){
			*AirFlag = TRUE;
		}
        //もし足場に着地したらジャンプ回数や移動指数をリセットする
        else {
			*AirFlag = FALSE;
            JumpCount = 0;
            Gravity = 0;
            *JumpFlag = FALSE;
        }
        return 0;
    }
}
int main(void) {
    SetDrawScreen(DX_SCREEN_BACK);
    Input = 0;
    Time = GetNowCount();//カウント値を更新する
    PlayerHandle = LoadGraph("テスト用.png");
    LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
    dir = TRUE;
    DashFlag = FALSE;
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
        //カウント値を更新する
        Time = GetNowCount();
		//フレームを管理する
		while (GetNowCount() - Time < 1000 / 60) { Sleep(1); }
        //入力状態を更新する
        {
            int i;
            i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
            //チョン押しを確認する
            EdgeInput = i & ~Input;
            Input = i;
        }
        //ダッシュトリガー確認
        if ((Input&PAD_INPUT_1) == 0) {
            DashFlag = FALSE;
        }
        if (JumpCount >= 2) {
            JumpFlag = TRUE;
        }
        //移動処理
        {
            float MoveX, MoveY;
            MoveX = 0.0F;
            MoveY = 0.0F;
            //左に移動
            if ((Input&PAD_INPUT_LEFT) != 0) {
                dir = FALSE;
				MoveX -= 5.0F;
            }
            //右に移動
            if ((Input&PAD_INPUT_RIGHT) != 0) {
                dir = TRUE;
                MoveX += 5.0F;
            }
            //左ラン
            if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = FALSE;
                DashFlag = TRUE;
                MoveX -= 5.25F;
            }
            //右ラン
            if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = TRUE;
                DashFlag = TRUE;
                MoveX += 5.25F;
            }
            //ダッシュボタン
            if ((EdgeInput&PAD_INPUT_3) != 0) {
				int DashTimer = GetNowCount();

            }
            //ジャンプ処理
            if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
                //ジャンプできる状態にする
                DropPower = 0;
                //ジャンプ回数を増やす
                JumpCount += 1;
                //ジャンプする
                DropPower -= 9.5F;
                //ジャンプするときの重力を決める
                Gravity = 0.5F;
            }
            if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
                DashFlag = TRUE;
                DropPower = 0;
                JumpCount += 1;
                DropPower -= 12.0F;
                Gravity = 0.5F;
            }
            //落下処理
            DropPower += Gravity;
            //落下速度を移動量に追加する
            MoveY = DropPower;
            //当たり判定に基づく移動を行う
			MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE, &JumpFlag, &AirFlag);
        }
        //マップの描画
        {
            int i, j;
            for (i = 0; i < MAP_HEIGHT; i++) {
                for (j = 0; j < MAP_WIDTH; j++) {
                    if (MapData[i][j] == 1) {
                        DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
                    }
                }
            }
        }
        //キャラの描画
        {
            if (dir == TRUE)
                DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
            else
                DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
        }
    }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
    //初期化
    if (DxLib_Init() == -1) {
        return -1;
    }
    //メインプログラム
    main();
    //DXライブラリを終了する
    DxLib_End();
    return 0;
}

Math

Re: 移動とジャンプが上手く行きません。

#17

投稿記事 by Math » 7年前

□ printfデバッグをして手掛かりをつかみましょう。怪しい変数を表示してみましょう。
□ 大きいサイズの関数はデバッグしにくいです。小さくしましょう。
□ コメントは沢山書いた方があとで見た時役立ちます。ひと月後の自分は他人です。
(コードは直したものではないかも。要チェックです。)

コード:

#include "dxlib.h"           //ヘッダー部分
#define SCREEN_WIDTH (320)  //幅
#define SCREEN_HEIGHT (240)//高さ
#define CHIP_SIZE (16)                        //CHIPサイズ
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)   //MAP幅
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)//MAP高さ
//////プレイヤーX,Y:                    DropPower:      重力               
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;    //方向,JumpFlag,DashFlag,AirFlag
int GetChipParam(float X, float Y);//////////////////////////////////////////////////////////////////////////
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);//
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);//////////////////////////////////////////////////
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() { ///----------------------------------------------------------------gpUpdateKey--
    char tmpKey[256];
    GetHitKeyStateAll(tmpKey); 
        for (int i = 0; i < 256; i++){ 
            if (tmpKey[i] != 0) {
                Key[i]++;
            }
            else {
                Key[i] = 0;
            }
        }
    return 0;
}//----------------------------------------------------------------------------------------------------
char MapData[MAP_HEIGHT][MAP_WIDTH] = ///---------MapData[][]
{
    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,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,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,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,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, 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,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, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
//マップチップ確認---------------------------------------------------GetChipParam--
int GetChipParam(float X, float Y)
{
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
//マップの当たり判定--------------------------------------------------MapHitCheck--
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
 
    if (GetChipParam(X, Y) == 1) {
        float blx, bty, brx, bby;
        //壁衝突確認
        blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
        brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
 
        bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
        bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
        //上辺に当たったら3を返す
        if (*MoveY > 0.0F) {
            *MoveY = bty - Y - 1.0F;
            return 3;
        }
        //下辺に当たっていたら4を返す
        if (*MoveY < 0.0F) {
            *MoveY = bby - Y + 1.0F;
            return 4;
        }
        if (*MoveX > 0.0F) {
            *MoveX = blx - X - 1.0F;
            return 1;
        }
        if (*MoveX < 0.0F) {
            *MoveX = brx - X + 1.0F;
            return 2;
        }
        return 4;
    }
    return 0;
}
//当たり判定チェック----------------------------------------------------------------------------MoveChecker
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
    float Dummy = 0.0F;
    float hsize;
 
    hsize = Size*0.5F;
    //上下移動成分をチェック
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //問題がないのなら移動成分を加算する
        *Y += MoveY;
    }
    //左右移動成分、以下同順
    {
        MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
        *X += MoveX;
    }
    {
        //空中にいるなら、何もしない
        if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
        }
        //もし足場に着地したらジャンプ回数をリセットする
        else {
            JumpCount = 0;
            Gravity = 0;
            *JumpFlag = FALSE;
        }
        return 0;
    }
}
int draw_map() { ///-------------------------------------------------draw_map--
    int i, j;
    for (i = 0; i < MAP_HEIGHT; i++) {
        for (j = 0; j < MAP_WIDTH; j++) {
            if (MapData[i][j] == 1) {
                DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
            }
        }
    } return 0;
} 
int draw_char() { printf("\n\n.PlayerX=%d\t .PlayerY=%d\t .dir=%d\t",(int)PlayerX,(int)PlayerY,dir);///--draw_char--
	if (dir == TRUE){ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
	}else{ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);} return 0;
}
int main(void) { printf("②main()--->\t");///-----------------------------main--
    //SetDrawScreen(DX_SCREEN_BACK);
    //Input = 0;
    //Time = GetNowCount();//カウント値を更新する
    //PlayerHandle = LoadGraph("テスト用.png");
    //LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
    //dir = TRUE;
    //DashFlag = FALSE;
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
		draw_map(); draw_char();//マップの描画 //キャラの描画 
        //カウント値を更新する
        Time = GetNowCount();system("cls");printf("③Time=%d\t",Time);
        //入力状態を更新する
        {
            int i;
            i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
            //チョン押しを確認する
            EdgeInput = i & ~Input;
            Input = i;printf("④i=%d\n\n",i);
        }
        //ダッシュトリガー確認
        if ((Input&PAD_INPUT_1) == 0) {
            DashFlag = FALSE;
        }printf("⑤DashFlag=%d\t",DashFlag);
        if (JumpCount >= 2) {
            JumpFlag = TRUE;
		}printf("6:JumpFlag=%d\t",JumpFlag);
        //移動処理
        {
            float MoveX, MoveY;
            MoveX = 0.0F;
            MoveY = 0.0F;
            //左に移動
            if ((Input&PAD_INPUT_LEFT) != 0) {
                dir = FALSE;
                MoveX -= 5.0F;
            }
            //右に移動
            if ((Input&PAD_INPUT_RIGHT) != 0) {
                dir = TRUE;
                MoveX += 5.0F;
            }
            //左ラン
            if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = FALSE;
                DashFlag = TRUE;
                MoveX -= 5.25F;
            }
            //右ラン
            if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = TRUE;
                DashFlag = TRUE;
                MoveX += 5.25F;
            }
            //ダッシュボタン
            if ((EdgeInput&PAD_INPUT_3) != 0) {
 
            }
            //ジャンプ処理
            if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
                //ジャンプできる状態にする
                DropPower = 0;
                //ジャンプ回数を増やす
                JumpCount += 1;
                //ジャンプする
                DropPower = -9.5F;
                //ジャンプするときの重力を決める
                Gravity = 0.5F;
            }
            if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
                DashFlag = TRUE;
                DropPower = 0;
                JumpCount += 1;
                DropPower = -12.0F;
                Gravity = 0.5F;
            }
            //落下処理
            DropPower += Gravity;
            //落下速度を移動量に追加する
            MoveY = DropPower;
            //当たり判定に基づく移動を行う
            MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
        }
		draw_char();//キャラの描画 
		//{
        //    int i, j;
        //    for (i = 0; i < MAP_HEIGHT; i++) {
        //        for (j = 0; j < MAP_WIDTH; j++) {
        //            if (MapData[i][j] == 1) {
        //                DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
        //            }
        //        }
        //    }
        //}
        //{
        //    if (dir == TRUE)
        //        DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
        //    else
        //        DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);
        //}
    }
}
///------------------------------------------------------------------init--
int init(void) {
    ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);printf("①init()--->\t");
    if (DxLib_Init() == -1) { exit(-1); } //初期化
    SetDrawScreen(DX_SCREEN_BACK);       //
	Input = 0; Time = GetNowCount();    //カウント値を更新する
    PlayerHandle = LoadGraph("テスト用.png");
    LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
    dir = TRUE; DashFlag = FALSE; return 0;
}///---------------------------------------------------------------------------------------------WinMain--
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    //ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);
    //初期化
    //if (DxLib_Init() == -1) {
    //    return -1;
    //}
    //メインプログラム
    AllocConsole();FILE* out=0;freopen_s( &out, "CON", "w", stdout );///コンソール-[Debug Print]
	init(); //初期化処理
    main();//メイン
    fclose(out);FreeConsole();///Close-コンソール解放-[Debug Print]
         //DXライブラリを終了する
    DxLib_End(); return 0;
}///------------------------exit--

Math

#18

投稿記事 by Math » 7年前

すみません。間違えてます。

コード:

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
		draw_map(); //マップの描画 
        //カウント値を更新する

keito940
記事: 105
登録日時: 7年前

Re: 移動とジャンプが上手く行きません。

#19

投稿記事 by keito940 » 7年前

ということは解決ってことでいいですよね?

Math

Re: 移動とジャンプが上手く行きません。

#20

投稿記事 by Math » 7年前

今VistaのWindowsが起動しなくなり”システムの回復”をしたのでいろいろ設定を変えました。
VistaのVC++2008コマンドライン・コンパイラーのテストをしています。(Vistaから投稿)

コマンドライン・コンパイラー

コード:

D:\h\25\g1>g

D:\h\25\g1>nmake -f g.mak

Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /I"d:\dxlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

g1.cpp
        link /out:g1.exe /SUBSYSTEM:WINDOWS /LIBPATH:"d:\dxlib" "kernel32.lib" "user32.lib" "gdi32.l
ib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib"
 "odbc32.lib" "odbccp32.lib" g1.obj
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        g1.exe
コード

コード:

#include "dxlib.h"           //ヘッダー部分
#define SCREEN_WIDTH (320)  //幅
#define SCREEN_HEIGHT (240)//高さ
#define CHIP_SIZE (16)                        //CHIPサイズ
#define MAP_WIDTH (SCREEN_WIDTH/CHIP_SIZE)   //MAP幅
#define MAP_HEIGHT (SCREEN_HEIGHT/CHIP_SIZE)//MAP高さ
//////プレイヤーX,Y:                    DropPower:      重力 
float PlayerX = 24.0F, PlayerY = 214.0F, DropPower = 0.0F,Gravity;
char dir, JumpFlag, DashFlag,AirFlag;    //方向,JumpFlag,DashFlag,AirFlag
int GetChipParam(float X, float Y);//////////////////////////////////////////////////////////////////////////
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY, float Size,char *JumpFlag);//
int MapHitCheck(float X,float Y,float *MoveX,float *MoveY);//////////////////////////////////////////////////
int PlayerHandle, MapChipHandle[2], JumpCount, DashTrigger, Time, Input,EdgeInput;
int Key[256];
int gpUpdateKey() { ///----------------------------------------------------------------gpUpdateKey--
    char tmpKey[256];
    GetHitKeyStateAll(tmpKey); 
        for (int i = 0; i < 256; i++){ 
            if (tmpKey[i] != 0) {
                Key[i]++;
            }
            else {
                Key[i] = 0;
            }
        }
    return 0;
}//----------------------------------------------------------------------------------------------------
char MapData[MAP_HEIGHT][MAP_WIDTH] = ///---------MapData[][]
{
    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,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,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,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,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, 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,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, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,
};
 
//マップチップ確認---------------------------------------------------GetChipParam--
int GetChipParam(float X, float Y)
{
    int x, y;
 
    x = (int)X / CHIP_SIZE;
    y = (int)Y / CHIP_SIZE;
 
    if (x >= MAP_WIDTH || y >= MAP_HEIGHT || x < 0 || y < 0) return 0;
 
    return MapData[y][x];
}
//マップの当たり判定--------------------------------------------------MapHitCheck--
int MapHitCheck(float X, float Y, float *MoveX, float *MoveY) {
    float afX, afY;
    afX = X + *MoveX;
    afY = Y + *MoveY;
 
    if (GetChipParam(X, Y) == 1) {
        float blx, bty, brx, bby;
        //壁衝突確認
        blx = (float)((int)afX / CHIP_SIZE)*CHIP_SIZE;//左辺の当たり判定
        brx = (float)((int)afX / CHIP_SIZE + 1)*CHIP_SIZE;//右辺の当たり判定
 
        bty = (float)((int)afY / CHIP_SIZE)*CHIP_SIZE;//上辺の当たり判定
        bby = (float)((int)afY / CHIP_SIZE + 1)*CHIP_SIZE;//下辺の当たり判定
        //上辺に当たったら3を返す
        if (*MoveY > 0.0F) {
            *MoveY = bty - Y - 1.0F;
            return 3;
        }
        //下辺に当たっていたら4を返す
        if (*MoveY < 0.0F) {
            *MoveY = bby - Y + 1.0F;
            return 4;
        }
        if (*MoveX > 0.0F) {
            *MoveX = blx - X - 1.0F;
            return 1;
        }
        if (*MoveX < 0.0F) {
            *MoveX = brx - X + 1.0F;
            return 2;
        }
        return 4;
    }
    return 0;
}
//当たり判定チェック----------------------------------------------------------------------------MoveChecker
int MoveChecker(float *X, float *Y, float *DropPower, float MoveX, float MoveY,float Size, char *JumpFlag) {
    float Dummy = 0.0F;
    float hsize;
 
    hsize = Size*0.5F;
    //上下移動成分をチェック
    {
        //左下
        if (MapHitCheck(*X - hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //右下
        if (MapHitCheck(*X + hsize, *Y + hsize, &Dummy, &MoveY) == 3) *DropPower = 0.0F;
        //左上
        if (MapHitCheck(*X - hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //右上
        if (MapHitCheck(*X + hsize, *Y - hsize, &Dummy, &MoveY) == 4) *DropPower = -1.0F;
        //問題がないのなら移動成分を加算する
        *Y += MoveY;
    }
    //左右移動成分、以下同順
    {
        MapHitCheck(*X - hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y + hsize, &MoveX, &Dummy);
        MapHitCheck(*X - hsize, *Y - hsize, &MoveX, &Dummy);
        MapHitCheck(*X + hsize, *Y - hsize, &MoveX, &Dummy);
        *X += MoveX;
    }
    {
        //空中にいるなら、何もしない
        if (GetChipParam(*X - Size*0.5F, *Y + Size*0.5F+1.0F)==0 && (*X + Size*0.5F, *Y + Size*0.5F+1.0F)==0) {
        }
        //もし足場に着地したらジャンプ回数をリセットする
        else {
            JumpCount = 0;
            Gravity = 0;
            *JumpFlag = FALSE;
        }
        return 0;
    }
}
int draw_map() { ///-------------------------------------------------draw_map--
    int i, j;
    for (i = 0; i < MAP_HEIGHT; i++) {
        for (j = 0; j < MAP_WIDTH; j++) {
            if (MapData[i][j] == 1) {
                DrawGraph(j * CHIP_SIZE, i*CHIP_SIZE, MapChipHandle[1],TRUE);
            }
        }
    } return 0;
} 
int draw_char() { ///------------------------------------------------draw_char--
	if (dir == TRUE){ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0.0, PlayerHandle, TRUE, FALSE);
	}else{ DrawRotaGraph((int)PlayerX, (int)PlayerY, 1.0, 0, PlayerHandle, TRUE, TRUE);} return 0;
}
int main(void) { printf("②main()--->\t");///-----------------------------main--

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {
        draw_map(); //マップの描画
        //カウント値を更新する
        Time = GetNowCount();system("cls");printf("③Time=%d\t",Time);
        //入力状態を更新する
        {
            int i;
            i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
            //チョン押しを確認する
            EdgeInput = i & ~Input;
            Input = i;printf("④i=%d\n\n",i);
        }
        //ダッシュトリガー確認
        if ((Input&PAD_INPUT_1) == 0) {
            DashFlag = FALSE;
        }printf("⑤DashFlag=%d\t",DashFlag);
        if (JumpCount >= 2) {
            JumpFlag = TRUE;
		}printf("6:JumpFlag=%d\t",JumpFlag);
        //移動処理
        {
            float MoveX, MoveY;
            MoveX = 0.0F;
            MoveY = 0.0F;
            //左に移動
            if ((Input&PAD_INPUT_LEFT) != 0) {
                dir = FALSE;
                MoveX -= 5.0F;
            }
            //右に移動
            if ((Input&PAD_INPUT_RIGHT) != 0) {
                dir = TRUE;
                MoveX += 5.0F;
            }
            //左ラン
            if ((Input&PAD_INPUT_LEFT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = FALSE;
                DashFlag = TRUE;
                MoveX -= 5.25F;
            }
            //右ラン
            if ((Input&PAD_INPUT_RIGHT) != 0 && (Input&PAD_INPUT_1) != 0 && JumpFlag == FALSE) {
                dir = TRUE;
                DashFlag = TRUE;
                MoveX += 5.25F;
            }
            //ダッシュボタン
            if ((EdgeInput&PAD_INPUT_3) != 0) {
 
            }
            //ジャンプ処理
            if ((EdgeInput&PAD_INPUT_2) != 0 && JumpFlag == FALSE) {
                //ジャンプできる状態にする
                DropPower = 0;
                //ジャンプ回数を増やす
                JumpCount += 1;
                //ジャンプする
                DropPower = -9.5F;
                //ジャンプするときの重力を決める
                Gravity = 0.5F;
            }
            if ((EdgeInput&PAD_INPUT_2) != 0 && DashFlag == TRUE && JumpFlag == FALSE) {
                DashFlag = TRUE;
                DropPower = 0;
                JumpCount += 1;
                DropPower = -12.0F;
                Gravity = 0.5F;
            }
            //落下処理
            DropPower += Gravity;
            //落下速度を移動量に追加する
            MoveY = DropPower;
            //当たり判定に基づく移動を行う
            MoveChecker(&PlayerX, &PlayerY, &DropPower, MoveX, MoveY, CHIP_SIZE,&JumpFlag);
        }
        draw_char();
    }
}
///------------------------------------------------------------------init--
int init(void) {
    ChangeWindowMode(TRUE), SetGraphMode(320, 240, 32);printf("①init()--->\t");
    if (DxLib_Init() == -1) { return -1; }//初期化
    SetDrawScreen(DX_SCREEN_BACK);       //
	Input = 0; Time = GetNowCount();    //カウント値を更新する
    PlayerHandle = LoadGraph("テスト用.png");
    LoadDivGraph("マップチップ.bmp", 2, 2, 1, 16, 16, MapChipHandle);
    dir = TRUE; DashFlag = FALSE; return 0;
}///---------------------------------------------------------------------------------------------WinMain--
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

    AllocConsole();FILE* out=0;freopen_s( &out, "CON", "w", stdout );///コンソール-[Debug Print]
	init(); //初期化処理
    main();//メイン
    fclose(out);FreeConsole();///Close-コンソール解放-[Debug Print]
         //DXライブラリを終了する
    DxLib_End(); return 0;
}///------------------------exit--
あれXキーを押すと飛び上がったままだ。コードがあってるか見てください。(よく見てません)

閉鎖

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