您好,我是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()
没有错误消息,只是不显示蓝色矩形? 请为我的学校项目提供帮助。
答案 0 :(得分:1)
要在PyGame中使用多线程,必须考虑两件事:
在主线程中处理事件循环
在一个线程中完成所有图形绘制和窗口更新。如果有一个“介绍”线程和一个“游戏”线程,那么“介绍”线程必须先终止,然后才能启动“游戏”线程。
在主线程(程序)中,您必须声明线程并初始化控件(状态)变量。立即启动“简介”线程并运行事件循环。
我建议至少实现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)
答案 1 :(得分:0)
尝试将简介直接传递到introLoop
函数中。使用args
参数将参数传递给线程...
introThread = threading.Thread(target=introLoop, args=(intro))
您还必须重新定义功能:
def introLoop(intro):
答案 2 :(得分:0)
尝试使用.convert()
转换要加载的图像
pygame.image.load("image file path").convert()
或尝试使用.convert_alpha()
将图像转换为图像
pygame.image.load("image file path").convert_alpha()
Pygame发现加载.convert()
转换的图像变得更加容易和快捷,并且使用.convert_alpha()
转换具有alpha图层的图像(例如,EG透明度...),希望这会有所帮助! / p>
有关更多信息,请参阅以下Google搜索结果:
I recommend the first link, although this link is pretty pointless