首发于学习C++
【物理引擎系列】启用lisp

【物理引擎系列】启用lisp

经过一两天的代码整合,除了将lib2d单文件main.cpp拆分成多个h/cpp之外,还将最新编写的lisp语言作为控制语言进行嵌入,最终初见端倪。


脚本控制动画播放https://www.zhihu.com/video/1040166335631876096

关键代码

(吐槽下知乎对宽图片压缩惨不忍睹)

准备工作
脚本运行中


脚本运行机制(暂定)

由于没有实现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