在Love2D开发AI对战Pong游戏时无法绘制图形求助
问题描述
我正在用Love2D和Lua开发一款与AI对战的Pong游戏,但无法在屏幕上绘制矩形和圆形。尝试了多种方法并参考过往项目,仍未找到问题所在。接触Love2D和Lua编程仅数月,大概率忽略了某些明显细节,希望有人帮忙排查。相关代码如下:
Main.lua
push = require "Helpers/push" Class = require "Helpers/class" require "Objects/AI" require "Objects/Ball" require "Objects/Paddle" dimWidth = 960 dimHeight = 540 resWidth = 480 resHeight = 270 love.window.setTitle("Pong with artificial intelligence") function love.load() love.graphics.setDefaultFilter("nearest", "nearest") Font = love.graphics.newFont("Font/font.ttf") love.graphics.setFont(Font) push:setupScreen(resWidth, resHeight, dimWidth, dimHeight, { fullscreen = false, resizable = false, vsync = true }) Ball:init() end function love.update(dt) end function love.keypressed(key) end function love.draw() push:start() Ball:render() push:finish() end
Ball.lua
Ball = Class{} function Ball:init() self.x = 800 self.y = 450 self.width = 8 self.height = 8 end function Ball:update(dt) end function Ball:render() love.graphics.circle("fill", self.x, self.y, self.width, self.height) end
问题排查与解决
这里有三个核心问题导致图形无法显示:
- 类实例化错误
直接调用Ball:init()是错误的,用Class库创建的类需要先实例化对象,再调用方法。:init()是实例方法,直接通过类调用时self指向的是Ball类本身,而非具体实例。
修改love.load()中的代码:
-- 替换原来的Ball:init() ball = Ball()
同时在love.draw()中调用实例的render方法:
ball:render()
- 坐标超出虚拟屏幕范围
你的push虚拟分辨率是480x270,但Ball的初始坐标设为(800,450),远大于虚拟屏幕的宽高,导致图形在屏幕外无法显示。调整Ball的初始坐标到屏幕可见区域:
function Ball:init() self.x = resWidth / 2 -- 屏幕水平中心 self.y = resHeight / 2 -- 屏幕垂直中心 self.radius = 8 -- 用radius代替width/height,更贴合圆形属性 end
- love.graphics.circle参数错误
love.graphics.circle的参数格式是mode, x, y, radius, segments,你把第四个参数传成了height,这会导致分段数逻辑异常。修改render方法:
function Ball:render() -- segments可选,不传的话Love2D会自动计算合适值 love.graphics.circle("fill", self.x, self.y, self.radius) end
把这些修改后,就能正常显示圆形了。如果后续Paddle也有类似问题,参照这个逻辑排查:确保实例化对象、坐标在屏幕范围内、绘图函数参数正确。
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

