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
相关产品推荐
相关产品推荐

