XNA如何使对象不可见

时间:2014-05-05 05:44:22

标签: c# xna collision visible

我正在XNA制作2D Shooter游戏。我一直在努力研究玩家的射击速度(玩家每次射击另一颗子弹的频率),并且只有在前一颗子弹行进一定距离后,玩家才能再次射击:

if (this.bulletList[0].BULLETS[(this.bulletList[0].BULLETS.Count) - 1].X >= Pos.X + attackSpeed)
                canShoot = true;

如果bulletList是玩家可以射击的可用射弹,BULLETS是已经射击的子弹列表,attackSpeed是子弹射击的速率,或者简单地说:子弹必须行进到另一个子弹的距离可以拍摄。

现在我一直在研究碰撞。我的方法是在击中目标后处理子弹:

for (int i = 0; i < player.BULLETLIST[0].BULLETS.Count; i++)
        {
            if (CollisionManager.PlayerBulletOnBot(player.BULLETLIST[0].BULLETS[i], bot))
                player.BULLETLIST[0].BULLETS.RemoveAt(i);
        }

问题是,如果子弹在击中目标时被移除,我就不能再问这个子弹是否已超过给定距离以便射击另一颗子弹。 为了解决这个问题,我希望子弹在击中时变成不可见,之后它将被处理掉已经制作的另一个功能。

3 个答案:

答案 0 :(得分:2)

只需为Visible实例添加Bullet标记:

class Bullet {
    public bool Visible { get; set; }
}

当它击中时......让它不可见:

// ... hit
bulletInstace.Visible = false;

然后在绘制前检查:

if (bulletInstance.Visible)
    drawBullet(bullet);

如果它不可见,您的绘图代码应该跳过它。

答案 1 :(得分:0)

使用spriteBatch.Draw(...)绘制对象时,必须为精灵本身选择一种颜色。

我们都知道颜色是“红色,绿色和蓝色”值(或rgb)的混合物。没有多少人知道,至少在XNA中,有第四个值叫做alpha。

alpha值表示对象的透明度,这意味着如果你像下面的代码一样使用它,你的对象将是半隐形的(或半可见)。

spriteBatch.Draw(..., Color.White * 0,5f,...);

你可以玩:)

在旧的XNA论坛上再检查here

答案 2 :(得分:0)

当你按住按钮时,你需要增加到某个rof值的射击率(maxRof)属性。当rof等于maxrof时,你将子弹添加到子弹列表中(并将rof重置为0)。

不要让它不可见,将其从列表中删除。子弹的每一个实例都应该有&#34; Active&#34;属性设置为真火。 (当你发射子弹时,将其添加到列表中)当发生collsition时,将此属性设置为false。以伪代码为例:

更新

for each bullet in bullets
  -- update bullet position
  -- check collision if happened if yes then set Active to false
end for

bullets.removeall(function(c) NOT(c.active));

DRAW

for each bullet in bullets.findall(function(c) c.active)
  -- draw your bullets
end for