Easing の結果を new として取っていx
ます。これは非常に奇妙です!
また、x
であるはずlinearStep
です。linearStep
は ですがdouble
、あなたx
はint
です。x
adouble
を作成し、適切な量だけ増やします。
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);
}