2013-07-31 82 views
0

所以我有2帧的图像,我希望把它变成一个rectangle.This图像将动画它的帧,将循环他们 - 第一帧,第二帧。如何动画矩形框?

这里是我的代码:

//Create the image 
Texture2D image; 
//Load, Draw and Update the image in the rectangle 
//Load Contnet 

protected override void LoadContent() 
{ 
    // TODO: use this.Content to load your game content here 
    image = Content.Load<Texture2D>("image"); 
} 
protected override void Update(GameTime gameTime) 
{ 
    //Don't know what to write here, but it should make the frames loop 
} 
protected override void Draw(GameTime gameTime) 
{ 
    //Begin drawing the image 
    spriteBatch.Begin(); 
    spriteBatch.Draw(image, new Rectangle(244, 536, 32, 32), Color.White) 
    spriteBatch.End();  
} 

你能告诉我如何填写我的更新方法?

+0

您需要多张图片,我相信。然后你可以迭代图像。 – Zac

回答

3

添加上述public Game1()这些变量:

//Sprite Texture 
    Texture2D texture; 
    //A Timer variable 
    float timer = 0f; 
    //The interval (300 milliseconds) 
    float interval = 300f; 
    //Current frame holder (start at 1) 
    int currentFrame = 1; 
    //Width of a single sprite image, not the whole Sprite Sheet 
    int spriteWidth = 32; 
    //Height of a single sprite image, not the whole Sprite Sheet 
    int spriteHeight = 32; 
    //A rectangle to store which 'frame' is currently being shown 
    Rectangle sourceRect; 
    //The centre of the current 'frame' 
    Vector2 origin; 

接着,在LoadContent()方法:

 //Texture load 
     texture = Content.Load<Texture2D>("gameGraphics\\Enemies\\Sprite"); 

Update()的方法:

 //Increase the timer by the number of milliseconds since update was last called 
     timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds; 
     //Check the timer is more than the chosen interval 
     if (timer > interval) 
     { 
      //Show the next frame 
      currentFrame++; 
      //Reset the timer 
      timer = 0f; 
     } 
     //If we are on the last frame, reset back to the one before the first frame (because currentframe++ is called next so the next frame will be 1!) 
     currentFrame = currentFrame % 2; 
     sourceRect = new Rectangle(currentFrame * spriteWidth, 0, spriteWidth, spriteHeight); 
     origin = new Vector2(sourceRect.Width/2, sourceRect.Height/2); 

最后,Draw()方法:

 //Texture Draw 
     spriteBatch.Draw(texture, new Vector2(263, 554), sourceRect,Color.White, 0f, origin, 1.0f, SpriteEffects.None, 0); 

注:这是对我的作品的解决方案......如果有人发现这个答案是有用的,他们应该知道,他们的spritesheet必须有它的排列左帧正确否则动画将无法使用。

1

你可以保持一个时间计数器,然后以一定的时间间隔进行切换。你还需要有多个图像。

const int NUM_IMAGES = 2; // or whatever 
Texture2D[] images = new Texture2D[NUM_IMAGES]; 
double elapsedTime = 0; 
int currentFrame = 0; 
double frameInterval = .5; // the time, in seconds, between frames 

protected override void LoadContent() 
{ 
    spriteBatch = new SpriteBatch(GraphicsDevice); 

    // load all of your images. here, I'm assuming that they are numbered. 
    for (int i = 0; i < NUM_IMAGES; i++) 
     images[i] = Content.Load<Texture2D>("image" + i); 
} 
protected override void Update(GameTime gameTime) 
{ 
    // increment elapsed time by the frametime 
    elapsedTime += gameTime.ElapsedGameTime.TotalSeconds; 
    if (elapsedTime >= frameInterval) 
    { 
     // reset the elapsed time, and then update the frame counter. 
     elapsedTime %= frameInterval; 
     currentFrame++; 
     if (currentFrame >= NUM_IMAGES) 
      currentFrame %= NUM_IMAGES; 
    } 
} 
protected override void Draw(GameTime gameTime) 
{ 
    spriteBatch.Begin(); 
    // images[currentFrame] to draw the correct frame. 
    spriteBatch.Draw(images[currentFrame], new Rectangle(244, 536, 32, 32), Color.White); 
    spriteBatch.End(); 
} 
+0

在Update()方法elapsedTime给出“Unreachale代码检测”的警告。该怎么办? – PowerUser

+0

@PowerUser你确定这个警告是在我给你的代码中吗?因为这根本没有任何意义。 – Jashaszun

+0

是的,这是这个代码。不过,我找到了我的解决方案。 – PowerUser