Corona SDK - 我们如何将外部函数连接到main.lua?

问题描述:

现在我们将所有的代码收集在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 --------------------------------------------------------- 

在这另一个答案我会尽力实现我认为你想要的。请记住,我从来没有使用过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

我敢肯定,你可以使用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