0

我有一个标准的 cocos2d 启动层(HelloWorldLayer)。我为我的地形创建了另一类名为“Terrain”的 CCNode 类型。然后我在层的初始化中将它添加到我的层中:

terrain = [[Terrain alloc] initWithWorld:world AndLevel:0];
[self addChild:terrain z:1];

我添加了一个“CarObject”类(CCSprite 类),并将汽车对象添加到我的地形

 car = [[CarObject alloc] initWithWorld:world];
[terrain addChild:car];

- 即在地形和汽车的 initWithWorld 中,我初始化了一些 Box2d 代码

然后,当我移动它时,我尝试将我的汽车对象居中到我的屏幕上,我在我的更新方法中这样做:

  float offsetX = car.position.x;
   float offsetY = car.position.y;
    [terrain setOffsetX:(int)offsetX andOffsetY:(int)offsetY];   

其中 setOffsetX.. 方法是:

- (void) setOffsetX:(int)newOffsetX andOffsetY:(int)newOffsetY {

    _offsetX = newOffsetX;
    _offsetY = newOffsetY;

    CGSize winSize = [CCDirector sharedDirector].winSize;

    self.position = CGPointMake(-(_offsetX - winSize.width/2), -(_offsetY - winSize.height/2));

}

当我使用 NSLog 查看地形位置是否发生变化时,我可以看到位置实际上发生变化,但视图没有变化。我究竟做错了什么?我确定这是一个愚蠢的错误!

顺便说一句,如果我在 HelloWorldLayer 的更新方法中尝试这个(而不是 [terrain setOffsetX..])

self.position = CGPointMake(self.position.x-1, self.position.y);

地形在移动。

4

1 回答 1

0

汽车是地形的孩子。因此,汽车的位置相对于地形的位置。由于您将 Terrain 的位置基于 Car 的位置,而 Car 的位置实际上是相对于 Terrain 的位置,您可能会遇到这样的效果,即您的位置更新只是相互抵消了。

如果您想在保持 Car 居中的同时移动 Terrain,则不应将 Car 添加为 Terrain 的子项。而是将其添加到与地形 (HelloWorldLayer) 相同的节点。然后,您可以相互独立地移动 Car 和 Terrain。

于 2012-08-03T12:53:58.137 回答