簡體   English   中英

Pygame中方向相反時,玩家移動停止

[英]Player movement stops when direction reverses in Pygame

我在和pygame玩弄,最后我正在努力開發pong克隆。 我使用箭頭鍵實現了玩家的移動,一旦我從上升切換到立即下降,我的播放器就會死機,直到再次按下該方向鍵后才會移動。 這是我的代碼:

import sys, pygame

pygame.init()

display_width = 640
display_height = 480

display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Test Game")

black = (0,0,0)
white = (255,255,255)

clock = pygame.time.Clock()

running = True

class Player:

    def __init__(self,x,y,hspd,vspd,color,screen):
        self.x = x
        self.y = y
        self.hspd = hspd
        self.vspd = vspd
        self.color = color
        self.screen = screen

    def draw(self):
        pygame.draw.rect(self.screen,self.color,(self.x,self.y,32,32))

    def move(self):
        self.x += self.hspd
        self.y += self.vspd

player = Player(0,0,0,0,black,display)

while running:

    clock.tick(60)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                player.hspd = 0
            if event.key == pygame.K_LEFT:
                    player.hspd = 0
            if event.key == pygame.K_UP:
                player.vspd = 0
            if event.key == pygame.K_DOWN:
                player.vspd = 0

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                player.hspd = 4
            if event.key == pygame.K_LEFT:
                player.hspd = -4
            if event.key == pygame.K_UP:
                player.vspd = -4
            if event.key == pygame.K_DOWN:
                player.vspd = 4


    #Clear the screen
    display.fill(white)

    #Move objects
    player.move()
    #Draw objects
    player.draw()

    #Update the screen
    pygame.display.flip()

print "I made it!"
pygame.quit()
sys.exit()

我建議您使用key.get_pressed()來檢查當前按下的鍵集。

在您的場景中-當您按下並釋放(按此順序)時-速度設置為0,因此您需要檢查的按鍵不僅限於當前事件。

這是相關部分的工作版本:

def current_speed():
    # uses the fact that true = 1 and false = 0
    currently_pressed = pygame.key.get_pressed()
    hdir = currently_pressed[pygame.K_RIGHT] - currently_pressed[pygame.K_LEFT]
    vdir = currently_pressed[pygame.K_DOWN] - currently_pressed[pygame.K_UP]
    return hdir * 4, vdir * 4

while running:

    clock.tick(60)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

        player.hspd, player.vspd = current_speed()

    #Clear the screen
    display.fill(white)

    #Move objects
    player.move()
    #Draw objects
    player.draw()

    #Update the screen
    pygame.display.flip()

您的問題在這里:

if event.type == pygame.KEYUP:
        if event.key == pygame.K_RIGHT:
            player.hspd = 0
        if event.key == pygame.K_LEFT:
                player.hspd = 0
        if event.key == pygame.K_UP:
            player.vspd = 0
        if event.key == pygame.K_DOWN:
            player.vspd = 0

if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:
            player.hspd = 4
        if event.key == pygame.K_LEFT:
            player.hspd = -4
        if event.key == pygame.K_UP:
            player.vspd = -4
        if event.key == pygame.K_DOWN:
            player.vspd = 4  

我猜想您在立即切換鍵時仍會消耗掉按鍵事件,這意味着只要第一個事件尚未觸發其按鍵向上事件,就不會觸發其他按鍵按下事件。

編輯:也許最好檢查玩家是否在移動,如果只是在反向移動。 然后,您只需要檢查down事件。 否則,您的活動將被使用,並且無法正確檢查。 對於您的方法,您需要存儲自上一幀以來發生的鍵事件,並檢查該列表。

為了擴大LPK的答案,可能在處理您的向上鍵(來自event.key == pygame.K_UP)之前先處理您的向下鍵(對於event.key == pygame.K_DOWN)。 因此,當兩者都按下時(您可以確認這一點),您可能會感覺到運動,直到松開向上鍵。

暫無
暫無

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

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