雪碧在碰撞时不会移动

时间:2015-06-17 16:51:21

标签: ios objective-c sprite-kit

当我检测到与精灵的碰撞时,我希望它(fuelSprite)移动到一个新的随机生成的位置。

我生成像这样的精灵

//setup fuel

SKSpriteNode *fuel = [SKSpriteNode spriteNodeWithImageNamed:@"fuel.png"];

fuel.position = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height));
[fuel setScale:0.6];
fuel.zPosition = 1;
fuel.shadowCastBitMask = 1;

fuel.name = @"fuelNode";
fuel.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fuel.frame.size];

fuel.physicsBody.dynamic = FALSE;

fuel.physicsBody.affectedByGravity = false;
fuel.physicsBody.usesPreciseCollisionDetection = YES;
fuel.physicsBody.categoryBitMask = fuelCategory;

fuel.physicsBody.collisionBitMask = fuelCategory | fireCategory;
fuel.physicsBody.contactTestBitMask = fireCategory;

[self addChild:fuel];

[_items addObject:@"fuelNode"];

然后当检测到碰撞时,我想抓住精灵(只有数组中的东西)并移动它

-(void)didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"contact detected");

SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
}
else
{
    firstBody = contact.bodyB;
    secondBody = contact.bodyA;
}
  NSLog(@"Hit");
score ++;

SKSpriteNode *object = [_items firstObject];

object.position = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height));

}

这是在我的头文件中的fuelSprite和items数组

@property (nonatomic, strong) SKSpriteNode *fuelSprite;
@property (nonatomic) NSMutableArray *items;

出于某种原因,我无法将精灵移动到新的随机位置:(

命中检测工作完美无缺,NSlog显示

3 个答案:

答案 0 :(得分:1)

您正在向数组添加字符串而不是精灵。尝试替换

[_items addObject:@"fuelNode"];

[_items addObject:fuel];

此外,自此声明

SKSpriteNode *object = [_items firstObject];

使用NSString返回SKSpriteNode而不是object,因为精灵应该导致异常。我怀疑objectnil,因为你的数组没有正确分配。

您可以使用

访问场景中的精灵
SKSpriteNode *object = [self childNodeWithName:@"fuelNode"];

而不是将其添加到数组中。

答案 1 :(得分:0)

Haven没有做SpriteKit一段时间,而是设置了位置。

尝试更换:

object.position = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height));

使用:

  CGPoint randomPoint = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height));
  CGFloat duration = 2;
  SKAction *move = [SKAction moveTo:randomPoint duration:duration];
  [ojbect runAction:run];

希望这适合你。 :)

答案 2 :(得分:0)

原因是苹果阻止你弄乱连接到physicsBody的节点。

您有两种选择:

<强> A

SKPhysicsBody* tmp = object.physicsBody;
object.physicsBody = nil;
object.position = CGPointMake(arc4random_uniform(self.frame.size.width), arc4random_uniform(self.frame.size.height));
object.physicsBody = tmp;

为什么这么糟糕?因为这样你可以将物理对象与实际节点分离,并且它们可能同时位于两个不同的地方 - 你不想要这样但在某些情况下它并不重要 - 那么你可以使用它。

<强>乙

在您需要的位置创建一个新的物理主体并将其附加回您的节点