简体   繁体   中英

Python: Player Movement

I've been working on a school project, and I need some assistance with player movement. The problem is I have to manually tap the arrow / WASD keys for the player to move one spot at a time. The player won't move if I hold in the keys. How do I fix this issue?

Note - I'm using an outdated Python - Python 2.7.3

Code:

# Begin 'The Maze'
# Import modules

import os, sys, time, pygame
from pygame.locals import *
from pygame.time import *

# Initialise Pygame + Clock

pygame.init()
mainClock = pygame.time.Clock()

# Window Setup

WINDOWHEIGHT = 480
WINDOWWIDTH = 600
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('The Maze')

# Player Variables

player = pygame.Rect(50, 50, 50, 50)

# Colour Setup

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)

# Movement Variables

moveLEFT = False
moveRIGHT = False
moveUP = False
moveDOWN = False

MOVESPEED = 7

x,y = 0,0
charx,chary = 0,0
movex,movey = 0,0

# Game Loop & Events + Updates
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        # Change the keyboard variables
        if event.type == KEYDOWN:
            if event.key == K_LEFT or event.key == ord('a'):
                moveLEFT = True
                movex = -0.5
            if event.key == K_RIGHT or event.key == ord('d'):
                moveRIGHT = True
                movex = -0.5
            if event.key == K_UP or event.key == ord('w'):
                moveUP = True
                movey = 0.5
            if event.key == K_DOWN or event.key == ord('s'):
                moveDOWN = True
                movey = -0.5
        if event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_LEFT or event.key == ord('a'):
                moveLEFT = False
                movex = 0
            if event.key == K_RIGHT or event.key == ord('d'):
                moveRIGHT = False
                movex = 0
            if event.key == K_UP or event.key == ord ('w'):
                moveUP = False
                movey = 0
            if event.key == K_DOWN or event.key == ord('s'):
                moveDOWN = False
                movey = 0


        # Background Setup
        windowSurface.fill(WHITE)
        # Player Setup + Updating Screen
        if moveDOWN and player.bottom < WINDOWHEIGHT:
            player.top += MOVESPEED
        if moveUP and player.top > 0:
            player.top-= MOVESPEED
        if moveLEFT and player.left > 0:
            player.left -= MOVESPEED
        if moveRIGHT and player.right < WINDOWWIDTH:
            player.right += MOVESPEED
        pygame.draw.rect(windowSurface, GREEN, player)
        pygame.display.update()
        mainClock.tick(40)

Thanks!

A simple dedent of the block of code after # Background Setup did the job.

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        # Change the keyboard variables
        if event.type == KEYDOWN:
            if event.key == K_LEFT or event.key == ord('a'):
                moveLEFT = True
            elif event.key == K_RIGHT or event.key == ord('d'):
                moveRIGHT = True
            elif event.key == K_UP or event.key == ord('w'):
                moveUP = True
            elif event.key == K_DOWN or event.key == ord('s'):
                moveDOWN = True
        elif event.type == KEYUP:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            elif event.key == K_LEFT or event.key == ord('a'):
                moveLEFT = False
            elif event.key == K_RIGHT or event.key == ord('d'):
                moveRIGHT = False
            elif event.key == K_UP or event.key == ord ('w'):
                moveUP = False
            elif event.key == K_DOWN or event.key == ord('s'):
                moveDOWN = False

         # <-- Dedent

    # Background Setup
    windowSurface.fill(WHITE)
    # Player Setup + Updating Screen
    if moveDOWN and player.bottom < WINDOWHEIGHT:
        player.top += MOVESPEED
    if moveUP and player.top > 0:
        player.top-= MOVESPEED
    if moveLEFT and player.left > 0:
        player.left -= MOVESPEED
    if moveRIGHT and player.right < WINDOWWIDTH:
        player.right += MOVESPEED
    pygame.draw.rect(windowSurface, GREEN, player)
    pygame.display.update()
    mainClock.tick(40)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM