Lua oop - реализация таймера - PullRequest
1 голос
/ 02 июля 2011

Я следовал этому уроку http://www.crawlspacegames.com/blog/inheritance-in-lua/ и создал 2 объекта (ударные и гитара), которые наследуются от MusicalInstrument. Все работало нормально, пока я не добавил функции таймера, тогда почему-то только 1 из 2 объектов, которые наследуются от MusicalInstrument, называется

MusicalInstrument.lua:

module(...,package.seeall)

MusicalInstrument.type="undefined"

local function listener()
print("timer action: "..MusicalInstrument.type)
end

function MusicalInstrument:play(tpe)
    MusicalInstrument.type = tpe;
    print("play called by: "..MusicalInstrument.type)
    timer.performWithDelay(500,listener,3)
end

function MusicalInstrument:new( o )
    x = x or {} -- can be parameterized, defaults to a new table
    setmetatable(x, self)
    self.__index = self
    return x
end

Guitar.lua

module(...,package.seeall)
require("MusicalInstrument")

gtr = {}

setmetatable(gtr, {__index = MusicalInstrument:new()})

return gtr

Drums.lua

module(...,package.seeall)
require("MusicalInstrument")

drms = {}

setmetatable(drms, {__index = MusicalInstrument:new()})

return drms

main.lua

--    CLEAR TERMINAL    --
os.execute('clear')
print( "clear" ) 
--------------------------


local drms=require("Drums")

drms:play("Drums")

local gtr=require("Guitar")

gtr:play("Guitar")

Это вывод терминала:

clear
play called by: Drums
play called by: Guitar
timer action: Guitar
timer action: Guitar
timer action: Guitar
timer action: Guitar
timer action: Guitar
timer action: Guitar

Я исключил выход для трех вызовов времени на гитаре и 3 вызовов таймера ударных

Любые идеи о том, как сделать эту работу, будут высоко оценены !!

Спасибо

----------------------------- Отредактировано после очередной попытки -------------- -----

Следующее изменение в MusicalInstrument

module(...,package.seeall)

MusicalInstrument.type="undefined"

function MusicalInstrument:listener()
print("timer action: "..MusicalInstrument.type)
end

function MusicalInstrument:play(tpe)
    MusicalInstrument.type = tpe;
    print("play called by: "..MusicalInstrument.type)
    timer.performWithDelay(500,MusicalInstrument:listener(),3)
end

function MusicalInstrument:new( o )
    x = x or {} -- can be parameterized, defaults to a new table
    setmetatable(x, self)
    self.__index = self
    return x
end

Результат со следующим выводом:

clear
play called by: Drums
timer action: Drums
play called by: Guitar
timer action: Guitar

Таймер вызывал нужные инструменты, но только один раз

1 Ответ

2 голосов
/ 02 июля 2011

И в listener, и в MusicalInstrument:play() вы пишете и читаете одну и ту же переменную для обоих экземпляров.

Здесь вы фактически хотите установить тип инструмента для каждого экземпляра.Lua не совсем мой основной язык, но, например, что-то вроде:

function MusicalInstrument:listener()
    print("timer action: "..self.type)
end

function MusicalInstrument:play(tpe)
    self.type = tpe;
    local f = function() self:listener() end
    timer.performWithDelay(500, f, 3)
end
...