【问题标题】:Chipmunk Physics' Anchorpoints and positions花栗鼠物理的锚点和位置
【发布时间】:2012-12-15 16:24:36
【问题描述】:

我目前正在开发一款必须在 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中,只有1个body,命名为“BubbleSlot”,用作创建游戏中所有气泡的模板。

body 的锚点约为 (0.5, 0.5)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    这就是我认为 PE 中的锚点的全部用途。 PE 的 plist 加载代码将主体的位置设置为锚点,但这毫无用处,因为无论如何您都要将主体的位置设置为更有意义的位置。所以我只是用它来设置精灵的锚点,如上。

    你也在每帧更新精灵的位置和身体的位置,对吧? “更新”或“步骤”方法中的类似内容:

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

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

    【讨论】:

      【解决方案2】:

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

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

      我最好的猜测是,锚点是物理编辑器将其视为 (0, 0) 的位置。不过,这与您上面描述的内容不太合理。嗯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多