如何在Incisor中动态修改GraphicObject的运动速度?
如何在Incisor中动态修改GraphicObject的运动速度?
嘿,我完全懂你碰到的问题!你现在的代码里有个关键误区:当你调用addMotion.each()的时候,其实是把this.speed的初始值0直接传递给了运动实例,而不是让运动持续监听这个属性的变化。所以哪怕之后你用swoopValue把this.speed改成10,已经创建好的运动根本感知不到这个变化——它从一开始就被固定成0速度,自然不会动啦。
那该怎么解决呢?这里有两种靠谱的思路,你可以根据Incisor的实际API支持情况来选:
方法一:让运动动态读取speed属性
如果Incisor的addMotion.each()方法允许速度参数传入函数(而非固定数值),那你可以直接传一个返回this.speed的函数,这样运动每次计算速度时都会取最新的值:
class ProjectMain { init() { let myGraphicObject = new GraphicObject( nc.graphicAssets.whiteBox, nc.mainScene, "Box" ); this.speed = 0; // 用函数替代直接传this.speed,每次运动计算时都会获取最新的speed值 myGraphicObject.position.addMotion.each( [-300,-100,0], [300,100,10], () => this.speed, nc.motionTypes.MoveInCircle ); nc.swoopValue( this, "speed", 10, 10 ); } }
方法二:在swoop的回调中手动更新运动速度
如果Incisor不支持函数作为速度参数,那我们可以先把运动实例存下来,然后在swoopValue的回调里,每次speed更新时同步修改运动的速度属性:
class ProjectMain { init() { let myGraphicObject = new GraphicObject( nc.graphicAssets.whiteBox, nc.mainScene, "Box" ); this.speed = 0; // 保存运动实例的引用,方便后续修改 const circleMotion = myGraphicObject.position.addMotion.each( [-300,-100,0], [300,100,10], this.speed, nc.motionTypes.MoveInCircle ); // 给swoopValue加回调,每次speed变化时同步更新运动速度 nc.swoopValue( this, "speed", 10, 10, (newSpeed) => { circleMotion.speed = newSpeed; }); } }
这样调整后,当swoopValue逐步把speed从0提升到10的时候,运动的速度也会跟着同步增加,你就能看到盒子越转越快啦。
备注:内容来源于stack exchange,提问作者Eric Lubin
相关产品推荐
相关产品推荐

