gpt4 book ai didi

python - 对于 pygame.event.get() 中的事件 : is getting in the way of Timer

转载 作者:行者123 更新时间:2023-12-01 06:39:35 26 4
gpt4 key购买 nike

我正在 pygame 中制作文明 build 者游戏。现在你能做的就是点击城市来声明它们是你的,每 2 秒你就可以获得相当于你拥有的城市数量的金钱。所以我现在遇到的问题是因为for event in pygame.event.get():仅当我移动鼠标时屏幕才会更新。我不确定如何重新排列代码以便它自行更新。

import pygame, time, random, threading
import numpy as np
from PIL import Image
from threading import Timer

pygame.init()
width=525
height=700
screen = pygame.display.set_mode( (width, height ) )
pygame.display.set_caption('Territory Game')

font = pygame.font.Font('freesansbold.ttf', 20)

base = pygame.image.load("base.png").convert()
character = pygame.image.load("character.png").convert()
captured_base = pygame.image.load("captured-base.png").convert()

xIm = 10 # x coordnate of image
yIm = 10 # y coordinate of image

Startlist = []
for lop in range(441):
Startlist.append(random.randint(0,20))
Map = np.reshape((Startlist),(21, 21))
Startlist = []
Map[10,10] = 1
xcounter = -1
captured = ([[10,10]])
money = 0

def printit():
global money
money += len(captured)
t = Timer(2, printit)
t.start()
t = Timer(2, printit)
t.start()
running = True
while (running):
for event in pygame.event.get():
screen.fill((79,250,91))
pygame.draw.rect(screen, (0,0,0), (0,525,525,10))
pygame.draw.rect(screen, (164,164,164), (0,535,525,165))
for iterate in np.nditer(Map):
xcounter +=1
Icony = int(xcounter/21)
Iconx = xcounter-(Icony*21)
if iterate == 1:
if [Iconx,Icony] not in captured:
screen.blit(base,(Iconx*25,Icony*25))
if [Iconx,Icony] in captured:
screen.blit(captured_base,(Iconx*25,Icony*25))
if event.type == pygame.MOUSEBUTTONDOWN:
#Set the x, y postions of the mouse click
x, y = event.pos
if base.get_rect().collidepoint(x-(Iconx*25), y-(Icony*25)):
if [Iconx,Icony] not in captured:
captured.append([Iconx,Icony])
for thing in captured:
screen.blit(captured_base,(thing[0]*25,thing[1]*25))

screen.blit(font.render("Money: "+str(money), True, (0,0,0)),(5, 541))
xcounter = -1
pygame.display.flip()
if event.type == pygame.QUIT:
running = False
pygame.quit()

最佳答案

[...] So the problem I'm at right now is because of for event in pygame.event.get(): the screen only updates when I move my mouse [...]

答案被编码在问题中。您必须在主应用程序循环中而不是事件循环中更新窗口。事件循环必须处理用户输入(在您的问题的评论中提到)并更改游戏状态以反射(reflect)输入。但事件循环的职责不是绘制场景。

为了实现最佳控制流,主应用程序循环必须执行以下操作:

  • 处理事件
  • 清除显示
  • 绘制场景
  • 更新显示

这会导致场景在游戏的当前状态的每一帧中重新绘制:

running = True
while running:

# handle the events
for event in pygame.event.get():

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

if event.type == pygame.MOUSEBUTTONDOWN:
xcounter = -1
for iterate in np.nditer(Map):
xcounter +=1
Icony = int(xcounter/21)
Iconx = xcounter-(Icony*21)
if iterate == 1:
#Set the x, y postions of the mouse click
x, y = event.pos
if base.get_rect().collidepoint(x-(Iconx*25), y-(Icony*25)):
if [Iconx,Icony] not in captured:
captured.append([Iconx,Icony])

# clear the display
screen.fill((79,250,91))

# draw the scene
pygame.draw.rect(screen, (0,0,0), (0,525,525,10))
pygame.draw.rect(screen, (164,164,164), (0,535,525,165))

xcounter = -1
for iterate in np.nditer(Map):
xcounter += 1
Icony = int(xcounter/21)
Iconx = xcounter-(Icony*21)
if iterate == 1:
if [Iconx,Icony] not in captured:
screen.blit(base,(Iconx*25,Icony*25))
if [Iconx,Icony] in captured:
screen.blit(captured_base,(Iconx*25,Icony*25))

for thing in captured:
screen.blit(captured_base,(thing[0]*25,thing[1]*25))

screen.blit(font.render("Money: "+str(money), True, (0,0,0)),(5, 541))

# update the display
pygame.display.flip()

关于python - 对于 pygame.event.get() 中的事件 : is getting in the way of Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com