2017-03-05 3 views
0

Ich schreibe Code für ein Paddel-Pong-Spiel in Pygame, wo der Ball von den 3 Wänden abprallen wird, die das Paddel nicht an ist, und wenn es die Paddelwand anstelle des Paddels schlägt, macht es du verlierst ein Leben. Mein Problem ist, dass ich die Kollisionserkennung dafür nicht herausfinden kann. Hier ist, was ich bisher getan:Pong Kollision Pygame

import pygame, sys 
from pygame.locals import * 

pygame.init() 

screen_width = 640 
screen_height = 480 
Display = pygame.display.set_mode((screen_width, screen_height), 0, 32) 
pygame.display.set_caption('Lonely Pong') 

back = pygame.Surface((screen_width, screen_height)) 
background = back.convert() 
background.fill((255, 255, 255)) 

paddle = pygame.Surface((80, 20)) 
_paddle = paddle.convert() 
_paddle.fill((128, 0, 0)) 

ball = pygame.Surface((15, 15)) 
circle = pygame.draw.circle(ball, (0, 0, 0), (7, 7), 7) 
_ball = ball.convert() 
_ball.set_colorkey((0, 0, 0)) 

_paddle_x = (screen_width/2) - 40 
_paddle_y = screen_height - 20 
_paddlemove = 0 
_ball_x, _ball_y = 8, 8 
speed_x, speed_y, speed_circle = 250, 250, 250 
Lives = 5 

clock = pygame.time.Clock() 
font = pygame.font.SysFont("verdana", 20) 
paddle_spd = 5 

while True: 

    for event in pygame.event.get(): 
     if event.type == QUIT: 
      sys.exit() 
     if event.type == KEYDOWN: 
      if event.key == K_RIGHT: 
       _paddlemove = paddle_spd 
      elif event.key == K_LEFT: 
       _paddlemove = -paddle_spd 
     elif event.type == KEYUP: 
      if event.key == K_RIGHT: 
       _paddlemove = 0 
      elif event.key == K_LEFT: 
       _paddlemove = 0 

    Livespr = font.render(str(Lives), True, (0, 0, 0)) 
    Display.blit(background, (0, 0)) 
    Display.blit(_paddle, (_paddle_x, _paddle_y)) 
    Display.blit(_ball, (_ball_x, _ball_y)) 
    Display.blit(Livespr, ((screen_width/2), 5)) 

    _paddle_x += _paddlemove 

    passed = clock.tick(30) 
    sec = passed/1000 

    _ball_x += speed_x * sec 
    _ball_y += speed_y * sec 

    pygame.display.update() 

Ein weiteres Problem, das ich habe, ist, dass, wenn ich es starten, der Ball überhaupt nicht erscheinen. Könnte mir bitte jemand in die richtige Richtung zeigen? erste

+0

Ich nehme Ihren Code wird nie vorbei an der 'für Veranstaltung in pygame .event.get() ', zum Zeichencode. Der Zeichnungscode sollte in der inneren Schleife sein; behebe die Einrückung und versuche es erneut. – 9000

+0

Aber es ist wie seine einzige überspringen den Ball zeichnen, weil es das Paddel und die Leben zeichnet – TheBudderBomb

+0

Haben Sie überprüft, dass "sec" nicht Null ist? Vielleicht könnte 'sec = passed/1000.0' das beheben. – 9000

Antwort

2

ersten Dinge, wird der Ball nicht angezeigt werden, da Sie nicht die Oberfläche füllen, setzen Sie die color_key:

_ball.set_colorkey((0, 0, 0)) 

sollte

_ball.fill((0, 0, 0)) 

Zweitens zur Kollisionserkennung sein, pygame bietet einige Funktionen wie kollidieren und kollidieren.

https://www.pygame.org/docs/ref/rect.html#pygame.Rect.collidepoint

das bedeutet, dass Sie die Rechtecke der Oberflächen benötigen. Dies geschieht durch:

my_surface.get_rect() 

https://www.pygame.org/docs/ref/surface.html#pygame.Surface.get_rect

Um mit den Rändern des Bildschirms zu kollidieren, können Sie immer

tun können
if _ball_x <= 0 or _ball_y <= 0 or _ball_x >= 640 or _ball_y >= 480: 
    # collision detected 
+0

vielen Dank, krank zu bekommen. – TheBudderBomb