Ios 子类化SKSpriteNode时物理体的问题?
我在子类化SKSpriteNode时遇到了一个问题。下面是我对子类的实现:Ios 子类化SKSpriteNode时物理体的问题?,ios,objective-c,sprite-kit,skphysicsbody,skspritenode,Ios,Objective C,Sprite Kit,Skphysicsbody,Skspritenode,我在子类化SKSpriteNode时遇到了一个问题。下面是我对子类的实现: @implementation SSSquirrel - (id) init { if (self = [super init]) { // Create Squirrel and physics body SKSpriteNode *squirrel = [SKSpriteNode spriteNodeWithImageNamed:@"squirrelNormal"];
@implementation SSSquirrel
- (id) init {
if (self = [super init]) {
// Create Squirrel and physics body
SKSpriteNode *squirrel = [SKSpriteNode spriteNodeWithImageNamed:@"squirrelNormal"];
squirrel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:squirrel.size.width/2 - 10];
squirrel.physicsBody.dynamic = NO;
squirrel.physicsBody.affectedByGravity = NO;
squirrel.physicsBody.restitution = 0.8;
squirrel.physicsBody.friction = 0.1;
squirrel.zPosition = 1.0;
[self addChild:squirrel];
}
return self;
}
@end
然后我在我的主要游戏场景中创建了一只松鼠,如下所示:
SSSquirrel *squirrel1 = [[SSSquirrel alloc] init];
squirrel1.position = CGPointMake(offset, self.frame.size.height - offset);
[self addChild:squirrel1];
一切都很好。但是在游戏中,我尝试在触摸开始时“暂停”松鼠的物理体,然后在触摸结束时重新启用它(tempSquirrelBody是场景的SKPhysicsBody实例变量)。基本上,我试图给人一种错觉,即当用户触摸屏幕时,松鼠正朝着用户和其他物体移动
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
tempSquirrelBody = squirrel1.physicsBody;
squirrel1.physicsBody = nil;
CGPoint newPosition = squirrel1.position;
newPosition.x -= 60;
newPosition.y += 60;
squirrel1.position = newPosition;
squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelUp"];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch ends */
for (UITouch *touch in touches) {
CGPoint newPosition = squirrel1.position;
newPosition.x += 60;
newPosition.y -= 60;
squirrel1.position = newPosition;
squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelNormal"];
squirrel1.physicsBody = tempSquirrelBody;
}
}
不幸的是,这是行不通的;当physicsbody设置为nil时,physicsbody不会悬浮,松鼠会与其他对象碰撞。当我将代码从SSSquirrel类移动到游戏场景时,它仍然有效。我做错了什么
谢谢 将
冲突位掩码设置为0
而不是将整个physicsBody
设置为nil
不是更容易吗
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
for (UITouch *touch in touches) {
squirrel1.physicsBody.collisionBitMask = 0;
CGPoint newPosition = squirrel1.position;
newPosition.x -= 60;
newPosition.y += 60;
squirrel1.position = newPosition;
squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelUp"];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch ends */
for (UITouch *touch in touches) {
CGPoint newPosition = squirrel1.position;
newPosition.x += 60;
newPosition.y -= 60;
squirrel1.position = newPosition;
squirrel1.texture = [SKTexture textureWithImageNamed:@"squirrelNormal"];
squirrel1.physicsBody.collisionBitMask = 0xFFFFFFFF;
}
}
我终于意识到我做错了什么。在我的SSSquirrel课程中,我将物理体分配给了SKSpriteNode而不是self,这使得我在课堂外无法访问它。是的,这是一种更好的阻止碰撞的方法,但是,我的方法仍然正确。结果是我把物理体分配给了SKSpriteNode而不是self,这使得我在课堂外无法访问它。