在浏览器上实现自动引导(五)

上接我的新手引导系列博客文章。

在游戏开发中新手引导的设计、代码编写、测试需要花费较多的时间和精力,特别是测试验证,在反反复复的引导流程中点来点去,会让人有一种要崩溃的感觉。因此在想能否实现让计算机根据我们的新手引导配置,自动去跑我们的引导呢?

答案是肯定的,请看下在的演示:

手工执行引导,注意鼠标指针的移动。

自动执行引导,注意鼠标指针没有移动。

在sz.Guide中开始自动引导

只需要在你的引导配置中加入开启开关

guideConfig = {
    tasks:{...},                        //引导任务
    fingerImage:‘res/finger.png‘,       //手型图片
    isShowMask: false,                  //是否开启遮罩
    isAutoGuide: true                   //是否自动引导
} 

isAutoGuide: true 即可打开自动引导,非常的简单。你可以在你的游戏过种中随时开启和关闭,对于测试非常有用。

自动引导的实现

目前sz.Guide只实现了在浏览器上的自动引导功能,实现的思路就是根据引导配置中的节点名字,在游戏渲染中定位节点,并模拟鼠标动作,触发节点控件的事件来完成的。

浏览器中模拟鼠标事件

使用javascript在浏览器上模拟鼠标事件是非常方便的,可以使用initMouseEvent函数来完成:

initMouseEvent(
   type,   //string类型 :要触发的事件类型,例如‘click‘。
  bubbles,// Boolean类型:表示事件是否应该冒泡,针对鼠标事件模拟,该值应该被设置为true。
  cancelable,// bool类型:表示该事件是否能够被取消,针对鼠标事件模拟,该值应该被设置为true。
  view,// 抽象视图:事件授予的视图,这个值几乎全是document.defaultView.
  detail,// int类型:附加的事件信息这个初始化时一般应该默认为0。
  screenX,// int类型 : 事件距离屏幕左边的X坐标
  screenY,// int类型 : 事件距离屏幕上边的y坐标
  clientX,// int类型 : 事件距离可视区域左边的X坐标
  clientY,// int类型 : 事件距离可视区域上边的y坐标
  ctrlKey,// Boolean类型 : 代表ctrol键是否被按下,默认为false。
  altKey,// Boolean类型 : 代表alt键是否被按下,默认为false。
  shiftKey,// Boolean类型 : 代表shif键是否被按下,默认为false。
  metaKey,// Boolean类型: 代表meta key 是否被按下,默认是false。
  button,// int类型: 表示被按下的鼠标键,默认是零.
  relatedTarget// (object) : 事件的关联对象.只有在模拟mouseover 和 mouseout时用到。
  )

initMouseEvent函数非常之多,但对与我们这里来说只需要模拟touchBegan和touchEnded,对应的鼠标事件类型为mousedown和mouseup,我们还需要关心的就是想要点击的控件的位置x和y。仅需要这些参数就能完成我们的任务了。

生成了鼠标事件,还需要将事件分派到document的节点中, cocos2d-js默认的canvas节点名为gameCanvas,我们需要将事件投递给它。

//获取gameCanvas
var pt = ...//通过座标转换计算位置
var canvas = document.getElementById("gameCanvas");
//初始化鼠标事件
var mousedown = document.createEvent("MouseEvent");
mousedown.initMouseEvent("mousedown", true, true, window, 0, 0, 0, pt.x, pt.y, true, false, false, false, 0, null);
//将鼠标事件分派到canvas中
canvas.dispatchEvent(mousedown);

坐标系统

使用过cococs2d的都知道坐标原点为左下角(x=0,y=0), 而在dom元素中坐标原点为左上角(x=0, y= 0),关于cocos2d坐标系的学习请参见关东升老师的文章《Cocos2d-JS 坐标系》。

节点坐标

我们通过引导定位器,获得到了节点对象,通过node.getPosition()函数获取节点所在父节点中的相对位置。

世界坐标

手型精灵在引导层上,引导层为整个屏幕大小。要让手型精灵正确指向定位到的节点,还需要将节点坐标转换为cocos2d中的世界坐标。通过父点节的转换函数,转换一个点为世界坐标点:

var point = locateNode.getParent().convertToWorldSpace(locateNode.getPosition());

cocos2d世界坐标转换到canvas坐标

目前最后一步就是将游戏中的坐标转换为canvas坐标,然后去执行鼠标模拟函数,点击我们定位的控件。

1.获取canvas矩形信息

function getHTMLElementPosition(element) {
    var docElem = document.documentElement;
    var win = window;
    var box = null;
    if (cc.isFunction(element.getBoundingClientRect)) {
        box = element.getBoundingClientRect();
    } else {
        if (element instanceof HTMLCanvasElement) {
            box = {
                left: 0,
                top: 0,
                width: element.width,
                height: element.height
            };
        } else {
            box = {
                left: 0,
                top: 0,
                width: parseInt(element.style.width),
                height: parseInt(element.style.height)
            };
        }
    }
    return {
        left: box.left + win.pageXOffset - docElem.clientLeft,
        top: box.top + win.pageYOffset - docElem.clientTop,
        width: box.width,
        height: box.height
    };
}

上面这段代码获取一个dom节点的矩形信息,其实不用自己编写这个方法,你可以直接调用cc.inputManager.getHTMLElementPosition(),引擎已经有这个方法了。

2.坐标转换

canvas矩形的left对应游戏世界x坐标,鼠标位置即x上偏移rect.left

x + rect.left

canvas矩形的top与游戏异界y坐标相反,rect.top + rect.height为游戏世界对应浏览器的底部,游戏中y坐标越大,对应canvas的中的y越小:

rect.top + rect.height - y

具体请看下面代码:

mouseSimulation: function(x, y) {
    var canvas = document.getElementById("gameCanvas");
    var rect = cc.inputManager.getHTMLElementPosition(canvas);//getHTMLElementPosition(canvas);
    var pt = cc.p(x + rect.left, rect.top + rect.height - y);

    var mousedown = document.createEvent("MouseEvent");
    mousedown.initMouseEvent("mousedown", true, true, window, 0, 0, 0, pt.x, pt.y, true, false, false, false, 0, null);
    canvas.dispatchEvent(mousedown);
    setTimeout(function () {
        var mouseup = document.createEvent("MouseEvent");
        mouseup.initMouseEvent("mouseup", true, true, window, 0, 0, 0, pt.x, pt.y, true, false, false, false, 0, null);
        canvas.dispatchEvent(mouseup);
    }, 100);
}

至此所有的问题都已解决,将mouseSimulation函数插入引导流程中体验一下自动引导的爽快吧!

自动执行,注意鼠标指针没有移动,引导提示在移动

时间: 2024-08-23 23:45:22

在浏览器上实现自动引导(五)的相关文章

五个在Safari浏览器上的实用快捷键使用

五个在Safari浏览器上的实用快捷键使用. Command+L   前往URL地址栏,填写新的网址或进行搜索    Command+T   开启新的浏览器标签页    Command+W 关闭当前标签页    Command+R   刷新当前标签页    Command+.    停止载入当前标签页

所有浏览器打开后自动打开115.29.163.152/404.html这个网页,然后自动跳转到hao123 解决办法

这几天,电脑所有浏览器打开后自动打开115.29.163.152/404.html这个网页,然后自动跳转到hao123这个网页,网上查询没解决办法.开始自己找,搜索注册表,都无效,最后下载软件HijackThis(HijackThis是一款英文免费软件,由荷兰的一名学生merijn开发.提供其利用业余时间开发的软件供大家下载.HijackThis能够扫描注册表和硬盘上的特定文件,找到一些恶意程序“劫持”浏览器的入口.但要提醒大家注意的是,这些内容也可能正由正常的程序在使用,所以不能草率处理,必须

浏览器插件-自动登录淘宝(二)

前言 关于案例 下一章 版本更新提示案例 一.前言 上章我们提到过开发一个插件所需要的步骤: 浏览器插件-自动登录淘宝(-) 并且还介绍了如何在页面上面注入脚本代码,并且成功的完成用户名和密码的自动输入功能. 本章将会以一些案例来介绍插件的一些新的开发技巧.案例将包括: 关于案例 涉及的技术点包括: 如何使用popup.html popup如何使用js 如何使用chrome  api 二.关于案例 任何一个成熟的产品都会有关于的标志,这是在法律的角度上面宣示自己拥有这个产品的所有权. 以下案例将

让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm

「微信小程序」的开发框架体验起来,还不错--自带了UI框架.但是问题是他的IDE,表现起来相当的糟糕--其实主要是因为,我当时买WebStorm License买了好多年.所以,我觉得他的IDE真不如我这个付费好用. 而且,作为一个拥护自由和开源的 「GitHub 中国区首席Markdown程序员」.微信在「微信小程序」引导着Web开向封闭,我们再也不能愉快地分享我们的代码了. 如果我们放任下去,未来的Web世界令人堪忧. 好了,废话说完了: 文章太长不想看,可以直接看Demo哈哈: GitHu

手机浏览器音乐无法自动播放的问题

最近,做项目时,需要使用背景音乐.大家都知道,html5的<audio>标签即可播放音乐,其格式为: <audio loop="loop"> <source src="音乐链接地址"> </audio> 如果需要音乐是自动播放,给<audio>标签加上autoplay属性即可.如果需要点击某个图标能够暂停或开始播放,需要用js来控制: var music=$('.music'); var audio=doc

浏览器上的音频即时通讯应用开发

网络上视频主播的火热带动了网络视频聊天室开发行业的火热.现在网上企业或者工作室在弄网页的视频聊天室.通过个人学习,借用别人的开发Demo(AnyChat SDK,网上随便搜索一下就可以下载的),加上几十行JavaScript脚本就能轻松实现视频通话:也不用去下载指定的什么浏览器,因为IE.firefox.chrome等windows平台主流浏览器全部通过,完美运行.下边就跟大伙分享分享我的成果,布局代码就不贴出来了,只贴JavaScript脚本. 下面是我所使用的开发包的特点: 1.      

音频文件在各浏览器上的兼容性

HTML5 Audio标签能够支持wav, mp3, ogg, acc, webm等格式,但有个很重要的音乐文件格式midi(扩展名mid)却在各大浏览器中都没有内置的支持.不是所有的浏览器都支持MP3 OGG之类的,每个浏览器因为版权的问题支持的格式都是不一样的. 浏览器和音频兼容性 浏览器制造商并非都同意使用某种音频文件格式.对于图像,PNG.JPEG 或 GIF 格式的文件在任何浏览器上都能加载到您的网页里.遗憾的是,音频文件并非如此.表 1 展示了网页中可以使用的音频文件格式,但是并非所

在浏览器上输入url后边发生什么

URL是Uniform Resource Location的缩写,译为“统一资源定位符 接下来执行8个步骤 dns域名解析: 1 .在浏览器上dns搜索 2 . 操作系统上dns搜索 3 . 读取hosts 文件 找对应的ip地址 4 . 向本地配置的首选的dns服务器发送dns解析请求 更加详细的解析 dns域名解析 简单解释 用于唯一的确认主机的ip 为了方便人们的辨别 使用了域名 域名和IP的对应关系保存在一个叫hosts文件中. 最初,通过互联网信息中心来管理这个文件 后来由于上边的太过

html中通过移除空格的方法来解决浏览器上的留白间距该怎么理解?

今天在切图的时候,碰到一个兼容性的问题,很幸运最后通过张金鑫老师的文章解决了这个问题!但在阅读张老师文章的时候,我有个地方不明白,在网上查了下也没找到我想要的答案,后来自己想了半天好像是这么回事,现在我把我的想法写出来,如果有不对的地方,大家一定要指出哦. 如图(事例1): 这是张老师文章中的一段事例代码,代码的结构是一个div包括着3个a元素,每个a元素之间都是各占一行,所以显示在浏览器上时,a元素之间会有一个间隙,如图: 那么问题来了!将代码改成这样,如图(事例2): 最后的结果是这样的,如