You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Love2D报错:调用getHeight方法提示nil值,求排查解决

问题根源

你遇到的attempt to call method 'getHeight' (a nil value)错误,核心原因是platforms数组里的元素只是存了坐标的普通表,不是Love2D的Image对象,所以调用platform:getHeight()时,这个表根本没有对应方法,自然报错。

虽然你全局加载了平台图片platform = love.graphics.newImage("assets/platform.png"),但platforms里的每个平台项并没有关联这个图片资源。

修复步骤

1. 修正platforms数组结构

把每个平台项改成包含图片引用、x坐标、y坐标的表:

platforms = {
  { image = platform, x = 0, y = 550 },
  { image = platform, x = 400, y = 400 },
  { image = platform, x = 200, y = 300 },
  { image = platform, x = 600, y = 200 },
  { image = platform, x = 0, y = 100 },
}

2. 修正碰撞检测代码

  • 把所有platform:getHeight()、platform:getWidth()改成platform.image:getHeight()、platform.image:getWidth()
  • 删掉player.image:getWidth(help)里的多余参数help,getWidth()不需要传参

修改后的碰撞检测部分:

-- Detect collisions with platforms
for i, platform in ipairs(platforms) do
  if player.y + player.image:getHeight() >= platform.y
     and player.y <= platform.y + platform.image:getHeight()
     and player.x + player.image:getWidth() >= platform.x
     and player.x <= platform.x + platform.image:getWidth() then
    player.isJumping = false
    player.velocityY = 0
    player.y = platform.y - player.image:getHeight()
  end
end

3. 修正绘制平台的代码

love.draw里绘制平台时,要传入图片对象platform.image,而不是整个platform表:

-- Draw platforms
for i, platform in ipairs(platforms) do
  love.graphics.draw(platform.image, platform.x, platform.y)
end
完整修复后的代码
platform = love.graphics.newImage("assets/platform.png")

function love.load()
  love.window.setTitle("My Platformer")
  love.window.setMode(800, 600)
  gravity = 800
  player = { x = 50, y = 50, speed = 200, jumpHeight = -500, isJumping = false, velocityY = 0, image = love.graphics.newImage("assets/player.png") }
  
  platforms = {
    { image = platform, x = 0, y = 550 },
    { image = platform, x = 400, y = 400 },
    { image = platform, x = 200, y = 300 },
    { image = platform, x = 600, y = 200 },
    { image = platform, x = 0, y = 100 },
  }
end

function love.update(dt)
  -- Apply gravity
  player.velocityY = player.velocityY + gravity * dt
  player.y = player.y + player.velocityY * dt

  -- Jumping
  if love.keyboard.isDown("space") and not player.isJumping then
    player.isJumping = true
    player.velocityY = player.jumpHeight
  end

  -- Move player left and right
  if love.keyboard.isDown("left") then
    player.x = player.x - player.speed * dt
  elseif love.keyboard.isDown("right") then
    player.x = player.x + player.speed * dt
  end

  -- Detect collisions with platforms
  for i, platform in ipairs(platforms) do
    if player.y + player.image:getHeight() >= platform.y
       and player.y <= platform.y + platform.image:getHeight()
       and player.x + player.image:getWidth() >= platform.x
       and player.x <= platform.x + platform.image:getWidth() then
      player.isJumping = false
      player.velocityY = 0
      player.y = platform.y - player.image:getHeight()
    end
  end
end

function love.draw()
  -- Draw platforms
  for i, platform in ipairs(platforms) do
    love.graphics.draw(platform.image, platform.x, platform.y)
  end

  -- Draw player
  love.graphics.draw(player.image, player.x, player.y)
end

内容的提问来源于stack exchange,提问作者user14683910

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:32:15