第三篇,鼠标事件与游戏人物移动

一,假设
假设,所有可添加鼠标事件的对象,都有一个mouseEvent方法,添加的鼠标事件同过这个mouseEvent来调用。
这样的话,添加鼠标事件,其实只需要给canvas添加一个鼠标事件,然后循环LGlobal类里的childList,即循环所有的可视对象,如果被添加了鼠标事件,那么就调用它相应的方法。
二,实现
1,给LGlobal类追加mouseEvent方法,然后修改LGlobal类的setCanvas,实现canvas的鼠标事件的添加与调用

LGlobal.setCanvas = function (id,width,height){
LGlobal.canvasObj = document.getElementById(id);
if(width)LGlobal.canvasObj.width = width;
if(height)LGlobal.canvasObj.height = height;
LGlobal.width = LGlobal.canvasObj.width;
LGlobal.height = LGlobal.canvasObj.height;
LGlobal.canvas = LGlobal.canvasObj.getContext("2d"); LEvent.addEventListener(LGlobal.canvasObj,LMouseEvent.MOUSE_DOWN,function(event){
LGlobal.mouseEvent(event,LMouseEvent.MOUSE_DOWN);
});
}
LGlobal.mouseEvent = function(event,type){
var key;
for(key in LGlobal.childList){
if(LGlobal.childList[key].mouseEvent){
LGlobal.childList[key].mouseEvent(event,type);
}
}
}

2,给LSprite类添加mouseList数组,用来保存所添加的鼠标事件,然后添加mouseEvent方法
mouseEvent方法中,我们需要做2个处理,
1),判断自己是否添加了鼠标事件,如果没有添加,则循环它的childList
2),如果添加了鼠标事件,判断自己是否被点击,LSprite虽说意义上是可视类,但是其实目前它本身是不可见的,可见的是它上面的Bitmap,准确点说,是这个Bitmap类中的BitmapData,更准确点说,是这个BitmapData中的Image,所以判断自己是否被点击,需要判断的是LSprite中的childList中的可视对象是否被点击,如果被点击,则调用相应的方法

mouseEvent:function (event,type,cood){
if(cood==null)cood={x:0,y:0};
var self = this;
if(self.mouseList.length == 0){
for(key in self.childList){
if(self.childList[key].mouseEvent){
self.childList[key].mouseEvent(event,type,{x:self.x+cood.x,y:self.y+cood.y});
}
}
return;
}
if(self.childList.length == 0)return;
var key;
var isclick = false;
for(key in self.childList){
isclick = self.childList[key].ismouseon(event,{x:self.x+cood.x,y:self.y+cood.y});
if(isclick)break;
}
if(isclick){
for(key in self.mouseList){
var obj = self.mouseList[key];
if(obj.type == type){
event.selfX = event.offsetX - (self.x+cood.x);
event.selfY = event.offsetY - (self.y+cood.y);
event.currentTarget = self;
obj.listener(event);
}
}
return;
} },
ismouseon:function(event,cood){
var self = this;
var key;
var isclick = false;
for(key in self.childList){
isclick = self.childList[key].ismouseon(event,{x:self.x+cood.x,y:self.y+cood.y});
if(isclick)break;
}
return isclick;
}

ismouseon方法,用来判断自己是否被点击
LBitmap类中也需要判断是否自己被点击,所以添加ismouseon

ismouseon:function(event,cood){
var self = this;
if(event.offsetX >= self.x + cood.x && event.offsetX <= self.x + cood.x + self.width &&
event.offsetY >= self.y + cood.y && event.offsetY <= self.y + cood.y + self.height){
return true;
}else{
return false;
}
}

添加鼠标事件的时候,模仿ActionScript的语法

backLayer.addEventListener(LMouseEvent.MOUSE_DOWN, onmousedown);

下面,准备一张地图,一个人物行走图,用鼠标事件来控制人物的走动,

init(80,"back",800,480,main);

var list = new Array();
var index = 0;
var backLayer;
//地图
var mapimg;
//人物
var playerimg;
var loader
var imageArray;
var animeIndex = 0;
var dirindex = 0;
var dirarr = new Array({x:0,y:1},{x:-1,y:0},{x:1,y:0},{x:0,y:-1},{x:-1,y:1},{x:1,y:1},{x:-1,y:-1},{x:1,y:-1});
var dirmark = {"0,1":0,"-1,0":1,"1,0":2,"0,-1":3,"-1,1":4,"1,1":5,"-1,-1":6,"1,-1":7}; //移动目标
var toX = 0;
var toY = 0;
function main(){ loader = new LLoader();
loader.addEventListener(LEvent.COMPLETE,loadBitmapdata);
loader.load("back.jpg","bitmapData");
}
function loadBitmapdata(event){
var bitmapdata = new LBitmapData(loader.content);
mapimg = new LBitmap(bitmapdata);
loader = new LLoader();
loader.addEventListener(LEvent.COMPLETE,loadOver);
loader.load("1.png","bitmapData");
}
function loadOver(event){
var bitmapdata = new LBitmapData(loader.content,0,0,70,92);
imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,8,8);
document.getElementById("inittxt").innerHTML="";
playerimg = new LBitmap(bitmapdata);
playerimg.bitmapData.setCoordinate(0,0);
index = 0;
backLayer = new LSprite();
addChild(backLayer);
backLayer.addChild(mapimg);
backLayer.addChild(playerimg);
backLayer.addEventListener(LEvent.ENTER_FRAME, onframe)
backLayer.addEventListener(LMouseEvent.MOUSE_DOWN, onmousedown);
} function onframe(){
index++;
if(index >= imageArray[0].length){
index = 0;
}
var markx = 0,marky = 0;
var l = 3;
if(playerimg.x > toX){
playerimg.x -= l;
markx = -1;
}else if(playerimg.x < toX){
playerimg.x += l;
markx = 1;
}
if(playerimg.y > toY){
playerimg.y -= l;
marky = -1;
}else if(playerimg.y < toY){
playerimg.y += l;
marky = 1;
}
if(markx !=0 || marky != 0){
var mark = markx+","+marky;
dirindex = dirmark[mark];
}
playerimg.bitmapData.setCoordinate(imageArray[dirindex][index].x,imageArray[dirindex][index].y);
}
function onmousedown(event){
toX = parseInt(event.selfX/3)*3;
toY = parseInt(event.selfY/3)*3;
}

看一下成果吧
http://fsanguo.comoj.com/html5/jstoas02/index.html

下一篇,研究下继承吧

用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动的更多相关文章

  1. 用仿ActionScript的语法来编写html5——第五篇,Graphics绘图

    用仿ActionScript的语法来编写html5——第五篇,Graphics绘图 canvas本身就是一个Graphics,可以直接进行绘图在actionscript里面,每个Sprite都有一个G ...

  2. 用仿ActionScript的语法来编写html5——第八篇,图片处理+粒子效果

    用仿ActionScript的语法来编写html5系列开发到现在,应该可以做出一些东西了,下面先来研究下图片的各种效果预览各种效果看下图效果和代码看这里,看不到效果的请下载支持html5的浏览器 ht ...

  3. 用仿ActionScript的语法来编写html5——第六篇,TextField与输入框

    一,对比1,html5中首先看看在html5的canvas中的文字显示 var canvas = document.getElementById("myCanvas"); var ...

  4. 用仿ActionScript的语法来编写html5——第七篇,自定义按钮

    第七篇,自定义按钮这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ ...

  5. 用仿ActionScript的语法来编写html5——第四篇,继承与简单的rpg

    第四篇,继承与简单的rpg 这次用继承自LSprite的类来实现简单的rpg的demo先看一下最后的代码与as的相似度 var backLayer; //地图 var mapimg; //人物 var ...

  6. 用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

    一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库,它模仿了ActionScript的语法,用于html5的开发,目前实现的功能相对较少,还不能称之 ...

  7. 用仿ActionScript的语法来编写html5——第二篇,利用Sprite来实现动画

    上一篇,我已经模仿as,加入了LBitmap和LBitmapData类,并且用它们实现了静态图片的显示.这次用Sprite来动态显示图片.依然遵循上一篇对显示对象的处理的思路,添加LSprite类,并 ...

  8. 用仿ActionScript的语法来编写html5——第九篇,仿URLLoader读取文件

    第九篇,仿URLLoader读取文件 先看看最后的代码 function readFile(){ urlloader = new LURLLoader(); urlloader.addEventLis ...

  9. 用仿ActionScript的语法来编写html5——第一篇,显示一张图片

    第一篇,显示一张图片 一,代码对比 as代码: public var loader:Loader; public function loadimg():void{ loader = new Loade ...

随机推荐

  1. log4j容器初始化探究

    Log4j容器初始化探究 Log4j第一步就是初始化Logger容器Repository,这一章我们来探究Logger容器,从别从独立应用以及servlet容器下启动初始化两方面探究. 1 独立应用 ...

  2. poll?transport=longpoll&connection...连接的作用

    在浏览器中打开使用VS2013开发的项目时,按F12使用浏览器调试,会发现一堆无关的请求,结构大致是:poll?transport=longpoll&connection.....一直不停的请 ...

  3. 免安装Oracleclient和PL/SQL

    写在前面: Oracle是典型的C/S结构,服务端提供oracle服务的实例,主要用于数据库的管理,对象的管理与存储.数据的 存储.查询.数据库资源的监控.监听等一些服务. 而client仅仅是一个与 ...

  4. 基于Redis实现延迟队列

    背景 在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加 ...

  5. linux2.6内核netfilter架构分析

    1.2.6内核的netfilter与2.4的有很大不同: ChangeLog-2.6.15 中有下面这样的描述: commit 9fb9cbb1082d6b31fb45aa1a14432449a0df ...

  6. hihoCoder #1291 : Building in Sandbox 逆向处理+并查集维护

    /** 题目:#1291 : Building in Sandbox 链接:https://hihocoder.com/problemset/problem/1291 题意:就是一个三维的空间里,按照 ...

  7. logback参考配置

    logback配置 <?xml version="1.0" encoding="UTF-8"?> <configuration> < ...

  8. 从thinkphp到php到ajax

    因为thinkphp的ajax非常麻烦,所以采用了php辅助,辅助的过程必然要只有一个连接字符串,但是却不能异步了 如果单独的在页面写连接字符串,不引用,那么页面又返回正常

  9. Android将指定的.class打包到mainDex中

    1️⃣ 我们分包的时候会遇到一个问题,因为加载和初始化的问题,如果某个类不在mainDex中,那么程序就会报错,java.lang.NoClassDefFoundError. 2️⃣ 在gradle中 ...

  10. VS本地调试oracle报错解决方法

    同事的项目,SVN下载下来以后一直报错,后来确认一下 1本地要安装oracle 2代码用的是64位的,所以本地安装也要64位的oracle 3VS调试用的IIS Express也要是64位的,激活方法 ...