MVC架构包含model、controller、view
model一般是会有多个实例的类,该类只有数据没有视图,比如Hero类
controller一般一个类就是一个全局对象,比如PlayDuelController
views一般就是界面表现部分,比如Hero类增加图形表示后的HeroView类
对于一些场景、层、控件不一定要放在views目录下,可以单独建立一个scenes、controls的目录
本篇主要是归纳一下model的写法,这里会用我自己定义的类来做演示,同时也可以参考Quick-cocos2d-x示例代码中的mvc例子,另外版本是3.3
一.基本定义
1.基本类定义
1)第一级类
--从cc.mvc.ModelBase派生
local People = class("People",cc.mvc.ModelBase)
--构造函数是固定格式
--properties是一个表,所有初始参数都在这一个参数里
--用super.ctor初始化父类构造函数,注意用.,而且前面有self
function People:ctor(properties,events,callbacks)
People.super.ctor(self,properties)
end
--返回对象
return People
2)派生类
--引入基类
local People = import(".People")
--派生
local Man = class("Man",People)
function Man:ctor(properties,callbacks)
Man.super.ctor(self,properties,callbacks)
end
return Man
2.对象生成
--包含文件
local People = require("src.app.models.People")
--new对象,每次new是会新产生对象实例,参数是table类型
local People1 = People.new({name="tom"})
local People2 = People.new({name="mary"})
3.定义属性
--先把父类的属性表clone过来
People.schema = clone(cc.mvc.ModelBase.schema)
--定义属性,后面的是类型
People.schema["name"] = {"string"}
--number类型属性要有默认值
People.schema["sleepTime"] = {"number",0}
--实际的变量名是属性名+_,要增加get和set两个函数存取
function People:getName()
return self.name_
end
function People:setName(name)
self.name_ = name
end
--使用方法
printf("People1 name=%s",People1:getName())
People1:setName("chendana")
printf("People1 name=%s",People1:getName())
4.定义方法
function People:eat(number)
print("in function eat")
end
二.面向对象性
1.函数多态
lua没法写函数参数不同的同名函数,如果真要这么写,实际调用会自动调用最后那个
比如:
function People:eat(number,type)
print("in function eat(number,type)")
end
function People:eat(number)
print("in function eat(number)")
end
People1:eat(10,1)
最后会显示in function eat(number),如果把函数位置调一下,就会调用后面定义的
2.派生类函数覆盖
--注意也是用.,而且参数要有self,不能写成Man.super:eat(number)
function Man:eat(number) print("in man function eat(number)") Man.super.eat(self,number) end 3.虚函数 是自动支持的 父类 function People:normal() print("in function People:normal") end function People:sleep(time) print("in function People:sleep(time)") end function People:eat(number) print("in function People:eat(number)") end function People:dayAction() self:normal() self:eat(5) self:sleep(10) end 派生类 function Man:eat(number) print("in function Man:eat(number)") Man.super.eat(self,number) end 调用 local Man1 = Man.new({name="tom",beard="1"}) Man1:dayAction() 会显示 [LUA-print] in function People:normal [LUA-print] in function Man:eat(number) [LUA-print] in function People:eat(number) [LUA-print] in function People:sleep(time)