2

グラフ

このような機能が必要です。横の値は時間で、縦の値は出力です。time から開始する0と、値は-1またはになり1ます。時間を増やすと、値は と に1なり-1、「バウンス」するたびに距離が減少します。

私は過去にハックなコードでそれを行ったことがあります。変数にターゲット値を格納し、値がターゲット値に達するたびに、私はtargetValue *= -.5そうします。

手動でこれを行う必要のない、数学関数を使用したより良い実装があるかもしれません。私にとって、それは三角関数のようなものですが、最終的な出力は で乗算され1 - (time / maxTime)、波ではなく線です。

4

3 に答える 3

1

図のように、「目標値」の減少が線形である場合、次のようになります。

  • 時間ステップを 1 に正規化し、0 になるのに必要な正規化された期間の数を n とします。
  • targetValue = -1 から始めます。
  • コードをより簡潔に記述する方法はありますが、ここでは明確なバージョンを示します。これは SAS OPTMODEL コードで記述されていますが、OPTMODEL にアクセスできない場合は、任意の言語に簡単に翻訳できるはずです。

    proc optmodel;
    num targetValue init -1;
    num n init 3;
    num series{ t in 1 .. 2*n + 1} = 
        if t = 1 then 
            targetValue
        else 
            -series[t - 1] + mod(t,2)* (1 / n);
    print series;
    quit;
    

定数による減算の代わりに定数による積を使用すると、シリーズは制限内でのみ 0 になります。

于 2013-05-31T03:50:24.540 に答える
1

正確な形状に興味がない場合はtargetValue *= -.5、グラフを描画する関数の呼び出し間の時間の増分が等しい限り、まさに私が行うことです。それが良い選択だと私が思う理由は、それがあなたが望むことをする最も簡単な選択だからです. 時間の増分が等しくない場合は、常に -.5 ではなく、-(time-Increment) に比例する何かが必要になる場合があります。

于 2013-05-29T18:51:16.477 に答える
0

これはゲームのちらつき効果のためだったので (つまり、ヒットしたキャラクターがゆっくりちらつき始めてから、より速くちらつき始めます)、@Blender の回答に基づいて解決策を作成することになりました。

Wolframアルファプロット

唯一の違いは、垂直方向のバウンス間隔を小さくするだけでなく、水平方向のバウンス間隔も小さくすることです。

AS3のコードは次のようになります。

// flickerTime is a Number between 0 and max, in seconds.
// max is the amount in seconds that the flickering effect lasts
// 10 is a constant that can be changed if we want more or less flickers in that amount of time
var max:Number = 3;
var flick:Number = Math.cos(this.flickerTime * this.flickerTime * 10) * (max - this.flickerTime) / max;
this.visible = flick > 0;
于 2013-12-04T20:39:12.163 に答える