本帖最后由 Drill_up 于 2020-3-11 12:13 编辑
首先,感谢你提供的思路。
我把你的代码优化了一下,其实这个部分本来我没打算深入的……因为我当时的目标,是为了镜头暂停后,所有像素一定归位到标准位置。过程稍微监督一下就好。
你这里实际上是提供了像素补正值,使得每次移动都是 相对 标准的像素值,移动后就不会出现抖动的情况。
实际上,rmmv这个函数的公式扭转了很多次,估计你也被“tileHeight()”给弄头晕了吧。
if (y2 > this.centerY()){ var distance = Math.abs(y2 - this.centerY()); var pixel_distance = distance * $gameMap.tileHeight() ; //像素距离 var pixel_speed = Math.min(pixel_distance/speedRatio_y,$gameSystem._drill_LCa_speedMax); //像素速度 if( pixel_speed < 0.25 ){ pixel_speed = 0.25; } //像素最小速度(1/4像素) if( pixel_distance < pixel_speed ){ //最小收敛间距 $gameTemp._drill_LCa_pixel_fix_y = 0; //(镜头停止移动后,所有像素必须吻合归位) $gameMap.scrollDown( distance ); // }else{ pixel_speed += $gameTemp._drill_LCa_pixel_fix_y; //速度小数位补正 $gameTemp._drill_LCa_pixel_fix_y = pixel_speed - Math.round(pixel_speed); //补正值 pixel_speed = Math.round(pixel_speed); //设置速度为固定像素速度 $gameMap.scrollDown( pixel_speed/$gameMap.tileHeight() ); // } }
if (y2 > this.centerY()){
var distance = Math.abs(y2 - this.centerY());
var pixel_distance = distance * $gameMap.tileHeight() ; //像素距离
var pixel_speed = Math.min(pixel_distance/speedRatio_y,$gameSystem._drill_LCa_speedMax); //像素速度
if( pixel_speed < 0.25 ){ pixel_speed = 0.25; } //像素最小速度(1/4像素)
if( pixel_distance < pixel_speed ){ //最小收敛间距
$gameTemp._drill_LCa_pixel_fix_y = 0; //(镜头停止移动后,所有像素必须吻合归位)
$gameMap.scrollDown( distance ); //
}else{
pixel_speed += $gameTemp._drill_LCa_pixel_fix_y; //速度小数位补正
$gameTemp._drill_LCa_pixel_fix_y = pixel_speed - Math.round(pixel_speed); //补正值
pixel_speed = Math.round(pixel_speed); //设置速度为固定像素速度
$gameMap.scrollDown( pixel_speed/$gameMap.tileHeight() ); //
}
}
总的来说,镜头需要解决的问题有两个:
1.镜头暂停移动后,所有像素一定归位到标准位置。
2.每次移动时,需要防止事件出现抖动。
但是,rmmv和js本身的局限性,给我们的思路造成了一些局限:
1. distance 是 1/$gameMap.tileHeight() 的像素值,写代码时经常被绕晕。
2. 所有编程语言,频繁使用除号,一定会造成精度丢失。(比如你有时候会看到0.9999999999999999992的值,而不是整数)
3. 镜头移动每次都是固定的像素值,小数位后的精度会丢失。事件的位置和镜头的不匹配,造成抖动。
你的思路解决了问题3.
考虑到问题1,我这里将速度和距离转成了 var pixel_distance 和 var pixel_speed 像素单位。因为像素单位也可能是小数,像素单位后面的小数位,才是需要的补正值。
考虑到问题2,也就是你图中最后,镜头停止了,但是事件偏偏多出了1像素的缝隙。
这个是编程语言除法的缺陷,这里直接用"$gameMap.scrollDown( distance );",也就是为什么我之前需要强调的最小收敛间距。
图中大多数地方都没有出现问题,但是在坐标(51,13)的位置,移动过程中还是出现了缝隙,不过没有抖动,而且镜头暂停后,缝隙被收敛了。
基本问题已经被解决。 |