目前,当用户按下“ 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”水平移动坦克。
答案 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
的开头设置了变量tanky
和gameloop
,所以在帧的开头重置了水箱的位置:
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))
# [...]