2010-07-20 6 views
0

Итак, я пытаюсь воссоздать один из этих «виртуальных джойстиков» на некоторых из этих игр для 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. Тогда второе, если проверяет, превышает ли положение джойстика x 330 или меньше 130, что даст радиус воображаемого диапазона, который является кругом. Также обратите внимание на дополнительные && currentPosition.x > 330 и currentPosition.x < 130, это означает, что человек перемещает виртуальный джойстик обратно в центр, так как вы не хотите, чтобы пользователь не мог этого сделать.
  4. else if делает то же, что и 3, за исключением направления y.
  5. Для окончательного if используется bool j, чтобы определить, выполнены ли другие два оператора `i.

Этот план не работает явно, иначе я бы не просил вас о помощи, так вы знаете, что я делаю неправильно?

ответ

0
  1. В случае, когда пользователь перемещает контакт вне вашего диапазона, вы должны быть настройки на центр джойстика в исходное положение центра (вероятно, 230, 408), я не вижу, что делается в любом месте вашего кода.

  2. Это нормально, если вы ничего не установили в касаниях, поскольку вы хотите переместить джойстик только в том случае, если касание перемещено. Просто проверьте [touch view] == joystick в трофеях.

  3. Вам не нужно отдельно проверять x и y, так как перемещение джойстика за пределы диапазона в любом направлении должно привести его обратно в центр.

  4. Вам нужно оживить движение джойстика, возвращаясь в исходный центр, иначе он не будет выглядеть хорошо.

Итак, у вас есть оригинальный центр как постоянный 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; 
     } 
    } 
} 
+0

Спасибо, потребовалось немного Мессинг вокруг, но я получил его! – 2010-07-20 06:23:09

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); 
Смежные вопросы