import pygame
import time
class Task:
def __init__(self,f,t):
self.f=f
self.t=t
class TaskMng:
def __init__(self):
self.s=set()
def add(self,t):
self.s.add(Task(t,0))
def run_one(self):
s=set()
for e in self.s:
e:Task
t=e.t
f=e.f
t0=time.time()
if t0>t:
try:
r=next(f)
if r==-1:
s.add(e)
else:
e.t=t0+r
except:
s.add(e)
for e in s:
self.s.remove(e)
def run(self):
while 1:
self.run_one()
class MyGame:
def __init__(self,title,w,h):
self.w=w
self.h=h
self.win=pygame.display.set_mode((w,h))
pygame.display.set_caption(title)
self.alive=True
self.task_mng=TaskMng()
def add_task(self,task):
self.task_mng.add(task)
def handle_msg(self,e:pygame.event.Event):
pass
def run(self):
while self.alive:
for e in pygame.event.get():
self.handle_msg(e)
self.task_mng.run_one()
class Demo01(MyGame):
def __init__(self, title, w, h):
super().__init__(title, w, h)
self.add_task(self.patin())
self.L=[None]*32
def add_rect(self,x,y):
for i in range(len(self.L)):
if not self.L[i]:
self.L[i]=[x,y]
return i
return -1
def move(self,x,y):
r=self.add_rect(x,y)
if r==-1:
yield -1
while y>100:
y-=10
self.L[r][1]=y
#停顿 0.1秒
yield 0.1
self.L[r]=None
yield -1
def patin(self):
while 1:
self.win.fill(0x00ffff)
for i in range(len(self.L)):
e=self.L[i]
if e:
x,y=e
pygame.draw.rect(self.win,0xff0000,(x-25,y-25,50,50))
pygame.display.flip()
yield 0.1
#print('hh')
def handle_msg(self, e):
t=e.type
d=e.dict
if t==pygame.QUIT:
self.alive=False
elif t==pygame.MOUSEBUTTONDOWN:
print(d)
x,y=d.get('pos')
self.add_task(self.move(x,y))
demo=Demo01('使用yeild异步GUI框架',800,700)
demo.run()