一、事件路由
flask的机制是实例化事件轮询函数,然后向主函数注册路由视图的方式实现路由响应。
使用flask轮询函数只需要实例化Flask类,再app.run就可以了。app是库自带的,用户要做的只剩往路由表里添加视图函数。
pygame的内部机制是单事件循环,可以模仿flask注册事件类。先实例化一个自己的route类,往这个route类里封装事件表,对应flask 的路由表,再封装事件索引装饰器。
class Route:
def __init__(self):
self.lib = {}
def __repr__(self):
return f"{self.lib=}"
def __call__(self,routepath):
def warpper(func):
self.lib[routepath] = func
@wraps
def inner_wrapped(*args):
return func(*args)
return inner_wrapped
return warpper
二、游戏类
在游戏类的init函数中封装route事件表
class Game:
def __init__(self):
pygame.init()
self.route = Route()
self.clock = pygame.time.Clock()
def run(self):
self.screen = pygame.display.set_mode((400,300))
print(self.route.lib)
while 1:
for event in pygame.event.get():
if event.type in self.route.lib:
self.route.lib[event.type](event)
self.screen.fill((0,0,0))
pygame.display.flip()
self.clock.tick(20)
三、注册事件函数
把以上两个类写进 lib.py 中,导入库:
import pygame,sys
from functools import wraps
写入口主函数和事件注册函数:
import pygame,sys
from pygame.locals import *
from lib import Game
game = Game()
@game.route(QUIT)
def exit(e):
pygame.quit()
sys.exit()
@game.route(KEYDOWN)
def keydown(e):
print(e)
@game.route(MOUSEMOTION)
def mousemottion(e):
print(e)
@game.route(MOUSEBUTTONDOWN)
def mousebuttondown(e):
print(e)
game.run()
网友评论