Make some experiments with RxLua and defold.
Rx it is a reactive programming. You can read more here http://reactivex.io/.
Rx is based on Observables , Observers, and Operators
An Observer essentially subscribes to an Observable.
The Observable then emits streams of data which the Observer listens and reacts to, setting in motion a chain of operations on the data stream. The real power comes from Operators or “Reactive Extensions” (hence the term Rx) .
Operators allow you to transform, combine, manipulate, and work with the sequences of items emitted by Observables.
I like mvc and observable pattern. But it hard to use it in defold, because when i worked with go or gui, i need to worked inside it context. I can’t subscribe in gui to model,and change gui when model change event emmited(yes i can, save events and then iterate them on_update, i have lib for that, but it is not comfortable.
I can use messages for it, but messages worked only with go/gui, not with lua modules(i can make module that will be emmit messages for modules, but it is not very comfortable).Also working with messages not very comfortable =)
I add 2 methods to RxLua lib.
go and go_distinct. They worked in context of go.
go emmits all events
go_distinct only unique per frame.
Go is very simple. It emmits events when scheduler will be updated.I update it every frame in context of go.
function Observable:go(scheduler) return self:delay(0,scheduler) end
Model(emmit 5 equals events every frame)
function M:initialize() self.rx = RX.Subject() end local frame = 0 function M:update(dt, no_save) self.ecs_world:update(dt) for i=1,5 do self.rx:onNext(frame) end frame = frame + 1 end
Subscription go script
... WORLD.rx:go(SCHEDULER):subscribe(function(v) print("all:" .. v) end) WORLD.rx:go_distinct(SCHEDULER):subscribe(function(v) print("distinct:" .. v) end) ... function Scene:update(go_self, dt) SCHEDULER:update(dt) end
DEBUG:SCRIPT: [INFO 11:01:02] none: /scenes/logo/logo_scene.lua:21: distinct:45 DEBUG:SCRIPT: [INFO 11:01:02] none: /scenes/logo/logo_scene.lua:18: all:45
I don’t show here power of Rx. When you can:receive value, change it, mix it with other and etc. It contains a lot of methods, you can read it in docs https://github.com/bjornbytes/RxLua/tree/master/doc.
When you read it, you can think that rx complex and redundant. But give it a chance.It is simple but powerful tool. I love it = )
It contains a lot of code, because i use my template for all project. You need
world/world.lua (model of world)
init_controller(update world model)
scenes/logo/logo_scene.lua.(scene controller.Subscribe to world)