Условие не сработает, если задан 75: android

Итак, это, вероятно, глупый вопрос от программиста-любителя, пытающегося поэкспериментировать с базовым использованием графики Android, но вот он.

Чтобы познакомиться с 2D-графикой Android, чтобы помочь моему другу, который хочет, чтобы я использовал его идею для своей игры, я решил попробовать сделать простую версию понга. (просто это означает, что я еще даже не заставил оба лепестка двигаться)

Опираясь на руководства по Android API, я создал экспериментальный приложение вокруг пользовательского объекта View (PongView), который имеет 3 ShapeDrawable объекта (rectangles). Две ракетки (я называл их палками) и мяч. Я реализовал MotionEventListener в представлении и заставил левый джойстик двигаться вместе с ним (да, я кое-что понял :).

После этого я заставил мяч двигаться с помощью отложенного Runnable, созданного в основном действии, которое вызывает метод обновления внутри пользовательского представления. В методе обновления я сделал обработчик столкновений, который меняет вектор мяча (на определенной оси), когда он касается сторон экрана или любых сторон ракеток.

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

Вот условия столкновения:

//collisions
if ((bx + bside == getMeasuredWidth() || bx == 0) || //hit right or left of screen
        ((bx + bside == lx || bx == lx + width) && (by < ly + height && by > ly)) || //hit left stick
        ((bx + bside == rx || rx + width == bx) && (by < ry + height && by > ry))) { //hit right stick
    bVectorX = -bVectorX;
    System.out.println("bounce x");
}
if ((by + bside == getMeasuredHeight() || by == 0) ||
        ((by + bside == ly || by == ly + height) && (bx < lx + width && bx > lx)) ||
        ((by + bside == ry || by == ry + height) && (bx < rx + width && bx > rx))) {
    bVectorY = -bVectorY;
    System.out.println("bounce y");
}
  • bside: длина стороны (в пикселях) квадрата шара
  • ширина: ширина лопастей
  • высота: высота весла
  • bVectorX: изменение координаты (в пикселях) при обновлении по оси x.
  • bx: x-координата шара
  • by: y-координата шара
  • lx: x-координата левого манипулятора

Пытаясь сузить проблемную область, я закомментировал все, кроме этого утверждения, так как это утверждение доставляло мне неприятности (по крайней мере, по оси X):

bx == lx + width

Я понял, что, поскольку lx никогда не менялось во время выполнения, я мог подставить необработанное значение (75) для тестирования и посмотреть, вызвало ли это срабатывание условия. Это не так. Поэтому я решил вместо этого попробовать 76, и знаете что, это сработало! Я понятия не имею, почему, но это сработало. мяч отскочил от этой линии пикселей. Итак, я попытался вернуть переменные, пытаясь:

bx == lx + width + 1
bx == lx + width - 1

и оба работали! Однако, когда я убирал один +/- 1, он проходил прямо через весло и отскакивал от удара с другой стороны. (поскольку все, что я делаю, это переворачиваю вектор). Я хочу, чтобы он ударил по правой стороне весла и изменил вектор.

Я понятия не имею, почему это происходит, заранее спасибо за вашу помощь :)

РЕДАКТИРОВАТЬ: Итак, я проверил условное выражение и обнаружил, что эти два фрагмента кода возвращают true.

if (75 == 75) {

    int i = 75;
    if (i == 75) {

Но это все еще никогда не возвращает true.

if (bx == 75) {

Еще раз спасибо за поддержку. :)


person BAT23    schedule 07.06.2016    source источник
comment
+1 за подробный пост. Я пробовал кодировать коллизии раньше, но это было слишком давно. Собираюсь пойти дальше и поддержать этот пост, вместо этого проголосовав за него. Ваше здоровье!   -  person AL.    schedule 07.06.2016
comment
@int j Большое спасибо за голосование и редактирование, я надеюсь, что это можно решить. Я могу добавить редактирование с моими последними условными тестами.   -  person BAT23    schedule 08.06.2016
comment
Идите прямо вперед. Чем больше соответствующих деталей вы сможете предоставить, тем лучше.   -  person AL.    schedule 08.06.2016
comment
может ли быть, что bx не 75.. значит, это неправда? Вам нужно добавить журналы, чтобы увидеть, какие значения есть во время выполнения, а также вам нужно увидеть, действительно ли меняется ширина. Кроме того, по стандартам «bx == lx + width» выглядит как опечатка, вероятно, это должно быть «bx = lx + width», но без фактического требования или ожидаемого поведения мы можем только строить предположения.   -  person JoxTraex    schedule 08.06.2016
comment
@JoxTraex Я думаю, что «bx == lx + width» является условным, а обычный = предназначен для установки переменных. И я думаю, что знаю, почему проблема возникает после того, как я добавил журналы, как вы сказали, и опубликую ответ, когда у меня будет рабочий код.   -  person BAT23    schedule 08.06.2016
comment
Всегда ли bVectorX больше 1 или меньше -1? Если да, то это может быть просто перепрыгивание через границу. Вы можете переключиться на использование операторов меньше/больше, чтобы избежать этого. т. е. bx ‹= lx + ширина   -  person Maybe_Factor    schedule 25.07.2016
comment
Может наивный вопрос, а что за бх типа? В int или float?   -  person SathOkh    schedule 29.08.2016


Ответы (1)


Вы не должны проверять точное равенство, т.е. if (bx == 75) {}, так как это условие для обнаружения столкновения будет выполнено только, если ваш bVectorX имеет очень ограниченный набор значений (т.е. только целые числа, которые добавляются или вычитаются из/в bx, будут выполняться). всегда делайте это значение 75).

Просто используйте <= и >= и все будет в порядке.

То же самое относится и к обнаружению столкновений с краями экрана.

person diginoise    schedule 06.09.2016