设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3899|回复: 18
打印 上一主题 下一主题

[有事请教] 写了个物品介绍界面方法,不知道哪里出了问题(已解决)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
跳转到指定楼层
1
发表于 2019-3-15 12:27:52 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 rexuegg123 于 2019-3-16 19:55 编辑

写了些物品介绍界面显示的方法,其中一个界面删除的方法不知道哪里出了问题,请大神们看看

就是这个定时删除介绍图片的方法用上后出了问题


没引用用这个方法时,用的这行代码:
setTimeout(function(){for (var i=101;i<=110;i++){$gameScreen.erasePicture(i);};},6000);
除了不能刷新删除介绍的计时外一切正常。(当然也有个小问题,就是多点几次物品,会发现介绍界面删除地越来越快……)


引用这个方法后(itemshow_clean ();),游戏占用内存在20多秒的时间内暴涨了几十倍……








感谢bule_ku大神的提示和耐心讲解!
问题已解决:达到延迟并有刷新延迟清除时间的功能



修改代码如下:
引用函数部分
JAVASCRIPT 代码复制
  1. //格子的交互方法
  2. //根据包裹状态(关闭,开启,对接等),点击每格物品时所作的动作
  3. function Backpack_lattice (Num) {
  4.     var n = Num;
  5.     var m = WY_Bpack_sate;
  6.         switch (m) {
  7.            case 0:break;   //关闭状态,不动作
  8.            case 1:           //包裹开启,但没有对接其他界面
  9.                   lattice_mesage_show (n);    //点击物品时执行的事件:显示物品介绍
  10.                   $gameSwitches.setValue(17,true);        //显示物品介绍计时的开关                 
  11.                   if (WY_i ==0) {itemshow_clean ();} else {WY_i=1;}; //判断:是否引用延迟清除的方法(不能重复引用),不引用时重置计时变量WY_i为1。
  12.                 break;
  13.            case '采集':   //对接采集界面
  14.           lattice_click_Collect (n);  // 点击物品时执行的事件:采集工具就位           
  15.                 break;
  16.         };       
  17. };


方法定义部分

JAVASCRIPT 代码复制
  1. //用于计时清除物品介绍图片
  2. //功能:定时6秒后清除,若6秒内点击(不同)物品会重新计时
  3. function itemshow_clean () {
  4.         WY_i=1;    //全局变量,初始值为0,在上一级函数的操作中重置为1,以达到刷新延迟(清除物品介绍时间)目的              
  5.         function itemshow_clean_sto () {               
  6.                 if (WY_i<=60) {
  7.                         var w = WY_i*100;
  8.                     if (w>=6000) {                                 
  9.                            for (var i=101;i<=110;i++){$gameScreen.erasePicture(i);};//循环清除物品介绍图片
  10.                            WY_i=0;
  11.                     } else {
  12.                        setTimeout(function(){WY_i++;itemshow_clean_sto ();},100);
  13.                     };
  14.                 };               
  15.         };
  16.     itemshow_clean_sto ();
  17. };


问题总结:
1、我不该用for循环情况下还要用延迟执行……for循环是不会等待延迟的
2、重复引用相同函数会开启多个实例,使计时加快(同时对WY_i进行累加),反而达不到刷新(重置)延迟时间的目的。所以我在上一级的操作中用if判断了itemshow_clean ()是否已被引用,若没被引用并在实例中运行的话就直接引用,已引用的话只需重置WY_i=1就可以了。




Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
2
 楼主| 发表于 2019-3-15 16:55:23 | 显示全部楼层
本帖最后由 rexuegg123 于 2019-3-15 17:06 编辑

大概知道问题出处了:
JAVASCRIPT 代码复制
  1. function itemshow_clean () {
  2.   WY_i=1;//定义一个全局变量,初始为1
  3.   for (;WY_i<=60;) {
  4.     var w = WY_i*100;
  5.     if (w>=6000) {                          
  6.       for (var i=101;i<=110;i++){$gameScreen.erasePicture(i);};//循环清除物品介绍图片
  7.     } else {
  8.       setTimeout(function(){WY_i++;},100)
  9.     };
  10.   }
  11. };


代码中“setTimeout(function(){WY_i++;},100);”,这句延迟了WY_i++的执行,但for循环并不会停下来,它会在WY_i>60之前极快地循环n多次,但这是否造成占用内存暴涨的原因还不确定
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
3
 楼主| 发表于 2019-3-16 10:02:39 | 显示全部楼层
本帖最后由 rexuegg123 于 2019-3-16 10:10 编辑
blue_ku 发表于 2019-3-16 00:18
那是个死循环,一直在执行else语句块。
前面说的if那块应该也是出不去的,你可以在函数后面写个alert(0) ...


确实,if下面不加  "WY_i++"的话,无法跳出最大那个for循环,WY_i++的值达到60后,if的前半部分部分会一直执行……

如果加 "WY_i++"就成了秒删,因为 setTimeout(WY_i++,100); 这句的延迟累加,根本没有延迟……

但直接用 setTimeout(function(){for (var i=101;i<=110;i++){$gameScreen.erasePicture(i);};},6000); 的话,连续点击物品时,游戏似乎会创建多个延迟6秒删除图片的实例,无法达到刷新延迟时间的效果。

最后重新写成下面这样的代码……除了不会生成更多延迟删除的实例秒删外,还是无法达到刷新延迟删除时间的效果。
JAVASCRIPT 代码复制
  1. //用于计时清除物品介绍图片
  2. //功能:定时6秒后清除,若6秒内点击(不同)物品会重新计时
  3. function itemshow_clean () {
  4.         WY_i=1;//定义一个全局变量,初始为1   ————————在上一级操作下WY_i值被重新设置为1,已达到刷新延迟时间的效果
  5.         function itemshow_clean_sto () {
  6.                 if (WY_i<=60) {
  7.                         var w = WY_i*100;
  8.                     if (w>=6000) {                          
  9.                            for (var i=101;i<=110;i++){$gameScreen.erasePicture(i);};//循环清除物品介绍图片
  10.                     } else {
  11.                        setTimeout(function(){WY_i++;itemshow_clean_sto ();},100);
  12.                     };
  13.                 };               
  14.         };
  15.     itemshow_clean_sto ();
  16. };
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
4
 楼主| 发表于 2019-3-16 17:09:39 | 显示全部楼层
本帖最后由 rexuegg123 于 2019-3-16 19:53 编辑
blue_ku 发表于 2019-3-16 15:01
晕了@_@
setTimeout() 传入的第一个参数要求是字符串。


谢谢大佬,花了那么多时间来讲解,涨了不少知识……再次十分感谢!!!
我这里的问题已经解决了(具体在1楼已经更新):
1、我不该用for循环情况下还要用延迟执行……for循环是不会等待延迟的
2、重复引用相同函数会开启多个实例,使计时加快(同时对WY_i进行累加),反而达不到刷新(重置)延迟时间的目的。所以我在上一级的操作中用if判断了itemshow_clean ()是否已被引用,若没被引用进而在实例中运行的话就直接引用,已引用的话只需重置WY_i=1就可以了。


回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
5
 楼主| 发表于 2019-3-19 10:51:24 | 显示全部楼层
本帖最后由 rexuegg123 于 2019-3-19 10:56 编辑
白嫩白嫩的 发表于 2019-3-18 13:40
期待楼主的飞天历险早点问世,炒鸡怀念


我也跟期待,不过唉,一个人弄……怎一个慢字了得。
对了,你那里有高级物品的素材没?我这里在飞天国际版里面没有大号……很多素材不全。

点评

我的账号都忘记了,十来年了,哎  发表于 2019-3-19 13:36
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2346
在线时间
168 小时
注册时间
2017-4-25
帖子
219
6
 楼主| 发表于 2019-4-29 11:06:37 | 显示全部楼层
本帖最后由 rexuegg123 于 2019-4-29 11:16 编辑
m328759997 发表于 2019-4-26 02:48
请问一下这种格子背包是怎么制作的


用图片做的啊……主要用到了图片公共事件和文字图片化这两个插件
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-19 20:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表