C# XNA:如何让小行星从屏幕的所有侧面反弹

本文关键字:侧面 屏幕 XNA 小行星 | 更新日期: 2023-09-27 17:56:13

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

移动小行星的代码:

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);
        }
    }

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

C# XNA:如何让小行星从屏幕的所有侧面反弹

由于我还不能发表评论,我将尽力理解您的问题。据我了解,发生在你身上的是天体直接上下移动,而不是在屏幕上

弹跳?

我建议你使用矩阵,并创建一个这样的旋转。 你可以在这里阅读更多关于它的信息,把天体像火箭一样对待,并在你自己的代码中植入:

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

首先在随机位置创建小行星,并将它们添加为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;
     }
 }