Arun Ravindranath
Arun Ravindranath

Reputation: 13

How to move image in python using pygame?

I'm a beginner in python and I am trying to learn the features of pygame in order to make a simple game. I want to move an image using the wasd keys, but it's not working. Please help.

I'm using python (3.7.0) on windows 10. The following is the code:

import pygame
from pygame.locals import *
pygame.init()

pygame.display.init()
keys = [False, False, False, False]
screen=pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
background=pygame.Surface(screen.get_size())
background.fill((255,255,255))
playerpos=[100,100]
player=pygame.image.load("Copper.png")

while 1:
    pygame.display.init()
    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)
    for event in pygame.event.get():
        pygame.display.init()
        pygame.display.flip()
        if event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                    pygame.display.quit()
        pygame.display.flip()
        # 8 - loop through events
        for event in pygame.event.get():
            # 9 - check if event is X button 
            if event.type==pygame.QUIT:
                # 10 - quit the game
                pygame.quit() 
                exit(0)
            if event.type == pygame.KEYDOWN:
                if event.key==K_w:
                    keys[0]=True
                elif event.key==K_a:
                    keys[1]=True
                elif event.key==K_s:
                    keys[2]=True
                elif event.key==K_d:
                    keys[3]=True
            if event.type == pygame.KEYUP:
                if event.key==pygame.K_w:
                    keys[0]=False
                elif event.key==pygame.K_a:
                    keys[1]=False
                elif event.key==pygame.K_s:
                    keys[2]=False
                elif event.key==pygame.K_d:
                    keys[3]=False
            # 9 - Move player
            if keys[0]:
                playerpos[1]-=500
            elif keys[2]:
                playerpos[1]+=500
            if keys[1]:
                playerpos[0]-=500
            elif keys[3]:
                playerpos[0]+=500

I expect the image "Copper.png" to move when I press w,a,s,d but the image does not move. The image does refresh everytime I press w,a,s,d but does not move.

Upvotes: 1

Views: 279

Answers (1)

Rabbid76
Rabbid76

Reputation: 210946

Get rid of the multiple even handling loops. Use a single loop to handle all the events.
Further it is sufficient to init the display once (pygame.display.init())

Create a variable speed, which defines the number of pixels, the position of the image changes by each step

First evaluate the pygame.QUIT event and stop running the main loop when the event happens:

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

Then handle the other events like the pygame.KEYDOWN and pygame.KEYUP.

For a continuously movement, the manipulation of the player position has to be done outside the event loop. If it would be don in the loop, the the position of the player would only change if en event occurs. Note use a small "speed" (speed = 1), else the player would rapidly moved out of the window.

for event in pygame.event.get():
    # event handling

if keys[0]:
    playerpos[1]-=speed
elif keys[2]:
    playerpos[1]+=speed
if keys[1]:
    playerpos[0]-=speed
elif keys[3]:
    playerpos[0]+=speed

Do the drawing of the scene at the end of main loop:

speed = 1
done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key==pygame.K_RETURN:
                done = True
            for i in range(4):
                if event.key == (K_w, K_a, K_s, K_d)[i]:
                    keys[i]=True
        elif event.type == pygame.KEYUP:
            for i in range(4):
                if event.key == (K_w, K_a, K_s, K_d)[i]:
                    keys[i]=False
    if keys[0]:
        playerpos[1]-=speed
    elif keys[2]:
        playerpos[1]+=speed
    if keys[1]:
        playerpos[0]-=speed
    elif keys[3]:
        playerpos[0]+=speed

    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)    
    pygame.display.flip()

Note, alternatively you can use pygame.key.get_pressed() to get all states of of all keyboard buttons at once. So you don't need to evaluate the key events separately:

speed = 1
done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                done = True

    allKeys = pygame.key.get_pressed()
    playerpos[0] += -speed if allKeys[K_a] else speed if allKeys[K_d] else 0
    playerpos[1] += -speed if allKeys[K_w] else speed if allKeys[K_s] else 0

    screen.fill(0)
    screen.blit(background,(0,0))
    screen.blit(player,playerpos)    
    pygame.display.flip()

Upvotes: 2

Related Questions