gpt4 book ai didi

ios - 触摸时未检测到自定义 SKSpriteNode

转载 作者:技术小花猫 更新时间:2023-10-29 10:30:21 25 4
gpt4 key购买 nike

在学习SpriteKit的过程中,我正在尝试制作一款冒险小游戏。我正在创建一个英雄,并将其添加到场景中,然后在 touchesBegan: 期间,我检测触摸是否起源于英雄,并采取相应的行动。

如果我将英雄添加为 SKSpriteNode,触摸会检测到他。如果我将他添加为 SKSpriteNode 的子类,则触摸不会!添加的区别:

_heroNode = [SKSpriteNode spriteNodeWithImageNamed:@"hero.png"];

对比

_heroNode = [[ADVHeroNode alloc] init];

初始化看起来像这样:

- (id) init {
if (self = [super init]) {

self.name = @"heroNode";
SKSpriteNode *image = [SKSpriteNode spriteNodeWithImageNamed:@"hero.png"];
[self addChild:image];
}
return self;
}

将英雄添加为 SKSpriteNode 的子类在将其添加到场景的意义上起作用,但触摸不会检测到他。我的 touchesBegan: 看起来像这样:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */

UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if (YES) NSLog(@"Node name where touch began: %@", node.name);

//if hero touched set BOOL
if ([node.name isEqualToString:@"heroNode"]) {
if (YES) NSLog(@"touch in hero");
touchedHero = YES;
}
}

令人沮丧的是,这段代码在直接添加 SKSpriteNode 时工作得很好,而不是我自己的子类。有什么建议吗?

最佳答案

这里有一些子类化你的英雄的方法

SKNode

SKNode 的子类此方法要求您的节点监控触摸,因此需要 self.userInteractionEnabled 属性。

@implementation HeroSprite

- (id) init {
if (self = [super init]) {
[self setUpHeroDetails];
self.userInteractionEnabled = YES;
}
return self;
}

-(void) setUpHeroDetails
{
self.name = @"heroNode";
SKSpriteNode *heroImage = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
[self addChild:heroImage];
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint locationA = [touch locationInNode:self];
CGPoint locationB = [touch locationInNode:self.parent];
NSLog(@"Hit at, %@ %@", NSStringFromCGPoint(locationA), NSStringFromCGPoint(locationB));
}

@end

SKSpriteNode

另一种“更简单”的方法,如果你只想子类化一个SKSpriteNode。这将与您使用的基本相同(在您想要子类化您的 Hero 之前)。因此,您在问题中设置的 touchesBegan 将起作用。

@implementation HeroSprite

- (id) init {
if (self = [super init]) {
self = [HeroSprite spriteNodeWithImageNamed:@"Spaceship"];
[self setUpHeroDetails];

}
return self;
}

-(void) setUpHeroDetails {
self.name = @"heroNode";
}

@end

关于ios - 触摸时未检测到自定义 SKSpriteNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484396/

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