此文转自朱大仙,感谢他的劳作。
翻译来源地址:https://github.com/Kadoba/gamework
gamework是控制LOVE2D游戏进程流的一个项目.
↑
这个是按原文译的, 当初乍看完全不懂, 接下来我来用图文给大家解释gamework的功能及用法.
函数会到后面总结, 前面就看看是怎么回事吧.
(= =总感觉我每次都超快切入正题)
-- 加载gamework模块
local gamework = require "gamework" -- 构造.使得你定义的love回调函数运行时都会触发gamework.
gamework.initialize() -- 取得root.
local root = gamework.getRoot()
我们就成功的做出了如图所示的东西.
接下来给大家介绍个任务(task)的概念.是怎样的呢?
也没什么好解释的,将task放入root就可以执行…恩,真的,就是这样.
task是一个概念,实际上我们会使用子任务(subtask), 我们把使用的子任务都可以叫做任务.
subtask是作为一个数组存在的,在数组内可以放以绑定的回调函数.在先前的gamework.initialize()命令的效果下,
gamework已经绑定了love的基本回调函数(load, update, draw, ……)
现在演示将一个task加入root
-- 创建一个task.
local taskA = {} -- 定义taskA的'draw'回调函数.
function taskA:draw()
love.graphics.print("hello world", , )
end -- 将taskA加入root.
gamework.addSubtask(root, taskA)
我们就成功的做出了如图所示的东西.
结果就是运行这个文件,屏幕上就会绘制出"hello world",
就是这样, gamework会按顺序执行root里的task.
另外, 我们可以在subtask中放入subtask.
local taskB = {}
function taskB:draw()
love.graphics.print("I’m taskB!", , )
end -- 将taskB加入taskA.
gamework.addSubtask(taskA, taskB)
我们就成功的做出了如图所示的东西.
首先gamework会执行taskA的函数,然后就会执行taskA的子任务taskB.
每一个task又可以有多个subtask.
每一个subtask只属于唯一 一个task, 我们将这个task称做subtask的Master.
它们会按顺序执行. 但我们也可以设定优先级下标(Order).
像这样:
-- 构造2个画矩形的task
local rect = {}
function rect:draw()
love.graphics.setColor(,,,)
love.graphics.rectangle("fill", , , , )
love.graphics.setColor(,,,)
end local rect2 = {}
function rect2:draw()
love.graphics.setColor(,,,)
love.graphics.rectangle("fill", , , , )
love.graphics.setColor(,,,)
end gamework.addSubtask(rect)
gamework.addSubtask(rect2) function rect2:keypressed(k)
-- 通过按键改变order的值来控制优先级
-- 每个task默认的order都是0
if k == "up" then
gamework.setOrder(self, )
elseif k == "down" then
gamework.setOrder(self, -)
end
end
然后运行程序, 我们按键'上', 结果就是后定义的rect2矩形会显示rect上
我们就成功的做出了如图所示的东西.
另外, 在gamework里面有个代表级任务(Delegate)的概念,
Delegate有什么用呢? 用法就是:
- 将一个task的设置一个Delegate.
- 然后, 这个Delegate将会代替属于同一个Master的同级的subtask执行.
比如我给root设一个Delegate.
local delegate = {} gamework.setDelegate(root, delegate) --设置 function delegate:draw()
love.graphics.print("I hind those subtask", , )
end
我们就成功的做出了如图所示的东西.
Delegate将会代替taskA及其子任务,rect.rect2执行.红色区域的就相当于作废了.
每一个task只允许存在一个Delegate
另外:
- 你可以把root理解成一个task.
- Delegate也可以包含subtask,也可以包括Delegate.
呼~ 好累,最后的一个功能.
word1 = {draw = function(self) love.graphics.print("hello", , ) end}
word2 = {draw = function(self) love.graphics.print("world", , ) end} gamework.addSequence(word1)
gamework.waitSequence(0.5)
gamework.addSequence(word2, false)
那个"addSequence(word2, false)”中的false参数会标记word2为停止(halt)状态,
它将subtask加入了任务队列(Sequence),任务们开始排队.
就这样,waitSequence函数会使word2在0.5s后取消halt然后就执行了.
函数列表:*这样用gamework.setOrder(taskA, 1)
addSequence(task, subtask, halt, ...) | 添加子任务到队列,可以设置停止(halt)状态 |
addSubtask(task, subtask, ...) | 添加子任务 |
setDelegate(task, subtask, ...) | 设置代表级任务 |
setOrder(task, order) | 设置优先级下标(Order) |
getDelegate (task) | 返回任务中的代表级任务 |
getHaltSubtask (task) | 返回任务中所有的halt状态的子任务 |
getMaster(subtask) | 返回子任务的Master |
getOrder(task) | 返回任务的优先级下标(Order) |
getRoot() | 返回root的任务 |
getTaskType(task) | 返回任务的类型 |
clearSequence (task) | 清空一个任务队列(Sequence)的所有子任务 |
clearSubtasks (task) | 清空一个任务的所有子任务 |
remove(subtask) | 删除一个子任务 |
最后, 有...恩 蛮多功能没翻译给大家, 有兴趣自己去看看来源地址.