我知道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];
}
保留/释放超级班级是否正确? “[超级更新:时间];”在代码的底部将进行最终定位。
答案 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);
}