ページ 11

オブジェクトが滑る処理

Posted: 2010年9月11日(土) 00:40
by NEX
64*64の円のオブジェクトが滑るような演出をするプログラムを作っております。
 ※10円玉をテコピンした時のような感じ

マウスでクリックして離すと離した方向に向かって滑るところまでは作れました。

ただ慣性を表現する所で手間取っております。
初速度と減速はどの程度与えてやればよいのでしょうか?

クリックしていた時間によって初速度が変わるようにしております。
 ※早く離したらいっきに滑らすため

添付させて頂いたのがソースになります。
ソース内の下記で値を弄っております。
// 初速度の設定
    if( Mouse.plFlg ){
        Medal.Dir = (float)atan2( float(End.x-Start.x), float(End.y-Start.y));
        Medal.Speed = -1 * float(touchCount/60) + 3;    // ここの値
        touchCount = 0;
    }
    
    // 移動処理
    Medal.Px += int(sin(Medal.Dir) * Medal.Speed);
    Medal.Py += int(cos(Medal.Dir) * Medal.Speed);
    
    // 減算処理 // ここの値
    if(Medal.Speed > 0) Medal.Speed -= 0.01f;
    else Medal.Speed = 0;
添付したソースのまずいところを含めアドバイスを頂けないでしょうか?

Re:オブジェクトが滑る処理

Posted: 2010年9月11日(土) 03:19
by NEX
すいません・・・。
デバックしてみたらクリックして移動した距離も
速度に関連させないといけないですよね・・・。
どのくらいの値を入れればよいのかが全く分かりません・・・。

答えにくい質問かとは思いますが
皆さんのご意見をお聞かせ願えないでしょうか?

稀にジグザグに動くのは気のせいなのでしょうか?
ソースにまずいところがありましたらご指摘いただけないでしょうか?

Re:オブジェクトが滑る処理

Posted: 2010年9月11日(土) 03:25
by NEX
連続して投稿失礼します。
添付させて頂いたソースに
float distance = sqrt( float((End.x - Start.x) * (End.x - Start.x) + (End.y - Start.y) * (End.y - Start.y)) );という1行を追加しております。


// 初速度の設定
    if( Mouse.plFlg ){
        float distance = sqrt( float((End.x - Start.x) * (End.x - Start.x) + (End.y - Start.y) * (End.y - Start.y)) );
        Medal.Dir = (float)atan2( float(End.x-Start.x), float(End.y-Start.y));
        Medal.Speed = -1 * float(touchCount/60) + 7;    // ここの値
        touchCount = 0;
    }
↑に記載し忘れてしまいました。

Re:オブジェクトが滑る処理

Posted: 2010年9月11日(土) 06:14
by NEX
何度もすみません・・・。
質問させて頂いてから修正を重ね
少しだけ慣性?がかかったように見えるようになりました。

一番最初に添付させて頂いたソースのLoop内がかなり変わっております。

ただ問題が御座いまして「く」の字の様にマウスを動かしてしまうと
とんでもない方向に円が飛んで行ってしまいます。

参考になりそうなURLを探していたらこのような動作のことをフリックというのですね・・・。
http://hoshiba.seesaa.net/article/121780114.html
URLはiphoneですがこのようなことがやりたいです。

void Loop(){

    // タッチされている時間をカウント
    if( Mouse.lFlg ) touchCount++;

    // 触っている時
    if( Mouse.lFlg ){
        Medal.Px = (float)Mouse.x;
        Medal.Py = (float)Mouse.y;
    }

    // 座標計算
    if( Mouse.clFlg ){
        Start.x = Mouse.x;
        Start.y = Mouse.y;
    }

    if( Mouse.plFlg ){
        End.x = Mouse.x;
        End.y = Mouse.y;
    }

    // 移動
    // 角度を修正
    //    float rot = float(Medal.Dir/180*M_PI);

    // 初速度の設定
    static float distance = 0.0f;

    if( Mouse.plFlg ){
        float distance = sqrt( float((End.x - Start.x) * (End.x - Start.x) + (End.y - Start.y) * (End.y - Start.y)) );
        if( distance>= 5){
            Medal.Dir = (float)atan2( float(End.x-Start.x), float(End.y-Start.y));
            Medal.Speed = -1 * float(touchCount/60) + 7;    // ここの値
            touchCount = 0;
        }
    }
    
    // 移動処理
    Medal.Px += int(sin(Medal.Dir) * Medal.Speed);
    Medal.Py += int(cos(Medal.Dir) * Medal.Speed);
    
    // 減算処理 // ここの値
    if(Medal.Speed > 0) Medal.Speed -= (-0.01f * distance) + 0.2f;
    else Medal.Speed = 0;
    
    if( Key[KEY_INPUT_F2].trgKey ) Init();

}

Re:オブジェクトが滑る処理

Posted: 2010年9月11日(土) 12:45
by Justy
 マウスのクリックからリリースまでのベクトルを使っているのが原因かと。
 普通にリリースした時点でのマウスの(前のフレームとの)移動ベクトルをそのままオブジェクトの
移動ベクトルとして、放たれたオブジェクトの移動ベクトルは徐々に減衰すればいいかと。


http://codepad.org/bIiI6g1B
画像

Re:オブジェクトが滑る処理

Posted: 2010年9月12日(日) 17:23
by NEX
Justy様
ソースまでありがとうございます。
なんとか出来ました。
マウスの座標取得の方法を変えて古いフレームと見比べれば実装できるのですね。
勉強になりました。ありがとうございました。