Использование сенсорных экранов для управления игрой

голоса
8

Я работаю над моей первой видеоигрой для Android платформы как немного проекта по вечерам и выходным.

Она идет вдоль красиво, но я очень недоволен управления sensativity.

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

/-------------------------\
|                         |
|                         |
|                         |
|       Game Area         |
|                         |
|                         |
|                         |
|                         |
|                         |
/-------------------------\
|                         |
|       Touch Area        |
|                         |
\-------------------------/

Я в настоящее время использую переменную состояния, чтобы держать «MOVING_LEFT, MOVING_RIGHT, NOT_MOVING» и я обновления местоположения объекта игрока в каждом кадре на основе этой переменной.

Тем не менее, мой код, который читает входной сенсорный экран и устанавливает это переменная состояния либо слишком чувствительно к регистру, или слишком лага, в зависимости от того, как я настроить его:

public void doTouch (MotionEvent e) {
    int action = e.getAction();

    if (action == MotionEvent.ACTION_DOWN) {
        this.mTouchX = (int)e.getX();
        this.mTouchY = (int)e.getY();           
    } 
    else if (action == MotionEvent.ACTION_MOVE) {
        if ((int)e.getX() >= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();   
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_RIGHT;
            }
        } 
        else if ((int)e.getX() <= this.mTouchX) {
            this.mTouchX = (int)e.getX();
            this.mTouchY = (int)e.getY();
            if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {              
                this.mTouchDirection = MOVING_LEFT;
            }
        }
        else {
            this.mTouchDirection = NOT_MOVING;
        }               
    } 
    else if (action == MotionEvent.ACTION_UP) {
        this.mTouchDirection = NOT_MOVING;
    }       
}

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

Это не очень хорошо работает, я полагаю, есть некоторые IPhone / Android разработчики на которые здесь придумали, как сделать хорошее управление с помощью сенсорного экрана и может дать некоторые советы.

Задан 15/03/2009 в 03:05
источник пользователем
На других языках...                            


2 ответов

голоса
2

Одна очевидная проблема заключается в том, что нигде не вы принимаете во внимание время с момента последнего нажатия.

Я хотел бы предложить вам относиться к игрокам потрогать как выражение желаемого движения на аналоговом диапазоне -x/+xи -y/+y, затем выполнить фактическое движение в другом месте в зависимости от времени.

Например

objectPos += objectPos + (joyPos * timeDelta * maxSpeed);

Так что, если максимальная скорость вашего объекта 10мс-1 и игроки палец на 0,5 на контрольной панели, то объект будет движущемся 5 метров в секунду. Если ваша игра работает на 10fps, то каждый кадр объект будет двигаться 0,5 метра.

Эти цифры являются вымышленными, но мы надеемся продемонстрировать необходимость отделить управление от движения, а затем фактор времени.

Ответил 15/03/2009 d 03:39
источник пользователем

голоса
2

Вы могли бы попробовать что-то похожее на «перетащить прямоугольники» на Windows. Если удерживать кнопку мыши на что-то, вы не начать операцию перетаскивания до перемещения мыши за пределами небольшой области вокруг мыши вниз месте. Причина в том, что это очень трудно держать курсор на тот же пиксель при нажатии.

Таким образом, первая попытка может быть (int)e.getX() >= this.mTouchX + DEAD_ZONEи похож на другой случай, где DEAD_ZONEесть небольшое число.

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

Ответил 15/03/2009 d 03:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more