XNA动画切换两个精灵的位置

时间:2013-12-20 18:30:28

标签: c# arrays xna 2d sprite

我正在创建一个基于match-3的游戏。游戏功能齐全,我唯一需要的就是动画。现在我想切换两个精灵的位置,所以我想如果我只是画出后面的东西那么我就不用担心切换任何东西,因为它只会在视觉上发生。

public void Switch2(GameTime gameTime) 
{
    Vector2 sPos1 = new Vector2(16 + 50 * firstXint, 16 + 50 * firstYint);
    Vector2 sPos2 = new Vector2(16 + 50 * secondXint, 16 + 50 * secondYint);
    Vector2 a2 = new Vector2(16 + 50 * firstXint, 16 + 50 * firstYint);
    Vector2 b2 = new Vector2(16 + 50 * secondXint, 16 + 50 * secondYint);
    Vector2 ag2 = new Vector2(14 + 50 * firstXint, 14 + 50 * firstYint);
    Vector2 bg2 = new Vector2(14 + 50 * secondXint, 14 * secondYint);

    if (sPos1.X <= b2.X)
    {
        sPos1 = sPos1 + spriteSpeedX * (float)gameTime.ElapsedGameTime.TotalSeconds;
    }
    if (sPos2.X >= a2.X)
    {
        sPos2 = sPos2 - spriteSpeedX * (float)gameTime.ElapsedGameTime.TotalSeconds;
    }

    spriteBatch.Begin();
    spriteBatch.Draw(gridTexture, ag2, Color.White);
    spriteBatch.End();

    spriteBatch.Begin();
    spriteBatch.Draw(gridTexture, bg2, Color.White);
    spriteBatch.End();

    spriteBatch.Begin();
    spriteBatch.Draw(apple, sPos1, Color.WhiteSmoke);
    spriteBatch.End();

    spriteBatch.Begin();
    spriteBatch.Draw(strawberry, sPos2, Color.WhiteSmoke);
    spriteBatch.End();
}

如果我将Vector2置于此方法之上,但Vector2无法使用firstXint(播放器点击的位置)等,则会有效。然后再次如果我以这种方式尝试,精灵将不会移动,因为游戏总是从头开始调用该方法,因此sPos1sPos2永远不会改变。顺便说一下,然后在Draw()方法中调用该方法。

关于我如何解决这个问题的任何想法?我无法想出任何东西。 (也许是因为我已经使用XNA 2天了,之前游戏是在Windows窗体应用程序而不是精灵只有数字)

1 个答案:

答案 0 :(得分:0)

首先,当您执行多个spriteBatch.Draw时,您不必每次都致电BeginEnd,这非常低效,您只需要:

spriteBatch.Begin();
spriteBatch.Draw(gridTexture, ag2, Color.White);
spriteBatch.Draw(gridTexture, bg2, Color.White);
spriteBatch.Draw(apple, sPos1, Color.WhiteSmoke);
spriteBatch.Draw(strawberry, sPos2, Color.WhiteSmoke);
spriteBatch.End();

对于您的主要问题,您写道,您在Draw中调用此方法,因此每个游戏周期调用此方法,主要问题是您初始化sPos1sPos2和使用gameTime.ElapsedGameTime.TotalSeconds更新其值。

gameTime.ElapsedGameTime是固定的,计算每个周期之间的时间,并且总是大约16毫秒(如果你的游戏每秒更新60次)。这意味着你的精灵位置永远不会改变 你必须使用gameTime.TotalGameTime来跟踪自游戏开始以来的时间,这应该会移动你的精灵。

参考MSDN