Inledning
Denna artikel är en direkt fortsättning på Asteroids - Del 4 . Nu är det dags att blanda in lite meteoriter i spelet.
Fler listor
Precis som med skotten så ska vi använda listor för att hålla reda på meteoriternas positioner och hastigheter. Samtidigt behöver vi en Random-variabel för att slumpa ut startpositionerna för meteoriterna.
Deklarera följande variabler:
//Meteoriter
Texture2D gfx_meteor;
List<Vector2> meteor_pos = new List<Vector2>();
List<Vector2> meteor_speed = new List<Vector2>();
Random myRnd = new Random();
Som vanligt behövs det lite grafik. Ladda hem meteor.bmp nedan och placera den i din Content-mapp i projektkatalogen. Lägg även till filen i Solution Explorern.
Skapa meteoriter
I metoden LoadContent() ska vi nu ladda in grafiken som vanligt men också skapa 10 meteoriter. Detta gör vi såklart med en loop:
gfx_meteor = Content.Load<Texture2D>("meteor");
for (int i = 0; i < 10; i++)
{
meteor_pos.Add(new Vector2(myRnd.Next(800), myRnd.Next(600)));
double tmp_angle = (myRnd.Next(1000) * Math.PI * 2) / 1000.0;
double tmp_speed = 0.5 + 3.0 * (myRnd.Next(1000) / 1000.0);
meteor_speed.Add(new Vector2((float)(tmp_speed * Math.Cos(tmp_angle)),
(float)(tmp_speed * Math.Sin(tmp_angle))));
}
Positionen slumpas mellan 0 och 799 i sidled och mellan 0 och 599 i höjdled. Hastigheten sätts ihop av en vinkel (tmp_angle) och fart (tmp_speed). För att slumpa decimala tal, t.ex. värden mellan 0.0 till 1.0 så får vi göra ett litet knep. Vi slumpar tall mellan 0 och 1000 och dividerar resultatet med 1000.0. Det är viktigt här att det står 1000.0 och inte bara 1000 för annars blir det en division mellan två heltal.
Vi ser till att hastigheten blir minst 0.5 och max 3.5 med samma metod för slump.
Uppdatera meteoriterna
I metoden Update() behöver vi loop'a igenom meteoriterna och förflytta dem. Samtidigt kan vi se till att de inte åker iväg i cyberrymden på samma sätt som vi gjorde med rymdskeppet i Asteroids - Del 3 .
for (int i = 0; i < meteor_pos.Count; i++)
{
meteor_pos[i] += meteor_speed[i];
Vector2 v = meteor_pos[i];
//Utanför skärmen?
if (v.X < -80)
v.X = graphics.GraphicsDevice.Viewport.Width + 80;
if (v.X > graphics.GraphicsDevice.Viewport.Width + 80)
v.X = -80;
if (v.Y < -60)
v.Y = graphics.GraphicsDevice.Viewport.Height + 60;
if (v.Y > graphics.GraphicsDevice.Viewport.Height + 60)
v.Y = -60;
//Uppdatera i listan
meteor_pos[i] = v;
}
Rita ut meteoriterna
Sist men inte minst så måste vi uppdatera metoden Draw() så att meteoriterna ritas ut.
for (int i = 0; i < meteor_pos.Count; i++)
{
spriteBatch.Draw(gfx_meteor, meteor_pos[i], null, Color.White, 0,
new Vector2(gfx_meteor.Width / 2, gfx_meteor.Height / 2), 1.0f, SpriteEffects.None, 0);
}