簡體   English   中英

Pygame的按鍵事件

[英]Keydown event for Pygame

我只想向左和向右移動一個塊,但是現在不為什么按鍵代碼無法通過。 當我打開程序時,它只是在位置顯示了“水箱”,但是您不能使用向左或向右鍵移動它。

import pygame, sys
from pygame.locals import *

WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
TANK_SIZE = 20

BLACK = (0  ,0  ,0  )
WHITE = (255,255,255)

def drawArena():
    DISPLAYSURF.fill(BLACK)

def drawTank(tank):
    pygame.draw.rect(DISPLAYSURF, WHITE, tank)

def main():
    pygame.init()
    global DISPLAYSURF
    DISPLAYSURF = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption('Tanks')

    tankX = 200
    tankY = 200

    tank = pygame.Rect(tankX, tankY, TANK_SIZE, TANK_SIZE)

    drawArena()
    drawTank(tank)

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

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    tankX -= 20
                if event.key == pygame.K_RIGHT:
                    tankX += 20

        drawArena()
        drawTank(tank)

        pygame.display.update()

if __name__ == '__main__':
    main()

這是因為更新的tankX值不會影響tank對象。 有很多方法可以使它起作用。 例如,在while True循環中插入tank的重新初始化:

import pygame, sys
from pygame.locals import *

WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
TANK_SIZE = 20

BLACK = (0  ,0  ,0  )
WHITE = (255,255,255)

def drawArena():
    DISPLAYSURF.fill(BLACK)

def drawTank(tank):
    pygame.draw.rect(DISPLAYSURF, WHITE, tank)

def main():
    pygame.init()
    global DISPLAYSURF
    DISPLAYSURF = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption('Tanks')

    tankX = 200
    tankY = 200

    tank = pygame.Rect(tankX, tankY, TANK_SIZE, TANK_SIZE)

    drawArena()
    drawTank(tank)

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

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    tankX -= 20
                if event.key == pygame.K_RIGHT:
                    tankX += 20

        tank = pygame.Rect(tankX, tankY, TANK_SIZE, TANK_SIZE)

        drawArena()
        drawTank(tank)

        pygame.display.update()

if __name__ == '__main__':
    main()

您不應該更新tankX和tankY變量,因為這不會影響tank Rect對象。 您不需要重新初始化tank對象,因為這很可能浪費資源。 一種更有效的方法是使用它的move_ip()函數直接更新tank對象的x和y值。

在您的主循環中...

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

        if event.type == pygame.KEYDOWN:
            if event.type == pygame.K_LEFT:
                tank.move_ip(-20, 0)
            if event.type == pygame.K_RIGHT:
                tank.move_ip(20, 0)

    drawArena()
    drawTank(tank)

    pygame.display.update()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM