mugeda动画平台还可以用来制作跨屏互动的动画应用,比如在PC端的大屏幕上显示动画的主界面,同时会显示出供手机扫描的二维码,手机扫描后会在手机上显示手机端动画界面。通过手机就可以和PC端的显示界面跨屏互动操作。这种动画应用在类似一些商场搞活动,或者户外宣传等常见可以使用。可以制作一对一玩的跨屏互动应用,也可以制作一对多玩(多个玩家同时玩)的跨屏互动应用。为了更好的理解跨屏互动应用的使用,本文档将通过一个简单的例子来演示跨屏动画的制作过程。

一、制作动画

1.PC端动画制作

a.在PC端,设置舞台吃尺寸为宽700、高480

b.在舞台中放在一个文字对象,并命名为info(用于显示连接及通讯信息)

c.在舞台中放在一个二维码的图片。(该二维码会在运行时被用真实的客户端连接的二维码替换)。给该图片命名qrc。

如图:

2.移动端动画制作

a.设置舞台尺寸为宽320、高416

b.在舞台中放一个用圆角矩形和文字组成的按钮,文字内容为connectPC。为该按钮设置动作为回调函数,触发方式:单击,函数名字:connectPC

如图:

c.用同步骤b相同的方式,再创建两个按钮,文字分别为sayHello、sayOK,函数名字分别为sayHello、sayOK。

最后舞台如图:

3.导入脚本

a.PC端,点击菜单栏的文件-》导入-》脚本。在弹出的导入脚本对话框中,勾选jquery.js、socketio.js、jquery.qrcode.js。点击确定。

如图:

b.用同样的方式在移动端导入socketio.js

导入文件说明:

跨屏动画通讯用到的Mugeda.Socket对象是基于socket.io封装的,所以PC端和移动端都需要导入socketio.js文件。PC端需要在游戏开始时动态更换二维码图片,所以需要导入与二维码相关的库文件jquery.js、jquery.qrcode.js

二、编写代码

用到的主要对象说明:

Mugeda.Socket对象,用于维护存连接相关数据和操作。

Mugeda.Socket.Client对象,用于维护存匿名认证客户的信息和操作。

实现通讯的主要步骤:

1.PC端先向服务器发起连接请求,产生连接

2.然后PC端通过侦听authorization事件获取到非认证用户(即客户端)带request和token的地址,进而通过replaceQrcode将动画中的图片对象替换为二维码。

3.玩家通过手机等移动设备扫描二维码,在自己的设备中打开客户端,

4.客户端向服务器发起连接请求,并产生连接

5.客户端与PC端通讯

连接服务器

通过实例化Mugeda.Socket对象,产生连接。Mugeda.Socket类的构造函数为:

Mugeda.Socket(request, token, isRegisteredUser, guestURL, server, port)

其中:

request:{string}请求字符串

token:{string}令牌

isRegisteredUser:{bool,缺省false}是否为认证客户。

server:{string,缺省为SERVER_URL常量} 服务器地址

port:{string,缺省为SERVER_PORT常量}服务器端口

1. 认证用户的实例化:认证用户拥有request、token以及非认证客户的游戏地址url,使用以下方式实例化Mugeda.Socket

var a = new Mugeda.Socket(request, token, true, url)

2. 匿名用户的实例化:匿名用户通常来自二维码的扫描,网页地址中包含request和token,可通过以下方式直接从地址中获取

var a = new Mugeda.Socket()

a.getReqestAndTokenFromUrl()

实例化Mugeda.socket对象后,认证用户和匿名用户都使用以下形式的方式连接服务器。

a.connect(function(err){})

在回调函数中,查看err字符串,如果为空,说明连接成功,否则,可能是token不对。

认证用户(即PC端)获取匿名用户(即客户端)队列

认证用户通过a.clients获取匿名用户数组,最早连接的用户在队列前面。数组的每一个元素都为Mugeda.Socket.Client实例。

侦听cliententer和clientleave事件,这两个事件在匿名用户连接和断开时刻发生。

a.addEventListener('cliententer', function(client){

})

a.addEventListener('clientleave', function(client){

})

认证用户对匿名用户的操作

1. 发送消息

对Client实例发送消息:

client.send(event, data, callback)

其中:

event{stirng},自定义事件名

data{string、number、object、null}发送的数据,其中number和string在发送前会被转化为{data: string}或{data.number}的形式。

callback{function},对需要匿名用户立即回复的情形,callback函数会传递到匿名客户,由匿名客户直接调用。

对全体Client发送消息

a.sendAll(event, data)

参数含义同上。

2. 检测Client是否有回应

client.checkAvailable(callback, timeout)

其中:

callback{function}回调

timeout{number,缺省10}超时秒数

检测非认证用户是否有回应,若有,callback回调,回调函数的第一个参数为true;否则,timeout后,callback回调,回调函数的第一个参数为false。

3. 不断检测Client的存在性

client.checkAvailableContinuously(callback, interval, timeout)

匿名用户将每隔interval秒(缺省5秒)向认证用户发送一个心跳包,当timeout(缺省20秒)后,callback回调且第一个参数为false。

4. 得到Client实例在a.clients数组中的Index

a.getClientIndexByUserId(client.user)

匿名用户的操作

1. 发送消息

a.send(event, data, callback)

参数含义同上。

2. 检测与服务器的连接讯速度

a.benchmark(callback, times, timeout)

匿名用户多次向服务器发送数据,服务器收到后返回数据,测试数据来回所用时间/2。

其中:

callback{function}回调函数,格式为function(averageTime, timeArray),其中timeArray记录了每一次的时间,averageTime为平均时间,单位均为ms。

times{number,缺省为3}测试的次数。

timeout{number,缺省2000}超时的时间,单位ms。

其他事件

1. 认证何用户消息侦听

a.addEventListener('message', function(client, event, data, callback){

console.log(event, data)

})

侦听匿名用户通过a.send发送的消息。client为发送消息的用户的Client对象,其余参数同上。

2. 匿名用户消息侦听

a.addEventListener('message', function(event, data, callback){

console.log(event, data)

})

形式与上面类似,但是回调少了client参数。

3. 匿名用户侦听PC断开事件

a.addEventListener(‘disconnected’, function(){

})

1.PC端代码

a.定义SocketComm对象

var mugeda=Mugeda.getMugedaObject();

var scene = null;

var info = null;

var isConnect = false;

var SocketComm = function(){//定义SocketComm对象

this.socket = null;

this.scene = null;

this.connected = null;

this.name = (new Date()).getTime();

var _=this;

this.setup = function(callback, scene){

connect = new Mugeda.Socket('dejipuzzle','d2f7335a19ecc3ed2a0cbe66580fdd05', true,

'https://cn.mugeda.com/client/preview_css3.html?id=d20c8a20');//通过实例化Mugeda.Socket类,产生连接

this.scene = scene;

connect.connect(function(err){//认证用户(PC端)连接服务器

if(err){

Mugeda.log(err);

}

else{

_.connected = true

callback({

event: 'connect'

})

}

})

connect.addEventListener('authorization',function(){//认证用户(PC端)侦听authorization事件

var replaceQrcode = function(imgObj, url) {//将动画中的图片对象替换为二维码

var cvs, height, width;

var holder = document.createElement('div');

holder.width = imgObj.width;

holder.height = imgObj.height;

if (url) {

$(holder).empty().qrcode({

text: url,

ecLevel: 'L'

});

width = imgObj.width;

height = imgObj.height;

$(imgObj.dom).css('background-image', 'none');

$(imgObj.dom).css('background-color', 'white');

$(imgObj.dom).css('padding', '4px');

cvs = $(holder).find('canvas');

cvs.css('margin', '2px');

cvs.css('width', (width - 4) + 'px');

cvs.css('height', (height - 4) + 'px');

imgObj.dom.src = cvs[0].toDataURL();

}

};

var qrc = scene.getObjectByName('qrc');//获取舞台中原来的二维码图片对象

replaceQrcode(qrc, this.clientURL);//通过this.clientURL获取非认证用户带request和token的地址,并替换二维码

console.log(this.clientURL);

})

connect.addEventListener('cliententer', function(client){//侦听cliententer在匿名用户连接时触发。

info.text = ("用户接入成功。");

console.log(client);

})

connect.addEventListener('clientleave', function(client){//侦听clientleave事件,在匿名用户断开时触发。

info.text = ("用户离开。");

console.log(client);

})

connect.addEventListener('disconnect', function () {//侦听disconnect事件

callback({

'event':'disconnect'

});

_.connected = false;

isConnect = false;

});

connect.addEventListener('message', function(client, event, data){

//侦听匿名用户通过a.send发送的消息。并调用在setup的回调函数中处理

callback({

'event':event,

'client':client,

'data':data

});

})

};

}

b.在renderReady监听回调中调用SocketComm实例的setup方法

var cross = new SocketComm();//实例化SocketComm对象

mugeda.addEventListener("renderReady", function () {

scene = mugeda.scene;

info = scene.getObjectByName('info');//获取info对象,显示连接状态和移动端发来的消息

var processMessage = function(msg){//setup处理消息的回调函数

if(!mugeda || !scene)

return;

msg = msg || {};

if(msg.event == "connect"){

info.text = ("连接成功。等待用户接入。");

}

else if(msg.event == "disconnect"){

info.text = ("连接断开");

}

else if(msg.event == "update"){

console.log(msg.data);

}

else if(msg.event == 'mobilemessage') {//处理匿名用户(客户端)发来的消息

var data = msg.data;

info.text = data;

}

}

cross.setup(processMessage, scene);//调用SocketComm实例的setup方法

});

2.移动端代码

var mugeda=Mugeda.getMugedaObject();

mugeda.addEventListener("renderReady", function () {

scene = mugeda.scene;

var hello = scene.getObjectByName('hello');//获取sayHello按钮对象

var ok = scene.getObjectByName('ok');//获取sayOK按钮对象

var connectButton = scene.getObjectByName('connect');//获取connectPC按钮对象

hello.left = -700;//sayHello按钮移到舞台外

ok.left = -700;//sayOK按钮移到舞台外

var socket = new Mugeda.Socket();//实例化Mugeda.Socket对象

socket.getReqestAndTokenFromUrl();//获取request和token

socket.addEventListener('authorization', function(){//侦听authorization事件

console.log(this.clientURL);

});

socket.addEventListener('message', function(event, data, callback){//侦听PC端通过send发送的消息

console.log(event, data);

processMessage(event,data, callback);

})

socket.addEventListener('disconneted', function(){//匿名用户(移动端)侦听PC断开事件

console.log('disconneted');

error.text = "连接失败,请重新刷二维码";

scene.gotoAndPause(errorFrame);

})

window.connectPC = function(){//connectPC按钮的回调函数

socket.connect(function(err){//回调中,查看err字符串,为空,说明连接成功。

if(err){

console.log(err);

if(err.indexOf && err.indexOf('handshake')>=0){

console.log("无效的二维码。请重新刷二维码。")

}

}

else{

console.log('connect OK');

connectButton.left = -700;//connectPC按钮移到舞台外

hello.left = 76;//sayHello按钮移到舞台内

ok.left = 76;//sayOK按钮移到舞台内

}

});//匿名用户(移动端)连接服务器

};

window.sayHello = function(){//sayHello按钮的回调函数

socket.send('mobilemessage', "Hello,World!");//向PC端发送消息

};

window.sayOK = function(){//sayOK按钮的回调函数

socket.send('mobilemessage', "I'm OK!");//向PC端发送消息

};

});

二、运行程序

先运行PC端程序,用移动设备扫描PC端的二维码来运行移动端。

移动端点击connectPC按钮连接服务器。

点击sayHello和sayOK按钮,可以在PC端看到交互结果。

实例预览:

https://cn.mugeda.com/client/preview_css3.html?id=d8297427

总结,该例子只是用了最简单的示例来演示怎么建立一个最简单(Hello World)的跨屏互动应用。具体到商业级的产品的肯定还需要根据具体的产品需求制作更加丰富的动画内容。后面章节中会有一些案例分析,其中有一篇是是一款跨屏动画的案例分析。敬请期待后续更多文章推出。感觉好的请帮忙点赞^_^

[Mugeda HTML5技术教程之12]制作跨屏互动应用的更多相关文章

  1. [Mugeda HTML5技术教程之19]制作可定制贺卡

    本文档通过一个实例介绍可定制贺卡的动画的制作过程.实例包含两部分: 1. 动画部分:介绍动画制作过程中如何给祝福词和落款的文本对象命名,如何给定制按钮定义表单动作. 2. 代码部分:介绍贺卡的脚本逻辑 ...

  2. [Mugeda HTML5技术教程之16]案例分析:制作跨屏互动游戏

    本节我们将要做一个跨屏互动应用的案例分析,该应用时给一家商场做活动使用的,是一个跨屏爱消除游戏.PC端页面显示在连接在PC的大屏幕上,参与活动的玩家可以用自己的手机扫描PC端页面上的二维码,连接成功后 ...

  3. [Mugeda HTML5技术教程之14]案例分析:制作网页游戏

    本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...

  4. [Mugeda HTML5技术教程之2] Mugeda HTML5富媒体平台简介

    [Mugeda HTML5技术教程之2] Mugeda HTML5动画平台简介 摘要:Mugeda提供基于云的平台,供开发人员和设计人员快速的开发.发布和统计基于HTML5的,包含丰富动画和交互的移动 ...

  5. [Mugeda HTML5技术教程之15]案例分析:制作移动教育课件

    本文档要分析的案例是一个一氧化碳还原氧化铜的教育小课件,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作移动教育课件的方法.Mugeda为移动教育领域和移动数字出版领域提供理想的教 ...

  6. [Mugeda HTML5技术教程之11]Mugeda API简介

    一.API 概述 Mugeda API 提供了一个简单的,结构化的方法来实时动态管理Mugeda内容.它提供了一下方法: •访问Mugeda内容中的对象. •获取和设置对象属性,如位置.旋转.比例.不 ...

  7. [Mugeda HTML5技术教程之1] HTML5: 生存还是毁灭

    [Mugeda HTML5技术教程] 开篇: HTML5 - 生存,还是毁灭 摘要:HTML5并不试图解决所有问题.但是在很多适合的场合,HTML5是不二选择. To be, or not to be ...

  8. [Mugeda HTML5技术教程之4] Studio 概述

    Mugeda Studio 是基于云平台的制作HTML5动画的专业可视化集成开发环境,可以让你在不需要安装客户端程序的情况下,只通过浏览器就能轻松创作高质量的HTML5动画.HTML5动画相对于传统的 ...

  9. [Mugeda HTML5技术教程之10]发布内容

    动画作品制作好后,就要拿来使用,怎么发布到想要的位置也是动画制作者比较关心的问题.这一节,我们讲述怎样将制作好的动画内容发布到想要的地方.对制作好的内容,可能的使用场景主要有以下三种:直接导出:发布到 ...

随机推荐

  1. Linux下的管道命令有这些:

    Linux下的管道命令有这些: 选取命令:cat grep 排序命令:sort wc uniq 双向重定向:tee 字符转换命令: tr, col, join, paste, expand 切割命令: ...

  2. RichTextBox控件日常使用集合

    1.RichTextBox控件自动滚动到底部 richTextBox1.ScrollToCaret(); //将控件的内容滚动到当前光标位置

  3. Codeforces 519E A and B and Lecture Rooms

    http://codeforces.com/contest/519/problem/E 题意: 给出一棵树和m次询问,每次询问给出两个点,求出到这两个点距离相等的点的个数. 思路: lca...然后直 ...

  4. LeetCode_Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. 【转】Win7与Ubuntu 14.04双系统修改启动项顺序

    原文网址:http://blog.sina.com.cn/s/blog_b381a98e0102v1gy.html 一.Ubuntu14.04采用默认安装方式的情况 采用默认安装方式,在win7下安装 ...

  6. Java中的ThreadLocal深入理解

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  7. hdu 1874 畅通工程续(最短路)

    最短路问题! 最简单的最短路问题! 恩! #include<stdio.h> #define MAX 1000000 int map[500][500]; int n,m,start,en ...

  8. 第20讲- Spinner与适配器模式

    第20讲 Spinner与适配器模式 使用Spinner相当于从下拉列表中选择项目,Spinner是一个每次只能选择所有项的一个项的控件.它的项来自于与之相关联的适配器中.Spinner的重点问题就是 ...

  9. Hibernate中Session的几个方法的简单说明

    Hibernate对普通JDBC的操作进行了轻量级的封装,使得开发人员可以利用Session对象以面向对象的思想来实现对关系数据库的操作. 一般通过Configuration对象读取相应的配置文件来创 ...

  10. Android之Intent

    前言:大家都知道Android程序的实现一般都由四大组件构成: Activity :Android程序实现功能的主体,提供了和客户交互的界面,也提供了和后台交互的功能. Service :是一个没有界 ...