pomelo 与 cocos2d-js 开发环境搭建

cocos2d-js 是整合了 cocos2d-html5 和 cocos2d-jsb,可以方便的开发部署到各种设备环境中

pomelo-cocos2d-js 则是对 pomelo-client-websocket 和 pomelo-cocos2d-jsb 的整合

本文以cocos code ide为开发环境说明如何搭建 pomelo 与 cocos2d-js 的开发环境

1:下载 cocos code ide
cocos code ide

2:下载 cocos2d-js 配置cocos code ide

cocos code ide

cocos_code_ide环境配置

3:新建 cocos javascript project

这个时候,可以点击 build runtime 按钮,看是否能够成功编译

可以选择 win32 runtime(本文演示的是win32) 或者 android runtime

4:下载 pomelo-cocos2d-js

在项目根路径下面执行

git clone https://github.com/Netease/pomelo-cocos2d-js.git --recursive

5:cocos2d-html5 环境搭建

修改index.html

<script src="frameworks/cocos2d-html5/CCBoot.js"></script>
<script src="pomelo-cocos2d-js/html5/build/build.js"></script>
<script type="text/javascript">
    require('boot');
</script> 
<script src="main.js"></script>

6:cocos2d-jsb 环境搭建

修改main.js

cc.game.onStart = function() {
    if (cc.sys.isNative === true) {
        require('pomelo-cocos2d-js/index.js');
    }

    cc.view.setDesignResolutionSize(800, 450, cc.ResolutionPolicy.EXACT_FIT);
    cc.view.resizeWithBrowserSize(true);
    // load resources
    cc.LoaderScene.preload(g_resources, function() {
        cc.director.runScene(new HelloWorldScene());
    }, this);
};
cc.game.run();

7:测试chat
修改app.js,添加

var pomeloChat = function() {
    var pomelo = window.pomelo;

    var route = 'gate.gateHandler.queryEntry';
    var uid = "uid";
    var rid = "rid";
    var username = "username";

    pomelo.init({
        host: "127.0.0.1",
        port: 3014,
        log: true
    }, function() {
        pomelo.request(route, {
            uid: uid
        }, function(data) {
            pomelo.disconnect();
            pomelo.init({
                host: data.host,
                port: data.port,
                log: true
            }, function() {
                var route = "connector.entryHandler.enter";
                pomelo.request(route, {
                    username: username,
                    rid: rid
                }, function(data) {
                    cc.log(JSON.stringify(data));
                    chatSend();
                });
            });
        });
    });

    function chatSend() {
        var route = "chat.chatHandler.send";
        var target = "*";
        var msg = "msg"
            pomelo.request(route, {
                rid: rid,
                content: msg,
                from: username,
                target: target
            }, function(data) {
                cc.log(JSON.stringify(data));
            });
    }
}

然后在 HelloWorldLayer 的 ctor 里面添加

pomeloChat();

8:本地把chatofpomelo-websocket跑起来

9:分别在jsb环境和html5环境测试



测试demo完整地址在 pomelo-cocos2d-js-demo 此demo只提供代码部分展示,cocos2d-js 库相关并没有上传

标签:无
fantasyni 在 2014-7-22 14:07发布
fantasyni 在 2014-7-22 14:50重新编辑 分享到 weibo
19 回复
#1 zj8487 2014-7-22 14:29 回复

#2 {1} cocopeng 2014-7-30 10:42 回复

您好,你的文章很棒,已经推荐到Cocos引擎中文官网。感谢您的分享。

fantasyni 2014-7-30 13:01 回复

@cocopeng 可以啊

#3 {1} daviekong 2014-7-30 13:08 回复

socket error:

Event
build.js:1532
socket close:

CloseEvent

这是什么问题?socket关闭了?

fantasyni 2014-7-30 13:09 回复

@daviekong
正常的哦,连接gate获取connector地址,chat里面是这样子的逻辑

#4 {10} 1938777573 2014-9-3 18:35 回复

楼主,我这边调试发现在pomelo.init的回调处死了。 并没有去连接connector服务器。 这是怎么回事啊?

fantasyni 2014-9-4 11:52 回复

@1938777573 connector 地址拿到了吗?

1938777573 2014-9-4 13:50 回复

@fantasyni 没有拿到。init函数的执行完了,但是回调没执行,估计socket连接死掉了。。。 但是socket的接受里面也没见到去主动调用回调函数。init的回调在哪执行的呢。。。

1938777573 2014-9-4 13:50 回复

@fantasyni 没有拿到。init函数的执行完了,但是回调没执行,估计socket连接死掉了。。。 但是socket的接受里面也没见到去主动调用回调函数。init的回调在哪执行的呢。。。

1938777573 2014-9-4 13:57 回复

socket = new WebSocket(url); WebSocket没有初始化。。。这个WebSocket怎么没看到定义啊。。。。

1938777573 2014-9-4 13:57 回复

socket = new WebSocket(url); WebSocket没有初始化。。。这个WebSocket怎么没看到定义啊。。。。

fantasyni 2014-9-4 14:01 回复

@1938777573 服务端看到连接connector的日志了吗

1938777573 2014-9-4 14:39 回复

我跟了一下跟到了libJSBindingForNetwork中的jsb_websocket.它的socket构造函数是跑了的,内部怎么会出现Socket连接不上呢?。。。

1938777573 2014-9-4 14:50 回复

@fantasyni js客户端连接gate服务器,服务器一点反应都没有。。。。

fantasyni 2014-9-4 15:04 回复

@1938777573 你是最新cocos2d-js吗?啥系统?

1938777573 2014-9-4 16:28 回复

@fantasyni 是最新的3.0R3. 系统?

#5 1938777573 2014-9-3 18:53 回复

按照Api的话,连接gate的步骤就这个pomelo.init.这里面用到的的WebSocket的连接怎么会出问题呢?为什么init的回调不执行啊?

#6 1938777573 2014-9-3 18:59 回复

有人吗?

#7 1938777573 2014-9-4 09:28 回复

楼主,在吗?

#8 {5} qqirod 2014-9-22 21:48 回复

按照教程,无论mac还是web都可以调试成功,但我用cocos compile -p web -m release命令发布web的release版本时,发现pomelo-cocos2d-js 文件夹不会被复制到发布版里面,又或者pomelo的任何库都没有包含进发布版里面。
我还尝试了发布成apk,可里面依然没有pomelo的东西。
也尝试发布成mac版,但编译时发生错误(用ide调试时正常的)。

请问怎么正确地发布成release版本?

qqirod 2014-9-22 23:05 回复

找到原因了,web发布版的,把pomelo-cocos2d-js 文件夹考到和index.html同级目录后,要确保
<script src="game.min.js"></script>
<script src="pomelo-cocos2d-js/html5/build/build.js"></script>
的顺序不能颠倒,颠倒则运行失败。

但还有个问题,在mac上的sofari访问成功,可在iphone4上访问失败,不知道是不是iphone4sofari版本较低的原因,有谁有这方面经验吗?

qqirod 2014-9-22 23:06 回复

sofari->safari

fantasyni 2014-9-23 09:14 回复

@qqirod iphone4 ios 几的?

qqirod 2014-9-23 21:55 回复

@fantasyni 5.1.1,safari是默认的版本,不知道是几版本。我怀疑是safari的版本不支持某些socket。以前我用mac10.68的safari也是连接不上某个socket版本(具体不记得是哪种socket了)的pomelo,换成chrome就可以。而现在系统升到mac10.9,safari跟着升级后,就连上了。

fantasyni 2014-9-24 09:06 回复

@qqirod 恩恩,应该是safari地版本的问题

#9 cqzs19871202 2014-12-7 20:32 回复

objc[1164]: Class AVAudioPlayer is implemented in both /System/Library/Frameworks/AVFoundation.framework/Versions/A/Resources/libAVFAudio.dylib and /Users/chris/work/workspace/cocos/js/TestPomelo/runtime/mac/TestPomelo Mac.app/Contents/MacOS/TestPomelo Mac. One of the two will be used. Which one is undefined.
2014-12-07 20:22:33.308 TestPomelo Mac[1164:33335] Unable to load nib file: MainMenu, exiting

浏览器就可以正常访问,但是cocos为啥报错呢?cocos2d-js的版本是v3.1

#10 cqzs19871202 2014-12-7 20:44 回复

TestPomelo Mac.app/../../../pomelo-cocos2d-js/index.js:25:Error: can't open pomelo-cocos2d-jsb/lib/emitter/index.js: No such file or directory
用xcode生成testPomelo.app后
还会报这些文件找不到

#11 {3} UndoRedo 2015-3-11 23:19 回复

用GIT下载pomelo-cocos2d-js 的时候,--recursive标志很重要,不然对应的几个库就下不来,提示找不到文件。
下完之后,cocos code IDE的工程最好刷新一下,不然也可能产生奇怪的问题。

这就是我调了好一会儿才通过的经验。

xulidong 2015-4-8 12:08 回复

pomelo-cocos2d-js中index.js第一句:
var Util = require('util');就报错:Error: can't open : No such file or directory
是模块没有下载完整吗?

zj8487 2015-4-8 14:41 回复

@xulidong
现在是新版本了。你倒官方看看文档

yesen 2015-9-20 09:12 回复

@zj8487 我用最新的(0.1.4)pomelo-cocos2d-js 在android的微信和qq浏览器会连不上服务器,服务器报could not find handle invalid data package,其他浏览器和cocos运行正常,大概是因为pomelo-cocos2d-js的pomelo版本过低导致socket的数据包类型或格式不对,我服务器用的是pomelo1.1.9,我把模板的build.js放到客户端,这时候微信和qq浏览器访问就正常了,但我不知道怎么整合代码,也报pomelo-cocos2d-js中index.js第一句:
var Util = require('util');就报错:Error: can't open : No such file or directory 纠结啊

#12 IcepOwer 2015-4-9 15:35 回复

pomelo-cocos2d-js/html5/build/build.js
现在已经没有这个文件了啊!而且我也遇到了@xulidong 的错误!
文档要跟上啊,不然怎么用!哎

#13 IcepOwer 2015-4-10 11:20 回复

教程已过期
“现在直接用 dist 下的文件,放入 cocos2d-js 的 jsList 里面即可,还是全局的 pomelo 对象”

#14 {1} UndoRedo 2015-4-11 20:30 回复
app.configure(&apos;production|development&apos;, &apos;connector&apos;, function() {
app.set(&apos;connectorConfig&apos;, {
  connector: pomelo.connectors.hybridconnector,
  heartbeat: 10,
  useDict: true,
  useProtobuf: true,
  ssl: {
    type: &apos;wss&apos;,
      key: fs.readFileSync(&apos;./keys/server.key&apos;),
      cert: fs.readFileSync(&apos;./keys/server.crt&apos;),
  }
});

});
请问一下,服务器这样启用wss之后,cocos2d-js客户端要做些什么才能连得上啊?

fantasyni 2015-4-11 20:33 回复

@UndoRedo
客户端下有 chat test 的例子的,你用 chatofpomelo-websocket 试试

#15 {2} UndoRedo 2015-4-11 23:15 回复
throw new Error(
  &apos;secure random number generation not supported by this browser&#92;n&apos;+
  &apos;use chrome, FireFox or Internet Explorer 11&apos;
)

就先不说wss了,我使用useCrypto的时候,在Chrome上调试是正常的,可是在cocos code ide 的Mac模拟器运行就会提示以上的错误,说是oldBrowser,没有crypto.getRandomValues这个方法。

UndoRedo 2015-4-11 23:30 回复

我的客户端是在bearcat-cocos2d-js-example的基础上加了pomelo-cocos2d-js。

UndoRedo 2015-4-11 23:49 回复

我硬把oldBrowser改写成Math.random生成随机数就可以了,不知道是否合适。

function oldBrowser(size, cb) {
var bytes = new Buffer(size);

for (var i = bytes.length - 1; i >= 0; i--) {
bytes[i] = Math.round(Math.random() * 256);
};
if (typeof cb === 'function') {
return process.nextTick(function () {
cb(null, bytes);
});
}
return bytes;
// throw new Error(
// 'secure random number generation not supported by this browser\n'+
// 'use chrome, FireFox or Internet Explorer 11'
// )
}

#16 {7} kin2141539 2015-4-13 10:44 回复

pomelo.on('onChat', function(data) {
cc.log("onChat:" + data);
cc.log("onChat1:" + JSON.stringify(data));
});

然后打印:
JS: onChat:[object Object]
JS: onChat1:{"msg":"[object Uint8Array]","from":"[object Uint8Array]","target":"[object Uint8Array]"}

为什么是Uint8Array?

kin2141539 2015-4-13 10:44 回复

求help,在线等

kin2141539 2015-4-13 11:00 回复

我的是cocos2d-js ios native环境运行的
这个是不是不支持?

fantasyni 2015-4-13 11:44 回复

@kin2141539 支持的吧~ spiderMonkey 应该没问题的

ccblandy 2015-4-27 18:16 回复

我把3283行// var b = buffer.readUInt8(pos);
改为var b = buffer[pos];虽然不报错了,但是我和你一样的问题onChat1:{"msg":"[object Uint8Array]","from":"[object Uint8Array]","target":"[object Uint8Array]"}

ccblandy 2015-4-28 17:41 回复

@fantasyni 坛主在么?接收消息时报错
../src/pomelo-cocos2d-js/dist/pomelo-cocos2d-js.js:3283:TypeError: buffer.readUInt8 is not a function
我把3283行// var b = buffer.readUInt8(pos);
改为var b = buffer[pos];虽然不报错了,但是我楼上一样的的问题onChat1:{"msg":"[object Uint8Array]","from":"[object Uint8Array]","target":"[object Uint8Array]"},怎么才能显示文字呢

fantasyni 2015-4-29 08:43 回复

@ccblandy
晕倒,你 cc.log(obj.target) 即可

ccblandy 2015-4-29 09:51 回复

@fantasyni 坛主你好,我知道里面的对象有msg、from、target属性,但是obj.target不是文字 是[object Uint8Array],而且源码3283行报错,我改为var b = buffer[pos];这样对吗

#17 ccblandy 2015-4-27 16:09 回复

mac环境 跑native环境 接收消息时报错
../src/pomelo-cocos2d-js/dist/pomelo-cocos2d-js.js:3283:TypeError: buffer.readUInt8 is not a function

#18 linyouhappy 2015-9-21 02:08 回复

cocos2d-js加载js文件超级简单。
std::string jsFileContent = futil->getStringFromFile(fullPath);
if (!jsFileContent.empty())
{
ok = JS::Compile(cx, obj, op, jsFileContent.c_str(), jsFileContent.size(), &script);
}

这个地方可以做很多工作,比如从加密的zip包取出脚本文件,然后,把文件内容注入进去,等等。
操作完毕,记得缓存。filename_script[fullPath] = script;
这点,越来越像lua了。

#19 linyouhappy 2015-10-2 15:50 回复

pomelo 与 cocos2d-js 搭配目前来说还是幻想。
折腾了一段时间,cocos2d-js 3.8版本,单单os文件就达到42MB,然后又要在js执行序列化的运算。我不知道有多少手机支撑得住,即使支撑的住,估计发热也厉害。
以前用lua开发,序列化在C++实现,定制化的那种序列化,使用socket连接。在游戏场景中,洪水般的消息喷出来,勉强还可以支持。手机玩半个小时就烫手。

回到顶部