2014-12-31 6 views
0

Я просто хочу переместить блок влево и вправо, но не сейчас, почему код прошивки не проходит. Когда я открываю программу, он просто показывает «танк» в своем положении, но вы не можете перемещать его с помощью левых или правых клавиш.Событие Keydown для 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() 

ответ

0

это потому, что обновленные tankX значения не влияют на tank объект. есть много способов заставить его работать. например, вставив повторной инициализации бака в цикле while True:

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() 
0

Вы не должны обновить переменные tankX и ТанКи, так как это не влияет на tank объект Rect. Вам не нужно повторно инициализировать объект tank, так как это, вероятно, пустая трата ресурсов. Более эффективным способом является простое обновление значений x и y объекта tank с использованием его функции move_ip().

В главной петле ...

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() 
Смежные вопросы