对于pygame.event.get()中的事件:妨碍了计时器



我正在用pygame制作一个文明建设者游戏。现在,您所能做的就是点击城市,将它们声明为您的城市,每 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()

[...]所以我现在遇到的问题是因为 for 事件pygame.event.get():屏幕仅在我移动鼠标时更新 [...]

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

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

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

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

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()

最新更新