python – 使用Pygame进行多线程处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使用Pygame进行多线程处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2888字,纯文字阅读大概需要5分钟。
内容图文
![python – 使用Pygame进行多线程处理](/upload/InfoBanner/zyjiaocheng/752/df45f0beb8f84aaeb81e6c45f67014ca.jpg)
我在编写一个使用线程的简单Pygame应用程序时遇到了一些麻烦.请记住,这是我写过的第一个多线程代码.
这是情况.我正在写一个简单的应用程序,它会在屏幕上绘制一些时髦的线条.我的问题是,当我绘制线条时,应用程序无法处理输入,因此我不能(例如)关闭窗口直到线条完成.这是我的原始代码:
import time
import pygame
from pygame.locals import *
SIZE = 800
def main():
screen = pygame.display.set_mode((SIZE, SIZE))
for interval in xrange(50, 1, -5):
screen.fill((0, 0, 0))
for i in xrange(0, SIZE, interval):
pygame.draw.aaline(screen, (255, 255, 255), (i+interval, 0), (0, SIZE-i))
pygame.draw.aaline(screen, (255, 255, 255), (i, 0), (SIZE, i+interval))
pygame.draw.aaline(screen, (255, 255, 255), (SIZE, i), (SIZE-i-interval, SIZE))
pygame.draw.aaline(screen, (255, 255, 255), (SIZE-i, SIZE), (0, SIZE-i-interval))
pygame.display.update()
time.sleep(0.03)
time.sleep(3)
while True:
for evt in pygame.event.get():
if evt.type == QUIT:
return
if __name__ == '__main__':
pygame.init()
main()
pygame.quit()
如您所见,事件循环仅在绘图完成时运行,因此在此之前窗口关闭按钮无响应.我认为将绘图代码放入自己的线程可能会有所帮助,所以我将代码更改为:
import threading, time
import pygame
from pygame.locals import *
SIZE = 800
def draw():
screen = pygame.display.set_mode((SIZE, SIZE))
for interval in xrange(50, 1, -5):
screen.fill((0, 0, 0))
for i in xrange(0, SIZE, interval):
pygame.draw.aaline(screen, (255, 255, 255), (i+interval, 0), (0, SIZE-i))
pygame.draw.aaline(screen, (255, 255, 255), (i, 0), (SIZE, i+interval))
pygame.draw.aaline(screen, (255, 255, 255), (SIZE, i), (SIZE-i-interval, SIZE))
pygame.draw.aaline(screen, (255, 255, 255), (SIZE-i, SIZE), (0, SIZE-i-interval))
pygame.display.update()
time.sleep(0.03)
time.sleep(3)
def main():
threading.Thread(target=draw).start()
while True:
for evt in pygame.event.get():
if evt.type == QUIT:
return
if __name__ == '__main__':
pygame.init()
main()
pygame.quit()
但我得到的只是黑屏,也没有响应输入.我在这做错了什么?
解决方法:
虽然我从未使用过pygame,但我怀疑你是否可以(或应该)从不同的线程调用它的API.所有绘图都应该在主事件循环中完成.
我想你必须改变你对游戏开发的思考方式.不是使用time.sleep()来暂停绘图,而是创建一个可以定期更新的对象.通常,这是在两次传递中完成的 – update()以及时推进对象状态,而draw()则渲染对象的当前状态.在主循环的每次迭代中,更新所有对象,然后绘制所有对象.请注意,draw()应该假设屏幕为空,并绘制直到当前时间所需的每一行.
在您的简单案例中,您可以使用更简单的东西.用yield替换draw()函数中的time.sleep().通过这种方式,您将获得一个迭代器,它将产生建议的等待时间,直到下一次迭代.在主循环之前,通过调用draw()创建一个迭代器并初始化下一次绘制时的时间:
draw_iterator = draw()
next_draw_time = 0 # Draw immediately
然后,在主循环中,在处理用户输入之后,检查是否需要绘制:
current_time = time.time()
if current_time >= next_draw_time:
如果是,请运行下一次迭代并安排下一个绘制时间:
try:
timeout = next(draw_iterator)
except StopIteration:
# The drawing is finished, exit the main loop?
break
next_draw_time = current_time + timeout
内容总结
以上是互联网集市为您收集整理的python – 使用Pygame进行多线程处理全部内容,希望文章能够帮你解决python – 使用Pygame进行多线程处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。