我按照这个关于马里奥式游戏的精彩指南: http://www.raywenderlich.com/62053/sprite-kit-tutorial-make-platform-game-like-super-mario-brothers-part-2
但是,我想将移动控件转换为箭头键,由SKSpriteNodes实现,其名称由以下位置检测:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode* node = [self nodeAtPoint:location];
// other left, up, down arrows with same code here
if ([node.name isEqualToString:@"rightArrow"]) {
self.player.moveRight = YES;
self.rightOriginalTouchLocation = location;
...
}
}
self.player.moveRight是一个布尔值(非常类似于指南中的moveForward),它告诉更新时的角色移动。
终止于:
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch* touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode* node = [self nodeAtPoint:location];
// other left, up, down arrows with same code here
if ([node.name isEqualToString:@"rightArrow"]) {
self.player.moveRight = NO;
}
...
}
但是,我遇到以下问题 - 当我开始触摸箭头,将其拖到箭头外,然后释放水龙头时,它不会被识别为箭头节点的“触摸结束”(并且它没有'因为那个停止移动)。 我试图以多种方式解决它(甚至计算从原始位置的触摸移动距离,看它是否太远,然后取消移动),但我总是设法重现恒定运动问题。
问题在于我可以同时点击两个箭头,因此仅记住最后一个节点被点击是不够的。
由于我想同时允许不同方向的移动,因此如果一个按钮被解除,我就无法停止所有移动。我需要具体知道哪个按钮被释放,所以我只能停止那个方向的运动。 你对我有什么想法吗?我应该以另一种方式实现它,考虑到我想要箭头键,还是有一种方法来检测哪个节点被释放,即使它不在其原始位置(点击)?非常感谢!
答案 0 :(得分:0)
如果有人对这个问题感兴趣 - 我有一个问题,即触摸和从SKSpriteNode移动没有为该SKSpriteNode调用touchesEnded(因为触摸的'发布'不在节点中)。 / p>
我通过将触摸的CGPoint保持在touchesBegan来解决它,并且当调用touchesEnded时,我使用简单的距离函数计算到最近的键的距离:
-(int)calculateDistanceWithPoints:(CGPoint)point1 andPoint:(CGPoint)point2 {
float d = sqrtf(pow((point1.x - point2.x), 2) + pow((point1.y - point2.y), 2));
return (int)d;
}
然后,在touchesEnded中,我检查了距离最小的密钥(我有3个密钥,因此哪个密钥最有可能是发布的密钥') - 并执行了操作该密钥发布所需。