虚拟操纵杆问题

时间:2010-07-20 05:39:33

标签: iphone collision-detection

所以,我试图在其中一些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)并且我没有对坐标系做任何事情(所以它基于左上角角)。现在,让我解释一下这应该是做什么的:

  1. 首先,我用方法中的前两行代码获得触摸的坐标。
  2. 如果触摸在圈子上,则if (g == true)实际上必须执行,并由touchesBegan设置。
  3. 然后第二个if是检查操纵杆的x位置是否大于330或小于130,这将给出虚圆的半径,即圆。另外,请注意额外的&& currentPosition.x > 330currentPosition.x < 130,如果此人正在将虚拟操纵杆移回中心,因为您不希望用户无法这样做。
  4. 除了y方向外,else if与3相同。
  5. 对于最后的if使用bool j来确定是否已执行其他两个`if语句。
  6. 这个计划显然不起作用,否则我不会请求你的帮助,所以你是否知道我做错了什么?

2 个答案:

答案 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)

  1. 如果用户将触摸移动到您的范围之外,您应该将操纵杆的中心设置为原始中心位置(可能是230,408),我不会在您的代码中的任何位置看到它。< / p>

  2. 如果您没有在触摸开始时设置任何内容,则可以,因为您只想在移动触摸时移动操纵杆。只需检查移动的触摸中的[touch view] == joystick

  3. 您无需单独检查x和y,因为将操纵杆移动到任何方向的范围之外都应该将其带回中心。

  4. 你需要动画操纵杆的动作返回到原来的中心,否则它看起来不会很好。

  5. 因此,将原始中心作为常量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;
            }
        }
    }