2015-05-04 1 views
0

Так что я пытаюсь создать игру с одним игроком в понг. Я смог получить мяч, чтобы отскочить от экрана и вернуться, но когда он попадает в стену с левой стороны, он восстанавливается, но не двигается. Также при попытке перемещения весла он будет двигаться только как 1 пиксель и только перемещаться вниз на 1 пиксель, после чего он больше не будет двигаться вверх или вниз по другому. Трудно объяснить, так вот код.Pygame Pong, Paddle перемещается только один раз вверх и вниз, и мяч не двигается после регенерации

import sys 
import pygame 
pygame.init() 

size = width, height = 1000, 800 
screenColor = 0, 0, 0 
outline = 0, 0, 255 

paddleOne = pygame.image.load("PONGPADDLE.png") 
ball = pygame.image.load("Bullet.png") 
ballRect = ball.get_rect() 
paddleRect = paddleOne.get_rect() 
speed = [1, 1] 
paddleOne_x = 980 
paddleOne_y = 400 
FPS = 1000 
fpsClock = pygame.time.Clock() 

paddleOnePos_x = 0 
paddleOnePos_y = 0 

screen = pygame.display.set_mode(size) 

while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_UP: 
       paddleRect.y += 10 
       if paddleRect.top > 0: 
        paddleRect.top = -1 
      if event.key == pygame.K_DOWN: 
       paddleRect.y -= 10 
       if paddleRect.bottom < 800: 
        paddleRect.top = +1 

     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_UP: 
       paddleRect_y = 0 
      if event.key == pygame.K_DOWN: 
       paddleRect_y = 0 

    ballRect = ballRect.move(speed) 
    if ballRect.right > width: 
     speed[0] = -speed[0] 

    if ballRect.top < 0 or ballRect.bottom > height: 
     speed[1] = -speed[1] 

    if ballRect.left < 0: 
     ballRect = ball.get_rect() 
    elif ballRect.colliderect(paddleRect): 
     speed[1] = -speed[1] 


    paddleOne_y += paddleRect.bottom 
    paddleOne_y += paddleRect.top 

    screen.fill(screenColor) 
    screen.blit(paddleOne, (paddleRect.left, paddleRect.top)) 
    # screen.blit(paddleOne, (paddleOne_x, paddleOne_y)) 
    screen.blit(ball, ballRect) 
    pygame.draw.rect(screen, outline, ((0, 0), (width, height)), 5) 
    pygame.display.flip() 
    fpsClock.tick(FPS) 
+0

Весь ваш 'if event.type == pygame.KEYUP:' блок выглядит странным для меня. 'paddleRect_y = 0' означает, что весло будет сбрасывать свое положение в верхней части экрана каждый раз, когда пользователь отпускает кнопку« вверх »или« вниз ». Поэтому для меня не слишком удивительно, что ваше весло никуда не движется. Возможно, вы пытались сделать что-то вроде «сбросить значение _velocity_ paddle до нуля, когда пользователь выпустит ключ»? – Kevin

+0

Ваши 'if paddleRect.top> 0' и' if paddleRect.bottom <800: 'условия также кажутся проблематичными. Если вы пытаетесь выполнить проверку границ, я думаю, вам нужно переключить '<' with '>' и наоборот. – Kevin

ответ

0

Если вы хотите весло двигаться до тех пор, как клавиша со стрелкой удерживается в нажатом положении, и хотите, чтобы остановить движение, когда клавиша отпущена, то вы должны быть изменения скорости весло, а не его положение. Пример реализации:

paddle_y_velocity = 0 

while 1: 
    if paddleRect.top < 0: 
     paddleRect.top = 0 
    if paddleRect.bottom > 800: 
     paddleRect.bottom = 800 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_UP: 
       paddle_y_velocity -= 1 
      if event.key == pygame.K_DOWN: 
       paddle_y_velocity += 1 

     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
       paddle_y_velocity = 0 

    paddleRect.top += paddle_y_velocity 

    ballRect = ballRect.move(speed) 
    #etc 
+0

Спасибо, что исправил эту проблему ха-ха. Я не могу поверить, что не видел этого до – Slim

+0

Также у вас есть представление о том, почему он не сталкивается с веслом. Кажется, что это не работает, и когда он восстанавливает мяч, он даже не перемещается – Slim