双虚拟操纵杆 iOS 同时使用
Dual Virtual Joystick for iOS simultaneous use
我正在为 SpriteKit 使用虚拟操纵杆,效果很好。我已经尝试过 JCInput version, or SpriteKit-Joystick 版本。两者都用于运动,并在左侧使用。
这是我用的代码,虽然gitHub中的文档很好,反正:
对于 JCInput 版本:
self.joystick = [[JCJoystick alloc] initWithControlRadius:40 baseRadius:45 baseColor:[SKColor blueColor] joystickRadius:25 joystickColor:[SKColor redColor]];
[self.joystick setPosition:CGPointMake(70,70)];
[self addChild:self.joystick];
和更新功能:
-(void)update:(CFTimeInterval)currentTime {
[self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+self.joystick.x, self.myLabel1.position.y+self.joystick.y)];
[self.myLabel2 setPosition:CGPointMake(self.myLabel2.position.x+self.imageJoystick.x, self.myLabel2.position.y+self.imageJoystick.y)];
/* Called before each frame is rendered */
}
对于 SpriteKit-Joystick 版本:
SKSpriteNode *jsThumb = [SKSpriteNode spriteNodeWithImageNamed:@"joystick"];
[jsThumb setScale:0.5f];
SKSpriteNode *jsBackdrop = [SKSpriteNode spriteNodeWithImageNamed:@"dpad"];
[jsBackdrop setScale:0.5f];
self.joystick = [Joystick joystickWithThumb:jsThumb andBackdrop:jsBackdrop];
self.joystick.position = CGPointMake(50,50);
[self addChild:self.joystick];
//I've already declared it in the header file
velocityTick = [CADisplayLink displayLinkWithTarget:self selector:@selector(joystickMovement)];
[velocityTick addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
和更新功能:
-(void)joystickMovement
{
if (self.joystick.velocity.x != 0 || self.joystick.velocity.y != 0)
{
[self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+.1 *self.joystick.velocity.x, self.myLabel1.position.y+.1 * self.joystick.velocity.y)];
}
}
现在一切正常,没有任何问题。但是我需要添加另一个来旋转我的角色(我们称之为 self.myLabel1
)。我尝试复制对象创建(使用唯一的名称、参数和位置将它们放在屏幕的右侧,但其他代码与我上面使用的完全相同)。
它们也可以工作,但问题是它们不能同时工作。我可以在任何给定时间使用左边的或右边的,而不是一起使用。我需要在两个单独的线程上 运行 它们吗?我试过将两个 CADisplayLinks 与两个单独的选择器一起使用,但什么也没有。我尝试使用同一个,但什么也没有。
任何人都可以阐明这个影子吗?
非常感谢。
您应该在 SKScene 中覆盖 update
而不是使用 CADisplayLink
。您可以从 update
调用 joystickMovement
并达到预期的效果。
您可以阅读更多关于 SKScene
处理 SKScene class reference 中每一帧的不同方法的信息。
如果您还没有,您还需要在 SKScene 的视图中将 multipleTouchEnabled
设置为 true。您可以使用
从 GameViewController
执行此操作
self.view.multipleTouchEnabled = YES;
我正在为 SpriteKit 使用虚拟操纵杆,效果很好。我已经尝试过 JCInput version, or SpriteKit-Joystick 版本。两者都用于运动,并在左侧使用。
这是我用的代码,虽然gitHub中的文档很好,反正:
对于 JCInput 版本:
self.joystick = [[JCJoystick alloc] initWithControlRadius:40 baseRadius:45 baseColor:[SKColor blueColor] joystickRadius:25 joystickColor:[SKColor redColor]];
[self.joystick setPosition:CGPointMake(70,70)];
[self addChild:self.joystick];
和更新功能:
-(void)update:(CFTimeInterval)currentTime {
[self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+self.joystick.x, self.myLabel1.position.y+self.joystick.y)];
[self.myLabel2 setPosition:CGPointMake(self.myLabel2.position.x+self.imageJoystick.x, self.myLabel2.position.y+self.imageJoystick.y)];
/* Called before each frame is rendered */
}
对于 SpriteKit-Joystick 版本:
SKSpriteNode *jsThumb = [SKSpriteNode spriteNodeWithImageNamed:@"joystick"];
[jsThumb setScale:0.5f];
SKSpriteNode *jsBackdrop = [SKSpriteNode spriteNodeWithImageNamed:@"dpad"];
[jsBackdrop setScale:0.5f];
self.joystick = [Joystick joystickWithThumb:jsThumb andBackdrop:jsBackdrop];
self.joystick.position = CGPointMake(50,50);
[self addChild:self.joystick];
//I've already declared it in the header file
velocityTick = [CADisplayLink displayLinkWithTarget:self selector:@selector(joystickMovement)];
[velocityTick addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
和更新功能:
-(void)joystickMovement
{
if (self.joystick.velocity.x != 0 || self.joystick.velocity.y != 0)
{
[self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+.1 *self.joystick.velocity.x, self.myLabel1.position.y+.1 * self.joystick.velocity.y)];
}
}
现在一切正常,没有任何问题。但是我需要添加另一个来旋转我的角色(我们称之为 self.myLabel1
)。我尝试复制对象创建(使用唯一的名称、参数和位置将它们放在屏幕的右侧,但其他代码与我上面使用的完全相同)。
它们也可以工作,但问题是它们不能同时工作。我可以在任何给定时间使用左边的或右边的,而不是一起使用。我需要在两个单独的线程上 运行 它们吗?我试过将两个 CADisplayLinks 与两个单独的选择器一起使用,但什么也没有。我尝试使用同一个,但什么也没有。
任何人都可以阐明这个影子吗?
非常感谢。
您应该在 SKScene 中覆盖 update
而不是使用 CADisplayLink
。您可以从 update
调用 joystickMovement
并达到预期的效果。
您可以阅读更多关于 SKScene
处理 SKScene class reference 中每一帧的不同方法的信息。
如果您还没有,您还需要在 SKScene 的视图中将 multipleTouchEnabled
设置为 true。您可以使用
GameViewController
执行此操作
self.view.multipleTouchEnabled = YES;