Dav*_*son 7 iphone sdk lua coronasdk
所以我来自传统的游戏开发,它使用OOP原理,而且从我看到你可以使用LUA模仿它,一旦你知道你在做什么.在一些代码发布中,我发现了如何使用director类并创建具有new()函数等的文件.
我正在寻找的是一种管理我的武器的方法.我有一个球员和一个对手,我宁愿拥有一个武器类,比如武器佳能.我所做的是:
-- private vars here
local power
local canonSprite
local whatever
local someFunction = function()
...
end
-- Private stuff here
local weaponCanon = {}
weaponCanon.fire = function(atX, atY)
...
end
weaponCanon.reset = function()
...
end
return weaponCanon
Run Code Online (Sandbox Code Playgroud)
然后在我的关卡代码中,我只是这样做:
local weaponCanon = require("weaponCanon")
weaponCanon.fire(100, 100)
Run Code Online (Sandbox Code Playgroud)
这很有效,并且允许我在编写武器时使用"私人"和"公共"心态.问题是,如果我想让玩家和对手拥有一个正典:
local playerWeapon = require("weaponCanon")
local opponentWeapon = require("weaponCanon")
Run Code Online (Sandbox Code Playgroud)
这只是将同一个对象而不是新实例返回给该对象.所以我只能在对手武器位置获得一枚武器.这显然是我想要/需要的.
我们的游戏中有很多武器,如果只有一个版本的每个文件都有一个设置告诉我们它是对手武器还是玩家武器会很不错.另一种方法是复制每个文件并创建一个weaponPlayerCanon和一个weaponOpponentCanon,但我想到修改一个文件并且每次都要更改2个以上的文件时会感到畏缩.
如何让它返回一个实例以及LUA文件的结构是什么?
谢谢或任何和所有的帮助
-d
如果稍后您开始需要继承(即LaserCannon是Weapon的子类),您可能需要更深入地使用元数据.
有很多库可以让你在Lua之上做"oop".你可以在这里看到一个非常好的列表:
http://lua-users.org/wiki/ObjectOrientedProgramming
我是middleclass的作者.使用我的lib,你必须做这样的事情:
local Weapon = class('Weapon')
function Weapon:initialize(a,b,c)
self.x,self.y,self.z = a,b,c
end
function Weapon:fire(x,y)
...
end
Run Code Online (Sandbox Code Playgroud)
LaserCannon很容易实现 - 你只需要将第二个参数传递给class:
local LaserCannon = class('LaserCannon', Weapon)
function LaserCannon:initialize(a,b,c,d)
self.w = d
Weapon.initialize(self, a,b,c) -- superclass' constructor
end
function LaserCannon:foo()
...
end
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它:
require 'middleclass' -- so you can use "class"
LaserCannon = require 'laser_cannon'
local playerWeapon = LaserCannon:new() -- a laser
local opponentWeapon = Weapon:new() -- a regular generic weapon
opponentWeapon:fire(100,200) -- typical use
playerWeapon:fire(100, 200) -- LaserCannon inherits fire from Weapon
playerWeapon:foo() -- LaserCannon-exclusive
Run Code Online (Sandbox Code Playgroud)
这是middleclass,这是我喜欢的,因为我做到了.我之前提到的页面上的其他库提供了类似的功能.
我想你正试图用你的源文件建模一个类.这意味着您还应该有一个函数来创建该类的新实例,除非您希望它们共享所有状态.
某些事情(未经测试):
local WeaponCannon = {}
WeaponCannon.__index = WeaponCannon
function WeaponCannon:new()
return setmetatable({}, self)
end
function WeaponCannon:fire(x, y)
-- Do something via the self reference and arguments (x, y)
end
return WeaponCannon
Run Code Online (Sandbox Code Playgroud)
在您的调用代码中(也未经测试):
require('WeaponCannon')
local playerWeapon = WeaponCannon:new()
local opponentWeapon = WeaponCannon:new()
Run Code Online (Sandbox Code Playgroud)