代码如下:
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()
Run Code Online (Sandbox Code Playgroud)
我知道,当我按右/左键时,图像向左和向右移动 10 个像素。但是我该如何做到这一点,当我按住按键时,它会重复该功能,如果我松开按键,它就会停止。我尝试添加一个 while 循环,所做的只是让这些人无限地向右/向左移动,那么是否有一个 pygame 模块可以添加它?
您不需要为此使用另一个模块,但这里需要另一种方法和更多的更正。
首先:每帧执行一次位块传输,而不是每次在某处更改某些内容时执行一次。
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()
Run Code Online (Sandbox Code Playgroud)
然后第二:改变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
Run Code Online (Sandbox Code Playgroud)
然后检查循环中的某个位置,move_left 或 move_right 变量是否为 true:
if move_right == True:
playerx += 10
Run Code Online (Sandbox Code Playgroud)
当我们按下该键时,我们会触发 KEYDOWN 事件,该事件将变量设置为 true。如果该变量为 true,程序将在该变量为 true 时每帧更改玩家的位置(注意:每帧 10 像素可能太多),并且在我们触发 KEYUP 事件之前它将保持为 true。换句话说:当按下键时,变量为 true 并且玩家移动。当我们松开按键时,变量变为 false 并且玩家停止移动。
我没有给你一个现成的代码,这只是它是如何完成的解释。如果您确实不知道如何实施,请随时再次询问。