gpt4 book ai didi

ios - SpriteKit didBeginContact 没有被调用

转载 作者:行者123 更新时间:2023-11-29 02:26:13 24 4
gpt4 key购买 nike

我希望你能帮忙,让一个方 block 穿过并跳跃以避开障碍物并收集硬币。它与障碍物的碰撞工作正常,下面的 gameOver 工作正常。

-(void)didBeginContact:(SKPhysicsContact *)contact
{
if ([contact.bodyA.node.name isEqualToString:@"coins"] || [contact.bodyB.node.name isEqualToString:@"coins"]) {
[self coinCollected]; //THIS IS NOT WORKING
NSLog(@"contacted"); //THIS IS NOT WORKING
}
else if ([contact.bodyA.node.name isEqualToString:@"ground"] || [contact.bodyB.node.name isEqualToString:@"ground"]) {
[hero land];
}
else {
NSLog (@"dead");
[self gameOver];
[self runAction:[SKAction playSoundFileNamed:@"gameover.wav" waitForCompletion:NO]];
}
}

我的 PMWorldGenerator 文件如下所示:

#import "PMWorldGenerator.h"
@interface PMWorldGenerator ()
@property double currentGroundX;
@property double currentObstacleX;
@property double coinX;
@property SKNode *world;

@end


@implementation PMWorldGenerator

static const uint32_t obstacleCategory = 0x1 << 1;
static const uint32_t groundCategory = 0x1 << 2;
static const uint32_t coinCategory = 0x1 << 3;

+ (id)generatorWithWorld:(SKNode *)world {
PMWorldGenerator *generator = [PMWorldGenerator node];
generator.currentGroundX = 0;
generator.currentObstacleX = 400;
generator.coinX = 50;
generator.world = world;
return generator;
}

-(void)populate
{
for (int i = 0; i <3; i++)
[self generate];
}


-(void)generate
{
SKSpriteNode *ground = [SKSpriteNode spriteNodeWithColor:[UIColor greenColor] size:CGSizeMake(self.scene.frame.size.width, self.scene.frame.size.height/2.7)];
ground.name = @"ground";
ground.position = CGPointMake(self.currentGroundX, -self.scene.frame.size.height/2 + ground.frame.size.height/2);
ground.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ground.size];
ground.physicsBody.categoryBitMask = groundCategory;
ground.physicsBody.dynamic = NO;
[self.world addChild:ground];
self.currentGroundX += ground.frame.size.width;

SKSpriteNode *obstacle = [SKSpriteNode spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(10,10)];
obstacle.name = @"obstacle";
obstacle.position = CGPointMake(self.currentObstacleX/5, ground.position.y + ground.frame.size.height/2 + obstacle.frame.size.height/2 + 5);
obstacle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:obstacle.size];
obstacle.physicsBody.dynamic = NO;
obstacle.physicsBody.categoryBitMask = obstacleCategory;
[self.world addChild:obstacle];
self.currentObstacleX += 550 ;

SKSpriteNode *coins = [SKSpriteNode spriteNodeWithColor:[UIColor yellowColor] size:CGSizeMake(4, 4)];
coins.name = @"coins";
coins.position = CGPointMake(self.coinX+80, ground.position.y + ground.frame.size.height/2 + obstacle.frame.size.height/2 + 25);
coins.physicsBody.categoryBitMask = coinCategory;
coins.physicsBody.dynamic = YES;
SKAction *revolution = [SKAction rotateByAngle:M_PI_4*10 duration:3];
SKAction *repeatRotate = [SKAction repeatActionForever:revolution];
[coins runAction:repeatRotate];
[self.world addChild:coins];
self.coinX += 550;

}

最后是我的 PMHero 文件:

#import "PMHero.h"
@interface PMHero ()
@end


@implementation PMHero
static const uint32_t heroCategory = 0x1 << 0;
static const uint32_t obstacleCategory = 0x1 << 1;
static const uint32_t groundCategory = 0x1 << 2;
static const uint32_t coinCategory = 0x1 << 3;


+(id)hero
{
PMHero *hero = [PMHero spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(12,12)];
hero.name = @"hero";
hero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hero.size];
hero.physicsBody.categoryBitMask = heroCategory;
hero.physicsBody.contactTestBitMask = obstacleCategory | groundCategory | coinCategory;
return hero;
}

我已经完全按照我为 “coins” 设置障碍物和地面所做的操作,但是它没有在我的 didBeginContact 中检测到任何与它们的碰撞/p>

最佳答案

您还没有添加物理 body 来获取金币

SKSpriteNode *coins = [SKSpriteNode spriteNodeWithColor:[UIColor yellowColor] size:CGSizeMake(4, 4)];
coins.name = @"coins";
coins.position = CGPointMake(self.coinX+80, ground.position.y + ground.frame.size.height/2 + obstacle.frame.size.height/2 + 25);

coins.physicsBody = [SKPhysicsBody bodyWith...//need code here

coins.physicsBody.categoryBitMask = coinCategory;
coins.physicsBody.dynamic = NO;
coins.physicsBody.collisionBitMask = 0;
SKAction *revolution = [SKAction rotateByAngle:M_PI_4*10 duration:3];
SKAction *repeatRotate = [SKAction repeatActionForever:revolution];
[coins runAction:repeatRotate];
[self.world addChild:coins];

关于ios - SpriteKit didBeginContact 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508236/

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