亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pygame 循環檢查速度很少

Pygame 循環檢查速度很少

茅侃侃 2023-04-25 15:48:03
我正在嘗試在 pygame (python 3) 中重新創建蛇,我想做的是每一幀,通過檢查按鍵來檢查蛇的速度,但它很少意識到我正在按下一個鍵,我做錯了什么/我應該怎么做(代碼在下面),我不明白為什么這不起作用,因為其他所有東西都可以立即運行,例如 clear 函數,甚至 handle() 做的事情非常相似,所以它使得我不知道為什么它不起作用import pygamefrom pygame.locals import *import mathimport randompygame.init()display = pygame.display.set_mode((512, 512))pygame.display.set_caption("Snake")display.fill((255, 255, 255))def handle():    global x, y    for event in pygame.event.get():        if event.type == QUIT:            pygame.quit()def make_apple():    x, y = random.randint(0, 502), random.randint(0, 502)    pygame.draw.rect(display, (255, 0, 0), (x, y, 10, 10))    return x, y# -- COLLISION DETECTION -- #def r(fox, foy, cR, sox, soy):    dx = abs(fox - sox)    dy = abs(foy - soy)    if dx < cR and dy < cR:        return True    else:        return Falsedef clear(aX, aY):    global x, y    display.fill((255, 255, 255))    pygame.draw.rect(display, (255, 0, 0), (aX, aY, 10, 10))    draw_snake(x, y)def draw_snake(x, y):    pygame.draw.rect(display, (0, 255, 0), (x, y, 10, 10))def set_vel():    for event in pygame.event.get():        if event.type == KEYDOWN:            print("KEY")            if event.key == K_LEFT:                yVel = 0                xVel = -1            elif event.key == K_RIGHT:                yVel = 0                xVel = 1            elif event.key == K_UP:                yVel = -1                xVel = 0            elif event.key == K_DOWN:                yVel = 1                xVel = 0            return xVel, yVel    return 0, 0def update_pos(x, y, xV, yV):    x += xV    y += yV    return x, yaX, aY = make_apple()x, y = 256, 256length = 1eaten = Falsewhile True:    velX, velY = set_vel()    clear(aX, aY)    handle()    x, y = update_pos(x, y, velX, velY)    if eaten:        aX, aY = make_apple()        eaten = False    pygame.display.update()    if r(x, y, 3, aX, aY):        display.fill((255, 255, 255))        eaten = True
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

您的問題是,當您調用 時pygame.event.get(),該函數不僅獲取事件,而且還將它們從隊列中刪除。這意味著每幀調用它兩次(就像您在set_vel和中所做的那樣handle)會產生奇怪的結果。

當我寫 pygame 時,我for event in pygame.event.get()while True. 嘗試這樣做并將退出處理和速度變化移動到循環中True而不是它們自己的函數中。


查看完整回答
反對 回復 2023-04-25
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

正如另一個答案中提到的,pygame.event.get()獲取所有消息并將它們從隊列中刪除。因此,第一個或第二個循環獲取一個事件,但永遠不會兩個循環都獲取所有事件。這導致某些事件似乎被遺漏了。

在主應用程序循環中獲取一次事件列表并將列表傳遞給函數:

def handle(events):

? ? global x, y

? ? for event in events:

? ? ? ? if event.type == QUIT:

? ? ? ? ? ? pygame.quit()

def set_vel(events):

? ? for event in events:

? ? ? ? # [...]

while True:

? ? events = pygame.event.get()

??

? ? velX, velY = set_vel(events )

? ? clear(aX, aY)

? ? handle(events)


? ? # [...]?


查看完整回答
反對 回復 2023-04-25
  • 2 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號