2012-07-29 60 views
1

使用Xna和C#的Im。爲XNA列表中的特定對象創建碰撞

我試圖讓我的列表中的具體對象做不同的事情。

的方式IVE寫出來的那一刻在我的列表中選擇所有的紋理,他們都做同樣的事情,如果我嘗試和選擇特定的質地他們都還在做同樣的事情:

if (planet.Load("planet0")) { if (planet.Bounds.Contains((int)tl.Position.X, (int)tl.Position.Y)) { changeScreenDelegate(ScreenState.Menu); } }

我基本上試圖讓每個選擇轉到不同的屏幕。

繼承人我班上的其他同學:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
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.Input.Touch; 
using Microsoft.Xna.Framework.Media; 


namespace PlanetDrill2 
{ 
    class StarSystemUrsa : Screen 
    { 
     Texture2D starSystemTexture; 

    List<Planet> planets; 

    Texture2D star; 
    Vector2 position; 
    Texture2D previousButton; 


    public StarSystemUrsa(Game game, SpriteBatch spriteBatch, ChangeScreen changeScreen) 
     : base(game, batch, changeScreen) 
    { 

     position = new Vector2((480 - 295)/2, (800 - 295)/2); 



     planets = new List<Planet>(); 

     Planet planet = new Planet(content, spriteBatch); 
     planet.Load("planet0"); 
     planet.velocity = 0.04f; 
     planet.radius = 80; 
     planet.angle = MathHelper.ToRadians(90); 
     planets.Add(planet); 

     planet = new Planet(content, spriteBatch); 
     planet.Load("planet4"); 
     planet.velocity = 0.02f; 
     planet.radius = 135; 
     planet.angle = MathHelper.ToRadians(120); 
     planets.Add(planet); 

     planet = new Planet(content, spriteBatch); 
     planet.Load("planet2"); 
     planet.velocity = 0.009f; 
     planet.radius = 180; 
     planet.angle = MathHelper.ToRadians(160); 
     planets.Add(planet); 

    } 




    protected override void SetupInputs() 
    { 

     base.SetupInputs(); 
    } 


    public override void Activate() 
    { 
     base.Activate(); 
    } 

    protected override void LoadScreenContent(ContentManager content) 
    { 
     starSystemTexture = content.Load<Texture2D>("levelSelectMenu"); 
     star = content.Load<Texture2D>("ursaeMajorisStar"); 
     previousButton = content.Load<Texture2D>("previousButton2"); 



     base.LoadScreenContent(content); 
    } 

    protected override void UpdateScreen(GameTime gameTime, DisplayOrientation screenOrientation) 
    { 

     TouchCollection touchCollection = TouchPanel.GetState(); 

    foreach(TouchLocation tl in touchCollection) 
     { 
      if(tl.State == TouchLocationState.Pressed) // Moved? Is that right? 
      { 
       foreach(Planet planet in planets) 
       { 

        // Alternately: if(GetPlanetRectangle(planet).Contains(...)) 
        if(planet.Bounds.Contains((int)tl.Position.X, (int)tl.Position.Y)) 
        { 
         changeScreenDelegate(ScreenState.Menu); 
        } 

       } 

      } 

      TouchPanel.EnabledGestures = GestureType.DoubleTap | GestureType.VerticalDrag; 

      while (TouchPanel.IsGestureAvailable) 
      { 


       GestureSample gesture = TouchPanel.ReadGesture(); 

       switch (gesture.GestureType) 
       { 
        case GestureType.DoubleTap: 
         changeScreenDelegate(ScreenState.launchScreen); 
         break; 
        case GestureType.VerticalDrag: 

         break; 
        default: 
         break; 
       } 
      } 
     } 







     foreach (Planet planet in planets) 
     { 
      planet.angle += planet.velocity; 
      float orbitx = (float)(Math.Cos(planet.angle) * planet.radius); 
      float orbity = (float)(Math.Sin(planet.angle) * planet.radius); 

      float x = (game.GraphicsDevice.Viewport.Width - planet.image.Width)/2 + orbitx; 
      float y = (game.GraphicsDevice.Viewport.Height - planet.image.Height)/2 + orbity; 

      planet.position = new Vector2(x, y); 


     } 



     base.UpdateScreen(gameTime, screenOrientation); 


    } 

    protected override void DrawScreen(SpriteBatch batch, DisplayOrientation screenOrientation) 
    { 


     batch.Draw(starSystemTexture, Vector2.Zero, Color.White); 

     foreach (Planet planet in planets) 
     { 
      planet.Draw(); 
     } 

     batch.Draw(star,position, Color.White); 
     batch.Draw(previousButton, new Vector2(240, 750), Color.White); 
     base.DrawScreen(batch, screenOrientation); 
    } 





     protected override void SaveScreenState() 
     { 
      base.SaveScreenState(); 
     } 
    } 
} 

回答

2

給你的星球類另一個屬性稱爲ID,然後在初始化時爲每個星球分配一個不同的ID。然後在行星循環您的foreach的星球,你可以說

if(planet.ID == 0) { if (planet.Bounds.Contains((int)tl.Position.X, (int)tl.Position.Y)) { changeScreenDelegate(ScreenState.Menu); } }

這樣做對每一個可能的ID號,並更改screenstate到任何屏幕狀態,你想讓它轉。

另外,您可以枚舉ID號碼以清楚說明哪個行星正在被引用。

+0

乾杯兄弟,這樣做。我並不認爲在我的課堂中添加另一個成員,然後將其附加到我的列表中的每個星球,然後幫助識別每個對象。我想另一種方式,我可以做到這一點,如果(planet.radius == 135)等等。 – Clockworks 2012-08-04 21:51:40

1

附上Menuscreen作爲地球的對象的屬性。爲這些對象提供一種方法告訴屏幕管理者激活其屏幕。在你的(如果Planet.Bounds.Conains)邏輯塊內的被觸摸的行星上調用該方法。