我目前正在开发一款必须在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),然后相应地创建主体。
答案 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更新它。你只应该在创建身体并将其添加到世界时设置一次位置。