横スクロールRPGで、キーを押すとキャラが進むという部分で、滑らかに表示させるためにキーを押すとだんだん早くなり、キーを押すのをやめるとだんだん止まるというのを実装したいです。
自分は中学生なので物理はよくわからないのでどなたか知恵を貸していただけると助かります。
以下が部分的なコードになります。
加速&減速を教えてください!
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 加速&減速を教えてください!
まさに中学生には難しいかもしれませんが加速させたい時は「加速度」という考え方を使います。
速さ(速度)は分かりますね?
1秒間に2ピクセル進む速さで3秒間進んだら何ピクセル進むでしょう?⇒6ピクセルですね。
この2[ピクセル/秒]という速さが「速さ」なわけです。
この「速さ」を足し算して変化させるものを「加速度」と言います。
速さをvとしてxを移動距離、時間をtとしたら
x = v * t;
になります。このvを次第に大きくしていけば徐々に加速していきます。
サンプルコードを書いてみました。
DXライブラリが実行できる環境で実行してみてください。
実行結果は以下のようになります。
[youtube][/youtube]
右キーを押している間加速し離すと元の低速移動に戻るサンプルプログラムです。
このaが加速度です。
aの値を変えることで加速度が変化します。
aの値によって「速さ」=vが変化しているのが分かるでしょうか。
あえてキーを離すと初期状態に戻るようにしてあります。
これを工夫してテーマを満たすようにできますか?
分からなければまた聞いてください。
速さ(速度)は分かりますね?
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;
}
実行結果は以下のようになります。
[youtube][/youtube]
右キーを押している間加速し離すと元の低速移動に戻るサンプルプログラムです。
このaが加速度です。
aの値を変えることで加速度が変化します。
aの値によって「速さ」=vが変化しているのが分かるでしょうか。
あえてキーを離すと初期状態に戻るようにしてあります。
これを工夫してテーマを満たすようにできますか?
分からなければまた聞いてください。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 加速&減速を教えてください!
と言っても明日と明後日は掲示板を見れる時間が取れるか分からないので先に回答サンプルを書いておきます。
すぐに以下を見ずに自分でtryしてから見てみてください。
実行結果
[youtube][/youtube]
もっと止まり方を徐々にしたいとか加速度の変化の仕方も変更したいとなると、
sin波を使ったり
http://dixq.net/g/03_05.html
http://dixq.net/g/03_06.html
高次方程式を使ったベジェ曲線を使ったりします。
http://dixq.net/g/s_02.html
まだ難しいかもしれませんが、参考までに。
すぐに以下を見ずに自分で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
まだ難しいかもしれませんが、参考までに。
Re: 加速&減速を教えてください!
>自分は中学生なので物理はよくわからないので
「物理」とか面倒そうな単語をわざわざ考えなくてもよいのではないでしょうか.
の「3」が,キャラクタが1回の処理で動く量(速さ)なんですよね.
だとすれば,
この値を例えば
1 に変更したら,よりゆっくり動くようになり,
逆に 5 とかに変更したら,より早く動くようになる
のではありませんか.
…ということは,
プログラム実行中に,この「3」の部分を適当に変化させればキャラクタが動く速さが変わりますよね.
ここまでわかれば,あとは,「適当に変化」させればいいだけです.
手始めに,ダイレクトに「3」としていたところを変数にすればよいでしょう. あとは,
>キーを押すとだんだん早くなり、キーを押すのをやめるとだんだん止まる
みたいな めざす動き が実現されるように,この変数の値をうまいこと変更すればいいわけです.
たとえば
・同じ方向キーが押され続けているなら,変数値を増やす
・方向キーが押されていないなら,変数値を減らす
とかそんな感じのことをすればよいのではないかと思います.
・{どのくらい,どうやって}減らしたり増やしたりするのか?
・速さの最大値や最小値はどの程度が良いのか?
等は,あなたの「めざす動き」次第なので,いい感じになるように調整なり模索なりすることになるでしょう.
(「物理」はその際の有用な参考資料の一つ,といったところでしょうか)
「物理」とか面倒そうな単語をわざわざ考えなくてもよいのではないでしょうか.
の「3」が,キャラクタが1回の処理で動く量(速さ)なんですよね.
だとすれば,
この値を例えば
1 に変更したら,よりゆっくり動くようになり,
逆に 5 とかに変更したら,より早く動くようになる
のではありませんか.
…ということは,
プログラム実行中に,この「3」の部分を適当に変化させればキャラクタが動く速さが変わりますよね.
ここまでわかれば,あとは,「適当に変化」させればいいだけです.
手始めに,ダイレクトに「3」としていたところを変数にすればよいでしょう. あとは,
>キーを押すとだんだん早くなり、キーを押すのをやめるとだんだん止まる
みたいな めざす動き が実現されるように,この変数の値をうまいこと変更すればいいわけです.
たとえば
・同じ方向キーが押され続けているなら,変数値を増やす
・方向キーが押されていないなら,変数値を減らす
とかそんな感じのことをすればよいのではないかと思います.
・{どのくらい,どうやって}減らしたり増やしたりするのか?
・速さの最大値や最小値はどの程度が良いのか?
等は,あなたの「めざす動き」次第なので,いい感じになるように調整なり模索なりすることになるでしょう.
(「物理」はその際の有用な参考資料の一つ,といったところでしょうか)