(转)love2d有用的辅助库--gamework
此文转自朱大仙,感谢他的劳作。
翻译来源地址:https://github.com/Kadoba/gamework
gamework是控制LOVE2D游戏进程流的一个项目.
↑
这个是按原文译的, 当初乍看完全不懂, 接下来我来用图文给大家解释gamework的功能及用法.
函数会到后面总结, 前面就看看是怎么回事吧.
(= =总感觉我每次都超快切入正题)
1 -- 加载gamework模块 2 local gamework = require "gamework" 3 4 -- 构造.使得你定义的love回调函数运行时都会触发gamework. 5 gamework.initialize() 6 7 -- 取得root. 8 local root = gamework.getRoot()
我们就成功的做出了如图所示的东西.
接下来给大家介绍个任务(task)的概念.是怎样的呢?
也没什么好解释的,将task放入root就可以执行…恩,真的,就是这样.
task是一个概念,实际上我们会使用子任务(subtask), 我们把使用的子任务都可以叫做任务.
subtask是作为一个数组存在的,在数组内可以放以绑定的回调函数.在先前的gamework.initialize()命令的效果下,
gamework已经绑定了love的基本回调函数(load, update, draw, ……)
现在演示将一个task加入root
1 -- 创建一个task. 2 local taskA = {} 3 4 -- 定义taskA的'draw'回调函数. 5 function taskA:draw() 6 love.graphics.print("hello world", 0, 40) 7 end 8 9 -- 将taskA加入root. 10 gamework.addSubtask(root, taskA)
我们就成功的做出了如图所示的东西.
结果就是运行这个文件,屏幕上就会绘制出"hello world",
就是这样, gamework会按顺序执行root里的task.
另外, 我们可以在subtask中放入subtask.
1 local taskB = {} 2 function taskB:draw() 3 love.graphics.print("I’m taskB!", 0, 60) 4 end 5 6 -- 将taskB加入taskA. 7 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(100,255,255,255) love.graphics.rectangle("fill", 0, 80, 50, 50) love.graphics.setColor(255,255,255,255) end local rect2 = {} function rect2:draw() love.graphics.setColor(255,255,100,255) love.graphics.rectangle("fill", 25, 105, 50, 50) love.graphics.setColor(255,255,255,255) end gamework.addSubtask(rect) gamework.addSubtask(rect2) function rect2:keypressed(k) -- 通过按键改变order的值来控制优先级 -- 每个task默认的order都是0 if k == "up" then gamework.setOrder(self, 1) elseif k == "down" then gamework.setOrder(self, -1) end end
然后运行程序, 我们按键'上', 结果就是后定义的rect2矩形会显示rect上
另外, 在gamework里面有个代表级任务(Delegate)的概念,
Delegate有什么用呢? 用法就是:
- 将一个task的设置一个Delegate.
- 然后, 这个Delegate将会代替属于同一个Master的同级的subtask执行.
比如我给root设一个Delegate.
1 local delegate = {} 2 3 gamework.setDelegate(root, delegate) --设置 4 5 function delegate:draw() 6 love.graphics.print("I hind those subtask", 0 , 180) 7 end
我们就成功的做出了如图所示的东西.
Delegate将会代替taskA及其子任务,rect.rect2执行.红色区域的就相当于作废了.
每一个task只允许存在一个Delegate
另外:
- 你可以把root理解成一个task.
- Delegate也可以包含subtask,也可以包括Delegate.
呼~ 好累,最后的一个功能.
word1 = {draw = function(self) love.graphics.print("hello", 0, 240 ) end} word2 = {draw = function(self) love.graphics.print("world", 40, 260 ) end} 3 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) | 删除一个子任务 |
最后, 有...恩 蛮多功能没翻译给大家, 有兴趣自己去看看来源地址.
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。