C#XNA:如何让小行星从屏幕的各个方向反弹

时间:2014-04-02 10:04:31

标签: c# xna

我正在尝试制作一个小行星游戏并设法让小行星从一侧直线移动到另一侧到另一侧但是,它以无限直线运行而不是从所有侧面反弹屏幕就像我想要的那样。

移动小行星的代码:

public void Update(GameTime gameTime)
    {
        position.X = position.X + speed;
        position.Y = position.Y + speed;

        if (position.X <= 0)
        {
            position.X = 0;
            speed = random.Next(-3,3);
        }
        // Right Boundary
        if (position.X >= 1280 - texture.Width)
        {
            position.X = 1280 - texture.Width;
            speed = random.Next(-3,3);
        }
        // Top Boundary
        if (position.Y <= 0)
        {
            position.Y = 0;
            speed = random.Next(-3,3);
        }
        //Bottom Boundary
        if (position.Y >= 1024 - texture.Height)
        {
            position.Y = 1024 - texture.Height;
            speed = random.Next(-3,3);
        }
    }

我将如何修改此代码,使其停止在直线上移动并从屏幕的所有侧面反弹。 (位置和速度在超类中声明,速度值在小行星类构造函数中声明) 任何建议,将不胜感激。干杯

2 个答案:

答案 0 :(得分:0)

由于我无法评论,我会尽力了解你的问题。 根据我的理解,你发生的事情是,astroids直接上下移动而不是在屏幕周围反弹?

我建议您使用矩阵,并创建这样的旋转。你可以在这里阅读更多有关它的信息,像火箭一样处理星体,并在你自己的代码中使用它们:

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Angle_to_Direction.php

答案 1 :(得分:0)

首先在随机位置创建小行星,然后添加radnom velocity.vector2。所以你的更新功能更新如下:

position += velocity

然后使用此功能在反弹时反转速度。

 private void CheckCollision()
 {
     if (position.X < 0){
         position.X = 0;
        velocity.X *= -1;
     }
     if (position.X + texture.Width > screenBounds.Width){
        position.X = screenBounds.Width - texture.Width;
        velocity.X *= -1;
     }
     if (position.Y < 0){
         position.Y = 0;
         velocity.Y *= -1;
     }
 }