2012-12-04 116 views
0
public class dgc_Spaceship : DrawableGameComponent 
{ 

    Texture2D shipTexture; 
    Rectangle spriteRectangle; 
    SpriteBatch spriteBatch; 
    // 
    bool horizisSelected = false; 
    bool rotateSelected = false; 
    bool fireisSelected = false; 

    SpriteFont Count; 

    //Controls for ship 
    dgc_TriggerHorizontal triggerHorizantal; 



    Vector2 spritePosition; 
    Vector2 spriteOrigin; 
    Vector2 direction; 


    float rotation = 0.1f; 
    Random x, y; 


    List<Missle> missleCollection = new List<Missle>(); 
    List<Asteriod> asteriodCollection = new List<Asteriod>(); 


    Missle missle; 

    Asteriod asteriod; 

    public dgc_Spaceship(Game game) 
     : base(game) 
    { 
     // TODO: Construct any child components here 


     triggerHorizantal = new dgc_TriggerHorizontal(game); 
     triggerHorizantal.triggerHorizantal += new EventHandler(triggerHorizantal_Handler); 
     triggerHorizantal.triggerRotate +=new EventHandler(triggerHorizantal_triggerRotate); 
     triggerHorizantal.triggerFire +=new EventHandler(triggerHorizantal_triggerFire); 
     Game.Components.Add(triggerHorizantal); 
     missle = new Missle(game); 
     asteriod = new Asteriod(game); 

     for (int i = 0; i < 2; i++) 
     { 
      missleCollection.Add(new Missle(game)); 
     } 


     for (int i = 0; i < 2; i++) 
     { 
      asteriodCollection.Add(new Asteriod(game)); 
     } 


     } 




    /// <summary> 
    /// Allows the game component to perform any initialization it needs to before starting 
    /// to run. This is where it can query for any required services and load content. 
    /// </summary> 
    public override void Initialize() 
    { 
     // TODO: Add your initialization code here 

     base.Initialize(); 
    } 

    protected override void LoadContent() 
    { 

     spriteBatch = new SpriteBatch(GraphicsDevice); 
     shipTexture = Game.Content.Load<Texture2D>(@"Sprites\spaceship"); 
     spritePosition = new Vector2(450,320); 
     missle.LoadContent(); 

     Count = Game.Content.Load<SpriteFont>(@"Sprites\Count"); 
     // 
     x = new Random(); 
     y = new Random(); 

     foreach (Asteriod display in asteriodCollection) 
     { 
      display.LoadContent(); 

      int xVec = x.Next(0, 200), yVec = y.Next(0, 200); 
      display.position = new Vector2(xVec, yVec); 
     } 





     base.LoadContent(); 
    } 

    /// <summary> 
    /// Allows the game component to update itself. 
    /// </summary> 
    /// <param name="gameTime">Provides a snapshot of timing values.</param> 
    public override void Update(GameTime gameTime) 
    { 
     // TODO: Add your update code here 

     spriteRectangle = new Rectangle((int)spritePosition.X, (int)spritePosition.Y, shipTexture.Width, shipTexture.Height); 

     spriteOrigin = new Vector2(spriteRectangle.Width/2, spriteRectangle.Height/2); 

     direction = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)); 


     if (horizisSelected) 
     { 
      spritePosition.X-= 0.5f; 
      spritePosition.Y-= 0.5f; 

     } 


     if (rotateSelected) 
     {    
      rotation += 0.1f; 
      // missle.rotateSprite(); 
      spritePosition += direction * 20 * gameTime.ElapsedGameTime.Milliseconds; 
     } 

     if (fireisSelected) 
     { 
      missle.update(); 
     } 



     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 

     spriteBatch.Begin(); 
     // missle.draw(spriteBatch,rotation); 
     spriteBatch.Draw(shipTexture,spritePosition,null,Color.White,rotation,spriteOrigin,1f,SpriteEffects.None,0); 
     // spriteBatch.DrawString(Count,asteriodCollection.Count.ToString(),new Vector2(100,100),Color.Red); 
     foreach (Asteriod display in asteriodCollection) 
     { 
      display.Draw(spriteBatch); 
     } 
     spriteBatch.End(); 

     base.Draw(gameTime); 
    } 


    public void triggerHorizantal_Handler(object sender, EventArgs e) 
    { 
     //Do Stuff 
     horizisSelected = !horizisSelected; 

    } 

    public void triggerHorizantal_triggerRotate(object sender, EventArgs e) 
    { 
     //Do Stuff 
     rotateSelected = !rotateSelected; 
    } 

    public void triggerHorizantal_triggerFire(object sender, EventArgs e) 
    { 
     //Do Stuff 
     fireisSelected = !fireisSelected; 
    } 




    } 
} 

我的问题:XNA旋转和移动雪碧

我似乎无法想出解决办法。我在屏幕上有2个功能按钮。点击时,船顺时针旋转,另一个向前移动。稍微搜索一下,我就会发现带有Math.Sin/Cos的公式,但我认为我没有正确实现它。

我需要做的是将船沿旋转方向移动。

它的工作方式: 用户将点击旋转按钮,它将顺时针旋转船舶。当它处于用户想要的位置时,他们击中旋转按钮以停止该特定方向。

击中水平按钮,它会将船向前移动。

回答

1

你的代码表明,你移动你的精灵中选择旋转时所期望的方向,这需要在选择水平相反,如果选择旋转,然后你的方向应该改变(不是每帧)做

编辑:(最长5分钟)

if (horizisSelected) 
    { 
     //spritePosition.X-= 0.5f; 
     //spritePosition.Y-= 0.5f; 
     spritePosition += direction;// * 20 * gameTime.ElapsedGameTime.Milliseconds; 

    } 


    if (rotateSelected) 
    {    
     rotation += 0.1f; 
     // missle.rotateSprite(); 

     direction = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)); 
     //spritePosition += direction * 20 * gameTime.ElapsedGameTime.Milliseconds; 
    } 

如果你的船是它可能是因为经过的时间(毫秒)飞走,你将不得不调试成

+0

你能不能帮我修改吗?当我移动代码时,船只消失。 –

+0

检查更新的编辑 – Sayse

+0

您ROCK!谢谢! –