Pygame Pong условно заставляет мяч подпрыгивать

Можно ли добавить к этому коду условие, которое приведет к изменению x_direction, заставляя мяч отскакивать при превышении ширины? Что-то вроде: if x_val> width x_direction == x_direction * -1? (аналогично для y_direction).

import pygame
BLACK = (0,0,0)
WHITE = (255,255,255)
BLUE = (50,50,255)
YELLOW = (255,255,0)
width = 64
height = 480
pygame.init()
size = (width,height)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pong")
done = False
clock = pygame.time.Clock()
ball_width = 20
x_val = 150
y_val = 200
x_direction = 1
y_direction = 1

while not done:
    for event in pygame.event.get():
       if event.type == pygame.QUIT:
           done = True

x_val = x_val + x_direction
y_val = y_val + y_direction  
screen.fill (BLACK)
# condition to go here to make ball bounce

pygame.draw.rect(screen, BLUE, (x_val,y_val,ball_width,20))      
pygame.display.flip()
clock.tick(60)

pygame.quit ()


person Pieman    schedule 06.11.2018    source источник
comment
Что-то вроде: if x_val ›width x_direction == x_direction * -1? Для меня это имеет смысл, хотя 1) вы хотите = вместо == 2) Это будет обрабатывать только одну сторону экрана. 3) В традиционном понге мяч не отскакивает от левой и правой сторон экрана; вместо этого он засчитывается как очко для одного игрока. С другой стороны, большая часть игровой логики, вероятно, должна содержаться в цикле while not done (хотя это может быть просто проблемой форматирования вашего сообщения).   -  person 0x5453    schedule 06.11.2018


Ответы (1)


Ваши x_val и y_val должны быть увеличены внутри основного цикла, иначе они будут увеличиваться один раз и больше никогда.

Вы очень близки к тому, чтобы получить необходимое условие. Вот код, который заставляет мяч менять направление, если он ударяется о стены экрана:

if x_val < 0 or x_val > width:
    x_direction = x_direction * -1

if y_val < 0 or x_val > height:
   y_direction = y_direction * -1

Этот код также должен быть включен в основной цикл, поскольку нам нужно проверять положение мяча, чтобы увидеть, не сталкивается ли он со стеной в каждом кадре.

Поскольку ваш мяч имеет размер, а переменные x_val и y_val представляют центр вашего мяча, вам нужно будет включить размер мяча в приведенное выше условие, чтобы мяч отскакивал от края, а не от его края. центр.

person Community    schedule 07.11.2018
comment
Я понимаю, что благодарственные комментарии не одобряются, но, как пользователь впервые, спасибо за ваш ответ, который был очень полезен. Проголосовал за ваш ответ и поставил галочку. - person Pieman; 07.11.2018