SpriteKit Objective-C:编程方向键控制

所以让我直截了当地说:我想实现的是我的SpriteKit游戏以方向键的forms进行控制。 我想让它工作,例如,你可以拿着一个button,然后滑动你的手指到另一个button,以便第一个button被释放,而另一个button被按下(就像在物理游戏中一样控制器)。 我看到这是在许多现有的游戏(Carmageddon,Minecraft PE)上实现的,所以可以肯定。

我一直在尝试使用简单的touchesBegan和touchesEnded,但这里的问题是, 一旦你将手指从第一个button移动到第二个,第二个button不会被按下,而第一个button保持“按下“状态,直到你停止触摸屏幕 。 我也尝试过使用touchesMoved来检测触摸位置是否已经改变,但是却造成了很多的各种错误。

请把我推向正确的方向。 我希望我所要求的是(我正在使用Objective-C)。

这实际上只是为您的控件设置真/假状态。 就像你用真正的控制器一样。 您将首先在touchesBegan方法中检查触点触摸,并相应地设置4个控制器的BOOLvariables。 在touchedMoved方法中,再次检查用户的触摸是否与任何控制器节点接触,并相应地设置BOOLvariables。

在你的更新方法中,你可以检查4个BOOLvariables的状态并相应地执行你的代码。

(我使用横向的代码下面)

#import "GameScene.h" @implementation GameScene { SKSpriteNode *node0; SKSpriteNode *node1; SKSpriteNode *node2; SKSpriteNode *node3; BOOL node0touch; BOOL node1touch; BOOL node2touch; BOOL node3touch; } -(void)didMoveToView:(SKView *)view { self.backgroundColor = [SKColor blackColor]; node0 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(50, 50)]; node0.name = @"node0"; node0.position = CGPointMake(200, 200); [self addChild:node0]; node1 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(50, 50)]; node1.name = @"node1"; node1.position = CGPointMake(200, 400); [self addChild:node1]; node2 = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(50, 50)]; node2.name = @"node2"; node2.position = CGPointMake(100, 300); [self addChild:node2]; node3 = [SKSpriteNode spriteNodeWithColor:[SKColor grayColor] size:CGSizeMake(50, 50)]; node3.name = @"node3"; node3.position = CGPointMake(300, 300); [self addChild:node3]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { CGPoint touchLocation = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:touchLocation]; if(node.name != nil) { if([node.name isEqualToString:@"node0"]) { node0touch = true; node1touch = false; node2touch = false; node3touch = false; } if([node.name isEqualToString:@"node1"]) { node0touch = false; node1touch = true; node2touch = false; node3touch = false; } if([node.name isEqualToString:@"node2"]) { node0touch = false; node1touch = false; node2touch = true; node3touch = false; } if([node.name isEqualToString:@"node3"]) { node0touch = false; node1touch = false; node2touch = false; node3touch = true; } } else { node0touch = false; node1touch = false; node2touch = false; node3touch = false; } } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *touch in touches) { CGPoint touchLocation = [touch locationInNode:self]; SKNode *node = [self nodeAtPoint:touchLocation]; if(node.name != nil) { if([node.name isEqualToString:@"node0"]) { node0touch = true; node1touch = false; node2touch = false; node3touch = false; } if([node.name isEqualToString:@"node1"]) { node0touch = false; node1touch = true; node2touch = false; node3touch = false; } if([node.name isEqualToString:@"node2"]) { node0touch = false; node1touch = false; node2touch = true; node3touch = false; } if([node.name isEqualToString:@"node3"]) { node0touch = false; node1touch = false; node2touch = false; node3touch = true; } } else { node0touch = false; node1touch = false; node2touch = false; node3touch = false; } } }