#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;
}
DXライブラリを使ってゲームを作成しているのですが、プレイヤーの移動処理がうまくいかなくて困っています。
落下処理が処理されず、左右のキーを押してもプレイヤーの座標が変わりません。
どうすればいいのでしょうか?
[code]
#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);
[/code]
[code]
#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;
}
[/code]