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