Quick-cocos2d-x的MVC架构之model研究

最近正在学习Quick-cocos2d-x下的MVC架构,做下笔记
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, events, callbacks)
    Man.super.ctor(self, properties, events, 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.派生类函数覆盖

--可以直接覆盖,用super的函数调用基类处理

--注意也是用.,而且参数要有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)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值