0

私はC#でいくつかのイージング関数を使用していEase InますEase out。しかし、私がこれらのイージング機能で達成しようとしていることは、目に見える効果を与えません。

例:

int x=2;
while(x<200)
SetSomething(x = EaseIn(x, 1, EasingType.Quadratic));

SetSomethingの実行速度では、の効果に気付くのに十分な時間がありませんSetSomething。例:値は2-> 4->16->256から始まります

次の種類のグラフを作成しようとしましたが、値は小さくなりました(200以下): http ://theinstructionlimit.com/wp-content/uploads/2009/07/easing.png

イージング関数の実装はここにあります:http://theinstructionlimit.com/wp-content/uploads/2009/07/Easing.cs

200未満の狭い範囲で二次値を取得した場合でも、効果が緩和されることに気付くには、ループの各反復で少なくとも非常に小さな一時停止のような効果が必要です。この小さな一時停止は、2次曲線に従うこともできます(つまり、緩和のために:一時停止期間が最初に長くなり、次に一時停止期間が短くなる可能性があります)

私は同じために何をすべきですか?200未満の範囲の2次グラフを取得し、各反復でこの一時停止のような効果を得るにはどうすればよいですか?

4

2 に答える 2

1

Easing の結果を new として取っていxます。これは非常に奇妙です!

また、xであるはずlinearStepです。linearStepは ですがdouble、あなたxintです。xadoubleを作成し、適切な量だけ増やします。

const double step = 1.5; // Choose an appropriate value here!

for (double x = 2.0; x <= 200.0; x += step) {
    double y = Ease(x, 1.0f, EasingType.Quadratic);
    SetSomething(y); 
}

アップデート

あなたのデザインは非常に手続き的です。私はオブジェクト指向のアプローチを好みます。switch-ステートメントは、多くの場合、ポリモーフィック (オブジェクト指向) アプローチに置き換えることができます。

public abstract class Curve 
{
    public float EaseIn(double s);
    public float EaseOut(double s);
    public static float EaseInOut(double s);
}

public class StepCurve : Curve
{
    public override float EaseIn(double s)
    {
        return s < 0.5 ? 0.0f : 1.0f;
    }

    public override float EaseOut(double s)
    {
        return s < 0.5 ? 0.0f : 1.0f;
    }

    public override float EaseInOut(double s)
    {
        return s < 0.5 ? 0.0f : 1.0f;
    }
}

public class LinearCurve : Curve
{
    public override float EaseIn(double s)
    {
        return (float)s;
    }

    public override float EaseOut(double s)
    {
        return (float)s;
    }

    public override float EaseInOut(double s)
    {
        return (float)s;
    }
}

public class SineCurve : Curve
{
    public override float EaseIn(double s)
    {
        return (float)Math.Sin(s * MathHelper.HalfPi - MathHelper.HalfPi) + 1;
    }

    public override float EaseOut(double s)
    {
        return (float)Math.Sin(s * MathHelper.HalfPi);
    }

    public override float EaseInOut(double s)
    {
        return (float)(Math.Sin(s * MathHelper.Pi - MathHelper.HalfPi) + 1) / 2;
    }
}

public class PowerCurve : Curve
{
    int _power;

    public PowerCurve(int power)
    {
        _power = power;
    }

    public override float EaseIn(double s)
    {
        return (float)Math.Pow(s, _power);
    }

    public override float EaseOut(double s)
    {
        var sign = _power % 2 == 0 ? -1 : 1;
        return (float)(sign * (Math.Pow(s - 1, _power) + sign));
    }

    public override float EaseInOut(double s)
    {
        s *= 2;
        if (s < 1) return EaseIn(s, _power) / 2;
        var sign = _power % 2 == 0 ? -1 : 1;
        return (float)(sign / 2.0 * (Math.Pow(s - 2, _power) + sign * 2));

    }
}

これらの定義を使用すると、Easeメソッドを次のように変更できます。

public static float Ease(double linearStep, float acceleration, Curve curve)
{
    float easedStep = acceleration > 0 ? curve.EaseIn(linearStep) :
                      acceleration < 0 ? curve.EaseOut(linearStep) :
                      (float)linearStep;
    return MathHelper.Lerp(linearStep, easedStep, Math.Abs(acceleration));
}

switch-statementsを使用すると、メソッドを完全に削除できます。あなたは3次曲線を描くでしょう

var curve = new PowerCurve(3);
for (double x = 2.0; x <= 200.0; x += step) {
    double y = Ease(x, 1.0f, curve);
    SetSomething(y); 
}
于 2012-06-24T20:00:21.467 に答える
0

あなたがやりたいことを何でもするのに役立つはずだと私が考えることができる3つの方法があります(私はあなたが達成しようとしていることを正確に理解しているとは100%確信していません):)

  1. より大きな間隔を使用してから、描画中にスケーリングします。たとえば、x を 0 ~ 200 の範囲にする代わりに、0 ~ 200 00 の範囲にしてから、描画時に 0,01 でスケーリングします。

  2. スリープ機能を使用してください。sleep 関数は、現在のスレッドの実行を一定時間一時停止します。

  3. タイマーを使用します。タイマー スレッドを使用することをお勧めしますが、winform タイマーを使用することもできます。これは、あなたが示した例のように、ほぼ一定の FPS を確認する最も簡単な方法です。

http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

于 2012-06-24T17:40:42.863 に答える