簡體   English   中英

按住鍵時如何使精靈移動

[英]How can I make a sprite move when key is held down

目前,每次按下一個鍵時,精靈只會移動 1 個像素。 當按住左鍵或右鍵時,如何使水管工精靈不斷移動?

while running:
    setup_background()
    spriteimg = plumberright

    screen.blit(spriteimg,(x1, y1))

    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False
         elif event.type == pygame.KEYDOWN:
             if event.key == pygame.K_UP:
                 x1 = x1 + 0
                 y1 = y1 - 1
             elif event.key == pygame.K_DOWN:
                 x1 = x1 + 0
                 y1 = y1 + 1
             elif event.key == pygame.K_LEFT:
                 x1 = x1 -1
                 y1 = y1 + 0
             elif event.key == pygame.K_RIGHT:
                 x1 = x1 + 1
                 y1 = y1 + 0

    pygame.display.flip()
    clock.tick(120)

您可以使用pygame.key.get_pressed來做到這一點。

例子:

while running:
    keys = pygame.key.get_pressed()  #checking pressed keys
    if keys[pygame.K_UP]:
        y1 -= 1
    if keys[pygame.K_DOWN]:
        y1 += 1

鍵盤事件(參見pygame.event模塊)僅在按鍵狀態更改時發生一次。 KEYDOWN事件在每次按下某個鍵時發生一次。 KEYUP每次釋放一個鍵時發生一次。 將鍵盤事件用於單個操作或逐步移動。

如果要實現連續移動,則必須使用pygame.key.get_pressed() pygame.key.get_pressed()返回一個包含每個鍵狀態的列表。 如果按住某個鍵,則該鍵的狀態為True ,否則為False 使用pygame.key.get_pressed()評估按鈕的當前狀態並獲得連續移動:

while running:
    for event in pygame.event.get():
         if event.type == pygame.QUIT:
             running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        x1 -= 1
    if keys[pygame.K_RIGHT]:
        x1 += 1
    if keys[pygame.K_UP]:
        y1 -= 1
    if keys[pygame.K_DOWN]:
        y1 += 1

    setup_background()
    spriteimg = plumberright
    screen.blit(spriteimg, (x1, y1))

    pygame.display.flip()
    clock.tick(100)

另請參閱鍵和鍵盤事件

最小的例子: repl.it/@Rabbid76/PyGame-ContinuousMovement

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

rect = pygame.Rect(0, 0, 20, 20)
rect.center = window.get_rect().center
vel = 5

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            print(pygame.key.name(event.key))

    keys = pygame.key.get_pressed()
    
    rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel
    rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel
        
    rect.centerx = rect.centerx % window.get_width()
    rect.centery = rect.centery % window.get_height()

    window.fill(0)
    pygame.draw.rect(window, (255, 0, 0), rect)
    pygame.display.flip()

pygame.quit()
exit()

使用這個伙伴,它會很好用,把它放在你的 for 循環中。

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                playerX_change = -0.1
            if event.key == pygame.K_d:
                playerX_change = 0.1
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a or event.key == pygame.K_d:
                playerX_change = 0

    playerX += playerX_change
    player(playerX, playerY)
    pygame.display.update()

一個更簡單的方法可以是:KEYDOWN事件設置一個移動標志。 KEYUP 事件清除標志。 移動過程只需檢查每一幀的標志。 如果設置移動,如果未設置,則不移動。

您可以使用 KEYUP 和 KEYDOWN 事件。 您可以在按鍵按下時連續執行任務,而當按鍵向上時,只需停止該任務

for event in pygame.event.get():
    if event.type == pygame.KEYUP:
        if event.key==K_DOWN:
            print("down key is not pressed")
    elif event.type == pygame.KEYDOWN:
        if event.key==K_DOWN:
            print('down key is not pressed now')
    
    pygame.event.clear() #optional only if your code requires 
    #this will clear all event and the for loop will executed only once

我建議使用“時鍾”功能。

while running:
spriteimg = plumberright
screen.blit(spriteimg,(x1, y1))
spriteimg_x = 0
spriteimg_y = 0
spriteimg_speed = 0.2
dt = clock.tick(120)
    if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_UP:
             x1 = x1 + 0
             spriteimg_y -= spriteimg_speed
         elif event.key == pygame.K_DOWN:
             x1 = x1 + 0
             spriteimg_y += spriteimg_speed
         elif event.key == pygame.K_LEFT:
             spriteimg_x -= spriteimg_speed
             y1 = y1 + 0
         elif event.key == pygame.K_RIGHT:
             spriteimg_y -= spriteimg_speed
             y1 = y1 + 0
    x1 += spriteimg_speed * dt
    y1 += spriteimg_speed * dt

這條路怎么樣? 而且...我認為蜱的價值是如此之高..無論如何,我希望這種方式對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM