0

Javascript で 2D アニメーションを作成しており、ある点 (x1、y1) から別の点 (x2、y2) に設定された速度と方向で移動するスプライトが必要です。例えば、

function update(speedX, speedY){
    x1 += speedX;
    y1 += speedY;
    if("(x1, y1) reach (x2, y2)"){
        // do other stuff
    }
}

ほとんどの場合、speedX と speedY は等しくなく、各軸の移動に必要な距離を均等に考慮しているわけでもありません。特定の速度と角度に必要な速度を計算する正接関数を使用して、speedX と speedY の値を計算します。

私の質問は、これを行うことができるアルゴリズムはありますか? これは 1 秒間に 30 回実行する必要があり、フロートの追加であるため、効率的なものが望ましいです。ありがとう!

4

3 に答える 3

0

VIC-II の $1F ポートにあります。

PRINT PEEK(53279)

:-)

于 2013-12-04T21:01:27.870 に答える
0

解決:

さて、いくつかの作業で私はそれを理解しました。まず、関数を定義しました

function getSign(val) { ... }

これは、渡された数値が負、0、正のいずれであるかに応じて、それぞれ -1、0、または 1 を返すだけです。次に、最初に(更新が発生する前に)次のことを行いました。

var xSign = getSign(x1-x2);
var ySign = getSign(y1-y2);

最後に、ポイントが現在ターゲット (x2, y2) にあるか、それを過ぎたかどうかを確認するには、次のコードで確認します。

function update(speedX, speedY){
    x1 += speedX;
    x2 += speedY;
    var curXsign = getSign(x1-x2);
    var curYsign = getSign(y1-y2);
    if( curXsign != xSign || curYsign != ySign ||
        (curXsign == 0 && curYsign == 0)){
            // do other stuff
    }
}

基本的に、X または Y 間の相対ベクトル距離のいずれかの符号が符号を変更する場合、それはその軸がポイントを通過したことを意味します。curXsign と curYsign の両方が 0 の場合、それはターゲット ポイント上にあることを意味します。これら 3 つのケースのいずれも、目標地点に到達したか、目標地点を通過したことを意味します。テスト済みで動作します。

別の可能な解決策は、開始点と現在の位置の間の距離 (curDist) をテストし、それを開始点と目標点の間の距離 (dist) と比較することです。curDist >= dist になると、ターゲット ポイントにいる、またはターゲット ポイントを過ぎていることがわかります。

于 2012-06-30T17:28:41.397 に答える
0

通常 (私は過去にいくつかのゲームを開発しましたが、特別なことは何もありませんでした)私は自分のスプライトを四角形として見ていたので、非常に単純な式を使用して 2 つのスプライトの重なりをチェックしていました (この非常に良い説明を見てください)。

ポイントと長方形の間の衝突をチェックする必要があるとしましょう。ポイントが長方形領域の間に留まるかどうかを確認するために、簡略化された同じ式を適用できます。その場合はこちらをお読みください

于 2012-06-29T21:46:38.050 に答える