如何在XNA中产生无限的敌人?

时间:2014-10-11 23:15:43

标签: c# xna

我正在使用XNA框架工作开发游戏,这是我的代码 我只想生成无数的敌人 这是我的代码请帮助

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace fight_in_the_sky
{
/// <summary>
/// This is the main type for your game
/// </summary>
/// 
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spritebatch;
    Texture2D  anim, background1, background2, enemy;
    Rectangle rect0, rect2, rectdst, srcrect, rect3, rect4, srcrect2, enemy_rect;
    float elapsed;
    float delay = 40f;
    int frames = 0;
    Random random = new Random();
    public Vector2 velocity;
    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        graphics.PreferredBackBufferWidth = 800;
        graphics.PreferredBackBufferHeight = 600;
        IsMouseVisible = true;
    }


    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        rectdst = new Rectangle(0, 250, 115, 69);
        rect3 = new Rectangle(0,0,1280,720);
        rect4 = new Rectangle(1280, 0, 1280, 720);
        enemy_rect = new Rectangle(random.Next(800-94,800-47),random.Next(600-122,600-61),376/8,61);
        velocity.X = 3f;
        velocity.Y = 3f;
        base.Initialize();
    }


    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spritebatch = new SpriteBatch(GraphicsDevice);
        background1= Content.Load<Texture2D>("starfield006");
        background2= Content.Load<Texture2D>("starfield005");
        anim=Content.Load<Texture2D>("shipAnimation");
        enemy =Content.Load<Texture2D>("mineAnimation");
        rect0 = new Rectangle(0, 0, 800, 600);
        rect2 = new Rectangle(0, 250,200, 100);

        // TODO: use this.Content to load your game content here
    }


    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }

    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        // if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        // this.Exit();
        // TODO: Add your update logic here
        elapsed += (float)gameTime.ElapsedGameTime.Milliseconds;
        if (Keyboard.GetState().IsKeyDown(Keys.Left))
        {
            rectdst.X -= 12;
            if (rectdst.X < 0) { rectdst.X = 0; }
        }
        if (Keyboard.GetState().IsKeyDown(Keys.Right))
        {
            rectdst.X += 12;
            if (rectdst.X > 700) { rectdst.X = 700; }
        }
        if (Keyboard.GetState().IsKeyDown(Keys.Up))
        {
            rectdst.Y -= 12;
            if (rectdst.Y < 0) { rectdst.Y = 0; }
        }
        if (Keyboard.GetState().IsKeyDown(Keys.Down))
        { rectdst.Y += 10; if (rectdst.Y > 550) { rectdst.Y = 550; } }
        base.Update(gameTime);
        if (elapsed >= delay)
        {
            if (frames >= 7)
            { frames = 0; }
            else { frames++; }
            elapsed = 0;
        }
        srcrect = new Rectangle(115 * frames, 0, 115, 69);
        srcrect2 = new Rectangle(47*frames,0,47,61);
        if (rect3.X + background1.Width <= 0)
            rect3.X = rect4.X + background2.Width;
        if (rect4.X + background2.Width <= 0)
            rect4.X = rect3.X + background1.Width;
        rect3.X -= 5;
        rect4.X -= 5;
        enemy_rect.X +=(int) velocity.X;
        enemy_rect.Y += (int)velocity.Y;
        if (enemy_rect.Y >= 600 - 61 || enemy_rect.Y <= 0) velocity.Y = -velocity.Y;
        if (enemy_rect.X >= 800 - 47) velocity.X = -velocity.X;

    }



    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here
        spritebatch.Begin();
        spritebatch.Draw(background1,rect3, Color.Azure);
        spritebatch.Draw(background2,rect4, Color.Azure);
        spritebatch.Draw(anim, rectdst, srcrect, Color.White);
        spritebatch.Draw(enemy, enemy_rect, srcrect2, Color.White); 
        spritebatch.End();
        base.Draw(gameTime);
    }
}

}

这是我当前输出的一个镜头 http://imgur.com/7y43S7O

1 个答案:

答案 0 :(得分:1)

Infinite对于构建游戏来说是不切实际的,因为迟早你会耗尽RAM或者你的屏幕太满而无法称之为游戏。无论如何,我可以给你一个基本的想法。 如果你希望你的敌人数量不断增加,你可以使用一个列表并在每次想要出现时添加一个敌人

List<Enemy> enemies = new List<Enemy>;

更新:

if(spawnTimer > spawnInterval && enemies.Count()<enemyLimit){
   enemies.add(new Enemy([rectangle of spawn location and image size]);
   spawnTimer = 0;
}
for(int i=0; i<enemies.Count();i++){
   if(enemies[i].defeated){  
   enemies.Remove(enemies[i]);
}
spawnTimer+=gameTime.ElapsedGameTime.TotalSeconds;
画中的

   for(int i=0; i<enemies.Count();i++){
       spritebatch.Draw(enemy, enemies[i].Rect, srcrect2, Color.White);
    }

class Enemy{
   public Rectangle Rect{get;set;}
   public bool defeated{get;set;}
   public int Health{get;set;}

   public Enemy(Rectangle rect){
      Rect = rect;
      Health = 100;
      defeated = false;
   }

}