【问题标题】:XNA How to make an object invisibleXNA 如何使对象不可见
【发布时间】:2014-05-05 05:44:21
【问题描述】:

我正在 XNA 中制作 2D 射击游戏。我一直在研究玩家的射击速度(玩家每隔多久可以射击另一颗子弹)并使其只有在前一颗子弹行进一定距离后才能再次射击,如下所示:

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

bulletList 是玩家可以射击的可用 Projectiles,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);
        }

问题是,如果子弹在击中目标时被移除,我就无法再询问该子弹是否已通过给定距离以发射另一颗子弹。 为了解决这个问题,我希望子弹在被击中时变为不可见,然后它会在另一个已经创建的函数中处理。

【问题讨论】:

    标签: c# xna collision visible


    【解决方案1】:

    只需为Bullet 实例添加一个Visible 标志:

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

    当它击中时..使其不可见:

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

    然后在画之前检查一下:

    if (bulletInstance.Visible)
        drawBullet(bullet);
    

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

    【讨论】:

    • 一个子弹只需要绘制一次。一旦它在那里,我可以以任何我想要的方式调整它的位置。它不会在不同的位置重新绘制,因此我不能使用该标志。这就是为什么我认为让对象透明或不可见应该可行。
    • 绘制一次? ..每帧正确吗?该标志可让您在下一帧跳过它..
    • 据我所知,您不能在 XNA 中绘制一次并简单地在每一帧移动它。这不是框架的工作方式。西蒙是对的,你会想要一个你改变的 Visible 属性,并且只根据这个来绘制子弹。
    • @Villager Draw 方法每帧调用一次。如果您在 Draw 方法中绘制项目符号之前检查此 Visible 标志..那么您可以跳过它们该帧(以及未来)。有效地使它们在真正死亡之前不可见。
    • 这不是问题..您应该将向量包装在Bullet 实例中。这样,您将来可以在它们上附加更多属性。
    【解决方案2】:

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

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

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

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

    你可以玩这个:)

    在旧的 XNA 论坛上查看更多 here

    【讨论】:

      【解决方案3】:

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

      不要让它不可见,从列表中删除它。每个子弹实例都应将“Active”属性设置为 true on fire。 (当你发射子弹时,将其添加到列表中)当发生碰撞时,将此属性设置为 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));
      

      绘画

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

      【讨论】:

      • 他为什么不让子弹隐形。这更容易。不过当然这个也可以用。
      • invisible 表示子弹被隐藏,但更新函数仍在计算位置等参数。是他的例子,他需要那个来计算位置和距离......但如果使用 ROF,他不需要那个,所以他可以在碰撞后简单地处理那颗子弹。
      • 它只会计算直到达到一定距离(在村民的代码中)。然后他可以进行碰撞&amp;&amp; (player.BULLETLIST[0].BULLETS[i].Visible == false) 但这只是一个选择,很高兴看到其他人对某个主题的其他观点的答案。
      猜你喜欢
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多