Почему в моей игре Pong в Pygame мяч не отскакивает?

Я пытаюсь создать клон Pong в Pygame. Я новичок в Python, и у меня возникли проблемы. Программа должна сделать две ракетки подвижными, а мяч отскакивает от краев экрана, но мяч не отскакивает. Почему?

bif="bg.jpg"

import pygame, sys
from pygame.locals import *

pygame.init()
pygame.display.set_caption("Griffin West's Python Pong")
pygame.mixer.init()
sounda= pygame.mixer.Sound("Music.wav")

sounda.play()

screen=pygame.display.set_mode((1280,720),0,32)
background=pygame.image.load(bif).convert()

color1=(255,255,255)
color2=(255,255,0)
color3=(0,0,255)
color4=(0,255,0)
pos1=(640,0)
pos2=(640,720)
pos3=(640,360)
pos4=(0,360)
pos5=(1280,360)
radius=(100)
x1,y1=75,0
x2,y2=1175,0
x3,y3=0,0
clock=pygame.time.Clock()
speed=750
movex1, movey1=0,0
movex2, movey2=0,0



while True:


    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_w:
                movey1=-2
            elif event.key==K_s:
                movey1=+2
            if event.key==K_UP:
                movey2=-2
            elif event.key==K_DOWN:
                movey2=+2
        if event.type==KEYUP:
            if event.key==K_w:
                movey1=0
            elif event.key==K_s:
                movey1=0
            if event.key==K_UP:
                movey2=0
            elif event.key==K_DOWN:
                movey2=0

    x1+=movex1
    y1+=movey1
    x2+=movex2
    y2+=movey2


    milli=clock.tick()
    seconds=milli/1000.0
    dm=seconds*speed
    x3+=dm
    y3+=dm

    if x3>1280: 
        x3+=-dm
    if y3>720:
        y3+=-dm
    if x3<0:
        x3+=dm
    if y3<0:
        y3+=dm

    screen.blit(background, (0,0))

    screen.lock()
    pygame.draw.line(screen, color1, pos1, pos2, 1)
    pygame.draw.circle(screen, color1, pos3, radius, 1)
    pygame.draw.circle(screen, color1, pos4, radius, 1)
    pygame.draw.circle(screen, color1, pos5, radius, 1)
    pygame.draw.rect(screen, color3, Rect((x1,y1),(30,100)))
    pygame.draw.rect(screen, color2, Rect((x2,y2),(30,100)))
    pygame.draw.circle(screen, color4, (int(x3),int(y3)), 15)

    screen.unlock()
    myfont = pygame.font.SysFont("Press Start 2P", 50)
    label = myfont.render("Python", 1, (255,0,0))
    screen.blit(label, (494, 115))
    myfont = pygame.font.SysFont("Press Start 2P", 50)
    label = myfont.render("Pong", 1, (255,0,0))
    screen.blit(label, (544, 175))
    pygame.display.update()

person user2005813    schedule 24.01.2013    source источник
comment
Можете ли вы описать, что делает мяч, когда он должен отскакивать? Что он на самом деле делает? Это поможет разобраться в проблеме. Возможно, вы также можете добавить в код несколько комментариев относительно того, какие линии управляют мячом и отскакивают.   -  person chrisfs    schedule 24.01.2013
comment
Я предполагаю, что строки if x3>1280: x3+=-dm - это ваш код, чтобы мяч отскакивал? Я думаю, что он не отскакивает, потому что на следующем шаге dm будет просто добавлен обратно в x3.   -  person Marius    schedule 24.01.2013


Ответы (1)


отказ от ответственности: я не парень pyGame. Но, думаю, это логическая проблема.

Я предполагаю, что поведение, закодированное в настоящее время, заключается в том, что мяч перемещается из левого верхнего угла (0,0) в правый нижний (1280,720), а затем просто остается там.

Вы хотите, чтобы мяч менял направление, когда вы ударяетесь о стену, поэтому вместо скорости вам нужна отдельная скорость для x и y (что также поможет позже, когда вы захотите, чтобы мяч двигался под разными углами, в зависимости от удара веслом). Затем, когда мяч касается стены, вы меняете направление движения.

замените это:

dm=seconds*speed
x3+=dm
y3+=dm

if x3>1280: 
    x3+=-dm
if y3>720:
    y3+=-dm
if x3<0:
    x3+=dm
if y3<0:
    y3+=dm

Примерно так (с соответствующей инициализацией speedx, быстро):

dx=seconds*speedx
dy=seconds*speedy
x3+=dx
y3+=dy

if x3>1280: 
    x3+=-dx  # get ball out of the wall
    speedx = -speedx  # change direction
if y3>720:
    y3+=-dy
    speedy = -speedy
if x3<0:
    x3+=dx
    speedx = -speedx
if y3<0:
    y3+=dy
    speedy = -speedy
person John Hazen    schedule 24.01.2013