I want to move the left paddle using W and S, but whenever I click the keys the paddle doesn't move. I've only been learning python for a few months and pygame a few weeks, so if its a really obvious mistake then that's why.
Here's the main game loop:
while not x:
for event in pygame.event.get():
if event.type == pygame.QUIT:
x = True #quits the game when you press X
if event.type == pygame.KEYUP: #makes start screen go away
if event.key == pygame.K_RETURN:
gamescreen()
ball = Ball(window, white, 350, 220, 7)
p1Paddle = Paddle(window, blue, 50, 180, 10, 60)
p2Paddle = Paddle(window, red, 630, 180, 11, 60)
#moves the paddles
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w: #supposed to make the paddle go up
p1Paddle.state = 'up'
print('up')
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_s: #supposed to make the paddle go down
p1Paddle.state = 'down'
p1Paddle.move()
print('down')
pygame.display.update()
clock.tick(45)
and here's the paddle function/class.
class Paddle:
def __init__(self, screen, colour, posX, posY, width, height):
self.screen = screen
self.colour = colour
self.posX = posX
self.posY = posY
self.width = width
self.height = height
self.state = 'stopped'
self.show()
def show(self):
pygame.draw.rect(self.screen, self.colour, (self.posX, self.posY, self.width, self.height))
def move(self):
if self.state == 'up':
self.posY -= 10
elif self.state == 'down':
self.posY += 10
(I haven't gotten the chance to add the controls for the second paddle; I'll get there once I figure this one out.) It prints 'up' and 'down', so I know it works to some extent.
You need to create the objects before the application loop instead of in the application loop. But you have to draw the objects in each frame at their new position in the application loop:
p1Paddle = Paddle(window, blue, 50, 180, 10, 60)
p2Paddle = Paddle(window, red, 630, 180, 11, 60)
ball = Ball(window, white, 350, 220, 7)
while not x:
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
x = True
# [...] more events
# clear screen
window.fill(0)
# draw objects
p1Paddle.show()
p2Paddle.show()
ball.show()
# update display
pygame.display.update()
clock.tick(45)
The typical PyGame application loop has to:
pygame.time.Clock.tick
pygame.event.pump()
or pygame.event.get()
.blit
all the objects)pygame.display.update()
or pygame.display.flip()