Проблемы с виртуальным джойстиком - PullRequest
0 голосов
/ 20 июля 2010

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

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Вы можете рассчитать диапазон по модулю координат (используя векторы):

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);
0 голосов
/ 20 июля 2010
  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;
        }
    }
}
...