为什么当我按“ a”和“ d”时我的水箱不动?

时间:2019-05-29 19:38:15

标签: python python-3.x pygame user-controls

目前,当用户按下“ a”和“ d”时,我一直想让坦克移动。涉及按动键移动坦克的线似乎是正确的,我认为应该行得通。这也是我第一次使用这些论坛之一。请提供反馈,以便我改善。谢谢您的帮助。

我已经向我的老师和朋友寻求帮助,但他们都想知道为什么坦克不会移动。我也在互联网和YouTube上搜索了答案。奇怪的是,我和我的朋友直接复制了有关用户移动的youtube视频,用户可以在其中移动矩形。我的朋友可以按住“ w”,“ a”,“ s”或“ d”来移动矩形,但是我不能按住“ w”,“ a”,“ s”或“ d”来移动矩形它,但需要向该按钮发送垃圾邮件。奇怪的是,当您移动鼠标时,我可以同时按住“ w”,“ a”,“ s”或“ d”。

import pygame
from pygame.locals import *
import math
import random

width = 640 
height = 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("2 Player Tanks")


def gameloop(): 
    pygame.init()
    time = pygame.time.get_ticks()

    screen.fill(white)

    tankx = 100
    tanky = 100
    tankwidth = 40
    tankheight = 20
    turretwidth = 5 
    wheelwidth = 5
    tankmove = 5

    def tank(x,y):
        x = int(x)
        y = int(y)
        pygame.draw.circle(screen,black,(x,y),10)
        pygame.draw.rect(screen,black,(x-tankheight,y,tankwidth,tankheight))
        pygame.draw.line(screen,black,(x,y),(x-20,y-20), turretwidth)

        startx = 15
        for i in range(7):
            pygame.draw.circle(screen,black,(x-startx,y+20),wheelwidth)
            startx -= 5

   for event in pygame.event.get():
        if event.type == pygame.QUIT:
           pygame.quit()

        keys= pygame.key.get_pressed()

        if keys[pygame.K_a]:
            tankx -= tankmove
        if keys[pygame.K_d]:
            tankx += tankmove
        if keys[pygame.K_w]:
            tanky -= tankmove
        if keys[pygame.K_s]:
            tanky += tankmove         

         tank(tankx,tanky)
         pygame.display.update()

gameloop()

我希望玩家能够使用“ a”和“ d”水平移动坦克。

1 个答案:

答案 0 :(得分:1)

仅当事件发生时才执行事件循环。这意味着在按下某个键或释放一个键时执行该操作;但是,当按下一个键时,不会发生任何事件,并且不会执行事件循环。

您必须在主循环(在gameloop范围内)而不是在事件循环中评估按键:

例如

def gameloop(): 

    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    # <--
    keys= pygame.key.get_pressed()

    if keys[pygame.K_a]:
        tankx -= tankmove
    if keys[pygame.K_d]:
        tankx += tankmove
    if keys[pygame.K_w]:
        tanky -= tankmove
    if keys[pygame.K_s]:
        tanky += tankmove         

    tank(tankx,tanky)
    pygame.display.update()

注意:pygame.key.get_pressed()返回键的当前状态,并在调用pygame.event.get()时评估并更新状态。


由于在帧tankx的开头设置了变量tankygameloop,所以在帧的开头重置了水箱的位置:

 def gameloop(): 
      #[...]

      tankx = 100
      tanky = 100

在全局范围内定义变量,并使用global statement来访问它们。
降低坦克的速度,因为它的移动速度非常快(tankmove = 1)。

pygame.init()仅应在应用程序开始时调用一次。

例如

def gameloop(): 
    global tankx, tanky, tankmove

    tankwidth = 40
    tankheight = 20
    turretwidth = 5 
    wheelwidth = 5

    time = pygame.time.get_ticks()

    screen.fill(white)

    # [...]

pygame.init()

tankx = 100
tanky = 100
tankmove = 1
run = True
while run:
    gameloop()

  

我可以在随机背景下移动坦克,但程序会继续绘制新的坦克。为了解决这个问题,我添加了一个screen.fill(white)。这解决了绘图问题,但是现在我没有背景了。

不要在窗口上绘制 random 背景。创建一个pygame.Surface并在表面上绘制 random 背景。
.blit每帧中屏幕的背景表面:

background_surface = pygame.Surface((widht, height))
# draw background to "background_surface" rather then "screen"
# [...]
def gameloop():

    # [...]

    # blit background instead of screen.fill(white)
    screen.blit(background_surface, (0, 0))

    # [...]