我有一个节点放在我的屏幕下,作为一个平台。只要另一个节点触摸节点,布尔值就会设置为NO。
当我使用SKPhysicsBody
属性定义我的节点时,节点会忽略affectedByGravity
属性。
我的代码:
+ (void)addNewNodeTo:(SKNode *)parentNode
{
//Correct image size
SKSpriteNode *desertBottom = [SKSpriteNode node];
desertBottom = [[SKSpriteNode alloc] initWithImageNamed:@"Giraffe.png"];
desertBottom.position = CGPointMake(0, -200);
desertBottom.zPosition = 2;
desertBottom.physicsBody.collisionBitMask = lionType;
desertBottom.physicsBody.categoryBitMask = terrainType;
desertBottom.physicsBody.contactTestBitMask = lionType;
desertBottom.zPosition = 2;
desertBottom.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(desertBottom.size.width, desertBottom.size.height)];
desertBottom.physicsBody.dynamic = YES;
desertBottom.physicsBody.affectedByGravity = NO;
[parentNode addChild:desertBottom];
}
我的碰撞方法:
- (void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (lionType | terrainType)) {
self.lionNode.lionIsJumping = NO;
NSLog(@"%i", self.lionNode.lionIsJumping);
}
}
- (void)didEndContact:(SKPhysicsContact *)contact
{
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (lionType | terrainType)) {
self.lionNode.lionIsJumping = YES;
NSLog(@"%i", self.lionNode.lionIsJumping);
}
}
答案 0 :(得分:2)
物理机构有速度。重力随时间变化速度。如果身体由于重力已经以一定速度行进,并且您禁用重力,它将继续根据其当前速度移动,但不再从重力获得额外的速度。
我的猜测是,在禁用重力时你会期望身体停止。如果这是您想要的,您可以通过将速度的y分量设置为零来手动执行此操作:
SKPhysicsBody* body = desertBottom.physicsBody;
body.velocity = CGVectorMake(body.velocity.x, 0.0);
答案 1 :(得分:2)
如果平台在碰撞后不应移动,则必须将动态属性设置为false。
也许你的位掩码存在问题?
您是否尝试在didBeginContact方法的if语句之外注册?
答案 2 :(得分:1)
我已经为底部创建了一个带有SKSpriteNode
子类的新类,并将其添加到我的GameScene中。