【物理引擎系列】启用lisp
经过一两天的代码整合,除了将lib2d单文件main.cpp拆分成多个h/cpp之外,还将最新编写的lisp语言作为控制语言进行嵌入,最终初见端倪。
关键代码
(吐槽下知乎对宽图片压缩惨不忍睹)
脚本运行机制(暂定)
由于没有实现OpenGL的控制台输入,因此无法直接与脚本交互,所以先将脚本代码硬编码,看看效果。
在clib2d界面中按下数字键7,就会看到上述视频中的动画。事实上,我将脚本运行速度设置成10,即一帧(1/30秒)内运行lisp中的10个递归方法,设置成1的话就太慢了。
按下数字键7时,world调用start_animation函数,将lisp脚本转换成抽象语法树AST,不过AST并没什么作用,因此调用cvm中的转换函数将AST转换成相应的cval对象,同时在手工栈中添加第一个eval函数,这样准备工作就做完了。当然,如果过程中出现了异常,我们直接删掉parser对象就可以了,因为所产生的AST对象通通由parser中的内存池管理。
当脚本准备好之后,我们就可以开始运行动画,动画的run函数最终被glutDisplayFunc调用(如果没暂停的话)。运行过程中,我们只需要调用vm.run(限定lisp方法执行次数)即可,它会阶段性的运行/解释lisp语言,是可控的,当有返回值时,则返回非空值,当结果没出来返回nullptr。
后续
给lisp添加多个高阶函数,让其完成丰富多彩的动画演出。
编辑于 2018-10-29 09:25