下面是代码:
import pygame, sys
from pygame.locals import *
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
GRASSCOLOR = GREEN
BGCOLOR = WHITE
WINDOWWIDTH = 500
WINDOWHEIGHT = 300
def main():
pygame.init()
global DISPLAYSURF
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
pygame.display.set_caption('Platformer')
player = pygame.image.load('megaman_running_sprites_by_cobalt_blue_knight-d2y1i8s.png')
playerx = 140
playery = 10
DISPLAYSURF.fill(BGCOLOR)
DISPLAYSURF.blit(player, (10, 140))
while True: # Event handling loop
ground()
mousex, mousey = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == KEYDOWN:
if event.key == K_RIGHT:
DISPLAYSURF.fill(BGCOLOR)
playery += 10
DISPLAYSURF.blit(player, (playery, playerx))
elif event.key == K_LEFT:
DISPLAYSURF.fill(BGCOLOR)
playery -= 10
DISPLAYSURF.blit(player, (playery, playerx))
elif event.key == K_SPACE:
DISPLAYSURF.fill(BGCOLOR)
playerx -= 15
DISPLAYSURF.blit(player, (playery, playerx))
DISPLAYSURF.fill(BGCOLOR)
playerx -= 15
DISPLAYSURF.blit(player, (playery, playerx))
DISPLAYSURF.fill(BGCOLOR)
playerx -= 10
DISPLAYSURF.blit(player, (playery, playerx))
DISPLAYSURF.fill(BGCOLOR)
playerx -= 5
DISPLAYSURF.blit(player, (playery, playerx))
elif event.type == KEYUP:
if event.key == K_SPACE:
pygame.time.wait(100)
DISPLAYSURF.fill(BGCOLOR)
playerx += 45
DISPLAYSURF.blit(player, (playery, playerx))
elif event.key == K_RIGHT:
DISPLAYSURF.fill(BGCOLOR)
DISPLAYSURF.blit(player, (playery, playerx))
pygame.display.update()
def terminate(): # Terminates the program
pygame.quit()
sys.exit()
def ground():
pygame.draw.rect(DISPLAYSURF, GRASSCOLOR, (0, 250, WINDOWWIDTH, 100))
if __name__ == '__main__':
main()
我是这样的,当我按右/左键时,图像左右10像素。但是当我按住键时,我会如何做到这一点,它重复了这个功能,如果我让键走了,它就会停止。我尝试添加一个while循环,所有这一切都是让这些人无限地向左/右移动,那么有一个pygame模块来添加它吗?
答案 0 :(得分:3)
你不需要另外一个模块,但这里需要另一种方法和更多的修正。
首先:每帧进行一次blitting运行,而不是每当你在某处改变某些东西时运行一次。
while True: # Event handling loop
ground()
mousex, mousey = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == QUIT:
terminate()
elif event.type == KEYDOWN:
if event.key == K_RIGHT:
playery += 10
elif event.key == K_LEFT:
playery -= 10
elif event.key == K_SPACE:
#WTH are you doing here anyway???
elif event.type == KEYUP:
if event.key == K_SPACE:
pygame.time.wait(100) #What is this doing here?
DISPLAYSURF.fill(BGCOLOR)
DISPLAYSURF.blit(player, (playerx, playery))
pygame.display.update()
然后第二个:更改x和y值,这是错误的方式。 x是水平的,y是垂直的。它总是和这样的地方,如果你在这里重新发明轮子,人们就不能再读你的代码了。
现在针对您要求的问题:
您需要定义一个变量,例如“move_left”和“move_right”。
在循环事件检查中,您可以按照以下方式处理它们:
if event.type == KEYDOWN:
if event.key == K_RIGHT:
move_right = True
if event.type == KEYUP:
if event.key == K_RIGHT:
move_right = False
然后检查循环中的某个位置,move_left或move_right变量是否为true:
if move_right == True:
playerx += 10
当我们按下键时,我们触发KEYDOWN事件,该事件将变量设置为true。如果变量为真,程序将改变玩家的位置(注意:每帧10个像素可能太多),而此变量为真,并且在我们触发KEYUP事件之前它一直保持为真。换句话说:当按下键时,变量为真且玩家移动。当我们释放键时,变量变为false并且玩家停止移动。
我没有给你一个现成的代码,这只是解释它是如何完成的。如果你真的无法弄清楚如何实施,请随时再问。
答案 1 :(得分:1)
可能会有所帮助
key_input = pygame.key.get_pressed()
if key_input[pygame.K_LEFT]:
playery += 1
if key_input[pygame.K_RIGHT]:
playerx -= 1
答案 2 :(得分:0)
您可以使用pygame.key.set_repeat()
函数来允许多个事件。