python - 为什么这个 pygame 程序不起作用,所以当我将鼠标悬停在计算机屏幕上时它变成蓝色?
问题描述
您好,我对 pygame 还是很陌生,我正在尝试为用户将鼠标悬停在计算机屏幕上然后屏幕变为蓝色的游戏做一个介绍,以便表明当您按下它时游戏将开始。但是,蓝色矩形根本没有出现?顺便说一句,introScreen 就像一个 gif,但由许多不同的帧构成。
这是我的代码:
import pygame
import pygame.gfxdraw
import threading
pygame.init()
width = 800
height = 600
fps = 30
clock = pygame.time.Clock()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
screen = pygame.display.set_mode((width, height))
def introLoop():
while intro:
for i in range(0, 26):
clock.tick(8)
i = str(i)
introScreen = pygame.image.load("introScreen/" + i + ".gif")
introScreen = pygame.transform.scale(introScreen, (width, height))
screen.blit(introScreen, (30, 30))
pygame.display.flip()
def gameLoop():
while intro:
mouseX, mouseY = pygame.mouse.get_pos()
startRectArea = pygame.Rect(279, 276, 220, 128)
if startRectArea.collidepoint(mouseX, mouseY):
StartRect = pygame.draw.rect(screen, blue, (279, 276, 220, 128), 0)
pygame.display.update()
for event in pygame.event.get():
holder = 0
introThread = threading.Thread(target = introLoop)
gameThread = threading.Thread(target = gameLoop)
intro = True
introThread.start()
gameThread.start()
没有错误消息只是不显示蓝色矩形?请帮忙,因为我需要这个用于学校项目。
解决方案
要在 PyGame 中使用多线程,您必须考虑两件事:
在主线程中处理一个事件循环
在一个线程中完成所有的绘图和窗口的更新。如果存在“intro”线程和“game”线程,则“intro”线程必须首先终止,然后“game”线程才能启动。
在主线程(程序)中,您必须声明线程并初始化控制(状态)变量。立即启动“介绍”线程并运行事件循环。
我建议至少实现pygame.QUIT
,它表示程序必须终止 ( run = False
)。
此外,可以连续检查鼠标是否在起始区域(inStartRect = startRectArea.collidepoint(*pygame.mouse.get_pos())
):
introThread = threading.Thread(target = introLoop)
gameThread = threading.Thread(target = gameLoop)
run = True
intro = True
inStartRect = False
startRectArea = pygame.Rect(279, 276, 220, 128)
introThread.start()
while run:
if intro:
inStartRect = startRectArea.collidepoint(*pygame.mouse.get_pos())
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.MOUSEBUTTONDOWN and inStartRect:
intro = False
在介绍线程中,必须绘制整个介绍屏幕,包括背景和蓝色开始区域。如果介绍结束(游戏开始),那么在介绍线程结束时,主游戏循环开始:
def introLoop():
i = 0
while run and intro:
clock.tick(8)
filename = "introScreen/" + str(i) + ".gif"
i = i+1 if i < 26 else 0
introScreen = pygame.image.load(filename)
introScreen = pygame.transform.scale(introScreen, (width, height))
screen.blit(introScreen, (30, 30))
if inStartRect:
pygame.draw.rect(screen, blue, (279, 276, 220, 128), 0)
pygame.display.flip()
gameThread.start()
当介绍线程终止时,游戏线程开始。所以游戏线程可以做游戏场景的绘制:
def gameLoop():
while run:
clock.tick(60)
screen.fill(red)
# [...]
pygame.display.flip()
clock.tick(60)
推荐阅读
- php - 将两个或多个变量从 laravel 控制器发送到 vue 组件
- c# - 我正在尝试从 xml 文件中读取正则表达式,但是当我将正则表达式传递给 C# 代码但我得到错误匹配
- c++ - 相关的非类型参数包:标准是怎么说的?
- c# - 暂停 VLC 流的视频和缓冲(使用 libvlc)并重新启动实时视图,而无需再次初始化播放器
- c - 试图打印出用户输入的一些信息,但没有奏效
- docker - Docker Swarm 和 Windows 节点持久存储
- regex - 我可以将 Regextract 与 IF 一起使用,所以如果我不想找到的文本,公式会搜索另一个术语?
- php-7 - 如何在 ubuntu 18.04 上运行的 php7 中安装 gearman 扩展
- css - 如何使css表的头部变粘
- python - 加入两个爱国数据框pyspark