关于Processing显示和动画对象分离地思路和实现

来源:互联网 发布:有秒杀软件吗 编辑:程序博客网 时间:2024/06/05 20:06


关于物体控制的程序框架

一般来说要控制物体的显示需要在类的内容对对象进行控制,但有时,我们希望把物体的行为与物体的显示分开,比如对物体进行动画处理。

这里我从对shapes3d库的习得来谈谈我自己的一些想法。

shapes3d库有专职动画的包,但其内容实现我也不太清楚,猜测是把对象的显示和动画行为分开到不同的类中实现的,由此我想如果在我自己的Processing程序中如何做到在显示对象的外部类中对显示对象作动画处理呢?

首先,动画是对象显示对象的不断更新来实现的,如位置、大小、形状等。因此,我只要能在显示之前更新显示对象的这些属性就可以了。
Processing的draw()函数是显示对象更新和绘制的主要场所,我可以把更新和绘制放在draw()函数中进行。绘制由显示对象自己负责,而更新则由专门的更新类负责了。关键是更新类如何确定更新的时机。如果每加入一个对显示对象的更新类型就要在draw()中添加代码肯定是不符合软件的可扩展性原则的,因为这修改了原程序的代码。
如何在不修改原程序的基础上来更新呢。首先显示对象的更新和绘制我都放在显示对象的同一个方法中updateDraw()。这样在draw()函数中只要调用显示对象的一个方法。但在显示对象的updateDraw()方法中不能由显示对象自己实现更新,而必须由更新对象进行更新。这就必须由更新对象在其内部对显示对象进行设置,而这又进一步要求显示对象要通知更新对象何时进行更新。如何通知呢?这就要有更新对象的引用,进而要求更新对象要通过注册regUpdate()方法把自己的引用放在显示对象里,而显示对象要对这些不同类型的更新对象进行抽象,并调用这个抽象对象的更新方法(update(显示对象))把显示对象传递给更新对象,以便更新对象对其进行更新操作。由于一个显示对象可能同时要进行多种更新操作,比如同时行旋转和移动操作,所以显示对象应该有一个更新对象(抽象类型为Update)集。
经过上面的过程,我就可以实现在不改变原有代码的基础上来对显示对象实现不同类型的更新操作,而且这种操作也可以是同时进行的。而实现这个功能的主要是显示对象在更新时把自己的引用传递给更新对象,由更新对象实现更新逻辑,而不是自己实惠更新逻辑。要想调用不同更新对象的方法,就要用到抽象类。要想同时实现不同类型的更新,显示对象就要维护一个更新对象集,要想把不同更新对象放在同一个更新对象集中就必须要用到抽象类。
好吧,看上去有点啰嗦,但只是想把思路搞清楚。这样一来,我就实现了显示逻辑和动画逻辑的分离,使得在不修改原有代码的基础上实现功能的扩充。
要点:
1、显示更新时机(显示对象更新方法->调用更新对象更新方法,并传递自己的引用)
2、显示对象维护一个抽象的更新对象集。
3、更新对象能够在显示对象的更新对象集中注册自己。
同样,显示对象添加到屏幕上,也可以采取注册到显示对象集的方法实现把自己显示在屏幕上,也能实现不动原有代码就可以扩充显示的内容的目的。
思路清楚了,下面就是实现啦。

0 0