2.ジャンプ処理 について

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

2.ジャンプ処理 について

#1

投稿記事 by 土門 » 12年前

こちらの
http://homepage2.nifty.com/natupaji/DxL ... am.html#N2
ジャンプ処理をいろいろいじっているのですが
トレース出来ずにいます。
このソースの肝はこの部分かと思うのですが

コード:

// 落下処理
		PlayerY -= JumpPower ;

		// 落下加速度を加える
		JumpPower -= 1 ;

		// ジャンプボタンを押していて、地面についていたらジャンプ
		if( ( Key & PAD_INPUT_A ) && PlayerY == 300 ) JumpPower = 20 ;
 
お恥ずかしながら、これを実行して、なぜアノようなジャンプが再現出来ているのか
ちょっとわかりません。
真っ先に「?」となる箇所は、
ジャンプボタン押下後にJumpPower = 20がされてますが、
その後、すぐそのJumpPowerをプレイヤーのY軸から引いてますよね?
そしたら、プレイヤーは現場所から、Y軸がマイナス20された場所にワープしてしまうはず。
なのに、実際の実行画面では、プレイヤーは違和感なく、
連続表示されて上昇しております。
これが「なぜ?」なのです。
もちろん、数値を色々触り、調べているのですが、
どうやら、プレイヤーとジャンプの最高地点までの幅、
といった数値決めも無く、
どういう理屈でこちらのジャンプが考えられているのか、トレース出来ません。
わかりやすく解説お願い出来ませんか?

ちなみに、自分がジャンプを考えるならば、
常に重力を与えておき、ジャンプボタンを押している間はY軸座標から-1していく、
みたいな感じですかね、、、。高さを制限するなら、ジャンプの幅を入れる変数をつくり
Y座標から引いている数値がいくらになったら止める、みたいな処理を書く。
そんな感じです。

ですが、熟練された方のジャンプの考え方を学ぼうと思い、
こちらのソースを拝見、実行してみましたが
特に最初に20を入れているのが意味分かりませんでした。
この20は何をさしているのでしょうか、、幅?ですかね。
でもなプレイヤーがワープしないのか、、、んー、わからないです。


※重力計算のジャン案は今回は無しの方向でお願いします。

土門

Re: 2.ジャンプ処理 について

#2

投稿記事 by 土門 » 12年前

あ、もしかして勘違い、、、?
なんかわかりました。。。。
20ピクセルが目にも止まらないだけで、
20ちゃんと引かれたところで表示されてるわけですね、これ?

つまり、
20、19、18、、、、0と引かれ、その後
重力で、地面まで−1され続けると、

そういうことですね。

失礼しました。。。あー、恥ずかしい。
管理人さん、消してください、、、でも駄目なんでしょうね、、

土門

Re: 2.ジャンプ処理 について

#3

投稿記事 by 土門 » 12年前

このトピ、消されない場合は
せっかくなので今自分ジャンプの実装中なので
ジャンプでなにかありましたら、
このトピで質問させてもらったんでいいでしょうか。
問題無くジャンプが実装出来れば、
解決としますんで。。。

>管理人さん
というか、この無意味なトピをどうか消してください、
なにかありましたらまた立て直しますんで。

土門

Re: 2.ジャンプ処理 について

#4

投稿記事 by 土門 » 12年前

すみません、早速問題にぶち当たりました。
質問させてください。

今回URL先の「ジャンプ処理」の構造で
jumpを実装しようとしているのですが、
ジャンプボタンを押しっぱなしだと地面に着地するたびに
すぐまたジャンプし、連続で飛び続けてしまいます。

それを回避するために、
buttonを押しっぱなしにならないように
よくあるbuttonのトリガーを設定し、
前回のフレームでtrueになっている場合
falseになるまでは反応しないようにしたところ、

押し続けるという認識が無くなり、
ジャンプの高さが一定となってしまいました。
それでは困りまして、
押している長さでジャンプの高さは変えたいのです。
でも、ボタン押下の連続性は回避したい、、、
これを実装するにはどのような考え方でいけばいいのでしょうか?

アドバイスよろしくお願いします。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2.ジャンプ処理 について

#5

投稿記事 by usao » 12年前

リンク先のコードを見た感じだと,
(ジャンプと関係なくパッド操作でY座標を増減させることが可能なように見えて,その辺が謎というか意味不明なのですが,
 それはそれとして置いといてジャンプボタンの押下だけでの操作の話だとして,)
ボタンを押している長さでジャンプの高さが変わったりしそうには見えないのですが,実際は変わるのでしょうか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 2.ジャンプ処理 について

#6

投稿記事 by ISLe » 12年前

マリオ風のジャンプについて
こちらのトピックは参考になりませんか?

土門

Re: 2.ジャンプ処理 について

#7

投稿記事 by 土門 » 12年前

usaoさん
すみません、リンク先のソースではジャンプの高さは変わりませんね。
というか、このリンク先の組み方だと、
ジャンプbutton押す長さで高さを調整するって難しくないですか?
上記の組み方の場合のジャンプ調整の組み込み型を
教えてもらえませんでしょうか。プログラムじゃなくて構いません。
というか、リンク先のはとにかくジャンプするということを再現するためだけの
プログラムということで、調整だのなんだのするのにあまり向いていないのでしょうか?

ISLeさん
ありがとうございます。
確認してみます。

土門

Re: 2.ジャンプ処理 について

#8

投稿記事 by 土門 » 12年前

リンク先のISLeさんのサンプル確認しました。
自分でも高さの調整自体は出来たんです。

ただ、ジャンプの高さを調整する場合は
ジャンプボタンの押し続ける長さがPOINTになります。
するとframeをまたいでも認知し続けなければなりません。
結果、着地してもボタンを押し続けていると、
またjumpするジャンプボタンとなってしまいます。

でも、自分はジャンプボタンを押し続けていても
着地後にジャンプしないようにしたいのです。
ボタンを離さないと、次のジャンプが出来ないようにしたいのです。
でもそれを実装すると、ジャンプボタンの押下を一フレームでやめてしまうので
今度は「押し続けている」という認識が出来なくなります。

例えばISLeさんのサンプルも、高さが調節出来ますよね。
でも、ボタンを押しっぱなしだと、ぴょーんぴょーんとずっと跳ね続けます。
で、自分もそんな状態なのです、、。
で、ぴょーんぴょーんとなるのと辞める処理を書くと、
今度は押し続ける調整が出来なくなる、、、と。

これを対処をするのは難しいと思いませんか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 2.ジャンプ処理 について

#9

投稿記事 by ISLe » 12年前

土門 さんが書きました:これを対処をするのは難しいと思いませんか?
これならどうですか。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	const int SCREEN_W = 640;
	const int SCREEN_H = 480;
	const int CHARA_W = 64;
	const int CHARA_H = 64;

	int x, y;
	bool jumping = false;
	float vy, ga;
	x = (SCREEN_W-CHARA_W)/2;
	y = SCREEN_H-CHARA_H;

	bool bPressJumpButton, bPressJumpButtonOld;
	bPressJumpButton = bPressJumpButtonOld = false;

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
		bPressJumpButton = (CheckHitKey(KEY_INPUT_C) != 0);
		if (!jumping) {
			if (bPressJumpButton && !bPressJumpButtonOld) {
				vy = -16.0f; // 初速
				jumping = true;
			}
		}
		else {
			if (bPressJumpButton) {
				ga = 0.5f; // ジャンプボタンを押しているときの落下加速度
			}
			else {
				ga = 3.0f; // ジャンプボタンを離しているときの落下加速度
			}
			y += vy;
			vy += ga;
			if (y > SCREEN_H-CHARA_H) {
				y = SCREEN_H-CHARA_H;
				vy = ga = 0.0f;
				jumping = false;
			}
		}
		bPressJumpButtonOld = bPressJumpButton;
		DrawBox(x, y, x+CHARA_W, y+CHARA_H, GetColor(255,255,255), TRUE);
	}

	DxLib_End();
	return 0;
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 2.ジャンプ処理 について

#10

投稿記事 by usao » 12年前

難しいところが何なのかがいまいちつかめてないのですが,

最初に「押した」を検知(ジャンプの開始)
→以降,「離した」ことを検知するまでは押されたままであると判断(ジャンプ高さがどうのという話を制御)
→前記「離した」ことを検知しないと,次回の「押した」を検知しない(連続でジャンプしない)

ということを単純にやれば良いような話ではないのでしょうか.

土門

Re: 2.ジャンプ処理 について

#11

投稿記事 by 土門 » 12年前

ISLeさん、usaoさん
ほんとお手間取らせて申し訳ありません。
自分も当然のごとくそう思って、最初は
ジャンプボタンを押下中がtrue、離している状態がfalseを格納する
flgを作り、メインループ中にif(!ジャンプボタン)を設置したんですが
なぜかそれが機能しなかったんです、、、
一度tureになるとfalseが入らなかったというか。。。
もちろんなにかしら自分が記載ミスしてたわけですが、
なので、そういう使い方出来ないんだな、と思い込んでしまい
別の方法を模索してしまっておりました。
結局は、ISLeさんのソースを見て、あれ?出来るんだ、と
自分のを修正したところ、うまくそれは実装出来ました。
バカみたいに単純なミスですみません、、、、、。
しかし、勉強になりました。
今のところジャンプは完成したんですが、
イメージしてるのはちょっと特殊なジャンプ?なんです。
ジャンプ中の移動方向は固定なのですが
攻撃する方向は固定じゃ無いのです(キャラの向きは攻撃方向に付随)。
つまり、右にジャンプ中、移動方向は右向きっぱなしなんですが
空中で左を押すと、キャラは左に向けられる、といった感じなんです。
こちらのサイトのリファレンスを参考に作っていますので
mukiの概念を導入しておりますが、この場合、
mukiに入っている値によって、移動方向が実行されております。
ならば、ジャンプ中はmukiに右方向の値がずっと入っていなければなりませんね。
でも左を押せば、左方向を向く仕様でいきたいので、
描画や攻撃アクション等の判断素材にそのmukiは利用できません。
ということで、本来はひとつで済むはずの「移動方向が入る変数」を
移動用、キャラの向き用とふたつ作ってます。
上記のジャンプ中に、移動用には右が入って固定、
しかしキャラ向き用の中の値はレバーで変えられる。と。
これが不細工でちょっとナンセンスなんじゃないかなーっと、
上手い人はもっとスマートなの考えつくんじゃないかな、と思ったりしますが
でも上記の仕様を実装するなら仕方ないはずだとも思っています。
、、、ですよね?

余談ですが、前回まで取りかかっていたゲームは無事完成し、
(お世話になった方々やこちらのサイトに貢献させて頂きたく
ひと段落したらこちらの配布ページでうpしてみようと思っております!)、
先日から自分にとってのプログラム最大の難関
アクションゲームに取りかかっておりまして、ジャンプも初めて触っております。
またなにかと相談させて頂きたいと思っておりますので
お時間がありましたら、その時はぜひよろしくお願い申し上げます!

閉鎖

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