2011-05-11 74 views
2

現在我們將所有的代碼收集在main.lua中。我們不想使用面向對象的代碼,但仍然可以找到一種簡單的方法將不同的對象分割成單獨的文件。Corona SDK - 我們如何將外部函數連接到main.lua?

在我們的main.lua文件中,我們擁有諸如水,船,男孩,島嶼和雲之類的對象 - 所有這些一起創建了大量的代碼。我們希望在它自己的lua文件中包含「BEGIN WATER 3」,並且能夠使用簡單的函數在main.lua中執行該代碼。我們如何做到這一點?

下面的例子我們main.lua文件,顯示「water3」:

--------------- BEGIN WATER 3 --------------------------------------------------------- 

local watere = display.newImage("water3.png", true) 
game:insert(watere) 
watere.y = 619 
watere.x = 500 
watere.xScale = 2 

--water sound 
local wavesound5 = media.newEventSound("waves.wav") 

local function playWave5 (event) 
    media.playEventSound(wavesound5) 
end 

local w,h = display.contentWidth, display.contentHeight 

local function callbackFunc() 
    print("Transition 1 completed") 
end 

local function mainwater(watere) 
end 

function loopar() 
    local myTween = transition.to(watere, {time=2300, x=(400), y=(h-140), transition=easing.inOutQuad, onComplete=loopar2}) 
end 

function loopar2() 
    local myTween = transition.to(watere, {time=2200, x=(w-500), y=(h-120), transition=easing.inOutQuad, onComplete=loopar}) 
end 

local listener2 = function() 
    print("Transition 2 completed") 
end 

local myTween = transition.to(watere, {time=2300, x=(w-400), y=(h-140), transition=easing.inOutQuad, onComplete=loopar}) 

watere:addEventListener("touch", playWave5) 

---------------- END WATER 3 --------------------------------------------------------- 

回答

3

在這另一個答案我會盡力實現我認爲你想要的。請記住,我從來沒有使用過CoronaSDK,所以它可能需要一些調試。

首先,這是一個名爲create.lua的文件。你應該把它放在與main.lua相同的目錄下。

create.lua的主要目標是建立一個名爲create的表格。那張桌子只有一個創造水的功能;您可以稍後添加更多功能,例如創建地面。

-- file 'create.lua' 

local function water(game,x,y,xScale,imagePath,soundPath) 

    local image = display.newImage(imagePath) 
    game:insert(image) 

    image.x, image.y, image.xScale = x, y, xScale 

    local w,h = display.contentWidth, display.contentHeight 

    -- create two empty local variables and assign functions to them 
    local loopar, loopar2 
    loopar = function() transition.to(image, {time=2300, x=(400), y=(h-140), transition=easing.inOutQuad, onComplete=loopar2}) end 
    loopar2 = function() transition.to(image, {time=2200, x=(w-500), y=(h-120), transition=easing.inOutQuad, onComplete=loopar}) end 

    -- start the movement 
    transition.to(image, {time=2300, x=(w-400), y=(h-140), transition=easing.inOutQuad, onComplete=loopar}) 

    local sound = media.newEventSound(soundPath) 
    image:addEventListener("touch", function() media.playEventSound(sound) end) 
end 

local create = { water = water } 

return create 

裏面main.lua,爲了能夠首先使用create.water你必須得到訪問該create表;你使用require。像這樣:

-- file 'main.lua' 

local create = require 'create' 

<put the code for creating the 'game' group here> 

create.water(game, 619, 500, 2, "water3.png", "waves.wav") 

請注意,create.water接收參數。您現在可以更容易地更改參數:

create.water(game, 200, 100, 2, "water3.png", "waves.wav") -- other initial coordinates 
create.water(game, 619, 500, 1, "water3.png", "waves.wav") -- scaleX = 1 
create.water(game, 619, 500, 1, "water.png", "waves.wav") -- other water img 

Regards!

+0

此方法似乎在沒有模塊(...,package.seeall)的情況下工作。目前我在模塊中使用了這個聲明,但我聽說這是不好的做法。 – jhocking 2011-05-12 01:25:41

+0

@jhocking這是一個不好的做法。模塊函數將在下一個版本的Lua中被棄用。 – kikito 2011-05-12 07:47:30

+0

這不是一個問題。 – jhocking 2011-05-12 11:31:03

5

我敢肯定,你可以使用Lua的require功能電暈。

使用它的最簡單方法如下:

1)你只要你想創建的文件中儘可能多的本地函數(我們稱之爲extra.lua)

local function f1(...) 
    ... 
end 

local function f2(...) 
    ... 
end 

2)後這些函數可以創建一個包含所有要「共享」的函數的表格。這是常見的是表被稱爲像文件,所以我會打電話給我的extras

local extras = { 
    f1 = f1, 
    f2 = f2 
} 

這個符號似乎不可思議。它所做的是創建一個名爲extras的表,其中包含一個名爲f1的字段,指向本地函數f1。換句話說,調用f1(1,2,3)確實與調用extras.f1(1,2,3)

3)返回表在文件的結尾:

return extras 

4)現在對main.lua您可以使用這樣的演員中定義的函數:

local extras = require 'extras' 

extras.f1(1,2,3) 
extras.f2(4,5,6) 

我希望這有助於!祝你好運!

+0

謝謝!是否可以創建一個主函數,涵蓋「water3」中的所有函數,而無需手動調用每個函數? – sandra 2011-05-11 16:43:20

+0

對不起,我不明白你的意思是「覆蓋」 – kikito 2011-05-11 17:05:39

+0

收集是一個更好的詞,我的意思是! – sandra 2011-05-11 17:13:00

相關問題