cocos2d子类

时间:2011-10-08 20:26:42

标签: objective-c

我知道cocos2d有调度回调来做好事,但是当你需要使用一个CCAction(比如CCMoveTo)以便将精灵从a位置移动到b时,你就没有能力进行小位置安排只要动作生效,就到精灵位置。

我找到的唯一可行方法是制作一个CCMoveTo子类,以检查障碍物,从而为从iPhone顶部向底部移动的精灵向左或向右提供某种移动屏幕。问题是子类无法访问父类的实例变量(如startPosition_ one),因为它们尚未被声明为属性。

所以我使用以下代码片段来克服这种情况,但我想知道我做错了什么......

- (void)myUpdate:(ccTime)time {
 if(delegate && method_) {
   NSNumber *num = (NSNumber *)[delegate performSelector:method_ withObject:ownTarget];

  if(num) {
   double xpos = [num doubleValue];
   [num release];

   CCMoveTo *parent = [super retain];

   parent->startPosition_.x += xpos;

   [parent release];
 }

[super update:time]; 
}

保留/释放超级班级是否正确? “[超级更新:时间];”在代码的底部将进行最终定位。

1 个答案:

答案 0 :(得分:0)

CCMoveTo *parent = [super retain];

哎哟!这句话绝对没有意义。它与写作相同:

[self retain];

至于访问超类的实例变量:除非它们被声明为@private,否则你可以访问它们。我刚检查过:他们不是@private。你应该能够写入你的子类:

startPosition_.x += xpos;

如果这不起作用,请确保您的类实际上是CCMoveTo的子类,而不是其他类。

最后,我想说在实现游戏玩法时行动非常有限。基于速度矢量,通过每帧修改其位置属性,简单地为游戏对象设置动画可能会更好。您在位置和位置更新方面拥有更多自由,并且每次执行新操作时都不会产生诸如一帧延迟等操作的副作用。

-(void) update:(ccTime)delta
{
  // modify velocity based on whatever you need, ie gravity, or just heading in one direction
  // then update the node's position by adding the current velocity to move it:
  self.position = CGPointMake(self.position.x + velocity.x, self.position.y + velocity.y);
}