Не могу переместить мой персонаж - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь заставить UIImageView двигаться, когда я нажимаю кнопку. Я установил UIIAction для запуска NSTimer. При нажатии на кнопку символ (UIImageView) перемещается нормально. Когда я снова нажимаю на ту же кнопку, персонаж ускоряется и так далее, и в итоге он движется на миллиард миль в час. Как мне это решить? Вот код:

-(void)animateCharRight:(NSTimer *)theTimer 
{

    float speed;

    if (speed > 10.0f) 
    {

        speed = 10.0f;

    } 
    else 
    {

        speed = 10.0f;

    }

    CGRect rect = [character frame];
    rect.origin.x += speed;
    [character setFrame:rect];
}

Кроме того, когда вы нажимаете противоположную кнопку после того, как уже нажали одну, она вызывает ошибку, потому что нет другого таймера отмены. Как мне это сделать?

Как получить доступ к событию key up? Я не могу найти это.

Ответы [ 4 ]

2 голосов
/ 04 июня 2010

Ну, вы объявляете скорость в вашем методе и не устанавливаете ее на что-либо. Так что всегда идёт установка скорости 10.0f. Потому что и в вашем if, и в другом случае вы устанавливаете его в 10, так какой смысл в операторе if?

Тогда вы rect.origin.x += speed; или добавляете 10 источников все время, без исключений. Это то же самое, что и rect.origin.x += 10; Изображение будет постоянно двигаться.

Скорость всегда будет равна 10, и всегда добавляется к rect.origin.x Вы хотите сделать скорость переменной, а не просто в методе?

EDIT

Поскольку скорость объявляется в методе каждый раз, когда в качестве значения используется 0. Затем он устанавливается на 10. Если вы создаете скорость как переменную-член, то каждый раз, когда вызывается animateCharRight, вы можете сделать что-то вроде

speed += speedIncrementAmount;

или

speed += 1.0f;

То есть каждый раз, когда скорость увеличивается на 1 единицу или то, что вам нужно для вашей игры.

Тогда вам понадобится пара проверок в зависимости от вашей логики.

if (speed > 10.0f) 
{
    // This will clamp the speed at 10.0f;
    speed = 10.0f;
}

if (speed < - 10.0f) 
{
    // This will make sure you will never go left to quickly
    speed = - 10.0f;
}

Выше, если заявления могут работать или не могут. Зависит от использования. Если игра является боковым скулером, и вы хотите двигаться только вправо, то вы можете убедиться, что скорость никогда не будет меньше 0.

Подумайте о дизайне, который вам нужен.

Поскольку вы новичок в программировании игр, я бы начал с Обучающего курса и опирался на навыки, усвоенные в учебном пособии. Здесь - это ссылка на ссылку, которую я нашел в быстром поиске Google.

Помните, никто не делает Doom как первую игру. Все начинают с разрыва кирпича или тетриса, это «Hello World» игрового программирования.

2 голосов
/ 05 июня 2010

Похоже, вы можете запускать новый таймер при каждом нажатии кнопки. Таким образом, после 2 нажатий у вас теперь есть 2 таймера, каждый из которых будет вызывать -animateCharRight:, чтобы переместить ваше представление 10, в общей сложности 20. Больше нажатий, быстрее и т. Это то, что происходит?

1 голос
/ 05 июня 2010

Этот метод всегда перемещает вашего персонажа на 10. Однако, кажется, что вы запускаете новый таймер при каждом нажатии кнопки.Поэтому, если вы нажмете кнопку 3 раза, персонаж будет двигаться 3х10 = 30.Необходимо отменить существующий таймер, чтобы всегда был только один запущенный.

Вы можете отменить экземпляр NSTimer, используя [timer invalidate].( Смотри здесь )

1 голос
/ 04 июня 2010

Я думаю, что ваша проблема в том, что вы не устанавливаете скорость обратно на ноль, когда отпускаете клавишу для движения.Вам следует либо выполнить сброс, как только сработает событие keyup, либо если вы хотите, чтобы персонаж продолжал двигаться некоторое время после отпускания клавиши, вы можете установить скорость на ноль по истечении времени с таймером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...