如何从敌人(子弹)中获取伤害

时间:2016-05-16 20:22:19

标签: xna

Hello其他程序员!我很抱歉打扰你,但我有一个学校项目,即创建一个游戏。我几乎完成所有我要做的就是让我的角色(玩家)从敌人的子弹中受到伤害。

这是我的敌人类,我有我的子弹列表,让敌人射击子弹。你可以看到Ive试图通过temp跟踪子弹的位置(我按照这些教程制作了敌人https://www.youtube.com/watch?v=_TlnUM-uhSIhttps://www.youtube.com/watch?v=tfiKwOo_4xo

在你跳我之前我只是想说我到处寻找答案,但由于XNA对我想创造的东西非常有限,这对我来说非常困难。

    class Enemies
{
    public Texture2D texture;
    public Vector2 position;
    public Vector2 velocity;

    public bool isVisible = true;

    Random random = new Random();
    int randX, randY;
    float temp_bulletenemyX;
    float temp_bulletenemyY;

    // bullets
    private List<Bullets> bullets = new List<Bullets>();
    Texture2D bulletTexture;

    public Enemies(Texture2D NewTexture, Vector2 NewPosition, Texture2D newBulletTexture)
    {
        texture = NewTexture;
        position = NewPosition;

        randY = random.Next(-4, 4);
        randX = random.Next(-4, -1);

        velocity = new Vector2(randX, randY);

        bulletTexture = newBulletTexture;
    }

    float shoot = 0;

    public void update(GraphicsDevice graphics, GameTime gameTime)
    {
        KeyboardState keyboardState = Keyboard.GetState();
        position += velocity;

        if (position.Y <= 0 || position.Y >= graphics.Viewport.Height - texture.Height)
            velocity.Y = -velocity.Y;

        if (position.X < 0 - texture.Width)
            isVisible = false;

        shoot += (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (shoot > 1)
        {
            shoot = 0;
            Shootbullet();

        }
        updateBullets();

    }

    public void updateBullets()
    {
        foreach (Bullets bullet in bullets)
        {
            bullet.position += bullet.velocity;
            temp_bulletenemyX = bullet.position.X;
            temp_bulletenemyY = bullet.position.Y;
            if (bullet.position.X < 0)
                bullet.isVisible = false;

    }
        for (int i = 0; i < bullets.Count; i++)
            if(!bullets[i].isVisible)
            {
                bullets.RemoveAt(i);
                i--;
            }
}
    public void Shootbullet()
    {
        Bullets newBullet = new Bullets(bulletTexture);
        newBullet.velocity.X = velocity.X - 3f;
        newBullet.position = new Vector2(position.X + newBullet.velocity.X, position.Y + (texture.Height / 2) - (bulletTexture.Height / 2));

        newBullet.isVisible = true;
        if (bullets.Count() < 3) // hur många skott den skall skjuta
            bullets.Add(newBullet);


    }
    public void draw(SpriteBatch spriteBatch)
    {
        foreach (Bullets bullet in bullets)
            bullet.Draw(spriteBatch);
        spriteBatch.Draw(texture, position, Color.White);

    }

    public float PosX
    {
        get
        {
            return position.X;
        }
    }
    public Vector2 Pos
    {
        get
        {
            return position;
        }
    }
    public float PosY
    {
        get
        {
            return position.Y;
        }
    }

    public List<Bullets> GetbulletList
    {
        get{
            return bullets;
        }
    }

    public Texture2D text
    {
        get
        {
            return texture;
        }



    }

    public Texture2D BulletText
    {
        get
        {
            return bulletTexture;
        }

继承了我试图制作的基本Game1代码,因此我的角色可以受到伤害。

         player.rectangle = new Rectangle(Convert.ToInt32(player.PosX),  Convert.ToInt32(player.PosY), player.text.Width, player.text.Height);

    foreach (Enemies bullet in enemies.ToList())
        {

               rec_bullet = new Rectangle(Convert.ToInt32(bullet.GetbulletList.ElementAt(i).position.X), Convert.ToInt32(bullet.GetbulletList.ElementAt(i).position.Y), nyenemy.BulletText.Width, nyenemy.BulletText.Height);
               hit = CheckCollision(rec_bullet, player.rectangle);
              if (hit == true)
              {

                player.health -= 10;
                    hit = false;

            }
            i++;

如果一切都搞得一团糟,我感到非常抱歉,我已经通过遵循许多教程和一些自己的编码将所有内容放在一起。如果我违反论坛规则,我也很抱歉,我是新来的。

最好的问候基尔。

2 个答案:

答案 0 :(得分:2)

我会勇敢地提出以下建议 - 查看所提供代码的片段。

在Game1代码中 - 你正在通过敌人工作,但看起来你没有搜索每个敌人的子弹列表。您正在使用&#39; i&#39;获取ElementAt(..) - 添加一个,然后转到下一个敌人,然后只获得ElementAt(..)和增加的&#39; i&#39;。

根据我的理解 - 代码的流程应该是:

for each enemy in enemy list
   for each bullet in enemy bullet list
      Check Collision with Player
          if collision then adjust player health

答案 1 :(得分:0)

您的代码存在一些问题。对于初学者,您的Bullet类应该包含bulletUpdate()方法,该方法应该在foreach循环中调用。

foreach (Bullet b in bullets)
{
b.update(/*parameters here*/);
}

您的项目符号列表应该是存储在您的Game1.cs或EnemyManager类中的公共列表,而不是存储在每个敌人中。通过每个敌人对该列表的引用,这样当它们触发时,他们可以将子弹添加到列表中。

最重要的是,你的碰撞测试应该只是每个子弹和你自己之间的交叉测试。再次,另一个foreach循环。

foreach(Bullet b in bullets)
{
//where playerRect is the hitbox for your player and b.Rect is the hitbox for your bullet
if(playerRect.Intersects(b.Rect)
player.healh-=damage;
}

希望有所帮助。