lufy's legend

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 13212|回复: 10
打印 上一主题 下一主题

引擎中鼠标事件失效的问题

[复制链接]

46

主题

3

好友

1866

积分

偏将军

Rank: 4

跳转到指定楼层
楼主
发表于 2015-8-5 18:21:22 |只看该作者 |倒序浏览
群里有一位朋友使用引擎做一个浏览图片效果,嵌入到html中,也就是说html中除了<div id="mylegend">的元素(及初始化canvas的元素),还有其他的元素,有的在这个div的上面,有的在下面。效果图是这样的:
screenshot4.png
酒盒那一栏是lufylegend做的,也就是放了个<div id="mylegend">,在手机上使用时发现鼠标事件只位于canvas上面一部分位置生效,其余部分不生效,据跟踪是LSprite的ismouseonShapes判断失效造成的,也就是可能e参数中offsetX和offsetY出错了。这位朋友把改元素的position改为absolute后,通过绝对定位解决了此问题。
感觉是lufylegend中事件部分考虑不周导致的。希望lufy改进改进
回复

使用道具 举报

37

主题

8

好友

9311

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

沙发
发表于 2015-8-5 23:47:49 |只看该作者
这个是我一直强调的问题了,引擎设计的时候是以canvas来考虑的,所以我才会推荐用iframe来做这种嵌入效果
这个也并不能算是主流问题,能用iframe或者absolute解决的话就先这样吧,以后有时间了会试着调整一下的
不回答与技术和引擎不相关的问题
回复

使用道具 举报

46

主题

3

好友

1866

积分

偏将军

Rank: 4

板凳
发表于 2015-8-6 00:36:04 |只看该作者
lufy 发表于 2015-8-5 23:47
这个是我一直强调的问题了,引擎设计的时候是以canvas来考虑的,所以我才会推荐用iframe来做这种嵌入效果
...

可是iframe和主界面交互存在不方便之处。感觉以后可以加一个LGlobal.appMode属性,用这个属性来标识是否纯canvas模式或者有别的东西。赋予不同的值就对应相应的方案
回复

使用道具 举报

37

主题

8

好友

9311

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

地板
发表于 2015-8-6 12:20:03 |只看该作者
yorhomwang 发表于 2015-8-6 00:36
可是iframe和主界面交互存在不方便之处。感觉以后可以加一个LGlobal.appMode属性,用这个属性来标识是否 ...

多谢建议
也不是说不准备解决
只是会优先考虑其他功能
不回答与技术和引擎不相关的问题
回复

使用道具 举报

46

主题

3

好友

1866

积分

偏将军

Rank: 4

5#
发表于 2015-8-7 14:42:02 |只看该作者
lufy 发表于 2015-8-6 12:20
多谢建议
也不是说不准备解决
只是会优先考虑其他功能

还有就是一个非常小的问题,源代码中LStageAlign.RIGHT = "Re";这里的Re中的e是不是多写了的?我看LStageAlign.LEFT = "L";都是一个字母。
(我实在是有点强迫症,格式不统一看上去真的很不舒服,还望lufy包含)

就这种静态属性而言,我觉得用字母来代替会不会容易发生重复?建议以后改为十六进制(或者其他进制)的数字,我看box2dweb就是这么做的
回复

使用道具 举报

37

主题

8

好友

9311

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

6#
发表于 2015-8-7 20:05:03 |只看该作者
yorhomwang 发表于 2015-8-7 14:42
还有就是一个非常小的问题,源代码中LStageAlign.RIGHT = "Re";这里的Re中的e是不是多写了的?我看LStage ...

Re可能是写的时候不小心多了个e,不过这个倒没什么影响,因为实际用的时候,不需要关心它的值是什么,
这个任何开发规则都是一样的,类似于列举一样,不需要非得弄的十六进制或者弄个很长的字符串
常量的定义用什么类型都可以,数字也可以,整个项目中,可能多个地方使用到它,但是用的时候调用的是变量,而不是直接写它的值,所以只要定义不重复即可

不回答与技术和引擎不相关的问题
回复

使用道具 举报

46

主题

3

好友

1866

积分

偏将军

Rank: 4

7#
发表于 2015-8-7 20:58:55 |只看该作者
lufy 发表于 2015-8-7 20:05
Re可能是写的时候不小心多了个e,不过这个倒没什么影响,因为实际用的时候,不需要关心它的值是什么,
这 ...

我看了下前辈的LTimer代码,感觉写得太复杂了,我自己也写了个代码稍微短点的版本(遵照Adobe提供的as 3.0语法),放到这里,还望lufy考虑改进一下
  1. LGlobal.timerList = new Array();

  2. LGlobal.onShow = function () {
  3.         if (LGlobal.canvas == null) {
  4.                 return;
  5.         }
  6.         if(LGlobal._outStageCheckCount <= 0){
  7.                 LGlobal._outStageCheckCount--;
  8.                 if(LGlobal._outStageCheckCount < -2){
  9.                         LGlobal.stage.dispatchEvent(new LEvent(LFocusEvent.FOCUS_OUT));
  10.                         LGlobal._outStageCheckCount = 1;
  11.                 }
  12.         }
  13.         if (LGlobal.fpsStatus) {
  14.                 LGlobal.fpsStatus.reset();
  15.         }
  16.         if (LGlobal.timerList) {
  17.                 LGlobal.updateTimers();
  18.         }
  19.         if (LGlobal.stage.onresizeEvent) {
  20.                 LGlobal.stage.onresizeListener(LGlobal.stage.onresizeEvent);
  21.                 delete LGlobal.stage.onresizeEvent;
  22.         }
  23.         if (LGlobal.forceRefresh) {
  24.                 LGlobal.canvasObj.width = LGlobal.canvasObj.width;
  25.                 LGlobal.forceRefresh = false;
  26.         }
  27.         LGlobal.canvas.beginPath();
  28.         if (LGlobal.box2d != null) {
  29.                 LGlobal.box2d.ll_show();
  30.                 if (!LGlobal.traceDebug && LGlobal.keepClear) {
  31.                         LGlobal.canvas.clearRect(0, 0, LGlobal.width + 1, LGlobal.height + 1);
  32.                 }
  33.         } else {
  34.                 if (LGlobal.keepClear) {
  35.                         LGlobal.canvas.clearRect(0, 0, LGlobal.width + 1, LGlobal.height + 1);
  36.                 }
  37.                 if (LGlobal.backgroundColor !== null) {
  38.                         LGlobal.canvas.fillStyle = LGlobal.backgroundColor;
  39.                         LGlobal.canvas.fillRect(0, 0, LGlobal.width, LGlobal.height);
  40.                 }
  41.         }
  42.         LGlobal.show(LGlobal.childList);
  43. };

  44. LGlobal.updateTimers = function () {
  45.         var list = LGlobal.timerList, l = list.length;

  46.         if (list.length == 0) {
  47.                 return;
  48.         }

  49.         for (var i = 0; i < l; i++) {
  50.                 var timer = list[i];
  51.                 timer.ll_update();
  52.         }
  53. };

  54. var LTimer = (function () {
  55.         function LTimer (delay, repeatCount) {
  56.                 var s = this;
  57.                 LExtends(s, LEventDispatcher, []);

  58.                 s.type = "LTimer";
  59.                 s.delay = delay || 0;
  60.                 s.repeatCount = repeatCount || 0;
  61.                 s.currentCount = 0;
  62.                 s.running = false;
  63.                 s.ll_indexInList = null;
  64.                 s.ll_previousTime = null;
  65.         }

  66.         var p = {
  67.                 start : function () {
  68.                         var s = this;

  69.                         if (s.running) {
  70.                                 return;
  71.                         }

  72.                         s.running = true;
  73.                         s.ll_previousTime = (new Date()).getTime();
  74.                         s.ll_indexInList = LGlobal.timerList.length;

  75.                         LGlobal.timerList.push(s);
  76.                 },

  77.                 stop : function () {
  78.                         var s = this;

  79.                         if (!s.running) {
  80.                                 return;
  81.                         }

  82.                         s.running = false;

  83.                         LGlobal.timerList.splice(s.ll_indexInList, 1);

  84.                         s.ll_indexInList = null;
  85.                 },

  86.                 reset : function () {
  87.                         var s = this;

  88.                         s.currentCount = 0;
  89.                         s.ll_previousTime = null;

  90.                         s.stop();
  91.                 },

  92.                 ll_update : function () {
  93.                         var s = this, currentTime = (new Date()).getTime();

  94.                         if (currentTime - s.ll_previousTime >= s.delay) {
  95.                                 s.ll_previousTime = currentTime;
  96.                                 s.currentCount++;

  97.                                 s.dispatchEvent(LTimerEvent.TIMER);

  98.                                 if (s.currentCount == s.repeatCount) {
  99.                                         s.stop();
  100.                                         s.dispatchEvent(LTimerEvent.TIMER_COMPLETE);
  101.                                 }
  102.                         }
  103.                 }
  104.         };

  105.         for (var k in p) {
  106.                 LTimer.prototype[k] = p[k];
  107.         }

  108.         return LTimer;
  109. })();
复制代码
  1. var LTimerEvent = function () {throw "LTimerEvent cannot be instantiated";};
  2. LTimerEvent.TIMER = "timer";
  3. LTimerEvent.TIMER_COMPLETE = "timerComplete";
复制代码
就是有个疑问,我看文档上写的repeatCount默认是0,而您写的代码是无穷大,不知道到底哪个才是对的。
回复

使用道具 举报

37

主题

8

好友

9311

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

8#
发表于 2015-8-7 21:50:18 |只看该作者
yorhomwang 发表于 2015-8-7 20:58
我看了下前辈的LTimer代码,感觉写得太复杂了,我自己也写了个代码稍微短点的版本(遵照Adobe提供的as 3. ...

你可能不明白我为什么要把LTimer的控制加到LGlobal.childList里面,
在lufylegend中,核心时间轴和核心列表都只有一个,新功能扩展后依然要维持此原则,才能保证引擎扩展后,条例依然清晰,才能不断的扩展其他新功能
你可能这次加了一个LGlobal.updateTimers();,之后有其他的扩展,你可能会再加另一个方法,每次的逻辑可能又不一样,这样或许每一次看起来都很简单,但是综合起来内部逻辑就不统一了,就破坏了良好的可维护性,可能会得不偿失
不回答与技术和引擎不相关的问题
回复

使用道具 举报

37

主题

8

好友

9311

积分

诸侯王

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

9#
发表于 2015-8-7 21:55:08 |只看该作者
repeatCount默认是0没错,但是0的时候计时器将持续不断运行的,相当于无限大
不回答与技术和引擎不相关的问题
回复

使用道具 举报

8

主题

0

好友

218

积分

帐下督

Rank: 2

10#
发表于 2015-8-30 06:37:58 |只看该作者
我关心群号多少,菜鸟让进不?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

防止垃圾广告,请填写任意字符

Archiver|lufy's legend

GMT+8, 2024-4-30 06:55 , Processed in 0.058792 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部