Love2D(Lua)中的面向对象编程
2021-11-28 8:33:58
收藏:0
阅读:253
评论:1
我对Love2D和Lua产生了兴趣,并决定尝试一下。
因此,为了熟悉Lua和Love2D,我编写了一个简单的示例:
项目结构:
demo
|-ball.lua
|-main.lua
ball.lua
Ball = {
x = 0,
y = 0,
xSpeed = 0,
ySpeed = 0,
ballRadius = 0,
r = 0,
g = 0,
b = 0
}
function Ball:new(x, y, xSpeed, ySpeed, ballRadius, r, g, b)
t = {
x = x,
y = y,
xSpeed = xSpeed,
ySpeed = ySpeed,
ballRadius = ballRadius,
r = r,
g = g,
b = b
}
setmetatable(t, self)
self.__index = self
return t
end
function Ball:move()
self.x = self.x + self.xSpeed
self.y = self.y + self.ySpeed
end
function Ball:changeColor()
self.r = love.math.random(0, 255)
self.g = love.math.random(0, 255)
self.b = love.math.random(0, 255)
print('颜色: ' .. self.r .. ' ' .. self.g .. ' ' .. self.b)
end
function Ball:checkEdges()
if self.x + self.ballRadius > love.graphics.getWidth() or self.x - self.ballRadius < 0 then
self.xSpeed = self.xSpeed * -1
Ball:changeColor()
end
if self.y + self.ballRadius> love.graphics.getHeight() or self.y - self.ballRadius < 0 then
self.ySpeed = self.ySpeed * -1
Ball:changeColor()
end
end
function Ball:show()
love.graphics.setColor(self.r, self.g, self.b)
love.graphics.ellipse('fill', self.x, self.y, self.ballRadius)
end
main.lua
require "ball"
local ball = nil
local x, y
function love.load()
x = love.graphics.getWidth() / 2
y = love.graphics.getHeight() / 2
ball = Ball:new(x, y, 2, 3.5, 20, 255, 255, 255)
end
function love.update(dt)
Ball.move(ball)
Ball.checkEdges(ball)
end
function love.keypressed(key)
if key == 'escape' then
love.event.quit()
end
end
function love.draw()
love.graphics.setBackgroundColor(0, 0, 0)
Ball.show(ball)
end
因此,基本上只是一个球碰到边缘后会弹跳的球。
除了function Ball:changeColor()
的问题外,一切似乎都很好。
我希望每次球撞到边缘时都能改变颜色,但这似乎行不通。
是function changeColor()
有问题吗?
这是演示的快照:
函数确实触发了,rgb颜色值确实有所改变,但球本身没变颜色,任何帮助都是受欢迎的!
原文链接 https://stackoverflow.com/questions/70140672
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
最大的错误是颜色定义本身。
颜色的范围从0(零)到1。所以更改...
function Ball:changeColor() self.r = love.math.random(0, 255) self.g = love.math.random(0, 255) self.b = love.math.random(0, 255) print('color: ' .. self.r .. ' ' .. self.g .. ' ' .. self.b) end
...为...
function Ball:changeColor() self.r = love.math.random() self.g = love.math.random() self.b = love.math.random() print('color: ' .. self.r .. ' ' .. self.g .. ' ' .. self.b) end
它应该打印出...
color: 0.064632309279245 0.45080402957018 0.39887099192605
面向对象编程
你用
Ball:new()
分配了一个球,但在后续的代码中,你没有使用ball
分配的方法。为了将球作为参数传递给方法,使用“:”。
我给你改正后的版本以展示我的意思。
我的彩色球在这里被命名为
cball
;-)-- main.lua require "ball" function love.load() x = love.graphics.getWidth() / 2 y = love.graphics.getHeight() / 2 cball = Ball:new(x, y, 27, 27, 200, 0, 0, 0) end -- 当对象被分配时,你需要使用 : 调用所需的函数 -- 所以使用它... function love.update(dt) cball:move() -- 使用分配的方法,cball作为第一个参数 cball:checkEdges() -- 这里也一样 end -- 检查是否释放了密钥避免重复按键 ;-) function love.keyreleased(key) if key == 'escape' or key == 'q' then love.event.quit() end if key == 'r' then love.event.quit('restart') end end function love.draw() love.graphics.setBackgroundColor(.125, .125, .25) cball:show() -- 这里也一样 end
最后一件事是
ball.lua
不是真正设计为Lua的需求。你的球Lua没有返回值。
因此第二个require不能像第一个require一样。
一个好的设计示例...
-- ball.lua 始于... local Ball = { x = 0, y = 0, xSpeed = 0, ySpeed = 0, ballRadius = 0, r = 1, g = 0, b = 0 } --然后是Ball的所有函数/方法定义并且最后一行做 return Ball
这样每一次加载(首先是从文件,然后是从
package.loaded.ball
)都能正确完成。此外,你随之可以直接...
-- Ball = require('ball') function love.load() x = love.graphics.getWidth() / 2 y = love.graphics.getHeight() / 2 cball = require('ball'):new(x, y, 27, 27, 20, 0, 0, 0) end
作为一个副作用,你在
new()
中给出的选项全部生效。另一个副作用是在...
cball=require('ball'):new(...)
...之后会接着...
newball=cball:new(...)
(省略号是选项的占位符)
...以创建另一个(x,y,speedx,speedy,半径,颜色)独立的子(球),它们从
require('ball')
<--<< 子对象的父对象中派生。