2

我正在用 cocos2d (iphone jsb + cocos2d-html5) 编写一个跨平台游戏,我想知道如何真正让它跨平台。适用于 -html5 的代码不一定适用于 -iphone jsb,反之亦然。

目前我陷入以下(相关)问题:

  1. ctor和有什么区别init
  2. 什么时候应该超载ctor,什么时候应该超载init
  3. 我应该什么时候打电话_super()ctor/或init
  4. 如果我超载,我.init()应该什么时候打电话?ctorctor
  5. 我应该如何实例化对象?与var inst = new Obj(); inst.init();?还是只是var inst = new Obj();?我知道有些.create()方法是有意义的,但我问的是我自己编写create方法的情况。
  6. 我应该什么时候使用associateWithNative

我有一些适用于 html5 版本的代码,但后来我得到一个错误,说对象已经在 iPhone jsb 版本上初始化,所以很明显我弄错了。我试过查看 MoonWarriors 代码,但它似乎从未使用过associateWithNative,我认为这是必需的,它有时会重载,有时不会,有时会从ctor调用,有时不会,等等......initctor

4

2 回答 2

2

ad 1-5. 我发现覆盖 ctor - 尽管可能看起来更方便,特别是对于目前来自 JS 世界的人来说,在其他平台上编译 cocos2d-js 代码时可能会导致问题 - 如果你偶然ERROR in *: Invalid Proxy object发现错误,可能是因为覆盖ctor方法(在少数情况下对我来说)。此外,有时本机类上的构造函数方法会期望您最终为从本机类继承的类覆盖/处理的参数,这也可能导致一些冲突。

除此之外,Kex 描述了所有差异 - 我会说查看提供的示例和 cocos2d 源最安全,“Cocos2d 方式”是使用 init 方法和 static factory 的组合create

ad 6. 不再需要使用该associateWithNative方法(您可以在此处阅读更多内容:cocos2d-js-devel

于 2013-05-14T07:31:26.730 回答
1

对我来说也很难找到出路,我也有同样的问题,我开发的游戏主要是在浏览器上进行测试,现在我也有很多问题,无法将其移植到 iOS。

至于你的问题:

  1. ctor调用类的构造函数,init初始化新对象。
  2. ctor您应该在子类化时重载,init在为您的子类化的类的对象执行自定义初始化行为时。
  3. 我会说总是,虽然我也注意到这在 MoonWarriors 演示中并非无处不在。
  4. 我认为这不是一个好习惯。
  5. var inst = new Obj();& 然后inst.init()或其他方式是调用var inst = Obj.create();
  6. associateWithNative应该调用ctor

关于从您创建的类创建对象,例如,如果您有一个作为私有属性的var Warrior对象并且_hp您想在创建时分配它,据我了解有 3 种方法:

1.使用构造函数:

var myWarrior = new Warrior(hp);

& 然后你_hp在构造函数中设置ctor:function(hp)..

2.初始化:

var myWarrior = new Warrior();
myWarrior.init(hp);

& 然后你_hp在初始化中设置init:function(hp)..

3.采用工厂方法:

var myWarrior = Warrior.create(hp);

& 然后你_hp在创建方法中设置var Warrior& ,它会在 & 声明之后创建一个新对象并正确初始化它。

编辑:同样从 cocos2d-iphone-2.1-rc2 开始,您将不再需要覆盖ctor以便放置,associateWithNative因为不需要该调用的构建。

于 2013-05-04T04:49:28.410 回答