Как бы я обнаружил столкновение между веслом и мячом в основной игре в понг без спрайтов? - PullRequest
2 голосов
/ 14 марта 2019

Для моего Dofe Gold я создал игру pong в pygame, так как я впервые использовал pygame и не использовал спрайты, так как мне этого не приходило в голову.Теперь я хочу найти решение, которое позволит мне решить мою проблему, не переписывая мой код спрайтами.Примечание: я хочу, чтобы это все еще был мой код, поэтому я не приму переписанное решение кем-то другим, так как это лишит всякого чувства выполненного долга.Спасибо заранее.мой код:

import pygame
import random
global vel
run = True
def pong():
    global run
    collision = 0
    pygame.init()
    screen = (600, 600)
    window = pygame.display.set_mode((screen))
    pygame.display.set_caption("Pong")
    x = 300
    y = 590
    coords = (300, 150)
    width = 175
    height = 10
    vel = 10 - selection
    velx = 10
    vely = 10
    while run == True:
        pygame.time.delay(100)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        keys = pygame.key.get_pressed()        

        if keys[pygame.K_LEFT] and x>0:
            x -= vel
        elif keys[pygame.K_RIGHT] and x<600-width:
            x += vel
        if event.type == pygame.MOUSEBUTTONUP:
            pygame.quit()
            quit()
        paddlecoords = (x, y, width, height)
        window.fill((255, 255, 255))
        ball = pygame.draw.circle(window, (255,0,255), coords,(35), (0))
        paddle = pygame.draw.rect(window, (0, 0, 0), paddlecoords)
        pygame.display.update()
        coords=((int(coords[0])+velx), (int(coords[1])+vely))
        if coords[0]>600-35:
            velx = -velx
        elif coords[0]<35:
            velx = -velx
        elif coords[1]<35:
            vely = -vely
        elif coords[1]>600-35:
            vely = -vely

selection =input("Do you want to play\n1)easy\n2)medium\n3)hard\n4)impossible?\n")
if selection.isdigit():
    if 0 < int(selection) < 5:
        selection = int(selection)
        selection = (selection-1)*2
    else:
        print("must be between 1 and 4")
else:
    print("number must be an integer")
    quit()
pong()

1 Ответ

0 голосов
/ 15 марта 2019

Поскольку вам не нужен код, вот как это сделать в словах .

Напишите функцию с именем, скажем ballHits().

Перейдите кфункция paddlecoords, мяч coords и радиус шара 35?as radius

Внутри этой новой функции paddlecoords определяет прямоугольник.Код должен проверить, находится ли край шара внутри этого прямоугольника.

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

[ coords.x - radius,  coords.y - radius,  2 * radius, 2 * radius ]
# the [ x, y, width, height] of a square covering a circle

Используя класс rect PyGame, определите, перекрываются ли ваши два прямоугольника.

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

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

Если код решит, что произошло столкновение, верните True из функции и False иначе.

В вашем основном коде вызовите эту функцию и воздействуйте на возвращенный результат.

...