2

我有几个用 Cocos2D 创建的应用程序。

我正在将其中一些升级到 Cocos2D 的新版本 2.0。我使用的方法是:

  1. 我从标准模板创建了一个新的空白项目
  2. 我将所有文件移动到新项目

我通常将层 Helloworld 作为我的初始层。我注意到 Cocos2D 创建了一个 introLayer 作为初始层,我已经删除了它并恢复了加载 Helloworld 的行为。说到这里,我注意到了几点:

  1. Helloworld 的 init 方法内部的行为现在有所不同。我注意到现在在 init 方法中错误地报告了方向。即使应用程序只是横向,它也会始终将其报告为纵向。我还注意到导演还没有完全初始化。如果我尝试使用导演的观点,这一点得到了证实。如果我尝试在 Helloworld 的 init 方法中使用它,这个视图总是无效的。

为了解决这个问题,我已将所有代码移至 Helloworld 的 onEnter 方法。现在,Helloworld 和 director 已经完全初始化,一切正常。

这种方法适用于我为 Cocos2D 1.0 升级到 2.0 的第一个应用程序,但我现在从 Cocos2D 2.0beta 转换到 2.0 最终版本的应用程序出现了问题。

我现在遇到的问题是 Helloworld 没有触发任何触摸,是的,我有这个:

-(void) registerWithTouchDispatcher
{
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}


- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    return YES;
}

什么可以阻止 Helloworld 在 2.0 中检测触摸?如何使 Helloworld 的 init 方法表现得像 2.0 beta 或 1.0?

注意:加载 Helloworld 时永远不会调用 ccTouchBegan 和 registerWithTouchDispatcher。

谢谢。

4

2 回答 2

3

轮换问题是一个已知错误。第一个场景将以纵向模式初始化,即使应用程序设置为仅横向模式。这是因为初始化发生在应用委托更新方向之前。将代码放入 onEnter 可以解决这个问题,或者只是加载一个“介绍”场景,然后加载实际的第一个场景也可以解决这个问题。

触摸问题可能不是 cocos2d 2.0 的问题。也许就像不设置一样简单self.isTouchEnabled = YES。如果未调用 registerWithTouchDispatcher 方法,则 isTouchEnabled 未设置为 YES,或者您不是在 CCLayer 类中执行此操作,而是在 CCScene 中执行此操作。

于 2012-07-31T19:55:24.563 回答
0

这个问题的解决方案是将 [super onEnter] 放在 onEnter 方法上。

-(void) onEnter {
    [super onEnter];
    self.isTouchEnabled = YES;
}

缺少这条线会在应用程序上产生各种问题,例如调度程序不工作、ccMove 的奇怪行为、ccTransition 没有触发 onEnterTransitionDidFinish 以及各种问题。

于 2012-07-31T21:41:55.053 回答