プレイヤーの移動処理がうまくいかない

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: プレイヤーの移動処理がうまくいかない

Re: プレイヤーの移動処理がうまくいかない

#3

by みけCAT » 5年前

CharMove関数の引数plxおよびplyを参照にすることで、
CharMove関数内での座標の更新がPlayer_tに反映されるようにするとよさそうな気がします。

Re: プレイヤーの移動処理がうまくいかない

#2

by dic » 5年前

さすがみなさん
わかってらっしゃる

プレイヤーの移動処理がうまくいかない

#1

by さか » 5年前

DXライブラリを使ってゲームを作成しているのですが、プレイヤーの移動処理がうまくいかなくて困っています。
落下処理が処理されず、左右のキーを押してもプレイヤーの座標が変わりません。
どうすればいいのでしょうか?

コード:

#include "All.h"
#include "DxLib.h"

//プレイヤーの初期化
void Player_Init(Player_t *pl, int x, int y, int img)
{
	pl->Image = img;
	pl->x = x;
	pl->y = y;
	pl->muki = 0;
	pl->JumpFlag = FALSE;
	pl->DownSp = 0.0;
	pl->Movex = 0.0;
	pl->Movey = 0.0;
	pl->life = 3;
	pl->score = 0;
	pl->combo = 0;
}

//動きを計算する
void Player_Update(Player_t *pl) {
	// 左右の移動を見る
	if (Keyboard_Get(KEY_INPUT_LEFT) != 0) {
		pl->Movex -= SPEED;
		pl->muki = 0;
	}
	if (Keyboard_Get(KEY_INPUT_RIGHT) != 0) {
		pl->Movex += SPEED;
		pl->muki = 1;
	}
	//ジャンプ処理(デバッグ用)
	if (Keyboard_Get(KEY_INPUT_Z) != 0)
	{
		pl->DownSp = -JUMP_POWER;
	}

	// 落下処理
	pl->DownSp += G;

	// 落下速度を移動量に加える
	pl->Movey = pl->DownSp;

	//	移動制限
	if (pl->x < 0)					pl->x = 0;
	if (pl->x >= SCREEN_WIDTH - 64)	pl->x = SCREEN_WIDTH - 64;
	if (pl->y < 90)					pl->y = 90;
	if (pl->y >= SCREEN_HEIGHT)		pl->y = SCREEN_HEIGHT - 64;

	// 移動量に基づいてキャラクタの座標を移動
	CharMove(pl->x, pl->y, pl->DownSp, pl->Movex, pl->Movey, CHAR_SIZE);
}

void Player_Draw(Player_t *pl) {
	// キャラクタの描画
	DrawBox((int)(pl->x - CHAR_SIZE * 0.5F), (int)(pl->y - CHAR_SIZE * 0.5F),
		(int)(pl->x + CHAR_SIZE * 0.5F) + 1, (int)(pl->y + CHAR_SIZE * 0.5F) + 1,
		GetColor(255, 0, 0), TRUE);

コード:

#include "All.h"
#include "DxLib.h"

//extern char MapData[x][y];

// キャラクタをマップとの当たり判定を考慮しながら移動する
int CharMove(float plx, float ply, float DownSp,
	float Movex, float Movey, float Size)
{
	float Dummy = 0.0F;
	float hsize;

	// 半分のサイズを算出
	hsize = Size * 0.5F;


	// 左下と右下のチェック、もし当たっていればジャンプ処理をする
	if (MapHitCheck(plx - hsize, ply + hsize, Dummy, Movey) == 4 || MapHitCheck(plx + hsize, ply + hsize, Dummy, Movey) == 4)
	{
		if (Keyboard_Get(KEY_INPUT_SPACE) != 0) {
			Movey = -HIGH_JUMP_POWER;
		}
		// ジャンプ処理
		Movey = -JUMP_POWER;

		//スコアとコンボの処理
		//pl->combo++;
		//pl->score += 100;
	}

	// 左下と右下のチェック、もし当たっていればジャンプ処理をする
	if (MapHitCheck(plx - hsize, ply + hsize, Dummy, Movey) == 3 || MapHitCheck(plx + hsize, ply + hsize, Dummy, Movey) == 3)
	{
		if (Keyboard_Get(KEY_INPUT_SPACE) != 0) {
			Movey = -HIGH_JUMP_POWER;
		}
		// ジャンプ処理
		Movey = -JUMP_POWER;

		//スコアとコンボの処理
		//pl->combo = 0;
	}

	//Movey = 1.0f;
	// 上下移動成分を加算
	ply += Movey;
	plx += Movex;

	// 終了
	return 0;
}


// マップとの当たり判定
int MapHitCheck(float x, float y,
	float Movex, float Movey)
{
	float afX, afY;

	// 移動量を足す
	afX = x + Movex;
	afY = y + Movey;

	// 当たり判定のあるブロックに当たっているかチェック
	if (GetChipParam(afX, afY) == 2 || GetChipParam(afX, afY) == 3)
	{
		float bby;
		// ブロックの下の座標を算出
		bby = (float)((int)afY / CHIP_SIZE + 1) * CHIP_SIZE;    // 下辺の Y 座標

		// 下辺に当たっていた場合
		if (Movey < 0.0F)
		{
			//移動量の補正
			Movey = bby - y + 1.0F;
			// 風船に当たったと返す
			return 4;
		}
	}

	if (GetChipParam(afX, afY) == 4)
	{
		float bby;
		// ブロックの下の座標を算出
		bby = (float)((int)afY / CHIP_SIZE + 1) * CHIP_SIZE;    // 下辺の Y 座標

																// 下辺に当たっていた場合
		if (Movey < 0.0F)
		{
			//移動量の補正
			Movey = bby - y + 1.0F;
			// ドクロに風船に当たったと返す
			return 3;
		}
	}

	if (GetChipParam(afX, afY) == 1)
	{
		//GameClear();
	}

	// どこにも当たらなかったと返す
	return 0;
}

ページトップ