netease / treasures Goto Github PK
View Code? Open in Web Editor NEWa tutorial demo of pomelo
a tutorial demo of pomelo
想了解下玩家移动的相关代码,然后。。。
msgHandler.js看到
// Handle move message
pomelo.on('onMove', function(data) {
var path = data.path;
var entity = app.getCurArea().getEntity(data.entityId);
if (!entity) {
console.error('no character exist for move!' + data.entityId);
return;
}
var sprite = entity.getSprite();
var sPos = sprite.getPosition();
sprite.movePath([sPos, data.endPos]);
});
这只是注册一个onMove,猜测是服务器端广播一个玩家的移动时所调用,所以在服务器端playerHandler中找到代码:
/**
Player moves. Player requests move with the given movePath.
Handle the request from client, and response result to client
*
@param {Object} msg
@param {Object} session
@param {Function} next
@api public
*/
handler.move = function(msg, session, next) {
var endPos = msg.targetPos;
var playerId = session.get('playerId');
var player = area.getPlayer(playerId);
if (!player) {
logger.error('Move without a valid player ! playerId : %j', playerId);
next(new Error('invalid player:' + playerId), {
code: consts.MESSAGE.ERR
});
return;
}
var target = area.getEntity(msg.target);
player.target = target ? target.entityId : null;
if (endPos.x > area.width() || endPos.y > area.height()) {
logger.warn('The path is illigle!! The path is: %j', msg.path);
next(new Error('fail to move for illegal path'), {
code: consts.MESSAGE.ERR
});
return;
}
var action = new Move({
entity: player,
endPos: endPos,
});
if (area.timer().addAction(action)) {
next(null, {
code: consts.MESSAGE.RES,
sPos: player.getPos()
});
area.getChannel().pushMessage({route: 'onMove', entityId: player.entityId, endPos: endPos});
}
};
其中area.getChannel().pushMessage({route: 'onMove', entityId: player.entityId, endPos: endPos});正是广播移动的代码。既然要触发handler.move,客户端必然会调用这个方法,然后在clientManager.js中找到
function pick(args) {
var targetId = args.id;
var entity = app.getCurArea().getEntity(targetId);
if (entity.type === EntityType.TREASURE) {
pomelo.notify('area.playerHandler.move', {targetPos: {x: entity.x, y: entity.y}, target: targetId});
}
}
然后exports.pick = pick; pick又被公开出去,然后在componentAdder.js中找到调用pick的
var eventAction = function (event, node) {
if (event.type === 'mouseClicked') {
clientManager.pick({id: node.id});
}
};
调用eventAction的addComponentToEntity
/**
* add mouseClick component to entity
* @param {Object} entity
*/
var addComponentToEntity = function(entity) {
//add mouseButtonEvent to entities
var clickComponentEntity = new MouseButtonEventComponent({
pipe: area.gLevel.sysPipe(),
decider: area.scene.queryDecider('mouseButtonDecider'),
callback: eventAction
});
var node = entity.getSprite().curNode;
node.addComponent('mouseButtonEventComponent', clickComponentEntity);
};
和
this.addComponentTo = function(entity) {
addComponentToEntity(entity);
};
然后又把ComponentAdder公开出去
module.exports = ComponentAdder;
然后在app.js中看到 var ComponentAdder = require('componentAdder');
但是却没有任何调用,这样一来整个流程的源头就没有了,迷茫。。。
这个demo想说这个demo对于我这种初学者相当好,文档也比以前的给力,嗯,感谢一下网易。
然后今晚在文档的帮助下对源代码小小的分析了一下,基本都能看的懂,但是还是遇到了一些疑问。我看的时候记录了下来,请高手解答:
• Main.js
o //主动调用main函数 ---------在哪被调用,只是公开main出去啊?
o exports.main = main;
o
• next(null, {code: Code.FAIL}); 对应的next在哪 和node.js的next是否一样,一样的话方法名应该一样
• dispatcher.js
o var index = Math.abs(crc.crc32(uid)) % connectors.length;
o return connectors[index];
o 猜测其功能是根据uid和connectors服务器的个数将其分派到其中一个connectors服务器具体逻辑不懂
• Main.js
o pomelo.disconnect();为什么要中断连接
• entryHandler.js
o session api找不到,请大神不要见笑--!
o area.js中exp.addEntity方法getChannel().add(e.id, e.serverId);将玩家这样加入到channel中后,怎么广播channel中所有的玩家更新,找不到执行channel.pushMessage({route: 'addEntities', entities: added});这句代码的地方。貌似没有执行entityUpdate方法
浪费时间啊
使用bearcat,日志文件名称变成 pomelo-undefined.log rpc-log-undefined.log 不同服务的日志写到了一个文件里
我把package.json 改为 0.4.1 然后运行。。
进入场景以后,尝试移动人物,人物走了几步路就黑屏了,查看日志都是报以下的错误。
[2013-06-05 05:50:22.427] [INFO] [default] - �[33m[2013-06-05 05:50:22.426] [WARN] console - �[39mencode msg failed! key : "rankUpdate", msg : {"route":"rankUpdate","entities":[]}
var crc = require('crc');
module.exports.dispatch = function(uid, connectors) {
var index = Math.abs(crc.crc32(uid)) % connectors.length;
return connectors[index];
};
crc.crc32(uid) 返回的是十六进制的字符串,应该写成parseInt(crc.crc32(uid),16)
。
var index = Math.abs(parseInt(crc.crc32(uid)),16) % connectors.length;这个是不是写错了,有的用户名输进去点开始游戏无反应,应该改为
module.exports.dispatch = function(uid, connectors) {
var index = Math.abs(parseInt(crc.crc32(uid),16)) % connectors.length;
return connectors[index];
};
對於master服務器,我用這個方式啟動可以用node.js自帶的debugger調試:
node debug /var/devil/wsp/node/treasures-master/game-server/app.js env=development
但對於在master中啟動的其他服務器,例如connector,可以如何調試呢?
我試過在master啟動完所有服務器進程了,kill其中一個connector進程,然後再用上面的啟動方式手工啟動被kill掉的進程,但啟動完後會拋以下錯誤:
< info: socket.io started
< Caught exception: Error: listen EADDRINUSE
< at errnoException (net.js:769:11)
< at Server._listen2 (net.js:909:14)
< at listen (net.js:936:10)
< at Server.listen (net.js:985:5)
< at Object.exports.listen (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/socket.io/lib/socket.io.js:74:12)
< at pro.listen (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/pomelo-rpc/lib/rpc-server/acceptors/ws-acceptor.js:29:21)
< at pro.start (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/pomelo-rpc/lib/rpc-server/gateway.js:42:17)
< at pro.start (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/lib/components/remote.js:46:15)
< at Application._optComponents (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/lib/application.js:384:19)
< at async.eachSeries.iterate (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/async/lib/async.js:123:13)
详细的错误提示如下:
[2014-04-18 14:41:19.767] [INFO] [default] - [2014-04-18 14:41:19.766] [ERROR] console - Caught exception: TypeError: Cannot read property 'host' of undefined
at Handler.queryEntry (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/app/servers/gate/handler/gateHandler.js:29:37)
at Service.handle (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/common/service/handlerService.js:34:30)
at handle (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/server/server.js:219:25)
at next (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/common/service/filterService.js:50:7)
at Service.beforeFilter (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/common/service/filterService.js:65:3)
at beforeFilter (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/server/server.js:116:8)
at doHandle (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/server/server.js:232:3)
at pro.handle (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/server/server.js:71:5)
at Component.handle (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/components/server.js:54:15)
at handleMessage (/home/hongshuai.yuan/nodejs_work/pomelo/treasures/game-server/node_modules/pomelo/lib/components/connector.js:206:15)
When i try to start web-server with" pomelo start" command, i have this error :
M:\Tiry\GitHub\treasures\game-server\node_modules\pomelo-logger\node_modules\log
4js\lib\date_format.js:26
.replace(/y{1,4}/g, vYear)
^
RangeError: Maximum call stack size exceeded
0.2 $ -1 tresure
在一个干净的环境,git clone这个工程下来后,发现客户端的消息跟gate和connector都能通信,但是客户端发消息到area服务器的时候就没响应了,后来发现是pomelo的版本太低了,升级到高版本的pomelo后,功能一切正常。
修改文件:game-server/package.json:
pomelo的版本修改成如下,就可以了。
"pomelo": "~0.8.0"
I've been going through the code and don't understand where you getting this variable from.
I haven't seen in it anywhere else in the code.
Reference: https://github.com/NetEase/treasures/blob/master/game-server/app/util/routeUtil.js#L4
Also 'session.frontendId' is set when? Is there any documentation about these? I could not find it in API doc.
the generated logs in the v0.3 treasures:
总计 60
-rw-r--r-- 1 linzy root 0 03-14 17:03 con-log-[serverId].log
-rw-r--r-- 1 linzy root 0 03-14 17:03 crash.log
-rw-r--r-- 1 linzy root 0 03-14 17:03 forward-log-[serverId].log
-rw-r--r-- 1 linzy root 4783 03-14 17:03 node-log-[serverId].log
-rw-r--r-- 1 linzy root 0 03-14 17:03 processInfo.log
-rw-r--r-- 1 linzy root 0 03-14 17:03 rpc-log-[serverId].log
-rw-r--r-- 1 linzy root 0 03-14 17:03 systemInfo.log
look at the file name like "forward-log-[serverId].log", it should be some name like forward-log-area-server-1.log, the config in log4js.json is changed in v0.3, is there something wrong?
啟動服務器拋錯:
< Caught exception: TypeError: Cannot read property 'id' of undefined
< at Server.start (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/lib/master/master.js:46:68)
< at EventEmitter.emit (events.js:96:17)
< at exportEvent (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/pomelo-admin/lib/consoleService.js:279:14)
< at EventEmitter.emit (events.js:96:17)
< at Socket. (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/pomelo-admin/lib/masterAgent.js:101:16)
< at Socket.EventEmitter.emit as $emit
< at SocketNamespace.handlePacket (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/socket.io/lib/namespace.js:335:22)
< at Manager.onClientMessage (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/socket.io/lib/manager.js:488:38)
< at WebSocket.Transport.onMessage (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/socket.io/lib/transport.js:387:20)
< at Parser. (/var/linzy/wsp/node/treasures-master/game-server/node_modules/pomelo/node_modules/socket.io/lib/transports/websocket/hybi-16.js:39:10)
調試發現:
在lordofpomelo中,lordofpomelo/game-server/node_modules/pomelo/node_modules/pomelo-admin/lib/masterAgent.js 第100行self.emit('register', record); emit的參數是record;
而在treasures同一文件同一行中:self.emit('register', msg.info); 返回的是msg.info,這個msg.info值為空,故拋出上述錯誤。
查了一下lordofpomelo及treasures兩項目依賴的pomelo-admin的package.json,發現原來兩個依賴的pomelo-admin的版本是不同的,前者為0.0.17,後者為0.1.0。
簡言之,treasures 0.0.1版本直接下載回來配置後其實是無法運行的。
希望版本更新時能增加簡要的說明,並修復之。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.