Обнаружение барьера Android ускоряющегося объекта

мое приложение содержит объект, движущийся по поверхности. Я могу перемещать его с помощью акселерометра. Вот код движения объекта player:

if(x + mx*speed > 0 && x + mx*speed < GameView.WIDTH) {
        x += mx*speed;
    }
if(y+ my*speed > 0 && y+ my*speed < GameView.HEIGHT) {
        y+=my*speed;
    }

x и y - координаты игрока

mx - это значение, которое игрок получает от акселерометра, например: при наклоне влево mx равно -2, при большем наклоне mx равно -4, -5, -6 и т. д. --> у меня то же самое для ось Y

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

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

Теперь моя проблема: при интенсивном наклоне устройства вправо mx превращается в что-то вроде 6. скорость установлена ​​​​на 5. Это означает, что когда позиция игрока + 6 * 5 больше, чем вид игры, он больше не должен двигаться. . Но это приводит к тому, что игрок останавливает пиксели перед правой стороной обзора... при легком наклоне вправо объект идеально останавливается на границе обзора...

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

Изображение с интенсивным использованием акселерометра

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

нижняя часть экрана

Но теперь я могу достичь границ экрана только при медленном движении, что означает низкий mx или мой.

на скриншотах вы можете увидеть значения mY. На первой картинке мой = ок. 8 и на втором ок. 6.

Есть идеи?

заранее спасибо


person user2410644    schedule 13.02.2014    source источник
comment
Снимок экрана или два могут помочь прояснить ваш вопрос.   -  person D-Dᴙum    schedule 13.02.2014
comment
добавил два скриншота   -  person user2410644    schedule 13.02.2014
comment
Немного болтовни об обнаружении столкновений можно найти в Android Breakout (code.google.com/p/android). -прорыв). Обратите особое внимание на комментарии вверху findFirstCollision() в GameState.java — игра продвигает мяч вперед небольшими шагами, проверяя каждый шаг. Вам это не нужно — вам нужно беспокоиться только о четырех стенах, поэтому алгебра даст ответ — но если вы добавите больше объектов для столкновения, вам может понадобиться что-то подобное. (Это также усложняется, если столкновение происходит на краю объекта, а не в центре.)   -  person fadden    schedule 14.02.2014


Ответы (1)


Попробуйте вместо этого ограничить значение до границы, например так

x = Math.max(Math.min(x + mx*speed, GameView.WIDTH), 0.0f));
y = Math.max(Math.min(y + my*speed, GameView.HEIGHT, 0.0f));
person vidstige    schedule 13.02.2014
comment
Пойду попробую, спасибо! РЕДАКТИРОВАТЬ: отлично работает! Но, к сожалению, это работает только справа и внизу экрана... У вас есть предложение, как реализовать и эти две стороны? - person user2410644; 13.02.2014
comment
Конечно. Я добавил некоторый код, который должен обрабатывать это. Хотя немного хакерский. На этом этапе вы можете захотеть создать свой собственный метод с именем cap или что-то в этом роде. - person vidstige; 13.02.2014
comment
Работает как шарм! Спасибо! (Совершенно не думал о Math.min или Math.max) - person user2410644; 14.02.2014
comment
@user2410644 user2410644 проблема с вашим кодом раньше заключалась в том, что близко к краю вы вообще не меняли положение, оставляя объект на небольшом расстоянии от стены. С помощью Math.min вы обновите положение рядом с краем, но никогда не пройдете его. - person vidstige; 14.02.2014