您的位置:首页 > 移动开发 > Cocos引擎

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

2015-03-07 22:35 281 查看
最近正在学习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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x mvc lua 多态