c言語とDxライブラリでロックマン風のゲームを作っているのですが、
ジャンプの押し加減によって、ジャンプの強弱が変わるプログラムの
書き方がわかりません。どうするのが良いのでしょうか。
横アクションげーむのジャンプのやりかた
- Hiragi(GKUTH)
- 記事: 167
- 登録日時: 13年前
- 住所: 大阪府
- 連絡を取る:
Re: 横アクションげーむのジャンプのやりかた
これだ!といった書き方は無いので、それっぽく見せるしかありません。 以前私もソレをしてみようとしました。完全に参考にならないかと思われますが、
一応おいておきます。
http://climbi.com/b/3527/0
そもそもボタンの押し具合によってジャンプ力が変化するというのは現実の物理法則に反しているので、完全な再現はありません。
それっぽく見えればいいのです。
ジャンプボタンが押されている時とそうでないときで、落下速度を変化させるなどで対応すると良いかもしれません。
一応おいておきます。
http://climbi.com/b/3527/0
そもそもボタンの押し具合によってジャンプ力が変化するというのは現実の物理法則に反しているので、完全な再現はありません。
それっぽく見えればいいのです。
ジャンプボタンが押されている時とそうでないときで、落下速度を変化させるなどで対応すると良いかもしれません。
だいがくせい!
- Hiragi(GKUTH)
- 記事: 167
- 登録日時: 13年前
- 住所: 大阪府
- 連絡を取る:
Re: 横アクションげーむのジャンプのやりかた
適当ですが、とりあえずボタンの押す時間によってジャンプ力が変わるようなモノを作ってみました。 コピペで動きます。
ただし、左右移動はできませんし、何しろこのままでは見た目が不自然すぎます。 もっと改善する必要があるでしょう。
それに、このコードは考え方の一つに過ぎませんので、もっと別の方法、効率のいい方法もあるかと思います。そこらへんは調べるなり考えるなりして頑張ってください。
ただし、左右移動はできませんし、何しろこのままでは見た目が不自然すぎます。 もっと改善する必要があるでしょう。
それに、このコードは考え方の一つに過ぎませんので、もっと別の方法、効率のいい方法もあるかと思います。そこらへんは調べるなり考えるなりして頑張ってください。
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//アプリ初期化
ChangeWindowMode(TRUE); // ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理
SetDrawScreen(DX_SCREEN_BACK);
//必要な変数
int x; //x座標
int y; //y座標
int size; //プレイヤーのサイズ 今回は正方形とする。
double vx; //x方向への加速度
double vy; //y方向への加速度
int cnt_z; //Zキーの押されたフレーム数
//定数
const double JUMP_P = 16; //プレイヤーのジャンプパワー
const double G_on = 0.4; //キーが押されているときの重力
const double G_off = 1.6; //キーが押されていないときの重力
const int W_WIDTH = 640; //ウィンドウの高さ
const int W_HEIGHT = 480; //ウィンドウの幅
//ゲーム初期化
x = W_WIDTH / 2;
y = W_HEIGHT / 2;
vx = 0;
vy = 0;
cnt_z = 0;
size = 16;
// ループ処理
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
//計算
//Zキーの押されたフレーム数を格納する。
if (CheckHitKey(KEY_INPUT_Z) != 0){
cnt_z++;
}else{
cnt_z = 0;
}
//Zキーが押されている間
if (cnt_z > 0){
//Zキーが押された瞬間、かつ地面に接していたら
if (cnt_z == 1 && y == W_HEIGHT - size){
vy = JUMP_P; //ジャンプ力を与える
}
vy -= G_on;//押されてる間は重力を弱めに
}else{
vy -= G_off;//そうでないときは重力を強めに
}
y = y - vy; //実際に座標に対して計算
//めり込み防止
if (y > W_HEIGHT - size){
y = W_HEIGHT - size;
vy = 0;
}
//描画
DrawBox(x, y, x + size, y + size, GetColor(255, 255, 255), true);
}
DxLib_End(); // 後処理
return 0;
}
だいがくせい!