簡體   English   中英

Pygame 未檢測到何時按下鍵(使用事件)

[英]Pygame not detecting when a key is pressed (using events)

我正在做一個蛇游戲,每當我按下一個箭頭鍵時,我都會嘗試讓它轉動。 但是,由於某種原因,pygame 在我按下它們時沒有檢測到。 我在另一個程序上嘗試了 move_snake function,它運行良好,所以我認為它會干擾它。 我就是想不通是什么。

重要提示:我使用 keys = pygame.key.get_pressed() 遍歷所有鍵並遍歷鍵並且該方法有效。 但是,每次我按下一個鍵時,這都會在我的程序中增加兩個回合。 即使我使用標志來防止這種情況發生,它仍然會這樣做,所以我不得不停止使用它。 如果有任何方法可以讓它停止這樣做,我會很高興知道。

無論如何,這是我的代碼:

import pygame
import random

pygame.init()

width = 800
height = 700

screen = pygame.display.set_mode((width, height))

snake_len = 2
snakes = []

dirx = 1
diry = 0
turning = False
run = True

turns = {}
turns1 = []

clock = pygame.time.Clock()

class Turns(object):
    def __init__(self, xdir, ydir):
        self.xdir = xdir
        self.ydir = ydir

class Body(object):
    def __init__(self, x, y, width, height, xdir, ydir):
        self.x = x
        self.y = y
        self.w = width
        self.h = height
        self.xdir = xdir
        self.ydir = ydir

def get_body(x, y, w, h, xdir, ydir):
    return Body(x, y, w, h, xdir, ydir)

def add_turn(xdir, ydir):
    return Turns(xdir, ydir)

def turn_snake(snek):
    global dirx, diry, turning

    turn = turns[0]
    snek.dirx = turns[0].xdir
    snek.diry = turns[0].ydir

    tail = get_tail()

    if snek == tail:
        turns.remove(turn)

    turning = False

def get_tail():
    if snakes:
        tail = snakes[-1]
        return tail

def add_snake():
    tail = get_tail()
    if not snakes:
        snek = get_body(400, 350, 10, 10, 1, 0)
        snakes.append(snek)
    else:
        if dirx == 1:
            snek = get_body(tail.x - tail.w, tail.y, tail.w, tail.h, snakes[0].xdir, snakes[0].ydir)
            snakes.append(snek)
        if diry == 1:
            snek = get_body(tail.x, tail.y - tail.h, tail.w, tail.h, snakes[0].xdir, snakes[0].ydir)
            snakes.append(snek)
        if dirx == -1:
            snek = get_body(tail.x + tail.w, tail.y, tail.w, tail.h, snakes[0].xdir, snakes[0].ydir)
            snakes.append(snek)
        if diry == -1:
            snek = get_body(tail.x, tail.y + tail.h, tail.w, tail.h, snakes[0].xdir, snakes[0].ydir)
            snakes.append(snek)

def draw_snake():
    screen.fill((0, 0, 0))
    for snake in snakes:
        pygame.draw.rect(screen, (95, 53, 203), (snake.x, snake.y, snake.w, snake.h))

def update_snake():
    for snake in snakes:
        if turns:
            if snake.x == turns[snakes[0].x, snakes[0].y].x and snake.y == turns[0].y:
                turn_snake(snake)
                snake.x += snake.dirx
                snake.y += snake.diry

def move_snake():
    global dirx, diry, turning

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                turns1.append('left')
            if event.key == pygame.K_RIGHT:
                turn = add_turn(1, 0)
                turns[snakes[0].x, snakes[0].y] = turn
            if event.key == pygame.K_UP:
                turn = add_turn(0, -1)
                turns[snakes[0].x, snakes[0].y] = turn
            if event.key == pygame.K_DOWN:
                turn = add_turn(0, 1)
                turns[snakes[0].x, snakes[0].y] = turn

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.display.quit()

    if len(snakes) < snake_len:
        add_snake()

    update_snake()
    draw_snake()
    move_snake()
    clock.tick(30)
    pygame.display.update()

編輯:

顯然只使用一個事件循環解決了主程序上的問題,但這仍然有點奇怪。 我運行了一個只運行 move_snake function 的調試程序,它在兩個事件循環中運行得非常好。

這是代碼:

import pygame

true = True
turns = []
screen = pygame.display.set_mode((700, 800))

def move_snake():
    global dirx, diry, turning
    keys = pygame.key.get_pressed()

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                turns.append('left')
            if event.key == pygame.K_RIGHT:
                 turns.append('right')
            if event.key == pygame.K_UP:
                turns.append('up')
            if event.key == pygame.K_DOWN:
                turns.append('down')

    print(turns)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.display.quit()
    move_snake()

這只是讓我對主程序中發生的事情仍然沒有一個好的答案......如果有人有任何想法,我將不勝感激。 謝謝!

我不是 100% 確定,因為我現在不能自己檢查它,但是如果你像這樣修復代碼的最后一部分,那么它應該可以工作:

def move_snake(event):
    global dirx, diry, turning

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            turns1.append('left')
        if event.key == pygame.K_RIGHT:
            turn = add_turn(1, 0)
            turns[snakes[0].x, snakes[0].y] = turn
        if event.key == pygame.K_UP:
            turn = add_turn(0, -1)
            turns[snakes[0].x, snakes[0].y] = turn
        if event.key == pygame.K_DOWN:
            turn = add_turn(0, 1)
            turns[snakes[0].x, snakes[0].y] = turn

while run:
    ev=pygame.event.wait():

    if ev.type == pygame.QUIT:
        run = False
        pygame.display.quit()

    if len(snakes) < snake_len:
        add_snake()

    update_snake()
    draw_snake()
    move_snake(ev)
    clock.tick(30)
    pygame.display.update()

基本上你在主循環中一次解析一個事件,如果它不是一個 QUIT 事件,那么你將它傳遞給 move_snake function 作為參數來檢查它是否是一個 KEYDOWN 事件。

你應該只有一個循環

for event in pygame.event.get(): 

第二個循環無法獲取任何事件,因為第一個循環獲取所有事件。

所以你應該使用move_snake(event)參數event但沒有for -loop 並在主循環中for -loop 中運行它:

def move_snake(event):
    global dirx, diry, turning

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            turns1.append('left')
        if event.key == pygame.K_RIGHT:
            turn = add_turn(1, 0)
            turns[snakes[0].x, snakes[0].y] = turn
        if event.key == pygame.K_UP:
            turn = add_turn(0, -1)
            turns[snakes[0].x, snakes[0].y] = turn
        if event.key == pygame.K_DOWN:
            turn = add_turn(0, 1)
            turns[snakes[0].x, snakes[0].y] = turn

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.display.quit()
        move_snake(event) # <-- run it with every event

    if len(snakes) < snake_len:
        add_snake()

    update_snake()
    draw_snake()

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

暫無
暫無

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

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