2014-11-12 7 views
0

해결해야 할 문제가 있습니다. C# XNA에서 스페이스 인베이더 게임을 만들고 있습니다. Invaders에 대한 튜토리얼을 다음과 같이 수행했습니다. https://www.youtube.com/watch?list=LLhsF03QfDMDhbw02_8C6Smg&v=wIW4S75iZBI&feature=player_detailpage#t=397 하지만 침입자 스프라이트 시트에 애니메이션을 적용하는 코드도 있습니다. 그리고 결국 여기에 내가 그리기있어 무엇 :C# XNA - 2 Rectangle 변수 애니메이션 텍스처를 그리는 방법?

void Draw(SpriteBatch spriteBatch){ 
    for (int r = 0; r < m_InvaderRows; r++) 
    { 
    for (int c = 0; c < m_InvaderCollumns; c++) 
    { 
     spriteBatch.Draw(m_BotInvaderTex, m_BotInvaderPos, m_BotInvaderHitBox, Color.White, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0); 

     // ??? 

     spriteBatch.Draw(m_BotInvaderTex, m_BotInvadersRect[r, c], Color.White); 
    } 
    } 
} 

그래서 처음 Draw() 전화는 1 애니메이션 스프라이트를 그립니다. 두 번째는 애니메이션이없는 50 개의 스프라이트를 그립니다. m_BotInvadersRect[r, c]은 다차원 배열로 사용한 직사각형입니다. 그래서 Draw 호출을 결합하고 내 화면에 50 개의 애니메이션 스프라이트가 그려지는 방법을 찾고 있습니다.

코드를 사용하여 침략자를 애니메이션으로 만들려면 어떻게해야합니까?

내 코드 :

using System; 
    using System.Collections; 
    using System.Collections.Generic; 
    using System.Linq; 
    using Microsoft.Xna.Framework; 
    using Microsoft.Xna.Framework.Storage; 
    using Microsoft.Xna.Framework.Audio; 
    using Microsoft.Xna.Framework.Content; 
    using Microsoft.Xna.Framework.GamerServices; 
    using Microsoft.Xna.Framework.Graphics; 
    using Microsoft.Xna.Framework.Input; 
    using Microsoft.Xna.Framework.Media; 
    using Microsoft.Xna.Framework.Net; 

    namespace SpaceInvaders 
    { 
    class botInvader 
    { 

     public botInvader() 
     { 

     } 

     public static Texture2D g_BotInvaderTex; 
     Rectangle m_BotInvaderHitBox; 
     public static Vector2 g_BotInvaderPos = new Vector2(0, 24); 
     Vector2 m_BotInvaderOrigin; 

     int m_BotInvaderCurrentFrame = 1; 
     int m_BotInvaderFrameWidth = 52; 
     int m_BotInvaderFrameHeight = 88; 

     float m_Timer = 0f; 
     float m_Interval = 100; 

     Rectangle[,] m_BotInvadersRect; 
     int m_InvaderRows = 5; 
     int m_InvaderCollumns = 10; 
     String m_BotInvadersDirection = "RIGHT"; 

     public void Initialize() 
     { 

     } 

     public void LoadContent(ContentManager Content) 
     { 
      g_BotInvaderTex = Content.Load<Texture2D>(".\\gameGraphics\\gameSprites\\botInvaders\\normalInvaders\\spritesheet"); // invaderShip1 
      m_BotInvadersRect = new Rectangle[m_InvaderRows, m_InvaderCollumns]; 
      for (int r = 0; r < m_InvaderRows; r++) 
      { 
       for (int c = 0; c < m_InvaderCollumns; c++) 
       { 
        m_BotInvadersRect[r, c].Width = g_BotInvaderTex.Width; 
        m_BotInvadersRect[r, c].Height = g_BotInvaderTex.Height; 
        m_BotInvadersRect[r, c].X = 70 * c; 
        m_BotInvadersRect[r, c].Y = 70 * r; 
       } 
      } 
     } 

     public void Update(GameTime gameTime) 
     { 
      m_BotInvaderHitBox = new Rectangle(m_BotInvaderCurrentFrame * m_BotInvaderFrameWidth, 0, m_BotInvaderFrameWidth, m_BotInvaderFrameHeight); 
      m_BotInvaderOrigin = new Vector2(m_BotInvaderHitBox.X/2, m_BotInvaderHitBox.Y/2); 

      m_Timer += (float)gameTime.ElapsedGameTime.Milliseconds; 

      if (m_Timer > m_Interval) 
      { 
       m_BotInvaderCurrentFrame++; 
       m_Timer = 0f; 
      } 

      if (m_BotInvaderCurrentFrame == 2) 
      { 
       m_BotInvaderCurrentFrame = 0; 
      } 

      m_BotInvaderHitBox = new Rectangle(m_BotInvaderCurrentFrame * m_BotInvaderFrameWidth, 0, m_BotInvaderFrameWidth, m_BotInvaderFrameHeight); 
      m_BotInvaderOrigin = new Vector2(m_BotInvaderHitBox.Width/2, m_BotInvaderHitBox.Height/2); 

      int m_RightSide = 800; 
      int m_LeftSide = 0; 

      for (int r = 0; r < m_InvaderRows; r++) 
      { 
       for (int c = 0; c < m_InvaderCollumns; c++) 
       { 
        if (m_BotInvadersDirection.Equals ("RIGHT")) 
        { 
         m_BotInvadersRect[r, c].X = m_BotInvadersRect[r, c].X + 1; 
        } 

        if (m_BotInvadersDirection.Equals("LEFT")) 
        { 
         m_BotInvadersRect[r, c].X = m_BotInvadersRect[r, c].X - 1; 
        } 
       } 
      } 

      String m_BotInvadersChangeDirection = "N"; 

      for (int r = 0; r < m_InvaderRows; r++) 
      { 
       for (int c = 0; c < m_InvaderCollumns; c++) 
       { 
        if (m_BotInvadersRect[r, c].X + m_BotInvadersRect[r, c].Width > m_RightSide) 
        { 
         m_BotInvadersDirection = "LEFT"; 
         m_BotInvadersChangeDirection = "Y"; 
        } 

        if (m_BotInvadersRect[r, c].X < m_LeftSide) 
        { 
         m_BotInvadersDirection = "RIGHT"; 
         m_BotInvadersChangeDirection = "Y"; 
        } 
       } 

       if (m_BotInvadersChangeDirection.Equals("Y")) 
       { 
         for (int c = 0; c < m_InvaderCollumns; c++) 
         { 
          m_BotInvadersRect[r, c].Y = m_BotInvadersRect[r, c].Y + 3; 
         } 
       } 
      } 
     } 

     public void Draw(SpriteBatch spriteBatch) 
     { 
      for (int r = 0; r < m_InvaderRows; r++) 
      { 
       for (int c = 0; c < m_InvaderCollumns; c++) 
       { 
        spriteBatch.Draw(g_BotInvaderTex, g_BotInvaderPos, m_BotInvaderHitBox, Color.White, 0f, Vector2.Zero, 1.0f, SpriteEffects.None, 0); 
        spriteBatch.Draw(g_BotInvaderTex, m_BotInvadersRect[r, c], Color.White); 
       } 
      }   
     } 
    } 
} 

답변

0

당신은이 튜토리얼에서 같은 스프라이트를 만들기위한 호출 만들어야합니다 ->enter link description here합니다. 이 클래스 유에서 애니메이션을

m_BotInvaderHitBox = new Rectangle(m_BotInvaderCurrentFrame * m_BotInvaderFrameWidth, 0, m_BotInvaderFrameWidth, m_BotInvaderFrameHeight); 
 
      m_BotInvaderOrigin = new Vector2(m_BotInvaderHitBox.X/2, m_BotInvaderHitBox.Y/2); 
 

 
      m_Timer += (float)gameTime.ElapsedGameTime.Milliseconds; 
 

 
      if (m_Timer > m_Interval) 
 
      { 
 
       m_BotInvaderCurrentFrame++; 
 
       m_Timer = 0f; 
 
      } 
 

 
      if (m_BotInvaderCurrentFrame == 2) 
 
      { 
 
       m_BotInvaderCurrentFrame = 0; 
 
      } 
 

 
      m_BotInvaderHitBox = new Rectangle(m_BotInvaderCurrentFrame * m_BotInvaderFrameWidth, 0, m_BotInvaderFrameWidth, m_BotInvaderFrameHeight); 
 
      m_BotInvaderOrigin = new Vector2(m_BotInvaderHitBox.Width/2, m_BotInvaderHitBox.Height/2); 
 

 
      int m_RightSide = 800; 
 
      int m_LeftSide = 0; 
 

 
      for (int r = 0; r < m_InvaderRows; r++) 
 
      { 
 
       for (int c = 0; c < m_InvaderCollumns; c++) 
 
       { 
 
        if (m_BotInvadersDirection.Equals ("RIGHT")) 
 
        { 
 
         m_BotInvadersRect[r, c].X = m_BotInvadersRect[r, c].X + 1; 
 
        } 
 

 
        if (m_BotInvadersDirection.Equals("LEFT")) 
 
        { 
 
         m_BotInvadersRect[r, c].X = m_BotInvadersRect[r, c].X - 1; 
 
        } 
 
       } 
 
      } 
 

 
      String m_BotInvadersChangeDirection = "N"; 
 

 
      for (int r = 0; r < m_InvaderRows; r++) 
 
      { 
 
       for (int c = 0; c < m_InvaderCollumns; c++) 
 
       { 
 
        if (m_BotInvadersRect[r, c].X + m_BotInvadersRect[r, c].Width > m_RightSide) 
 
        { 
 
         m_BotInvadersDirection = "LEFT"; 
 
         m_BotInvadersChangeDirection = "Y"; 
 
        } 
 

 
        if (m_BotInvadersRect[r, c].X < m_LeftSide) 
 
        { 
 
         m_BotInvadersDirection = "RIGHT"; 
 
         m_BotInvadersChangeDirection = "Y"; 
 
        } 
 
       } 
 

 
       if (m_BotInvadersChangeDirection.Equals("Y")) 
 
       { 
 
         for (int c = 0; c < m_InvaderCollumns; c++) 
 
         { 
 
          m_BotInvadersRect[r, c].Y = m_BotInvadersRect[r, c].Y + 3; 
 
         } 
 
       } 
 
      }

을 넣어도 있고 마지막으로 당신은 튜토리얼을 따라이 객체의 목록을 작성하고 추첨 방식에서리스트의 각 항목을 그릴 수 있습니다.

+0

Game1.cs의 그리기 방법 –

관련 문제