青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 7(服务器连接&数据处理)

继上一次介绍了《神奇的六边形》的完整游戏开发流程后(可点击这里查看),这次将为大家介绍另外一款魔性游戏《跳跃的方块》的完整开发流程。

(点击图片可进入游戏体验)

因内容太多,为方便大家阅读,所以分多次来讲解。

若要一次性查看所有文档,也可点击这里

接上回(《跳跃的方块》Part 6

(四)服务器连接

服务器部分已经搭建完成,这里就需要与服务器进行通讯。构建一个与服务器的通讯类: Interactive.js,使用引擎AssetUtil功能,将这个脚本加载到UIRoot上,进行与服务器的通讯。
代码如下:

 1 var Interactive = qc.defineBehaviour(‘qc.engine.Interactive‘, qc.JumpingBrick.GameOver, function() {
 2     var self = this;
 3     // 设置到全局
 4     JumpingBrick.service = self;
 5
 6     self.serverUrl = "http://127.0.0.1/JumpingBrick/";
 7 }, {
 8     serverUrl: qc.Serializer.STRING
 9 });
10
11 /**
12  * 上传分数
13  * @param {string} rid - 用户唯一标示
14  * @param {string} token - 当前登陆用户的临时标示
15  * @param {number} score - 分数
16  * @param {func} callbackFunc - 回调函数
17  */
18 Interactive.prototype.updateScorers = function(rid, token, score, callbackFunc) {
19     var url = this.serverUrl + "updateScorers.php";
20     url += "?rid=" + rid;
21     url += "&token=" + token;
22     url += "&score=" + score;
23
24     qc.AssetUtil.get(url, callbackFunc);
25 };
26
27 /**
28  * 获取排行榜
29  * @param {string} rid - 用户唯一标示
30  * @param {string} token - 当前登陆用户的临时标示
31  * @param {func} callbackFunc - 回调函数
32  */
33 Interactive.prototype.getRank = function(rid, token, callbackFunc) {
34     var url = this.serverUrl + "getRank.php";
35     url += "?rid=" + rid;
36     url += "&token=" + token;
37
38     qc.AssetUtil.get(url, callbackFunc);
39 };

(五)本地数据存储

本地数据存储使用引擎提供的Storage功能来实现本地数据的存储功能。

(六)处理游戏数据

现在,服务器通讯、本地存储的接口都已经准备就绪。可以开始处理实际的游戏数据了。

创建脚本

创建数据管理的DataManager.js,并加载到UIRoot上。用来管理所有的数据。

 1 /**
 2  * 数据管理
 3  */
 4 var DataManager = qc.defineBehaviour(‘qc.JumpingBrick.DataManager‘, qc.Behaviour, function() {
 5     var self = this;
 6     JumpingBrick.data = self;
 7     self.loginType = DataManager.NOLOGIN;
 8     self.onRankUpdate = new qc.Signal();
 9     self.shareIcon = ‘http://mama.game.qcplay.com/JumpingBrick/icon.png?v=1.1‘;
10     self.sharePath = ‘http://mama.game.qcplay.com/gamelink/jumpjumpingbrick.php‘;
11     self.shareTitle = [
12         ‘你能超越我吗?‘,
13         ‘真是反应灵巧,求超越!‘,
14         ‘反应力爆表,真心求超越!‘,
15         ‘简直神乎其技,无人能挡!‘
16     ];
17     self.followPage = ‘http://mp.weixin.qq.com/s?__biz=MzAxMDc1MDI5OQ==&mid=400438976&idx=1&sn=abbefc3e6f53bfdf7a5bef0eed53cce2&scene=0#wechat_redirect‘;
18 }, {
19     shareIcon: qc.Serializer.STRING,
20     sharePath: qc.Serializer.STRING,
21     shareTitle: qc.Serializer.STRINGS,
22     followPage: qc.Serializer.STRING
23 });
24
25 DataManager.NOLOGIN = 0;
26 DataManager.QUICKLOGIN = 1;
27 DataManager.WECHATLOGIN = 2;
28
29 DataManager.prototype.awake = function() {
30     var self = this;
31     // 添加微信的回调接口
32     self.wechat = self.gameObject.getScript(‘qc.WeChat‘);
33     if (self.wechat) {
34         self.addListener(self.wechat.onLogin, self.doWechatLoginResult, self);
35         self.addListener(self.wechat.onStartLogin, self.doStartLoginService, self);
36     }
37 };

处理普通登陆和微信登陆

代码如下:

 1 /**
 2  * 是否正在微信登陆中
 3  * @return {Boolean} [description]
 4  */
 5 DataManager.prototype.isInWechatLogin = function() {
 6     return this.wechat && this.wechat.status === ‘loggingIn‘;
 7 };
 8
 9 /**
10  * 是否在微信中打开
11  */
12 DataManager.prototype.isWeChat = function() {
13     return this.wechat && this.wechat.isWeChat();
14 };
15
16 /**
17  * 快速登录,直接进入游戏
18  */
19 DataManager.prototype.quickLogin = function() {
20     var self = this;
21     self.loginType = DataManager.QUICKLOGIN;
22     self.loadScore();
23     JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.Game);
24 };
25
26 /**
27  * 微信登录,等待微信处理
28  */
29 DataManager.prototype.wechatLogin = function() {
30     var self = this;
31     self.wechat.login();
32 };
33
34 /**
35  * 注销
36  */
37 DataManager.prototype.logout = function() {
38     var self = this;
39     self.loginType = DataManager.NOLOGIN;
40 };
41
42 /**
43  * 开始登陆游戏服务器
44  */
45 DataManager.prototype.doStartLoginService = function() {
46     JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.Logining);
47 };
48
49 /**
50  * 登录结果
51  */
52 DataManager.prototype.doWechatLoginResult = function(result) {
53     var self = this;
54     if (result && result === ‘fail‘) {
55         JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.Welcome);
56         return;
57     }
58
59     var data = self.wechat.user;
60     self.loginType = DataManager.WECHATLOGIN;
61     self.rid = data.rid;
62     self.token = data.token;
63     self.loadScore();
64     JumpingBrick.uiManager.switchStateTo(qc.JumpingBrick.UIManager.Game);
65 };

基础数据处理

微信登录后 当微信登录时,保存高分到服务器,并可以从服务器获取排行榜信息。

  1 /**
  2  * 得到当前的保存键值,为不同的用户存储不同的数据
  3  */
  4 DataManager.prototype._getStorageKey = function() {
  5     var self = this;
  6     if (self.loginType === DataManager.QUICKLOGIN) {
  7         return ‘quickLogin‘;
  8     }
  9     else if (self.loginType === DataManager.WECHATLOGIN && self.rid) {
 10         return self.rid;
 11     }
 12     else {
 13         return ‘temp‘;
 14     }
 15 };
 16
 17 /**
 18  * 获取数据
 19  */
 20 DataManager.prototype.loadScore = function() {
 21     var self = this;
 22     self.highScore = parseInt(self.game.storage.get(‘JumpingBrickHighScore_‘ + self._getStorageKey()));
 23 };
 24
 25 /**
 26  * 保存数据
 27  */
 28 DataManager.prototype.saveScore = function (score) {
 29     var self = this;
 30     self.lastScore = score;
 31     self.newHigh = false;
 32     if (!self.highScore || score > self.highScore) {
 33         self.newHigh = true;
 34         self.highScore = score;
 35         try {
 36             self.game.storage.set(‘JumpingBrickHighScore_‘ + self._getStorageKey(), score);
 37             self.game.storage.save();
 38         }
 39         catch(e) {
 40             console.log(‘当前开启了隐私模式,无法保存‘);
 41         }
 42         self.updateScore(self.highScore);
 43     }
 44 };
 45
 46 /**
 47  * 保存数据到服务器
 48  */
 49 DataManager.prototype.updateScore = function(score) {
 50     var self = this;
 51     if (self.loginType !== DataManager.WECHATLOGIN) {
 52         return;
 53     }
 54     JumpingBrick.service.updateScorers(self.rid, self.token, score);
 55 };
 56
 57 /**
 58  * 保存游戏数据
 59  */
 60 DataManager.prototype.saveGameState = function(data) {
 61     var self = this;
 62     try {
 63         self.game.storage.set(‘JumpingBrickGameState_‘ + self._getStorageKey(), JSON.stringify(data));
 64         self.game.storage.save();
 65     }
 66     catch(e) {
 67         console.log(‘当前开启了隐私模式,无法保存‘);
 68     }
 69 };
 70
 71 /**
 72  * 获取并删除保存的游戏数据
 73  */
 74 DataManager.prototype.restoreGameState = function() {
 75     var self = this;
 76     var data = self.game.storage.get(‘JumpingBrickGameState_‘ + self._getStorageKey());
 77     if (data) {
 78         data = JSON.parse(data);
 79     }
 80     return data;
 81 };
 82
 83 /**
 84  * 删除游戏数据
 85  */
 86 DataManager.prototype.clearGameState = function() {
 87     var self = this;
 88     try {
 89         self.game.storage.del(‘JumpingBrickGameState_‘ + self._getStorageKey());
 90         self.game.storage.save();
 91     }
 92     catch(e) {
 93         console.log(‘当前开启了隐私模式,无法保存‘);
 94     }
 95 };
 96
 97 /**
 98  * 请求排行榜
 99  */
100 DataManager.prototype.queryRank = function() {
101     var self = this;
102     if (self.loginType !== DataManager.WECHATLOGIN) {
103         return;
104     }
105     JumpingBrick.service.getRank(self.rid, self.token, self.onGetRankSuccess.bind(self));
106 };
107
108 /**
109  * 获取排行榜成功
110  */
111 DataManager.prototype.onGetRankSuccess = function(data) {
112     var self = this;
113     try {
114         data = JSON.parse(data);
115     }
116     catch (e) {
117         data = {
118             rankTop: [],
119             userData: {}
120         };
121     }
122
123     var self = this;
124     // 获取排行榜成功
125     var rank = 0;
126     var rankTop = data.rankTop;
127     for (var i = 0; i < rankTop.length; i++) {
128         var u = rankTop[i];
129         if (u.rid === self.rid) {
130             rank = i + 1;
131             break;
132         }
133     }
134     data.selfRank = data.userData && data.userData[0];
135     if (data.selfRank)
136         data.selfRank.ranking = rank;
137     self.onRankUpdate.dispatch(data);
138 };

设置当前分享的内容

 1 /**
 2  * 设置分享内容
 3  */
 4 DataManager.prototype.buildShareContent = function(score) {
 5     var self = this,
 6         wechat = self.wechat;
 7     if (wechat && wechat.wx.share) {
 8         var title;
 9         if (score <= 0)
10             title = ‘《跳跃的方块》真是一款魔性的游戏,根本停不下来!‘;
11         else {
12             var index = 0;
13             if (score > 100) index = 3;
14             else if (score > 50) index = 2;
15             else if (score > 20) index = 1;
16             else index = 0;
17             title = ‘我在《跳跃的方块》中达到‘ + score + ‘层,‘ + self.shareTitle[index];
18         }
19         wechat.share(title, self.shareIcon, ‘‘, self.sharePath);
20     }
21 };
时间: 2024-12-20 14:17:59

青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 7(服务器连接&数据处理)的相关文章

JAVASCRIPT开发HTML5游戏--斗地主(网络对战PART4)

继之前用游戏引擎(青瓷引擎)做了斗地主单机版游戏之后,这里分享下使用socket.io来实现网络对战,代码可已放到github上,在此谈谈自己整个的开发思路吧. 客户端代码 服务端代码 (点击图片进入游戏体验) 前文链接: javascript开发HTML5游戏--斗地主(单机模式part1) javascript开发HTML5游戏--斗地主(单机模式part2) javascirpt开发HTML5游戏--斗地主(单机模式part3) 本文章为网络对战第一部分内容.主要内容如下: 简介 服务端项

纯JavaScript+HTML+CSS 的div弹出框

CSS <style> .mask { width:100%; height:100%; position: absolute; top:0; left:0; filter: alpha(opacity=40); -moz-opacity:0.4; opacity:0.4; background-color: #ffffff; z-index:2; display: none; } div.sample_popup { height:auto; border:10px solid #64646

2016年 最火的 15 款 HTML5 游戏引擎

HTML5游戏从2014年Egret引擎开发的神经猫引爆朋友圈之后,就开始一发不可收拾,今年<传奇世界>更是突破流水2000万!从两年多的发展来看,游戏开发变得越来越复杂,需要制作各种炫丽的效果,还要制作各种基于 2D 或者 3D 的场景.作为一名开发者,分析了当下最火爆,最热门的HTML5游戏引擎供大家参考,希望大家也能找到属于自己的那款游戏开发引擎. 我在github上面收集了四十多款的HTML5开源游戏引擎,从里面star.fork等等参数分析其流行度,最后综合各方面元素,筛选出靠前的十

20款最受欢迎的HTML5游戏引擎收集

在“最火HTML5 JavaScript游戏引擎”系列文章国外篇(一)中,我们盘点了当下备受开发者推崇的非国产HTML5和JavaScript游戏引擎.在各种2D小游戏逆袭的今天,用HTML5和JavaScript进行游戏开发成为了一大潮流,而HTML5和JavaScript游戏引擎也逐渐走向了成熟,在追求原生体验的同时,也深逐精致细腻狂炫酷拽.在本文中,我们将继续介绍来自国外,非常受开发者欢迎的HTML5和JavaScript游戏引擎. 1. melonJS melonJS这款轻量级的开源免费

主流HTML5游戏框架的分析和对比

本文主要选取了Construct2.ImactJS.LimeJS.GameMaker.CreateJS.lycheeJS.Crafty.three.js.melonJS.Turbulenz.Quintus.Cocos2d-html5等进行了简要介绍和对比,主要是根据网上的资料整理而成. 主流框架对比 Construct2 Construct 2是一个运行于Windows平台的游戏制作工具,它可以让没有任何编程基础的用户在短时间内不写一行代码快速开发出一款可运行于所有平台(Windows.Mac.

青瓷引擎校园行--解密六小时开发游戏的核心技术

青瓷引擎校园行--解密六小时开发游戏的核心技术 2015-12-02 青瓷集结号 编者的话:2014年<围住神经猫>火遍朋友圈后,H5游戏市场开始活跃.2015年<愚公移山>(原创方:厦门青瓷数码技术有限公司)创造了180万的月流水量,让越来越多的资本开始关注H5游戏.H5游戏正是凭借其“即点即玩的无缝游戏体验”“研发成本低,研发时间短”的特性打开游戏行业的新格局. 面对H5游戏的大好市场前景,如何选择一款合适的H5引擎至关重要!厦门青瓷数码技术有限公司敏锐地嗅到了市场需要,集结强

QQ空间玩吧HTML5游戏引擎使用比例分析

GameLook报道/“Cocos 2015开发者大会(春季)”于4月2日在国家会议中心圆满落下帷幕.在会上全新的3D编辑器,Cocos Runtime等产品重磅公布,给业界带来了Cocos这款国产引擎的最新动态.同时Cocos引擎创始人王哲也提到在目前国内最重要的HTML5游戏渠道玩吧中Cocos已经成为使用率最高的游戏引擎.那么这一数据是如何获取的呢?国内HTML5游戏渠道中目前现状究竟如何?今天我们让数据来说话. 直击现场 1.背景分析 2015年,HTML5平台可谓火爆异常,广大CP纷纷

HTML5游戏开发引擎Pixi.js新手入门讲解

在线演示 本地下载 ?这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) <scripttype="text/javascript"src="http://cdn.gbtags.com/pixi.js/1.6.1/pixi.js"></script> 引擎使用: .... .... 阅读原文:HTML5游戏开发引擎P

HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js

太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章,"愤怒的小鸟篇" 此篇,并不是书中的篇符,而是通过希望通过结合实际的canvas 绘图库实现box2d物理引擎在各绘图库上应用,绘图库网上有很多现成的 如:createjs, pixi.js 等,Egret或者其它游戏引擎有自己的物理引擎扩展库,所以就不说了. 现在通过之前的学习,基本掌握了刚体等基础