Iphone 虚拟操纵杆问题

Iphone 虚拟操纵杆问题,iphone,collision-detection,Iphone,Collision Detection,所以,我正在尝试在一些iPhone游戏中重新创建一个“虚拟操纵杆”。基本上,这就是问题所在,我可以确保用户正在触摸圆圈(即“虚拟操纵杆”),我也可以移动物体(或者至少能够移动它,因为从那时起我就把它弄乱了)。但是,我不能给它一个范围 我说的范围到底是什么意思 希望我能正确地解释范围是什么意思。所以,当你在游戏机控制器上摆弄实际的操纵杆时,你显然不能像我描述的那个圆圈那样把它拖到任何地方。所以,它有一个范围,在你看不到的假想圆内的任何地方 我尝试了以下方法: - (void)touchesMove

所以,我正在尝试在一些iPhone游戏中重新创建一个“虚拟操纵杆”。基本上,这就是问题所在,我可以确保用户正在触摸圆圈(即“虚拟操纵杆”),我也可以移动物体(或者至少能够移动它,因为从那时起我就把它弄乱了)。但是,我不能给它一个范围

我说的范围到底是什么意思

希望我能正确地解释范围是什么意思。所以,当你在游戏机控制器上摆弄实际的操纵杆时,你显然不能像我描述的那个圆圈那样把它拖到任何地方。所以,它有一个范围,在你看不到的假想圆内的任何地方

我尝试了以下方法:

- (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);
        }
    }
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
UITouch*touch=[触摸任何对象];
CGPoint currentPosition=[触摸位置视图:self.view];
如果(g==true){
如果(操纵杆.center.x>330和¤tPosition.x>330 |操纵杆.center.x<130和¤tPosition.x<130){
操纵杆.center=CGPointMake(操纵杆.center.x,当前位置.y);
j=真;
}
如果(操纵杆.center.y>508和¤tPosition.y>508 | |操纵杆.center.y<308和¤tPosition.y<308){
操纵杆.center=CGPointMake(当前位置.x,操纵杆.center.y);
j=真;
}
如果(j==false){
操纵杆.center=CGPointMake(currentPosition.x,currentPosition.y);
}
}
}
在我开始解释我尝试的逻辑之前,有一个注意事项是,操纵杆位于屏幕上的(230408)处,我没有对坐标系做任何操作(因此它基于左上角)。现在,让我解释一下这是怎么回事:

  • 首先,我得到了这个方法中前两行代码的接触坐标
  • 然后
    如果(g==true)
    如果触摸是否在圆圈上,并且由
    触摸开始设置,则实际上必须执行该操作
  • 然后,第二个if检查操纵杆的x位置是否大于330或小于130,这将给出一个圆的假想范围半径。另外,请注意附加的
    &¤tPosition.x>330
    currentPosition.x<130
    这是为了防止用户无法将虚拟操纵杆移回中心位置
  • 除y方向外,
    else if
    的作用与3相同
  • 对于最后的
    if
    ,使用bool j确定是否执行了其他两个`if语句
  • 这个计划显然行不通,否则我就不会请求你的帮助,所以你可能知道我做错了什么吗

  • 如果用户将触控移动到您的范围之外,您应该将操纵杆的中心设置为原始中心位置(可能是230408),我看不到在代码中的任何地方都会这样做

  • 如果在“触控开始”中未设置任何内容,这是正常的,因为只有在触控移动时,您才想在中移动操纵杆。只需在触摸移动中选中
    [touch view]==操纵杆

  • 您不需要单独检查x和y,因为在任何方向将操纵杆移动到范围之外都会使其回到中心

  • 您需要设置操纵杆运动的动画,使其返回到原始中心,否则看起来不太好

  • 所以,将原始中心作为一个常数点。在触摸移动中,检查此中心与触摸位置之间的距离。如果超出某个范围,则将操纵杆设置动画,使其返回到原始中心

    - (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;
            }
        }
    }
    
    -(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件{
    UITouch*touch=[触摸任何对象];
    //self.joyStickCenter是定义的原始中心点。
    如果([touch view]==self.joystickImageView){
    CGPoint location=[触摸位置视图:self.view];
    如果((fabs(location.x-self.joyStickCenter.x)<15.0)和&(fabs(location.y-self.joyStickCenter.y)<15.0)){
    [self.joystickImageView设置中心:位置];
    //操纵杆动作代码
    返回;
    }
    else if((fabs(location.x-self.joyStickCenter.x)>40.0)| |(fabs(location.y-self.joyStickCenter.y)>40.0)){
    [UIView beginAnimations:nil上下文:nil];
    [UIView设置动画持续时间:0.25f];
    [self.joystickImageView setCenter:self.joyStickCenter];
    [UIView委员会];
    返回;
    }
    }
    }
    
    您可以通过坐标的模数(使用矢量)计算范围:


    谢谢,这花了点时间,但我明白了!
    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);