当我检测到与精灵的碰撞时,我希望它(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显示
答案 0 :(得分:1)
您正在向数组添加字符串而不是精灵。尝试替换
[_items addObject:@"fuelNode"];
与
[_items addObject:fuel];
此外,自此声明
SKSpriteNode *object = [_items firstObject];
使用NSString
返回SKSpriteNode
而不是object
,因为精灵应该导致异常。我怀疑object
是nil
,因为你的数组没有正确分配。
您可以使用
访问场景中的精灵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;
为什么这么糟糕?因为这样你可以将物理对象与实际节点分离,并且它们可能同时位于两个不同的地方 - 你不想要这样但在某些情况下它并不重要 - 那么你可以使用它。
<强>乙强>
在您需要的位置创建一个新的物理主体并将其附加回您的节点