错误 main.lua:98: 尝试索引局部变量 'e' (数值类型)

我一直得到这个错误,说我尝试索引局部变量'e'(数值类型),而我不知道我做错了什么。我正在尝试制作一个射击向地面靠近的外星人的游戏,并防止它们接触地面。我对Lua和Love2d相当新,所以如果这是一个简单的修复,我很抱歉。

代码:

function love.load()
  ship = love.graphics.newImage("ship.png")
  heart = love.graphics.newImage("heart.png")
  font = love.graphics.newFont("font.ttf", 20)
  player = {}
  storage = {}
  storage.enemys = {}
  level = 1
  storage.enemys.cooldown = 400 / level
  player.x = 0
  player.y = 600
  player.bullets = {}
  player.cooldown = 20
  player.speed = 10
  ammo = 3
  life = 2

  player.fire = function()
    if player.cooldown <= 0 then
      if ammo > 0 then
        ammo = ammo - 1
        player.cooldown = 20
        bullet = {}
        bullet.x = player.x + 35
        bullet.y = player.y
        table.insert(player.bullets, bullet)
      end
    end
  end

  storage.spawn = function()
    if enemys.cooldown <= 0 then
      storage.enemy.cooldown = 400 / level
      enemy = {}
      enemy.x = love.math.random(0, 780)
      enemy.y = 0
      table.insert(storage.enemys, enemy)
    end
  end

  reload = function()
    ammo = 3
  end

end

function love.update(dt)
  player.cooldown = player.cooldown - 1
  storage.enemys.cooldown = storage.enemys.cooldown - 1

  if player.x >= 720 then
    player.x = 720
  elseif player.x <= 0 then
    player.x = 0
  end

  if love.keyboard.isDown("f") then
    player.x = player.x + player.speed
  elseif love.keyboard.isDown("a") then
    player.x = player.x - player.speed
  end

  if love.keyboard.isDown("r") then
    reload()
  end

  if love.keyboard.isDown("space") then
    player.fire()
  end

  for i,b in ipairs(player.bullets) do
    if b.y < -10 then
      table.remove(player.bullets, i)
    end
    b.y = b.y - 10
  end

  for i,e in ipairs(storage.enemys) do
    if e.y < 700 then
      table.remove(storage.enemys, i)
      life = life - 1
    end
    e.y = e.y - 6
  end

  if storage.enemys.cooldown <= 0 then
    enemys.spawn()
  end

end

function love.draw()
  love.graphics.draw(ship, player.x, player.y)

  for _,e in pairs(storage.enemys) do
    love.graphics.setColor(0,255,0)
    love.graphics.rectangle("fill", e.x, e.y, 20, 20)
    love.graphics.setColor(255, 255, 255)
  end

  for _,b in pairs(player.bullets) do
    love.graphics.setColor(255,0,0)
    love.graphics.rectangle("fill", b.x, b.y, 2, 6)
    love.graphics.setColor(255, 255, 255)
  end

  if life == 2 then
    love.graphics.draw(heart, 0,0)
    love.graphics.draw(heart, 25,0)
  elseif life == 1 then
    love.graphics.draw(heart, 0,0)
  end

  love.graphics.setFont(font)
  love.graphics.print("弹药", 715, 0)

  if ammo == 3 then
    love.graphics.rectangle("fill", 670, 20, 125, 25)
  elseif ammo == 2 then
    love.graphics.rectangle("fill", 711, 20, 84, 25)
    love.graphics.rectangle("line", 670, 20, 125, 25)
  elseif ammo == 1 then
    love.graphics.rectangle("fill", 752, 20, 43, 25)
    love.graphics.rectangle("line", 670, 20, 125, 25)
  elseif ammo == 0 then
    love.graphics.rectangle("line", 670, 20, 125, 25)
  end
end
点赞
用户4984564
用户4984564

首先

enemy的复数形式是enemies,而不是enemys ;)

storage.enemies

这个表格包含了一个敌人列表(作为一个序列)和一个冷却值,它是一个数字。

pairs

此函数遍历表格中的所有键-值对。

问题

您可能已经猜到了。 pairs(storage.enemies)不仅会遍历您所有的敌人(在整数键处),还会遍历冷却时间(在字符串键'cooldown'处),导致您尝试索引一个数字。

示例:

for key, value in pairs({'a', 'b', 'c', foo='bar'}) do
  print(key, value)
end

将会打印出类似如下的结果

1    a
foo  bar
3    c
2    b

请注意,顺序是完全随机的,取决于Lua如何在内部存储表格。

for key, value in ipairs({'a', 'b', 'c', foo='bar'}) do
  print(key, value)
end

但这将打印出:

1    a
2    b
3    c

因为ipairs(与pairs相反)只会按顺序遍历整数键,直到遇到第一个nil值为止。例如,对于{1, 2, 3, nil, 5},它只会遍历123

2018-12-06 13:19:04