2012-07-29 26 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)逻辑块内的被触摸的行星上调用该方法。