【问题标题】:LOVE2d- Bullets are not shootingLOVE2d-子弹不射击
【发布时间】:2015-04-09 21:49:24
【问题描述】:

所以我正在玩一个教程脚本,我添加了一个跟随玩家移动的炮塔。这个炮塔应该每隔几秒就向玩家射击一次。在我添加碰撞或定时射击或类似的东西之前,我发现实际上并没有显示子弹射击。所以我将它设置为按键只是为了测试,不,不工作。

Full Code

你看错了吗?注意:我运行它时没有收到错误,只是没有显示项目符号!

【问题讨论】:

  • 我不知道这是否相关,但您的镜头删除代码未按您预期的方式工作。您正在根据原始索引从enemyShots 中删除条目,但每次调用table.remove 时都会重新计算索引。有关问题的示例,请参阅 eval.in/282084
  • @EtanReisner 我添加了一些我认为可以对抗的东西,link 也许这会有所帮助,但我在这里得到了关于子弹的提示:link
  • 那个链接是错误的。至少一个用户对该链接也有同样的效果。你不能从这样的表中删除。这是行不通的。您通常会向后遍历表(以避免重新索引问题)或找到其他方法来完成相同的工作。
  • 哈,实际上代码的作者讨论了这一点,但尽管如此,它仍然是错误的。
  • 那你建议怎么做呢? @EtanReisner

标签: windows lua love2d


【解决方案1】:

love.keyreleased(key) 将 shift 键视为单独的独立键,因此“X”永远不会发生。而是使用“x”来触发射击。

function love.keyreleased(key)
    if key == 'x' then
        shoot()
    end
end

一旦修复,您的碰撞检测就会出现问题:

  • player 没有像第 52 行 for ii, vv in ipairs(player) do 建议的那样用作数组。

  • 没有什么可以阻止子弹以负速度击中玩家或被不止一颗子弹击中的玩家,因此可以将它们添加到 remEnemyremShot 表多次,这将在以后搞砸删除。

  • 删除条目时发生的索引偏移(由 Etan Reisner 提到)也存在。

对于您的用例,通过将对象添加到集合来标记要删除的对象对我来说似乎是最好的方法:

local remShots = {}

如果发生碰撞或子弹的速度为负,那么

remShots[i] = true

要删除,请反向迭代以避免移动索引。

for i=#enemyShots,1,-1 do
  if remShots[i] then
    table.remove(enemyShots, i)
  end
end

性能

table.remove 将索引上方的所有元素向下移动以填补空白。在此处的代码中,循环删除了多个元素,因此它们被多次移动,但只要您的表不是很大,这个删除过程就可以了。

我注意到你在第一个要点上的目的是什么,但你也可以使用remPlayer 来避免在你解决问题时检查与已经被标记为移除的玩家的碰撞:

if not remPlayer[ii] and CheckCollision...

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多