使用Lua Love2D制作导弹射击游戏

我正在制作一个2D横向卷轴射击游戏,游戏中有一个小太空飞船可以射击导弹。我成功控制了导弹的速度,但是在射出第一发导弹之后,下一颗导弹的速度会越来越快。

而且,当我射出一颗导弹后,如果在第一颗导弹离开屏幕之前射出另一颗导弹,第一颗导弹就会消失,只有第二颗导弹可见。

请问有哪位可以帮我解决这个问题吗?谢谢!

这是代码:

--///////////////////////////////////// LOAD FUNCTION /////////////////////////////////////--
function love.load()
sprites = {}
  sprites.sky = love.graphics.newImage("sprites/sky.png")
  sprites.plane = love.graphics.newImage("sprites/tiny_ship.png")
  sprites.missile = love.graphics.newImage("sprites/missile.png")

  spaceShip = {}
  spaceShip.x = 150
  spaceShip.y = 100
  spaceShipSpeed = 150

  missiles = {}
  end
--///////////////////////////////////// UPDATE FUNCTION /////////////////////////////////////--
function love.update(dt)
  if love.keyboard.isDown("down") then
    spaceShip.y = spaceShip.y + spaceShipSpeed * dt
  end
  if love.keyboard.isDown("up") then
    spaceShip.y = spaceShip.y - spaceShipSpeed * dt
  end
  if love.keyboard.isDown("left") then
    spaceShip.x = spaceShip.x - spaceShipSpeed * dt
  end
  if love.keyboard.isDown("right") then
    spaceShip.x = spaceShip.x + spaceShipSpeed * dt
  end

 if love.keyboard.isDown("space") then
   spawnMissile()
 end

 for i, m in ipairs(missiles) do
   missile.x = missile.x + missileSpeed * dt
    end

end
-- /////////////////////////////////////END OF UPDATE FUNCTION/////////////////////////////////////--

--/////////////////////////////////////DRAW FUNCTION///////////////////////////////////// --
function love.draw()
  love.graphics.draw(sprites.sky, 0, 0, nil, 0.5, 0.5)
  love.graphics.draw(sprites.plane, spaceShip.x , spaceShip.y, nil, nil, nil, sprites.plane:getWidth()/2, sprites.plane:getHeight()/2)

--将导弹精灵放置到与太空飞船相同的位置--

  for i,m in ipairs(missiles) do
    love.graphics.draw(sprites.missile, missile.x, missile.y, nil, nil, nil, sprites.missile:getWidth()/2, sprites.missile:getHeight() /2)

  end
--missile 函数 :当射出导弹时,设置导弹位置和速度变量,并在 Missiles 表中更新它们--
  function spawnMissile()
    missile = {}
    missile.x = spaceShip.x
    missile.y = spaceShip.y
    missileSpeed = 50
    table.insert(missiles, missile)

end
end
--/////////////////////////////////////END OF DRAW FUNCTION /////////////////////////////////////--
点赞
用户4687565
用户4687565

将下面翻译成中文并且保留原本的 markdown 格式:

首先,强烈建议先看一下 lua 书

代码存在许多问题,其中最突出的是:

function spawnMissile()
    missile = {}
    //省略部分
    table.insert(missiles, missile)
end

该代码创建了一个名为 missile 的全局变量。实际上,应该改为 local missile = {}

此外,循环语句都是这样的:

for i, m in ipairs(missiles) do
   missile.x = missile.x + missileSpeed * dt
   //对 missile 做一些操作
end

im 是在循环中不断变化的变量。i 是索引,m 是存储在该索引处的表的元素。但你的代码只处理了全局变量 missile,而没有使用 m。实际上,missile 不应该存在。

所以,spawnMissile 在每次调用时都会覆盖 missile,而 love.updatelove.draw 也只更新和绘制 missile。这就是为什么只有一枚导弹出现的原因。


此外,我在这里提供一个指南 guide,它很长,需要一些 lua 知识,我可能会用不同的方法去做,但它确实涵盖了与发射导弹的太空船相关的所有内容。

2018-05-21 11:16:42
用户9392607
用户9392607

首先,你应该从love.draw函数中取出你的spawnMissile函数。它必须单独出现在love.update函数后面。它也必须使用dt,这样你就可以在love.update中调用它,比如 spawnMissile(dt)。一旦你有一个表插入,你还需要使用table.remove删除旧的发射物。看一些YouTube教程,这样在观看某个人输入Lua代码时,更容易纠正你的代码。有很多这样的教程....

2019-11-25 04:28:09