Итак, это, вероятно, глупый вопрос от программиста-любителя, пытающегося поэкспериментировать с базовым использованием графики 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) {
Еще раз спасибо за поддержку. :)