2017-02-01 19 views
3

Я довольно новичок в Python и PyGame. Я сделал мяч и два весла (два весла контролируются двумя игроками). Моя проблема в том, когда мяч попадает в весло игрока 2, он не отскакивает. Проблема находится в нижней части кода, где есть комментарий: #WITH PLAYER 2.Проблемы с обнаружением конфликтов - PyGame

# IMPORTS 
import pygame, time; 

# INIT PYGAME 
pygame.init(); 

# GLOBALS 
global screen, display_w, display_h; 
global clock, FPS; 
global gameOver; 
global ball, player_1, player_2; 

# ASSIGN GLOBALS 
def assign_globals(): 
    global screen, display_w, display_h; 
    global clock, FPS; 
    global gameOver; 
    global ball, player_1, player_2; 

    display_w = 800; 
    display_h = 600; 
    screen = pygame.display.set_mode((display_w, display_h)); 

    clock = pygame.time.Clock(); 
    FPS = 60; 

    gameOver = False; 

    ball = Ball(); 
    player_1 = Player(); 
    player_1.x = 0; 
    player_1.color = (255, 0, 0); 
    player_2 = Player(); 
    player_2.x = display_w - 15; 
    player_2.color = (0, 255, 0); 

# MAIN 
def main(): 
    assign_globals(); 
    setup(); 
    game_loop(); 
    set_fps(); 

# GAME LOOP 
def game_loop(): 
    global gameOver; 

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

      if(event.type == pygame.KEYDOWN): 
       # PLAYER 1 
       if(event.key == pygame.K_w): 
        player_1.velY -= 1; 
       if(event.key == pygame.K_s): 
        player_1.velY += 1; 
       # PLAYER 2 
       if(event.key == pygame.K_UP): 
        player_2.velY -= 1; 
       if(event.key == pygame.K_DOWN): 
        player_2.velY += 1; 

      if(event.type == pygame.KEYUP): 
       # PLAYER 1 
       if(event.key == pygame.K_w or event.key == pygame.K_s): 
        player_1.velY = 0; 
       # PLAYER 2 
       if(event.key == pygame.K_UP or event.key == pygame.K_DOWN): 
        player_2.velY = 0; 

     draw(); 
     animate(); 
     collision(); 

# DRAW 
def draw(): 
    global screen; 

    screen.fill((0, 0, 0)); 
    ball.draw(); 
    player_1.draw(); 
    player_2.draw(); 

    pygame.display.update(); 

# ANIMATE 
def animate(): 
    ball.animate(); 
    player_1.animate(); 
    player_2.animate(); 

# COLLISION 
def collision(): 
    ball.collision(); 
    player_1.collision(); 
    player_2.collision(); 

# SETUP 
def setup(): 
    pygame.display.set_caption("Pong"); 

# CLASSES 
class Ball(): 
    def __init__(self, x=0, y=0, w=0, h=0, velX=0, velY=0, color=()): 
     global display_w, display_h; 

     self.x = display_w/2; 
     self.y = display_w/2; 
     self.w = 20; 
     self.h = 20; 
     self.color = (0, 0, 255); 
     self.velX = 0.4; 
     self.velY = 0.4; 

    def reset(self): 
     self.x = display_w/2; 
     self.y = display_w/2; 
     self.velX = 0.4; 
     self.velY = 0.4; 

    def draw(self): 
     global screen; 

     pygame.draw.ellipse(screen, self.color, (self.x, self.y, self.w, self.h)); 

    def animate(self): 
     self.x += self.velX; 
     self.y += self.velY; 

    def collision(self): 
     global display_w, display_h; 

     # WITH WALL 
     if(self.x >= display_w - self.w): 
      self.reset(); 
     if(self.x <= 0): 
      self.reset(); 
     if(self.y >= display_h - self.h): 
      self.velY *= -1; 
     if(self.y <= 0): 
      self.velY *= -1; 

     # WITH PLAYER 1 
     if(self.x <= player_1.x + player_1.w and 
      self.x >= player_1.x and 
      self.y >= player_1.y and 
      self.y <= player_1.y + player_1.h): 
       ball.velX *= -1; 

     # WITH PLAYER 2 
     if(self.x <= player_2.x + player_2.w and 
      self.x >= player_2.x and 
      self.y >= player_2.y and 
      self.y <= player_2.y + player_2.h): 
       ball.velX *= -1; 

class Player(): 
    def __init__(self, x=0, y=0, w=0, h=0, velY=0, color=()): 
     global display_w, display_h; 

     self.w = 15; 
     self.h = 100; 
     self.x = color; 
     self.y = display_h/2 - self.h/2; 
     self.velY = 0; 
     self.color = color; 

    def draw(self): 
     global screen; 

     pygame.draw.rect(screen, self.color, (self.x, self.y, self.w, self.h)); 

    def animate(self): 
     self.y += self.velY; 

    def collision(self): 
     global display_h; 

     # WITH WALL 
     if(self.y + self.h > display_h): 
      self.velY = 0; 
     elif(self.y < 0): 
      self.velY = 0; 


# SET FPS 
def set_fps(): 
    global clock, FPS; 

    clock.tick(FPS); 

# CALL MAIN 
if(__name__ == "__main__"): 
    main(); 

# QUIT 
pygame.quit(); 
quit(); 
+1

В python вам не нужно заканчивать утверждения ';', и даже если это разрешено, это обычно обескураживает. То же самое относится к скобкам вокруг условия в операторах 'if'. И не бойтесь использовать 'elif' в цикле событий, где событие может быть только одного типа и иметь по одному ключу каждую итерацию. Наконец, постарайтесь, чтобы ваше именование было согласованным, чтобы вы не использовали 'lowercase_and_underscore' для некоторых переменных и' camelCase' для других. Это просто общие соглашения [(PEP8)] (https://www.python.org/dev/peps/pep-0008/), используемые для упрощения чтения кода между программистами. –

ответ

1

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

Таким образом, лопасть игрока 2 не имеет значения, так как она обнаруживает дальний угол, и в любое время, когда он обнаружит столкновение, он обнаруживает счет вместо этого и сбрасывает положение мяча, прежде чем он проведет проверку на столкновение.

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