gpt4 book ai didi

ios - SpriteKit : remove specific node instead of all nodes

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:14 25 4
gpt4 key购买 nike

我创建了一个应用程序,其中有两种不同大小的从天而降的“石头”节点源源不断。玩家控制第三个石头对象,并根据收集到的两种落石类型中的哪一种来获得积分。最后,梁对象用作移动地面。到目前为止,我已经在我的应用程序中添加了碰撞检测,它可以检测不同石头和光束之间的碰撞。这是我的碰撞代码:

static const uint32_t stoneCategory = 1;
static const uint32_t beamCategory = 2;
static const uint32_t stoneCategory2 = 4;

-(void)didBeginContact:(SKPhysicsContact *)contact{

SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;

CGPoint contactPoint = contact.contactPoint;

float contact_x = contactPoint.x;
float contact_y = contactPoint.y;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}

else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}


// First condition: make big stone stick to moving beams
if ((firstBody.categoryBitMask & stoneCategory) != 0)
{
SKPhysicsJointFixed *joint =
[SKPhysicsJointFixed jointWithBodyA:contact.bodyA
bodyB:contact.bodyB
anchor:CGPointMake(contact_x, contact_y)];

[self.physicsWorld addJoint:joint];
}


// Second condition: remove small stone on collision with big stone

if ((firstBody.categoryBitMask & stoneCategory) != 0 &&
(secondBody.categoryBitMask & stoneCategory2) != 0)
{

NSLog(@"Hit");

[self enumerateChildNodesWithName:@"stone" usingBlock:^(SKNode *node, BOOL *stop) {
[node removeFromParent];
}];
}

这完全符合预期。当大石头撞到光束物体时,它会粘在上面并随之移动。另外,当大石头和小石头碰撞时,小石头从场景中移除。然而:虽然我知道这正是我的代码应该做的,因为它指向我的石头方法(称为“石头”),但在石头之间发生碰撞时,我只希望移除一个特定的小石头,而不是所有的那一刻现场可见小石头。

我不知道如何做到这一点。回顾一下:我怎样才能删除一个特定的节点,而不是删除它的整个方法?希望我的问题很清楚,如果需要,我很乐意提供更多详细信息。

我的石法:

-(void) addStone
{

SKSpriteNode *stone = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(12, 12)];

stone.position = CGPointMake(skRand(0, self.size.width), self.size.height+12);
stone.name = @"stone";
stone.physicsBody.categoryBitMask = stoneCategory2;
stone.physicsBody.contactTestBitMask = stoneCategory;

stone.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:stone.size];
stone.physicsBody.usesPreciseCollisionDetection = YES;

[self addChild:stone];
}

在我的 createSceneContents 中

SKAction *makeStone= [SKAction sequence:@[
[SKAction performSelector:@selector(addStone) onTarget:self],
[SKAction waitForDuration:0.30 withRange:0.25]
]];

[self runAction:[SKAction repeatActionForever:makeStone]];

以上就是我的小石头方法。对于大的,我使用类似的方法,但使用了其他名称。

最佳答案

背后的原因 1) sprite 按 z 顺序绘制新对象,碰撞也会按照你绘制的顺序发生

so when you remove a small stone at first time and recreate it changes its body from A to B

只需在下面的联系代码中查看具体的 body 类型

 if(([contact.bodyA.node.name isEqualToString:@"bigstone"] && [contact.bodyB.node.name isEqualToString:@"smallstone"] ) || ([contact.bodyA.node.name isEqualToString:@"smallstone"] && [contact.bodyB.node.name isEqualToString:@"bigstone"]) )
{


if([contact.bodyA.node.name isEqualToString:@"smallstone"] )
{
[contact.bodyA.node removeFromParent];
}else{
[contact.bodyB.node removeFromParent];
}

}

关于ios - SpriteKit : remove specific node instead of all nodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com