SpriteKit/Obj-C - 以nodesatPoint开始触摸重启游戏
Posted
技术标签:
【中文标题】SpriteKit/Obj-C - 以nodesatPoint开始触摸重启游戏【英文标题】:SpriteKit/Obj-C -Restarting game in touches began with nodesatPoint 【发布时间】:2017-10-03 02:02:06 【问题描述】:我无法使用名称属性为“play”的 SKSpriteNode playAgainButton 重新启动游戏。游戏结束方法工作正常,但我无法在触摸开始功能中重新启动游戏。以下是各自的功能。任何帮助都会很棒,我已经在这个问题上停留了一段时间,并在文档中尝试了几种不同的方法,包括 - (CGPoint)convertPoint:(CGPoint)point fromNode:(SKNode *)node;和 - (NSArray *)nodesAtPoint:(CGPoint)p;
这是我在 touches started 函数中的代码:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
// Jumping fucntionality
[mainChar.physicsBody applyForce:CGVectorMake(0, 75000)];
// Play Again Button functionality
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
SKNode *node;
NSArray *nodes = [node nodesAtPoint:location];
for (node in nodes)
if ([node.name isEqual: @"play"])
score = 0;
[node removeFromParent];
[self.yourScoreLabel removeFromParent];
[self.finalScoreLabel removeFromParent];
self.scene.view.paused = NO;
scoreLabel.text = [NSString stringWithFormat:@"Score %ld", (long)score];
[self startTimers];
还有gameOver功能:
-(void)gameOver
self.scene.view.paused = YES;
[planetTimer invalidate];
[asteroidTimer invalidate];
self.yourScoreLabel = [SKLabelNode new];
self.yourScoreLabel.position = CGPointMake(0, 200);
self.yourScoreLabel.fontSize = 100;
self.yourScoreLabel.zPosition = 1;
self.yourScoreLabel.text = @"Your score:";
[self addChild:self.yourScoreLabel];
self.finalScoreLabel = [SKLabelNode new];
self.finalScoreLabel.position = CGPointMake(0, 0);
self.finalScoreLabel.fontSize = 200;
self.finalScoreLabel.zPosition =1;
self.finalScoreLabel.text = [NSString stringWithFormat:@"%ld", (long)score];
[self addChild:self.finalScoreLabel];
SKSpriteNode * playAgainButton = [SKSpriteNode spriteNodeWithImageNamed:@"play"];
playAgainButton.position = CGPointMake(0, -200);
playAgainButton.name = @"play";
playAgainButton.zPosition = 1;
[self addChild:playAgainButton];
谢谢。
【问题讨论】:
1) 我会在touchesEnded 事件中进行,而不是在touchesBegan 事件中。从 UX(用户体验)的角度来看,我可能会不小心触摸到按钮,然后在松开手指以不激活它之前用魔杖将其滑下。 2)我不明白什么是“重启”你的游戏,你所做的只是重启一个计时器,而你的主角从你最后一次触摸屏幕开始仍在加速。 最简单最安全的重启游戏方法,就是创建一个新的游戏场景实例 谢谢@Knight0fDragon touchesEnded 是有道理的。是的,这不是真正的“重启”,但它会重置分数、计时器等,然后从那里重新开始。我的问题是 nodesatPoint 方法,我将其更改为调用 self 即 SKSpriteNode *node = [self nodesatPoint:location] 现在它正在返回数组,但是它无法从该位置识别我的“播放”节点重启按钮。跨度> 因为您使用的是locationInView
而不是locationInNode
,其中节点是您的场景
感谢您的帮助!我用这条线修复了它:NSArray *nodes = [self nodesAtPoint:[self convertPointFromView:location]]; ...我不得不转换点
【参考方案1】:
您正在使用[touch locationInView:view]
,它将返回视图坐标系中的位置。在 SpriteKit 中,您需要处理场景的坐标系,它可能处于不同的间隔。要获取场景中的位置,只需执行CGPoint location = [touch locationInNode:self];
【讨论】:
以上是关于SpriteKit/Obj-C - 以nodesatPoint开始触摸重启游戏的主要内容,如果未能解决你的问题,请参考以下文章
DOM 无法将节点附加到 DOMNodeList (PHP 7.3) 中的元素
使用 NSFetchedResultsController 如何以编程方式设置 5 个部分以显示以及过滤它们以获取适当的行