所以,我试图在其中一些iPhone游戏中重新创建其中一个“虚拟操纵杆”。基本上,继承人问题我可以确保用户触摸圆圈(即“虚拟操纵杆”),我也可以移动东西(或至少能够移动它,因为从那以后我搞砸了与它一起)。但是,我不能给它一个范围。
一个范围我的意思是什么?
希望我能正确解释一下我所说的范围。因此,当在Playstation控制器之类的东西上弄乱实际的操纵杆时,你显然不会像我所描述的那样将它拖到任何地方。因此,它的范围可以在想象中的任何一个圆圈中找不到。
我尝试了以下内容:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint currentPosition = [touch locationInView:self.view];
if (g == true) {
if (joystick.center.x > 330 && currentPosition.x > 330 || joystick.center.x < 130 && currentPosition.x < 130) {
joystick.center = CGPointMake(joystick.center.x, currentPosition.y);
j = true;
}
if (joystick.center.y > 508 && currentPosition.y > 508 || joystick.center.y < 308 && currentPosition.y < 308) {
joystick.center = CGPointMake(currentPosition.x, joystick.center.y);
j = true;
}
if (j == false) {
joystick.center = CGPointMake(currentPosition.x, currentPosition.y);
}
}
}
在我开始解释我的尝试逻辑之前的一个注意事项,操纵杆位于屏幕上(230,408)并且我没有对坐标系做任何事情(所以它基于左上角角)。现在,让我解释一下这应该是做什么的:
if (g == true)
实际上必须执行,并由touchesBegan
设置。&& currentPosition.x > 330
和currentPosition.x < 130
,如果此人正在将虚拟操纵杆移回中心,因为您不希望用户无法这样做。else if
与3相同。if
使用bool j来确定是否已执行其他两个`if语句。这个计划显然不起作用,否则我不会请求你的帮助,所以你是否知道我做错了什么?
答案 0 :(得分:1)
您可以通过坐标模数(使用向量)计算范围:
double r;
double a,b;
//coorX = (actual image center coordinate X)-(initial image center coordinate X)
a = pow(coorX,2);
//coorY = (actual image center coordinate Y)-(initial image center coordinate Y)
b = pow(coorY,2);
actualPosition = sqrt(a+b);
答案 1 :(得分:0)
如果用户将触摸移动到您的范围之外,您应该将操纵杆的中心设置为原始中心位置(可能是230,408),我不会在您的代码中的任何位置看到它。< / p>
如果您没有在触摸开始时设置任何内容,则可以,因为您只想在移动触摸时移动操纵杆。只需检查移动的触摸中的[touch view] == joystick
。
您无需单独检查x和y,因为将操纵杆移动到任何方向的范围之外都应该将其带回中心。
你需要动画操纵杆的动作返回到原来的中心,否则它看起来不会很好。
因此,将原始中心作为常量CGPoint。并且在触摸时移动检查该中心与触摸位置之间的距离。如果超出范围,则将操纵杆设置为原始中心的动画。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
//self.joyStickCenter is the defined original center CGPoint.
if ([touch view] == self.joystickImageView) {
CGPoint location = [touch locationInView:self.view];
if((fabs(location.x - self.joyStickCenter.x) < 15.0) && (fabs(location.y - self.joyStickCenter.y) < 15.0)) {
[self.joystickImageView setCenter:location];
//your joystick action code
return;
}
else if((fabs(location.x - self.joyStickCenter.x) > 40.0) || (fabs(location.y - self.joyStickCenter.y) > 40.0)) {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.25f];
[self.joystickImageView setCenter:self.joyStickCenter];
[UIView commitAnimations];
return;
}
}
}