直截了当地说,使用变量而不是类来表示您的小行星可能不是一个好主意。您在标题中提到您在这里拥有的是一个重复的对象-甚至不是这种情况,因为您没有使用任何对象!由于在您的脑海中,您将这颗小行星可视化为一个物体,因此您应该使用一个类来包含它。
所有小行星都朝向同一个方向的原因是因为AsteroidRotation = MathHelper.Lerp(-0.5f, +0.5f, (float)random.NextDouble()); 是一个单一的值,与每个小行星的自转使用的值相同。
同样,您不能简单地使用AsteroidRotation[i],因为这意味着AsteroidRotation 是一个轮换集合,您可以在其中使用[i] 访问集合中的i 个 值.它不是一个集合,它是一个浮点值。
解决这个问题的两种方法:
1) 快速简单。不建议。不是未来的证明。会导致坏习惯。
将旋转值设为数组。
float[] asteroidRotation = new float[25];
for (int i = 0; i < 25; i++)
{
asteroidRotation[i] = MathHelper.ToRadians(random.Next(360));
// ToRadians() important, XNA does not work in degrees.
}
然后在你的绘图代码中你需要使用:
spriteBatch.Draw(AsteroidTexture,
AsteroidPositions[i],
AsteroidSourceLocation,
Color.White,
AsteroidRotation[i],
AsteroidSourceOrigin,
1.0f,
SpriteEffects.None,
AsteroidLocation.Y / 720.0f);
2) 创建一个Asteroid 类。好习惯。使用 C# / .Net 的面向对象的特性。
创建一个包含所有数据和相关方法的小行星类。这与您的“而不是为每个人创建 10 多种不同的东西”作斗争。
一个非常快速的课程设置,但它会完成工作:
public class Asteroid
{
public Texture2D Texture { get; set; }
public Vector2 Position { get; set; }
public Color Color { get; set; }
public float Rotation { get; set; }
public Rectangle SourceLocation { get; set; }
public Vector2 SourceOrigin { get; set; }
public Asteroid()
{
}
public void Draw(SpriteBatch sb)
{
sb.Draw(
Texture,
Position,
SourceLocation,
Color,
Rotation,
SourceOrigin,
1.0f,
SpriteEffects.None,
0f);
}
}
创建小行星列表并填写列表:
List<Asteroid> asteroids = new List<Asteroid>();
int numAsteroids = 25;
for (int i = 0; i < numAsteroids; i++)
{
Asteroid asteroid = new Asteroid();
asteroid.Texture = asteroidTexture;
asteroid.Position = new Vector2(1 * random.Next(800), 1 * random.Next(600));
asteroid.Color = Color.White;
asteroid.Rotation = MathHelper.ToRadians(random.Next(360));
asteroid.SourceLocation = new Rectangle(0, 0, 0, 0); // Fill me in
asteroid.SourceOrigin = new Vector2(0, 0); // Fill me in
asteroids.Add(asteroid);
}
确保您只执行一次,最好是在您游戏的其他 LoadContent() 或 Initialize() 方法中!
然后绘制:
foreach (Asteroid asteroid in asteroids)
{
asteroid.Draw(spriteBatch);
}
应该就是这样。我不认为我错过了什么!
将来,这使您可以扩展小行星可以非常轻松地完成的任务。您可以创建一个控制旋转速度的Update() 方法;通过给它们自己的速度让小行星移动。