加速&減速を教えてください!

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

加速&減速を教えてください!

#1

投稿記事 by kenshin » 4年前

横スクロールRPGで、キーを押すとキャラが進むという部分で、滑らかに表示させるためにキーを押すとだんだん早くなり、キーを押すのをやめるとだんだん止まるというのを実装したいです。
自分は中学生なので物理はよくわからないのでどなたか知恵を貸していただけると助かります。
以下が部分的なコードになります。

コード:


void Move_player(void){

	if (key[KEY_INPUT_RIGHT]>=){
		p1x+=3;
	}
	if (key[KEY_INPUT_LEFT]>=){
		p1x-=3;
	}


}

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 加速&減速を教えてください!

#2

投稿記事 by Dixq (管理人) » 4年前

まさに中学生には難しいかもしれませんが加速させたい時は「加速度」という考え方を使います。
速さ(速度)は分かりますね?
1秒間に2ピクセル進む速さで3秒間進んだら何ピクセル進むでしょう?⇒6ピクセルですね。
この2[ピクセル/秒]という速さが「速さ」なわけです。

この「速さ」を足し算して変化させるものを「加速度」と言います。
速さをvとしてxを移動距離、時間をtとしたら

x = v * t;

になります。このvを次第に大きくしていけば徐々に加速していきます。
サンプルコードを書いてみました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	float v = 1;
	float x = 0;
	float a = 0.2;

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		if (CheckHitKey(KEY_INPUT_RIGHT)) {
			v += a;
		}
		else {
			v = 1;
		}
		x += v;
		if (x > 640) {
			x = 0;
		}
		DrawCircle((int)x, 240, 10, GetColor(255, 255, 255), TRUE);
	}

	DxLib_End();
	return 0;
}
DXライブラリが実行できる環境で実行してみてください。
実行結果は以下のようになります。

[youtube][/youtube]

右キーを押している間加速し離すと元の低速移動に戻るサンプルプログラムです。
このaが加速度です。
aの値を変えることで加速度が変化します。
aの値によって「速さ」=vが変化しているのが分かるでしょうか。
あえてキーを離すと初期状態に戻るようにしてあります。
これを工夫してテーマを満たすようにできますか?
分からなければまた聞いてください。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 加速&減速を教えてください!

#3

投稿記事 by Dixq (管理人) » 4年前

と言っても明日と明後日は掲示板を見れる時間が取れるか分からないので先に回答サンプルを書いておきます。
すぐに以下を見ずに自分でtryしてから見てみてください。

コード:

#include "DxLib.h"

const static float V = 1.f;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	float v = V;
	float x = 0;
	float a = 0.2;

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		if (CheckHitKey(KEY_INPUT_RIGHT)) {
			v += a;
		}
		else {
			v -= a;
			if (v < V) {
				v = V;
			}
		}
		x += v;
		if (x > 640) {
			x = 0;
		}
		DrawCircle((int)x, 240, 10, GetColor(255, 255, 255), TRUE);
	}

	DxLib_End();
	return 0;
}
実行結果
[youtube][/youtube]

もっと止まり方を徐々にしたいとか加速度の変化の仕方も変更したいとなると、
sin波を使ったり
http://dixq.net/g/03_05.html
http://dixq.net/g/03_06.html
高次方程式を使ったベジェ曲線を使ったりします。
http://dixq.net/g/s_02.html

まだ難しいかもしれませんが、参考までに。

アバター
usao
記事: 1587
登録日時: 7年前

Re: 加速&減速を教えてください!

#4

投稿記事 by usao » 4年前

>自分は中学生なので物理はよくわからないので

「物理」とか面倒そうな単語をわざわざ考えなくてもよいのではないでしょうか.

コード:

p1x+=3;
の「3」が,キャラクタが1回の処理で動く量(速さ)なんですよね.
だとすれば,
この値を例えば
  1 に変更したら,よりゆっくり動くようになり,
 逆に 5 とかに変更したら,より早く動くようになる
のではありませんか.

…ということは,
プログラム実行中に,この「3」の部分を適当に変化させればキャラクタが動く速さが変わりますよね.

ここまでわかれば,あとは,「適当に変化」させればいいだけです.
手始めに,ダイレクトに「3」としていたところを変数にすればよいでしょう.

コード:

int PlayerCharMoveSpeed = 3; //キャラクタの移動する速さ
...
p1x+=PlayerCharMoveSpeed;  //移動量が変数になった
あとは,

>キーを押すとだんだん早くなり、キーを押すのをやめるとだんだん止まる

みたいな めざす動き が実現されるように,この変数の値をうまいこと変更すればいいわけです.
たとえば
・同じ方向キーが押され続けているなら,変数値を増やす
・方向キーが押されていないなら,変数値を減らす
とかそんな感じのことをすればよいのではないかと思います.

・{どのくらい,どうやって}減らしたり増やしたりするのか?
・速さの最大値や最小値はどの程度が良いのか?
等は,あなたの「めざす動き」次第なので,いい感じになるように調整なり模索なりすることになるでしょう.
(「物理」はその際の有用な参考資料の一つ,といったところでしょうか)

kenshin
記事: 7
登録日時: 4年前

Re: 加速&減速を教えてください!

#5

投稿記事 by kenshin » 4年前

ありがとうございました!

閉鎖

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