[DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

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

[DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#1

投稿記事 by 刀流 » 4年前

ゲームプログラミングの館でDXライブラリを勉強しているものです。
構造体を使ってジャンプ動作を実装しようとしたものの、問題が出てきました。
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です。

Math

Re: [DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#2

投稿記事 by Math » 4年前

画面 左上に座標値を表示しとけば すぐわかりますよ。

// 変数チェック
DrawFormatString( 0, 0, GetColor(255,255,255), "Player.x=%d,Player.y=%d",Player->x,Player->y) ;

Math

Re: [DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#3

投稿記事 by Math » 4年前

2万~3万円の中古パソコンで十分。https://www.mediator.co.jp/ここで3年保証を付けるといいですよ。


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

Re: [DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#5

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

以下のコードと画像を追加で用意し、実行してみました。
► スポイラーを表示
Player_Jump関数内において、経過秒数をint型のPlayer->tに格納してから処理しているため、
1秒経つまで0秒経過時の座標432が用いられ、
1秒経つと座標が約1700になり、Player_IsStandingによって432にされるようです。
時間を秒単位に変換せずミリ秒単位で処理するか、
時間をint型ではなくdouble型の変数に格納して処理するようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

刀流
記事: 9
登録日時: 4年前

Re: [DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#6

投稿記事 by 刀流 » 4年前

左上にDrawFormatStringを表示してY座標の値を調べて解決に近づきました、ありがとうございます!

刀流
記事: 9
登録日時: 4年前

Re: [DXライブラリ使用]構造体と管理部を用いたジャンプ処理の実装について

#7

投稿記事 by 刀流 » 4年前

time1, tim2, tをdouble型にすると解決しました、ありがとうございます!

返信

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