如果我用第一批代码创建一个精灵和身体,精灵就在圆形身体的顶部。但是如果我用第二批代码创建精灵,圆形主体的底部会附加到精灵的顶部。两批代码都使用以下
更新 1 -我更改了 createBody 以便它现在将位置作为输入。然后我认为我在每个原因中都发送了正确的位置,但是我仍然在第二批代码中看到精灵的顶部连接到身体的底部。
createBody 方法:
- (void)createBody : (NSNumber *)xPos yPos:(NSNumber *)yPos {
float radius = 16.0f;
b2BodyDef bd;
bd.type = b2_dynamicBody;
bd.linearDamping = 0.1f;
bd.fixedRotation = true;
bd.position.Set([xPos doubleValue]/PTM_RATIO, [yPos doubleValue]/PTM_RATIO);
body = _world->CreateBody(&bd);
b2CircleShape shape;
shape.m_radius = radius/PTM_RATIO;
b2FixtureDef fd;
fd.shape = &shape;
fd.density = 1.0f;
fd.restitution = 0.0f;
fd.friction = 0.2;
body->CreateFixture(&fd);
}
第一批代码——
英雄.mm -
- (id)initWithWorld:(b2World *)world {
if ((self = [super initWithSpriteFrameName:@"animal.png"])) {
NSNumber *xPos = [NSNumber numberWithDouble:self.position.x];
NSNumber *yPos = [NSNumber numberWithDouble:self.position.y];
[self createBody:xPos yPos:yPos];
}
}
你好世界.mm
_hero = [[[Hero alloc] initWithWorld:_world] autorelease];
[_terrain.batchNode addChild:_hero];
第二批代码——
英雄.mm -
CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"animal.png"];
[self addChild:sprite];
NSNumber *xPos = [NSNumber numberWithDouble: sprite.position.x];
NSNumber *yPos = [NSNumber numberWithDouble: sprite.position.y];
[self createBody:xPos yPos:yPos];
两批代码的主要区别在于,第一批使用initWithSpriteFrameName,第二批使用spriteWithSpriteFrameName。有谁知道如何使用 spriteWithSpriteFrameName 使精灵在身体上居中?
奇怪的是createBody方法中的这一行
bd.position.Set([xPos doubleValue]/PTM_RATIO, [yPos doubleValue]/PTM_RATIO);
似乎没有将身体定位在精灵上,而是将身体和精灵定位在世界坐标中。