ページ 1 / 1
キャラクター操作について
Posted: 2009年11月14日(土) 13:40
by オラウー
キャラクターの操作にスーパーマリオブラザーズのような
重みを加えたいんですが、どんなコードを打てばいいでしょうか
Re:キャラクター操作について
Posted: 2009年11月14日(土) 14:37
by 御津凪
どのような重みを付けるかによりますが、
重力のことなら、
空中にいたら落下量を少しずつ増加させて、現在位置に落下量を加えるようなコードを打てばいい感じになりますね。
それ以上のことはどう説明すればいいのかはわかりません。
(質問者の技量がわからない上に、どのコードに加えるのかがわからないので)
キャラクター操作について
Posted: 2009年11月14日(土) 15:43
by オラウー
たとえばスーパーマリオブラザーズは横に動くとき
最初のほうは動きが遅くてそこからだんだん速くなりますよね
あれを再現したいです
僕はプログラムはまだ初心者です
コードはこのサイトの落ち者ゲー(手抜き)というものそのままです
添付ファイルをつけます
Re:キャラクター操作について
Posted: 2009年11月14日(土) 16:44
by kazuoni
物理の加速度という概念を勉強してみてください。
Re:キャラクター操作について
Posted: 2009年11月14日(土) 16:53
by softya
簡単な物理計算の知識が必要です。
・加速度
・慣性
・摩擦
に付いての知識をご存知でしょうか?
まず、加速度ですかキーを押す事で少しづつ早くなり一定速度まで速くなる処理で使います。
これは、等加速度運動の考え方を使います。
http://www.geocities.jp/buturiyag3/03-01.htm
簡単に言うと移動速度は、キーの値が直接反映されるのでは無く、移動速度にキーが押されるたびに加速度値を加えていく事で移動速度を制御します。
int s;//速度
int v;//加速度
if( キーが有効 ) v=2;
else v=0;
s=s+v;
が処理の簡単な例です。この例の問題は加速の上限を決めていないので速度がどんどん速くなることです。
次に慣性ですが、動き出した物体は同じ速度で同じ方向に動き続ける法則を持っています。これが慣性の法則です。いきなりカーブを曲がろうとしても速い速度で動いていると急に曲がれない現象がその一例です。
http://www.max.hi-ho.ne.jp/lylle/undo1.html
int x;//x座標
x = x + s;//座標に速度を足します。
これを毎フレーム行うと、速度分だけキャラは移動してしまいますね。それも永久に。これが慣性の法則をプログラムとして組み込んだことになります。
ただし、真空の宇宙空間でも無い限り永久に動き続ける物体はありません。それが次にくる摩擦という考え方です。
摩擦は、一定の割合で速度を減らすものです。地球上の物体は、摩擦や空気抵抗で慣性の法則の同じ速度を保つ事ができません。この考えをプログラムに組み込みます。
s = s * 0.5;
この場合は、毎フレーム速度が半分になるものとしてみました。
実際には、値を調整して良い感じになるものを探す必要があります。
Re:キャラクター操作について
Posted: 2009年11月14日(土) 17:08
by 御津凪
先に添付されたコードにどう書き足せばある程度再現できるかを説明します。
1. ch_t 構造体に double 型の変数 vx を追加します。(これが加速度となります)
2. この変数を初期化するため、 ini 関数に ch.vx=0; を追記します。
3. operate_char 関数を以下のように変更します。
void operate_char(){
if(Key[KEY_INPUT_LEFT]>0)//左キーが押されていたら
ch.vx-=3;//左へ3加速
if(Key[KEY_INPUT_RIGHT]>0)//右キーが押されていたら
ch.vx+=3;//右へ3加速
// 加速度の計算など
if(ch.vx != 0){
if(ch.vx > 0){
ch.vx-=2;
if(ch.vx < 0) ch.vx=0;
}
else if(ch.vx < 0){
ch.vx+=2;
if(ch.vx > 0) ch.vx=0;
}
ch.x+=ch.vx; // 加速度を現在の位置に反映
}
}
これでコンパイル・実行すれば動きに重みがつきます。ちょうど softya さんの説明している方法を実装した形になります。
変更した operate_char 関数がその部分になるので、どういう処理になっているのか理解すると、加速度の修正や応用が行えるはずです。
ただし、これで方向キーを押し続けると際限なく加速するので、
最高速度を決め、それ以上の加速をしないようにする必要があります。
キャラクター操作について
Posted: 2009年11月14日(土) 17:44
by オラウー
御津凪さんのコードを付け足したら下のようなエラーと警告がたくさん出ました
c:\落ち物ゲー(手抜き)\code\main.cpp(57) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(59) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(62) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(63) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(64) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(65) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(65) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(67) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(68) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(69) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(69) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(71) : error C2039: 'vx' : 'ch_t' のメンバではありません。
c:\落ち物ゲー(手抜き)\code\main.cpp(8) : 'ch_t' の宣言を確認してください。
c:\落ち物ゲー(手抜き)\code\main.cpp(149) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\落ち物ゲー(手抜き)\code\main.cpp(149) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\落ち物ゲー(手抜き)\code\main.cpp(150) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\落ち物ゲー(手抜き)\code\main.cpp(150) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\落ち物ゲー(手抜き)\code\main.cpp(158) : warning C4244: '引数' : 'double' から 'float' への変換です。データが失われる可能性があります。
c:\落ち物ゲー(手抜き)\code\main.cpp(158) : warning C4244: '引数' : 'double' から 'float' への変換です。データが失われる可能性があります。
物理のことをもっと調べてみます
皆さんいろいろ教えてくれてありがとうございます
Re:キャラクター操作について
Posted: 2009年11月14日(土) 17:49
by 御津凪
> 1. ch_t 構造体に double 型の変数 vx を追加します。(これが加速度となります)
これを行いましたか?(error C2039 はこれが正しく行われていないことを示します)
> 2. この変数を初期化するため、 ini 関数に ch.vx=0; を追記します。
こちらも忘れずに行ってください。
エラーと警告の文章のほとんどはよく読めばわかるので、
できるだけ自力で解決した方が望ましいです。
それでもわからなければどうわからないのか含めて質問すればいいので。
Re:キャラクター操作について
Posted: 2009年11月14日(土) 18:12
by オラウー
出来ました、
1と2が抜けてました
ありがとうございました