2016-11-30 70 views
-2

所以我制作的游戏和小行星非常相似,我不确定如何让小行星产生出屏幕。任何帮助将非常感激。下面是小行星当前代码:产卵物体不在屏幕上

class asteroid 
{ 
    Texture2D m_txr; 
    public Vector2 velocity, position; 
    public BoundingSphere circle; 
    public Rectangle rect; 

    public asteroid(Texture2D txr, Vector2 screen_size, Random RNG) 
    { 
     m_txr = txr; 
     position = Vector2.Zero; 
     position.X = RNG.Next(0, (int)screen_size.X); 
     position.Y = RNG.Next(0, (int)screen_size.Y); 

     circle = new BoundingSphere(new Vector3(position.X + m_txr.Width/2, position.Y + m_txr.Height/2, 0), m_txr.Width/2); 
     velocity = new Vector2(0, 0); 

     while (velocity.X == 0 || velocity.Y == 0) 
      velocity = new Vector2((float)RNG.NextDouble() * RNG.Next(-2, 2), (float)RNG.NextDouble() * RNG.Next(-2, 2)); 

     rect = new Rectangle((int)position.X, (int)position.Y, m_txr.Width, m_txr.Height); 
    } 

    public void update(Vector2 screen_size) 
    { 
     circle.Center.X = position.X + m_txr.Width/2; 
     circle.Center.Y = position.Y + m_txr.Height/2; 

     rect.X = (int)position.X; 
     rect.Y = (int)position.Y; 


     position += velocity; 

     if (position.X > screen_size.X + m_txr.Width) 
      position.X = 0; 
     if (position.X < 0 - m_txr.Width) 
      position.X = screen_size.X; 
     if (position.Y > screen_size.Y + m_txr.Height) 
      position.Y = 0; 
     if (position.Y < 0 - m_txr.Height) 
      position = screen_size; 
    } 

    public void drawme(SpriteBatch sb) 
    { 
     sb.Draw(m_txr, position, Color.White); 
    } 
} 

感谢

+0

为什么你想让它们在屏幕之外产卵?其次你通过在屏幕的大小上限制“RNG.Next”中的产卵,所以增加这个限制并且它应该被解决 – Kyra

回答

0

你限制在asteriod生成方法自己产卵,因为您根据屏幕的大小randomnly位置,这应该修复它:

public asteroid(Texture2D txr, Vector2 screen_size, Random RNG) 
{ 
    m_txr = txr; 
    position = Vector2.Zero; 
    position.X = RNG.Next(0, (int)screen_size.X + 10); 
    position.Y = RNG.Next(0, (int)screen_size.Y + 10); 

    circle = new BoundingSphere(new Vector3(position.X + m_txr.Width/2, position.Y + m_txr.Height/2, 0), m_txr.Width/2); 
    velocity = new Vector2(0, 0); 

    while (velocity.X == 0 || velocity.Y == 0) 
     velocity = new Vector2((float)RNG.NextDouble() * RNG.Next(-2, 2), (float)RNG.NextDouble() * RNG.Next(-2, 2)); 

    rect = new Rectangle((int)position.X, (int)position.Y, m_txr.Width, m_txr.Height); 
} 
+0

我认为这是不正确的,Tomalele希望小行星只在*之外产卵屏幕。 –

+0

我对这个问题的理解有点不同,我的理解是,他希望他们在屏幕上和屏幕上显示出来,只是在屏幕上。即使你的解释是正确的,解决方案也是类似的,他是基于随机生成的,所以改变参数让它们在想要的地方生成 – Kyra

+0

解决方案是类似的,但是这并不能使你的答案正确。 –

1

对不起,由于困惑和久违,我完全忘了这个问题。

这是我想出来的解决方案,如果有人需要这个;

  // possition 
     int XorY = RNG.Next(0, 2); 
     if (XorY == 0) // top or bottom 
     { 
      int TorB = RNG.Next(0, 2); 
      if (TorB == 0) // top 
      { 
       position.X = RNG.Next(0, (int)screen_size.X); 
       position.Y = 0 - m_txr.Width; 
      } 
      else if (TorB == 1) // bottom 
      { 
       position.X = RNG.Next(0, (int)screen_size.X); 
       position.Y = (int)screen_size.Y; 
      } 
     } 
     else if (XorY == 1) // sides 
     { 
      int LorR = RNG.Next(0, 2); 
      if (LorR == 0) // left side 
      { 
       position.X = 0 - m_txr.Width; 
       position.Y = RNG.Next(0, (int)screen_size.Y); 
      } 
      else if (LorR == 1) // right side 
      { 
       position.X = (int)screen_size.X; 
       position.Y = RNG.Next(0, (int)screen_size.Y); 
      } 
     }