作为一个悲剧的程序员,一直在磨练自己的剑。热爱游戏,被众多出色的游戏感动过,也一直有个梦想,开发一个自己的游戏 。
因为是一个python程序员,第一时间搜python的相关游戏引擎,pygame,OK,用了下,还挺简单的。于是想再封装一下,改为与公司引擎用法一样。
第一是GetParent(),看到公司引擎里的对象是一树状结构呢,根节点当然是游戏客户区了,每个节点都有一parent,子节点调用GetParent()来得到父节点。
第二是SetPos(),每个节点的坐标都是相对于parent而言的,是一相对坐标,当然要取出绝对坐标,可以回索到根,把各parent的pos加起来。
第三是SetZ(),Z轴由里向外,值大的会遮住小的节点,每个节点的Z也是相对于parent而言的,如果A节点的parent的Z值比B节点的parent的Z值大,积使B节点的Z比A的大,也会被A遮住,当然,也可以取绝对Z。
第四是事件,键盘事件还好,把键盘事件传给焦点对像就OK了。难点就在于鼠标事件,公司引擎的对象鼠标进入会响应Enter,立刻会Leave,左右键按下的释放是LeftDown,RigthDown,LeftUp,RightUp,中间滚轮MouseWheelUp,MouseWheelDown。来实现这些功能,关键在于要找到一个快速的方法,就叫GetMaxZObj吧,由一绝对坐标XY,取出当前XY下,绝对Z最大的节点。除了蛮力查找外,实在没想出个好方法。公司引擎还有支持不规则图片,而且节点的客户区不包括那些不可见的像素,这个或许可以在rect的基础上再判断下掩码。
但当一切准备就绪好,功能测试通过了,性能测试却一败涂地。3000个surface就30帧都到不了了……,这可怎么活啊,公司引擎把完包后可以上万个box。
然后把所有的检查分发都去掉,每帧只显示3000个surface,也不行……,看到先天下足啊。
就此,一个把pygame封装的计划失败了。当然,早就知道北伐之路艰辛无比,继续养精蓄锐。