| 
 
| 赞 | 14 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 22 |  
| 经验 | 0 |  
| 最后登录 | 2025-4-17 |  
| 在线时间 | 380 小时 |  
 Lv3.寻梦者 
	梦石0 星屑2233 在线时间380 小时注册时间2021-11-7帖子176 | 
| 
本帖最后由 夏虫沉默 于 2021-12-22 21:40 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 在用纯脚本模拟重装机兵.金属探测仪的效果时,发现了几个问题:
 
 let x=$gamePlayer.screenX(), y=$gamePlayer.screenY();//获取玩家的画面xy位置        let xTemp=x-24,yTemp=y-48;//设置绘制图案起点是玩家所在方格左上角        $gameScreen.showPicture("1","$探测图2",0,xTemp,yTemp,100,100,255,0);        var picture = $gameScreen.picture(1);//获取图片id为1的对象        picture.move(0,xTemp,yTemp+48,100,100,255,0,30);//向下移动48pix距离        this.wait(30);//等待0.5秒        picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30);//向右移动48pix距离
上述代码的this.wait()方法可以用在事件插入的脚本里,但是封装成方法后,此时this.wait()就提示找不到wait方法的异常。let x=$gamePlayer.screenX(), y=$gamePlayer.screenY();//获取玩家的画面xy位置 
        let xTemp=x-24,yTemp=y-48;//设置绘制图案起点是玩家所在方格左上角 
        $gameScreen.showPicture("1","$探测图2",0,xTemp,yTemp,100,100,255,0); 
        var picture = $gameScreen.picture(1);//获取图片id为1的对象 
        picture.move(0,xTemp,yTemp+48,100,100,255,0,30);//向下移动48pix距离 
        this.wait(30);//等待0.5秒 
        picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30);//向右移动48pix距离 
通过百度后,我找到一个解决办法,JS的一个setTimeout方法(延时执行函数),那么理论上只要在规定的时间之后运行图片移动的方法也可以实现效果了,然后就可以写出类似下面的代码。
 function detectorTest(){        let x=$gamePlayer.screenX(), y=$gamePlayer.screenY();//获取玩家的画面xy位置        let xTemp=x-24,yTemp=y-48;//设置绘制图案起点是玩家所在方格左上角        $gameScreen.showPicture("1","$探测图2",0,xTemp,yTemp,100,100,255,0);        var picture = $gameScreen.picture(1);        picture.move(0,xTemp,yTemp+48,100,100,255,0,30);//图片向下移动一个单位长度        setTimeout(picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30),500);//0.5秒后图片向右移动一个单位长度,参数500也就是0.5秒}
然后测试一下,你就会发现图像是直接向右下方移动48√ ̄2的距离,而且图片的移动并没有等待0.5秒,如图1;function detectorTest(){ 
        let x=$gamePlayer.screenX(), y=$gamePlayer.screenY();//获取玩家的画面xy位置 
        let xTemp=x-24,yTemp=y-48;//设置绘制图案起点是玩家所在方格左上角 
        $gameScreen.showPicture("1","$探测图2",0,xTemp,yTemp,100,100,255,0); 
        var picture = $gameScreen.picture(1); 
        picture.move(0,xTemp,yTemp+48,100,100,255,0,30);//图片向下移动一个单位长度 
        setTimeout(picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30),500);//0.5秒后图片向右移动一个单位长度,参数500也就是0.5秒 
} 
   通过进一步的学习,https://www.w3school.com.cn/js/js_asynchronous.asp,原来setTimeOut方法的第一个参数是不能加括号()的,那么一个有需要参数的方法要怎么作为参数代入给延时执行函数setTimeout呢?
 结合回调函数的特性https://www.cnblogs.com/minshia/p/5935951.html
 可以把上一段代码的第7行修改为js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数。setTimeout(()=>{picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30);},500)
setTimeout(()=>{picture.move(0,xTemp+48,yTemp+48,100,100,255,0,30);},500) 
也可以这样写
 setTimeout(picture.move.bind(picture,0,xTemp+48,yTemp+48,100,100,255,0,30),500);
两种写法运行的效果是一样的,我们可以看到图像是分步移动,先往下走,再往右走,如图2;setTimeout(picture.move.bind(picture,0,xTemp+48,yTemp+48,100,100,255,0,30),500); 
   | 
 |