[英]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.