0

私はこのコードを持っています:

        public class Area
{
    Texture2D point;
    Rectangle rect;
    SpriteBatch _sB;
    GameTimer _gt;
    int xo, yo, xt, yt;
    //List<Card> _cards;

    public Area(Texture2D point, SpriteBatch sB)
    {
        this.point = point;
        this._sB = sB;
        xt = 660;
        yt = 180;
        xo = 260;
        yo = 90;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        rect = new Rectangle(660, 180, 80, 120);
        spriteBatch.Draw(point, rect, Color.White);

        _gt = new GameTimer();
        _gt.UpdateInterval = TimeSpan.FromSeconds(0.1);
        _gt.Draw += OnDraw;
    }

    private void OnDraw(object sender, GameTimerEventArgs e)
    {
        this.pass(xo, yo);
        if (xo != xt) xo += (xt > xo) ? 10 : -10;
        if (yo != yt) yo += (yt > yo) ? 10 : -10;
    }

    public void pass(int x, int y)
    {
        rect = new Rectangle(x, y, 80, 120);
        _sB.Draw(point, rect, Color.Black);
    }
}

だから、何が悪いのか理解できません。そして、それはXNAを使った私の最初のプロジェクトであり、そのために愚かな間違いがあるかもしれません:)

PSごめんなさい。座標(xt、yt)の長方形があり、長方形を(xo、yo)に移動するためのアニメーションが必要です

PPS間違いがわからないので、クラス全体を修正して追加しました。

4

2 に答える 2

5

アニメーション全体を1つのフレームで描画しています。..OnDrawとは異なるx、yを使用してPassを呼び出す必要があります。

編集:

1)タイマーは必要ありません。ゲームクラスの描画メソッドは、デフォルトで毎秒60フレームと呼ばれます...

2)Secondsパラメーターは、(float)gametime.ElapsedTime.TotalSecondsとして計算する必要があります。

float time;
int xt=660, yt=180;
int xo=260, yo=90;

public void Draw(SpriteBatch spriteBatch, float Seconds)
{
    rect = new Rectangle(660, 180, 80, 120);
    spriteBatch.Draw(point, rect, Color.White);

    this.pass(xo, yo, spriteBatch);
    time+= Seconds;
    if (time>0.3)
    {
        if (xo!=xt) xo+= (xt>xo) ? 10 : -10;
        if (yo!=yt) yo+= (yt>yo) ? 10 : -10;
        time = 0;
    }
}

public void pass(int x, int y, spritebatch sb)
{
    rect = new Rectangle(x, y, 80, 120);
    sb.Draw(point, rect, Color.Red);
}

ご存知のとおり、このアニメーションはラフモードで移動します...スプライトをスムーズに移動したい場合は...位置にVector2を使用し、速度にフロートを使用できます。

Vector2 Origin = new Vector2(260, 90);
Vector2 Target = new Vector2(660, 180);
Vector2 Forward = Vector2.Normalize(Target-Source);
float Speed = 100; // Pixels per second
float Duration = (Target - Origin).Length() / Speed;
float Time = 0;

public void Update(float ElapsedSecondsPerFrame)
{
   if (Time<Duration)
   {
      Time+=Duration;
      if (Time > Duration) {
          Time = Duration;
          Origin = Target;
      }
      else Origin += Forward * Speed * ElapsedSecondsPerFrame;
   } 
}

public void Draw()
{
    rect = new Rectangle((int) Origin.X, (int) Origin.Y, 80, 120);
    sb.Draw(point, rect, Color.Red);   
}
于 2012-04-08T19:43:48.730 に答える
1

Sprite Vortex を使用してアニメーション (実際には特定のバージョン) を作成する場合は、次のクラスを使用できます。新しいバージョンでは XML 形式が変更されているため、Sprite Vortex 1.2.2 を使用する必要があります。プロパティを追加する XML ファイルが「コンパイルしない」に変更されていることを確認してください。

実際の例が必要な場合は、非常に簡単な例をお送りします。

ps Sprite Vortex は、他のプログラムを使用する場合と同じことを行う必要がありますが、v 1.2.2 はかなりバグがありますが、それほど悪くはありません。

クラスはこちら: http://pastebin.com/sNSa7xgQ

Sprite Vortex (1.2.2 であることを確認してください) を使用してスプライトシートを選択し、アニメーション化するサブ画像を選択します。XML コードをエクスポートします。

クラスをプロジェクトに追加すると、XML が読み取られ、アニメーション用のフレームが自動的に作成されます。

于 2012-11-17T05:40:06.933 に答える