我正在尝试制作一款游戏,其中障碍物从屏幕顶部落下,玩家必须尝试避开它们,但是 didBeginContact 方法没有被调用,这让我发疯。这是我的代码中与节点冲突相关的部分...
//myScene.h
@interface MyScene : SKScene <SKPhysicsContactDelegate>
//myScene.m
@implementation MyScene
static const uint32_t playerCategory = 0x1 << 0;
static const uint32_t obstacleCategory = 0x1 << 1;
-(id)initWithSize:(CGSize)size
{
if (self = [super initWithSize:size])
{
//setup scene
self.backgroundColor = [SKColor whiteColor];
self.physicsWorld.gravity = CGVectorMake(0, 0);
self.physicsWorld.contactDelegate = self;
obstacles = [NSMutableArray array];
//add player node
player = [SKNode node];
SKSpriteNode *spritePlayer = [SKSpriteNode spriteNodeWithImageNamed:@"black.png"];
spritePlayer.size = CGSizeMake(50, 50);
spritePlayer.position = CGPointMake(self.frame.size.width/2, 100);
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame.size];
player.physicsBody.dynamic = NO;
player.physicsBody.mass = 0.02;
[player addChild:spritePlayer];
player.physicsBody.categoryBitMask = playerCategory;
player.physicsBody.contactTestBitMask = obstacleCategory;
player.physicsBody.collisionBitMask = 0;
player.physicsBody.usesPreciseCollisionDetection = YES;
[self addChild:player];
[self spawnNewObstacles];
}
return self;
}
- (void)spawnNewObstacles
{
//spawn obstacles
obstacle = [SKSpriteNode spriteNodeWithImageNamed:@"black.png"];
obstacle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:obstacle.frame.size];
obstacle.physicsBody.dynamic = YES;
obstacle.physicsBody.categoryBitMask = obstacleCategory;
obstacle.physicsBody.contactTestBitMask = playerCategory;
obstacle.physicsBody.collisionBitMask = 0;
obstacle.physicsBody.usesPreciseCollisionDetection = YES;
}
-(void)didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"didBeginContact Called!");
}
didBeginContact 方法没有被调用,我找不到我的代码有什么问题 感谢所有帮助...
最佳答案
sknode 大小未正确设置,因为没有图像引用,如果您记录其大小,则应为 inf,当我测试您的代码时,我返回了异常。
要修复此错误,请更改以下行
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:player.frame.size]; change that to
下面的内容应该可以工作
player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spritePlayer.size];
正如我在下面所说的,只需放弃播放器 sknode,它只是多余的,除非有充分的理由使用它。 ///////之前的答案
我忍不住注意到您没有将障碍物节点添加到任何父节点(即场景),就像您使用此行对玩家节点所做的那样
[self addChild:player];
你需要对障碍节点做同样的事情
[self addChild:obstacle];
,令我惊讶的是,您没有提到在屏幕上看不到这些节点,除非您将它们添加到代码中未包含的不同部分中,那么此时我建议您记录两个节点的位置节点以了解事物在屏幕上的位置。
至于数组,你不需要它,你所要做的就是为每个障碍节点命名,例如@“obstacle”,然后你可以使用以下方法访问具有该名称的所有节点
obstacle.name = @"obstacle";
/////later when you want to check for node removal
[self enumerateChildNodesWithName:@"obstacle" usingBlock:^(SKNode *node, BOOL *stop) {
SKSpriteNode *child = (SKSpriteNode*)node;
if (child.position.y <0){ //or any arbitrary condition
[child removeFromParent];
}
}];
最后,我看不出使用播放器作为 sknode 然后向其添加 skspritenode 的意义,除非我遗漏了一些东西! :) 。您可以简单地放弃玩家 sknode 并简单地使用 spritePlayer 节点。 希望这会有所帮助。
关于objective-c - 检测 Sprite 套件中数组中的对象之间的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22803052/