構造体を使ってジャンプ動作を実装しようとしたものの、問題が出てきました。
Zキーの入力でY座標に数値を代入してジャンプをさせ、縦に48のサイズの画像のY座標が432を超えればY座標に432を代入しジャンプ処理を終了させ元に戻すプログラムなのですが、ジャンプ処理でのY座標の動きが画像の動きに現れず、最後の432の代入だけしか処理されません。
以下問題のコードです。
//Player.h
#ifndef DEF_PLAYER_H //二重include防止
#define DEF_PLAYER_H
typedef struct {
int Image;
int x;
int y;
int flag;
int time1;
int time2;
int t;
int standing;
int howhighernow;
} Player_t;
// 初期化をする
void Player_Initialize(Player_t *Player, int x, int y, int img);
void Player_IsStanding(Player_t *Player);
void Player_Jump(Player_t *Player);
// 動きを計算する
void Player_Update(Player_t *Player);
// 描画する
void Player_Draw(Player_t Player);
// 終了処理をする
void Player_Finalize(Player_t Player);
#endif
//Player.cpp
#include "DxLib.h"
#include "Keyboard.h" //キーボードの入力を監視する関数(Keyboard_Get)のあるヘッダファイル
#include "Player.h"
#include <math.h>
#define g 9.8067
#define y_max 2.000
static int Player;
// 初期化をする
void Player_Initialize(Player_t *Player, int x, int y, int img) {
Player->Image = img; //画像ハンドルの格納(別ファイルのプレイヤー管理部にて代入)
Player->x = x;
Player->y = y; //y座標格納
}
void Player_IsStanding(Player_t *Player) {
//画面外まで落ちないよう制御
if (Player->y > 432) {
Player->y = 432;
Player->standing = true;
}
//地に足着いてるかどうか
}
void Player_Jump(Player_t *Player) {
if (Keyboard_Get(KEY_INPUT_Z) == 1) { //Zが押されたら
if (Player->flag == 0) { //現在浮いていないなら
Player->time1 = GetNowCount(); //time1にZが押された時の時間を格納;
}
Player->flag = 1; //飛び上がりフラグを立てる。
}
if (Player->flag == 1) {
Player->standing = false; //浮かせる
Player->time2 = GetNowCount(); // 現在経過時間を得る
Player->t = (double)(Player->time2 - Player->time1) / 1000.000; // ミリ秒を秒に変換して、Zが押されてからの経過時間を計算
Player->y = 480 - (int)((sqrt(0.750 * g * y_max) * Player->t - 1.000 * g * Player->t * Player->t) * 432 / y_max) - Player->howhighernow;//y座標を計算
Player_IsStanding(Player); //地面に達したか監視
if (Player->standing == true) // もし地面に達したなら
Player->flag = 0; // 飛び上がりフラグを戻す
}
else
Player->howhighernow = 480 - Player->y; //現在のy座標を得る
}
// 動きを計算する
void Player_Update(Player_t *Player) {
if (Keyboard_Get(KEY_INPUT_LEFT) > 0) {//左が押されていたら
Player->x--;
}
if (Keyboard_Get(KEY_INPUT_RIGHT) > 0) {//右が押されていたら
Player->x++;
}
Player_IsStanding(Player);
Player_Jump(Player);
}
// 描画する
void Player_Draw(Player_t Player) {
DrawGraph(Player.x, Player.y, Player.Image, TRUE);
}
// 終了処理をする
void Player_Finalize(Player_t Player) {
//特になし
}
Player_Initialize
Player_Finalize
を初めと終わりに一度、
Player_Update
Player_Draw
をwhile文の中で、
それぞれプレイヤー管理部を使用しながら呼び出しています。
Y座標が432を超えたときの処理はしっかりされるので、おそらくY座標の値の代入はされているもののそれが画像の動きに結ばれていないものと思われます。
やりたいことはジャンプ処理を画像と一緒に実装させることです。
DXライブラリを最近学習し始めたという上に掲示板も慣れていないもので、色々と至らぬ部分があるかとは思いますが、回答よろしくお願いいたします。
ちなみにOSはWindows、使用ソフトはVisual Studio 2017です。