2015-03-12 1 views
0

Я пытаюсь войти в игровое программирование, но у меня возникают трудности с первой игрой, которую я делаю. Я хочу сделать игру в понг, но я не могу заставить обнаружение столкновения работать дважды. Он работает один раз в любом случае, когда мяч идет, но второй раз не работает. Вот мой код:Почему оператор some if запускает только один раз в цикле while?

import pygame 
    import random 
    from random import uniform 

class Game(object): 
    def main(self, screen): 

     rand = random.randint(100, 250) 
     clock = pygame.time.Clock() 
     icon = pygame.image.load('player.png').convert_alpha() 
     image = icon 
     ball = pygame.image.load('ball.png').convert_alpha() #10 x 10 
     bar = pygame.image.load('bar.png').convert_alpha() # 25 x 200 
     divider = pygame.image.load('divider.png').convert_alpha() # 8 x 40 

     pressed_up = False 
     pressed_down = False 

     pressed_up2 = False 
     pressed_down2 = False 

     ballActive = False 
     ballActive2 = False 
     ballCollide = False 
     ballCollide2 = False 
     ballCanCollide = False 
     ballCanCollide2 = False 
     ballIsMovingControlled = False 
     ballIsMovingControlled2 = False 

     x = 0 
     barY = 300 
     barY2 = 300 
     barHitX = 20 
     barHitY = 200 
     barHitX2 = 20 
     barHitY2 = 200 
     ballangle = 90 
     ballAccel = 1 
     ball_x = 530 
     ball_y = 390 

     white = (255, 255, 255) 

     while 1: 
      clock.tick(30) 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        return 
       if event.type == pygame.KEYDOWN and event.key ==  pygame.K_ESCAPE: 
        return 

       elif event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_w: 
         pressed_up = True 
        if event.key == pygame.K_s: 
         pressed_down = True 

        if event.key == pygame.K_UP: 
         pressed_up2 = True 
        if event.key == pygame.K_DOWN: 
         pressed_down2 = True 

        if event.key == pygame.K_SPACE: 
         ballActive2 = True 

        if event.key == pygame.K_LEFT: 
         ballActive = False 
         ballActive2 = False 
         ballIsMovingControlled = True 
        if event.key == pygame.K_RIGHT: 
         ballActive = False 
         ballActive2 = False 
         ballIsMovingControlled2 = True 

       elif event.type == pygame.KEYUP: 
        if event.key == pygame.K_w: 
         pressed_up = False 
        if event.key == pygame.K_s: 
         pressed_down = False 

        if event.key == pygame.K_UP: 
         pressed_up2 = False 
        if event.key == pygame.K_DOWN: 
         pressed_down2 = False 
        if event.key == pygame.K_LEFT: 
         ballActive = False 
         ballActive2 = False 
         ballIsMovingControlled = False 
        if event.key == pygame.K_RIGHT: 
         ballActive = False 
         ballActive2 = False 
         ballIsMovingControlled2 = False 


      if pressed_up == True: 
       barY -= 10 
      if pressed_down == True: 
       barY += 10 

      if pressed_up2 == True: 
       barY2 -= 10 
      if pressed_down2 == True: 
       barY2 += 10 

      if ballActive == True: 
       ball_x -= 5 
       ball_y = 390 
       print("moving") 

       if ball_x == barHitX + 20 and ball_y >= barY and ball_y <= barY + 200: 
        ball_x = 32 
        ballActive = False 
        ballCollide = True 
        print("stopped1") 

      if ballActive2 == True: 
       ball_x += 5 
       ball_y = 390 
       print("moving2") 

       if ball_x == barHitX2 + 1040 and ball_y >= barY2 and ball_y <= barY2 + 200: 
        ball_x = 1058 
        ballCollide2 = True 
        ballActive2 = False 
       print("stopped2") 

      if ball_x == 600: 
       print("why wont you collide") 

      if ballIsMovingControlled == True: 
       ball_x -= 5 
      if ballIsMovingControlled2 == True: 
       ball_x += 5 





      if ballCollide == True: 
       ballActive2 = True 
       print("stopping1") 
       ballCollide = False 
      if ballCollide2 == True: 
       ballActive = True 
       print("stopping2") 
       ballCollide2 = False 








      def blitLvl(): 
       ballBlit = screen.blit(ball, (ball_x, ball_y)) 
       barBlit = screen.blit(bar, (30, barY)) 
       barBlit2 = barBlit = screen.blit(bar, (1050, barY2)) 
       barHitBox = pygame.draw.rect(screen, white, (30, barY, barHitX, barHitY), 1) 
       barHitBox2 = pygame.draw.rect(screen, white, (1050, barY2, barHitX2, barHitY2), 1) 

       screen.blit(divider, (530,20)) 
       screen.blit(divider, (530,100)) 
       screen.blit(divider, (530,180)) 
       screen.blit(divider, (530,260)) 
       screen.blit(divider, (530,340)) 
       screen.blit(divider, (530,420)) 
       screen.blit(divider, (530,500)) 
       screen.blit(divider, (530,580)) 
       screen.blit(divider, (530,660)) 
       screen.blit(divider, (530,740)) 
       screen.blit(divider, (530,820)) 


       pygame.display.update() 


      screen.fill((0, 0, 0)) 

      blitLvl() 
      pygame.display.set_caption("Pong") 
      pygame.display.set_icon(icon) 
      pygame.display.flip() 

if __name__ == '__main__': 
    pygame.init() 
    screen = pygame.display.set_mode((1080, 800)) 
    Game().main(screen) 

Проблема связана с ссылкой на детали, когда мяч активен. Я проверяю столкновение левого весла, когда мяч идет влево, и наоборот. Один из них может срабатывать, но другой не распознается. Он просто идет прямо через весло.

  if ballActive == True: 
       ball_x -= 5 
       ball_y = 390 
       print("moving") 

       if ball_x == barHitX + 20 and ball_y >= barY and ball_y <= barY + 200: 
        ball_x = 32 
        ballActive = False 
        ballCollide = True 
        print("stopped1") 

      if ballActive2 == True: 
       ball_x += 5 
       ball_y = 390 
       print("moving2") 

       if ball_x == barHitX2 + 1040 and ball_y >= barY2 and ball_y <= barY2 + 200: 
        ball_x = 1058 
        ballCollide2 = True 
        ballActive2 = False 
        print("stopped2") 
+0

Почему 'def blitLvl(): отступ' s как и в цикле while? Кроме того, чтобы уточнить, оператор 'if ballActive == True:' вводится один раз, а также 'if ballActive2 == True:', и затем ни один из них не вводится? –

+0

Чтобы ответить на ваш вопрос, blitLvl() находится в цикле while; и я пытаюсь объяснить, что когда ballActive верно, он перемещается влево. Он проверяет, попадает ли он в левое весло, и такая же ситуация возникает с ballActive2 и правым веслом. Проблема в том, что если ballActive запускается первым (при нажатии пробела), то левое сцепление работает, но не работает с правом. Опять же, наоборот. Если ballActive2 запускается первым, то происходит правильное столкновение весла, но не слева. – Cognitio72

ответ

1

Я думаю, что это связано с вашей условного оператора:

if ball_x == barHitX2 + 1040 and ball_y >= barY2 and ball_y <= barY2 + 200: 
    ball_x = 1058 

и увеличивающиеся на 5 и 10. Я не думаю, что вы хотите проверить, если ball_x точно barHitX2 + 1040, а если ball_x находится в диапазоне «barHitX2».

(т.е.)

if (ball_x >= BarHitX2 + 1040 and ball_x <= BarHitX2 + 1065) and (ball_y >= barY2 and ball_y <= barY2 + 200): 
    ... 

Это было бы мое предположение, по крайней мере.