花栗鼠物理学的锚点和位置

时间:2012-12-15 16:24:37

标签: objective-c ios cocos2d-iphone physics chipmunk

我目前正在开发一款必须在iPhone屏幕上绘制一系列气泡的游戏。每个气泡都有自己的花栗鼠体,使用名为PhysicsEditor的多边形物理编辑器绘制。有了它,我创建了一个.plist文件,其中包含创建花栗鼠体(质量,弹性,锚定点等)所需的信息。

以下是我用来创建具有给定坐标的气泡的代码。

- (cpBody *)drawBubblesWithX:(int)x andY:(int)y {

    NSString *name = names[arc4random() % 7];
    CCSprite *sprite; // Will contain the sprite object if name isn't Nil

    // create physics shape
    [[GCpShapeCache sharedShapeCache] anchorPointForShape:@"BubbleSlot"];
    cpBody *body = [[GCpShapeCache sharedShapeCache] createBodyWithName:@"BubbleSlot" inSpace:space withData:nil];

    cpBodySetPos(body, cpv(x, y));
    if (name != nil) { // If a color has been selected

        // create and add sprite
        sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"%@.png", name]];
        [self addChild:sprite];

        // set the position of the sprite to be the same as the physics body
        sprite.position = CGPointMake(x, y);

        // set the position of body based on the sprite object
        cpBodySetUserData(body, (__bridge cpDataPointer)(sprite));

    }
    return body;
}

[[GCpShapeCache sharedShapeCache]对象包含用于创建实体的.plist文件。在.plist中,只有一个名为“BubbleSlot”的正文,它用作模板来创建所有气泡游戏。

身体的锚点约为(0.5,0.5)。

我的问题是cpBodySetPos()函数没有设置物理对象的位置。它由锚点改变。例如,要将我的cpBody对象的位置设置在iPhone屏幕的中心,我会做cpBodySetPos(body,cpv(160,240))。但由于某种原因,我必须在.plist文件中设置主体的锚点,其值为(160,240),然后相应地创建主体。

2 个答案:

答案 0 :(得分:1)

所以我不确切知道物理编辑器中锚点属性的用途,但是Chipmunk没有这样的概念。一个身体的位置与它的重心是同一个东西,它是在施加扭矩时旋转的相同点。

形状相对于它的位置附着在身体上。如果你有一个顶点为(0,0)的多边形,它将位于身体的重心位置。 (1,0)的顶点将位于身体重心的右侧(如果它没有旋转),等等。

我最好的猜测是,锚点是物理编辑器将其视为(0,0)的位置。尽管如此,这对你所描述的内容并没有多大意义。 HRM。

答案 1 :(得分:1)

Sprites也有一个锚点。您可能希望将其设置为您在“物理编辑器”((0.5,0.5)样式中设置的锚点)。这样精灵就能正确显示身体中心的位置。

self.sprite.anchorPoint = [[GCpShapeCache sharedShapeCache] anchorPointForShape:@"BubbleSlot"];

这就是我能想到的PE中的锚点。 PE的plist加载代码将身体的位置设置为锚点,但是这样做无用,因为你要将身体的位置设置为更有意义的位置。所以我只是用它来设置精灵的锚点,如上所述。

你也在每帧都用身体的位置更新精灵的位置,对吗?在“更新”或“步骤”方法中这样的事情:

    CGPoint pt = cpBodyGetPos(self.body);
    self.sprite.position = pt;

从你的症状来看,你可能会自己更新身体的位置,而不是让Chipmunk更新它。你只应该在创建身体并将其添加到世界时设置一次位置。