对于pygame.event.get()中的事件:正在妨碍Tim

2024-09-23 22:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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()

Tags: inimageimporteventforbaseifscreen
1条回答
网友
1楼 · 发布于 2024-09-23 22:23:31

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

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

对于最佳控制流,主应用程序循环必须执行以下操作:

  • 处理事件
  • 清除显示器
  • 画场景
  • 更新显示

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

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

相关问题 更多 >