簡體   English   中英

Pygame KEYUP,KEYDOWN導致幻影移動

[英]Pygame KEYUP, KEYDOWN causing ghost movement

我在學習KEYUP和KEYDOWN時遇到了麻煩。 基本上,在用戶崩潰到窗口的任意一側后,游戲會按預期重置。 即使沒有按下或釋放任何鍵,也不希望正方形再次開始移動。

理想的事件系列:-用戶崩潰-游戲在原始起始位置(固定)以正方形重置-按下移動鍵並進行正方形移動

對於為什么會發生這種情況的任何見解都會很棒。

謝謝

import pygame
import time

pygame.init()

display_width = 800
display_height = 600

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

car_width = 75

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('A bit Racey')
clock = pygame.time.Clock()


def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()

    time.sleep(2)

    game_loop()


def crash():
    message_display('You Crashed')


def game_loop():
    x = 200
    y = 200

    x_change = 0
    y_change = 0

    gameExit = False

    while not gameExit:

        # Movement logic
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    x_change += 5
                if event.key == pygame.K_LEFT:
                    x_change += -5

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    x_change += -5
                if event.key == pygame.K_LEFT:
                    x_change += 5

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change += -5
                if event.key == pygame.K_DOWN:
                    y_change += 5

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    y_change += 5
                if event.key == pygame.K_DOWN:
                    y_change += -5

        x += x_change
        y += y_change

        gameDisplay.fill(white)
        pygame.draw.rect(gameDisplay, red, [x, y, 75, 75])

        # Check if border hit
        if x > display_width - car_width or x < 0:
            crash()
        if y > display_height - car_width or y < 0:
            crash()

        pygame.display.update()
        clock.tick(60)


game_loop()
pygame.quit()
quit()

修改全局變量,事件和大量標志。

只需使用pygame.key.get_pressed即可獲取鍵盤的當前狀態。 為每個箭頭鍵分配一個運動矢量,將其累加,歸一化,然后就可以了。

另外,如果您想對矩形做某事,只需使用Rect類。 這將使您的生活更加輕松。

這是一個正在運行的示例:

import pygame
import time

pygame.init()

display_width = 800
display_height = 600

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

car_width = 75

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('A bit Racey')
clock = pygame.time.Clock()


def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()

    time.sleep(2)

    game_loop()


def crash():
    message_display('You Crashed')

keymap = {
    pygame.K_RIGHT: pygame.math.Vector2(1, 0),
    pygame.K_LEFT: pygame.math.Vector2(-1, 0),
    pygame.K_UP: pygame.math.Vector2(0, -1),
    pygame.K_DOWN: pygame.math.Vector2(0, 1)
}

def game_loop():

    # we want to draw a rect, so we simple use Rect
    rect = pygame.rect.Rect(200, 200, 75, 75)

    gameExit = False

    while not gameExit:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        # get the state of the keyboard
        pressed = pygame.key.get_pressed()
        # get all the direction vectors from the keymap of all keys that are pressed
        vectors = (keymap[key] for key in keymap if pressed[key])
        # add them up to we get a single vector of the final direction
        direction = pygame.math.Vector2(0, 0)
        for v in vectors:
            direction += v

        # if we have to move, we normalize the direction vector first
        # this ensures we're always moving at the correct speed, even diagonally
        if direction.length() > 0:
            rect.move_ip(*direction.normalize()*5)

        gameDisplay.fill(white)
        pygame.draw.rect(gameDisplay, red, rect)

        # Check if border hit
        # See how easy the check is
        if not gameDisplay.get_rect().contains(rect):
            crash()

        pygame.display.update()
        clock.tick(60)


game_loop()
pygame.quit()
quit()

您的代碼還有其他一些問題:

例如,如果使用time.sleep(2) ,則整個程序將凍結。 這意味着您無法在等待時關閉窗口,並且窗口管理器等將不會重新繪制窗口。

另外,您的代碼包含一個無限循環。 如果您經常碰壁,就會遇到堆棧溢出的情況,因為game_loop調用會crash ,從而又調用game_loop 起初這可能不是一個大問題,但要記住一點。

您需要將游戲變量(x,y,x_change,y_change)設置為默認值,很可能是在crash()后使用crash crash()函數。 pygame不會為您做到這一點。

要么使變量成為全局變量,要么使用一些可變對象(例如字典)從其他方法訪問它們。

正如Daniel Kukiela所說,您可以將“ x_change”和“ y_change”設置為全局變量,並在開始時將它們的值設置為0,據我所知,這是工作項目。

import pygame
import time

pygame.init()

display_width = 800
display_height = 600

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

car_width = 75
x_change = 0
y_change = 0

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('A bit Racey')
clock = pygame.time.Clock()


def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()


def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()

    time.sleep(2)

    game_loop()


def crash():
    message_display('You Crashed')


def game_loop():
    x = 200
    y = 200
    global x_change
    x_change == 0
    global y_change
    y_change == 0



    gameExit = False

    while not gameExit:

        # Movement logic
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    x_change += 5
                if event.key == pygame.K_LEFT:
                    x_change += -5

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    x_change += -5
                if event.key == pygame.K_LEFT:
                    x_change += 5

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change += -5
                if event.key == pygame.K_DOWN:
                    y_change += 5

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                    y_change += 5
                if event.key == pygame.K_DOWN:
                    y_change += -5

        x += x_change
        y += y_change

        gameDisplay.fill(white)
        pygame.draw.rect(gameDisplay, red, [x, y, 75, 75])

        # Check if border hit
        if x > display_width - car_width or x < 0:
            crash()
        if y > display_height - car_width or y < 0:
            crash()

        pygame.display.update()
        clock.tick(60)


game_loop()
pygame.quit()
quit()

暫無
暫無

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

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