Метод столкновения понга в tkinter

Возникли небольшие проблемы с обнаружением столкновения с понгом. Я создал класс для Pong, инициализировал мой холст атрибутами окна и т. Д. И скоростью мяча для понга. Создал весла с использованием изображений, а затем изменил их размер до размеров весла, которые я хотел, используя PIL, как и для мяча для понга.

Прямо сейчас я использую метод canvas.coords, чтобы определить текущее местоположение моих ракеток и мяча. Согласно моей странице CPSC, это должно возвращать четыре значения: верхний правый левый и нижний правый / левый углы, и я могу затем обнаруживать столкновения, используя их.

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

def animate_pong_ball(self):
    self.C1.move(self.animated_ball, self.pong_dx, self.pong_dy)
    x1, y1 = self.C1.coords(self.animated_ball)

    if x1 <= 0:
        self.pong_dx *= -1
    elif x1 > WINDOW_WIDTH / 2:
        self.pong_dx *= -1
    if y1 <= 0:
        self.pong_dy *= -1
    elif y1 > WINDOW_HEIGHT:
        self.pong_dy *= -1

def detect_collisions(self):

    p1_x, p1_y = self.C1.coords(self.paddle_1)
    p2_x, p2_y = self.C1.coords(self.paddle_2)
    b_x, b_y = self.C1.coords(self.animated_ball)

    if p1_x == b_x or p2_x == b_x:
        self.pong_dx *= -1
    if p1_y == b_y or p2_y == b_y:
        self.pong_dy *= -1

Полный код на http://pastebin.com/KfEkpsAN Знайте, что там есть ошибки, грубая копия просто пытается заставить работать коллизии правильно в данный момент и не могу понять, что не так


person Community    schedule 04.01.2015    source источник
comment
Какой у Вас вопрос?   -  person Bryan Oakley    schedule 04.01.2015
comment
Согласно моему веб-сайту класса cpsc, он должен возвращать четыре верхних и нижних угла, я не понимаю, почему он возвращает только два значения.   -  person    schedule 04.01.2015
comment
Кажется, что он возвращает центр ракетки в качестве координат, а затем обнаруживает столкновение по всему экрану по вертикали, если координаты x мяча и ракетки встречаются, даже если они не сталкиваются. В настоящее время я вижу способ исправить это, чтобы ограничить столкновение между заданными координатами и размерами лопастей, но похоже, что должен быть лучший способ   -  person    schedule 04.01.2015


Ответы (1)


Как вы обнаружили (и как описано в правильных документах), количество координат, возвращаемых canvas.coords (x), зависит от типа x. По какой-то причине вы создали ракетки и мяч как изображения, добавленные на холст с помощью .create_image. Изображения отображаются относительно точки привязки x, y, которая является центром изображения, если не указано иное.

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

Правильный код пересечения для прямоугольной ракетки и круглого мяча, координата y которого находится над линией, зависит от того, находится ли координата x центра мяча в пределах конечных точек линии (пересечение, если расстояние y меньше радиуса ), меньше радиуса за пределами линии (чтобы мяч мог попасть в угол) или дальше (без пересечения).

person Terry Jan Reedy    schedule 04.01.2015