Cocos2dx学习笔记——cocos-ext头文件编译问题

开始学习的过程中遇到一个问题。就是跟着教程学习使用如何使用TableView的时候,为使用当时引入了一个名为cocos-ext.h的头文件而产生了大量的报错。我当时很诧异因为我一切步骤都是按照教程的步骤来的。后来我发现了原因所在。因为我为了更好的研究代码使用的是cocos2d的源码生成的项目。而不是使用预编译的版本。而环境搭建时对于基本头文件的路径有所优化,而源码中仍旧使用的是老版本的路径方式。所以解决方案如下:
不断循环编译。在编译报告中点开关于无法打开源文件extensions\...的报错项目。将其改为如#include "ExtensionExport.h"这样的格式。再重新生成直到没有报错为止。

git使用方法简明教程 - 个人篇

git使用

什么是git

git就是一个管理你项目代码,监控你代码的变更记录的一款软件。

下载git

在git官网上下载,推荐是带有gui的版本。下载地址自行百度

Bash 和 GUI

下载安装完毕后右键菜单会多出来两项。分别为git bash和git gui。bash为git的命令行版本,gui为git的gui版本。在一个文件夹下右键选择其中之一。就是在当前文件下打开该工具
PS: git bash 也可以当做普通的命令行来使用

项目的创建与删除

创建

在项目文件的根目录下右键,选中git bash。输入命令

1
$ git init

完成git文件创建,会在该目录下创建一个隐藏的文件夹 .git
该文件夹就是管理你代码的监控文件,文件夹总大小略大于你所有文本文件总大小

删除

文件夹设置为显示隐藏的项目,把.git文件夹删除就可以完成git项目的删除

代码管理

代码管理对于新手来说并不建议使用bash版本的git。因为过于复杂。一般bash用于处理gui版本无法处理的一些复杂的git管理操作。因此这里使用gui版本进行。
对于个人使用。一个简单的主分支即可。主分支一般默认起名叫master。我会在之后的团队协作使用git的教程中详细说明分支的相关内容。

代码提交 commit

当代码与之前版本不同时,git把有过改动的文件列出来。点击缓存改动。将改动的文件添加到将要提交的队列。在提交描述处填写该次提交改动的描述,点击提交完成代码的提交。
注意,此处的提交是指提交到本地的git项目中。并不是提交到网上的代码仓库。当然也可以不提交到网上。
描述格式:

1
2
3
4
描述详情

描述细节1
描述细节2

个人用的推荐的描述格式:

1
2
3
4
5
6
XXX功能

ADD XXX功能
UPDATE 优化了XXX的逻辑
DELETE 删除冗余代码
FIXED 修复了不能XXX的BUG

代码上传 push

代码上传是指将git项目提交带网络上的代码仓库中
上传必须知道三个东西:

  • git仓库的地址
  • git仓库的个人账号
  • git仓库的个人密码

在git gui中直接点击上传即可。在目标版本库中填入仓库的地址。然后上传的过程中会一一询问账号和密码。正确填写完成上传。

代码克隆 clone

代码克隆很简单。一局代码完事

1
$ git clone 项目的地址

历史记录 history

git gui左上角版本库中点击图示master分支(或所有分支)的历史完成查看

忽略文件 .gitignore

在项目的根目录创建.gitignore,可以忽略该文件的改动。不添加到git跟踪中格式支持通配符。一般用于忽略ide或者二进制打包生成的文件。
注释使用#
examples:
.idea/
node_modules/
*.tmp

使用github for windows进行简易处理

github 官网提供了一个面向github的gui简易版本,可以帮助用户很方便的进行代码的管理,支持的基本操作有:

  • 代码clone
  • 添加项目
  • 创建项目
  • .gitignore管理
  • remote远程管理
  • 分支切换
  • 代码提交
  • 代码上传
  • 代码同步
  • pull请求
  • 分支比较
  • 历史查看

常用的一些代码仓库

这里推荐一些流行的网络代码管理的提交平台,通过网络平台可以更好的分享代码,团队合作

国外:

  • github
  • google code(墙)
  • bitbucket
  • gitlab

国内:

  • oschina
  • code
  • GitCafe

pomelo框架制作游戏初探(二) - 登陆模块

好的那么接上篇pomelo框架制作游戏初探(一)
上篇初步介绍了pomelo框架的环境搭建与基本使用。那么现在开始来正式做一个项目吧,本次我想要做的项目是我自己根据Minecraft来的灵感想要做的一款沙盒类游戏,这里主要记录服务端与服务端交互的逻辑部分。

主界面

文件结构

  • /game-server #服务端代码
  • /shared #共用逻辑
  • /web-server #前端代码

服务端配置

配置文件

在pomelo框架下。服务端是基于一个JSON文件来实现服务端各个部分的数据交互的。该文件位于/game-server/config/servers.json

servers.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"development": {
"connector": [
{
"id": "connector-server-1",
"host": "127.0.0.1",
"port": 3150,
"clientHost": "127.0.0.1",
"clientPort": 3010,
"frontend": true
}
]
},
"production": {
"connector": [
{
"id": "connector-server-1",
"host": "127.0.0.1",
"port": 3150,
"clientHost": "127.0.0.1",
"clientPort": 3010,
"frontend": true
}
]
}
}

其中,有development和production两个参数分别表示开发环境和生产环境,来实现本地调试与正式运行相分离。下属为服务器的分类,常见的有connector服务器,chat服务器,gate服务器,area服务器等等,标识各种业务功能,如gate服务器负责负载均衡,将用户分配到不同的服务器处理。服务器分类下是一个数组。数组中每一个对象就是一个服务器的具体配置,配置的参数为:

  • id #服务器的唯一标识
  • host #服务器的ip地址
  • port #服务器的连接端口号
  • clientHost #面向客户端的ip,可不填
  • clientPort #面向客户端的端口号,可不填
  • frontend #客户端是否可见,当该值为true时clientHost与clientPort有效。默认为false

现在我想要添加一个gate服务器,来负责将连接的用户分配一个connector服务器来达到负载均衡的目的。那么我在servers.json的相应的地方加入这么一行参数:
"gate": [{"id": "gate-server-1","host": "127.0.0.1","clientPort": 3014,"frontend": true}]
如何添加服务器>>

添加服务器

对于pomelo来说,添加服务器很简单。如果代码按照规范写的话只需要修改servers.json配置文件即可。注意如果是要添加一个新的服务器类型的话需要在/game-server/config/adminServers.json中添加配置。否则直接修改servers.json配置文件会报错。如本例中添加了一个gate服务器类型:

adminServers.json

1
2
3
4
5
6
7
8
9
10
[
{
"type": "connector",
"token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
},
{
"type": "gate",
"token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
}
]

客户端连接

API

pomelo 框架提供了对客户端的API接口。这里暂时只讨论web端的API

  • pomelo.init(params, cb) #初始化
  • pomelo.request(route, msg, cb) #客户端请求
  • pomelo.notify(route, msg) #客户端无回调请求
  • pomelo.on(route, cb) #客户端响应
  • pomelo.disconnect() #断开连接

客户端

当打开网页时直接调用该代码。向gate服务器请求登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
function(){
pomelo.init({
host: "127.0.0.1",
port: 3014,
log: true
}, function () {
//发送请求
pomelo.request("gate.gateHandler.queryEntry", {uid: 1}, function (data) {
alert(JSON.stringify(data));
pomelo.disconnect();
});
})
}

初始化pomelo连接后,向服务器的gate.gateHandler.queryEntry请求数据,传递参数为{uid: 1}

服务端

** /game-server/app/servers/gate/handler/gateHandler.js 修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var Code = require('../../../../../shared/code');

module.exports = function(app){
return new Handler(app);
};

var Handler = function(app) {
this.app = app;
};

//连接请求
Handler.prototype.queryEntry = function(msg, session, next) {
var uid = msg.uid;//用户唯一标识
if (!uid) {
next(null, {code: Code.FAIL});
return;
}

var connectors = this.app.getServersByType('connector');//获取服务器列表
if (!connectors || connectors.length === 0) {
next(null, {code: Code.GATE.FA_NO_SERVER_AVAILABLE});//没有可用的服务器
return;
}

var res = connectors[0];//分配服务器
next(null, {code: Code.OK, host: res.host, port: res.clientPort});//将分配数据传递给下层
};

其中code是一个客户端与服务端共用的数据集合。位于shared文件夹内
/shared/code.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module.exports = {
OK: 200,
FAIL: 500,

ENTRY: {
FA_TOKEN_INVALID: 1001,
FA_TOKEN_EXPIRE: 1002,
FA_USER_NOT_EXIST: 1003
},

GATE: {
FA_NO_SERVER_AVAILABLE: 2001
}
};

尝试连接

当出现下图提示则说明连接正常。向gate服务器请求连接。gate服务器向用户分配了一个可用的连接服务器的IP与端口号

客户端处理登陆请求

好了。基本的请求分配服务器已经完成了。但是我们不能直接这么用。我们需要一个用户管理器去验证用户的账号密码,管理角色信息等等。这一部分和普通的网页是一致的。因此完全可以放在前端代码中写。web-server是基于express写的web服务器。这里直接在其中添加对账号与密码的验证。因为与pomelo框架无关所以不多累述。直接放出代码
/web-server/app.js 添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//登陆
app.post('/login', function(req, res) {
var msg = req.body;

var username = msg.username;
var pwd = msg.password;
if (!username || !pwd) {
res.send({code: 500});
return;
}

userDao.getUserByName(username, function(err, user) {
if (err || !user) {
console.log('username not exist!');
res.send({code: 500});
return;
}
if (pwd !== user.password) {
// TODO code
// password is wrong
console.log('password incorrect!');
res.send({code: 501});
return;
}

console.log(username + ' login!');
res.send({code: 200, token: Token.create(user.id, Date.now(), secret), uid: user.id});
});
});
//注册
app.post('/register', function(req, res) {
//console.log('req.params');
var msg = req.body;
if (!msg.name || !msg.password) {
res.send({code: 500});
return;
}

userDao.createUser(msg.name, msg.password, '', function(err, user) {
if (err || !user) {
console.error(err);
if (err && err.code === 1062) {
res.send({code: 501});
} else {
res.send({code: 500});
}
} else {
console.log('A new user was created! --' + msg.name);
res.send({code: 200, token: Token.create(user.id, Date.now(), secret), uid: user.id});
}
});
});

其中 userDao 是数据库用户管理对象。根据自己数据库来编写,用户从数据库中存取用户数据

pomelo框架制作游戏初探(一)

前言

很早就关注过NodeJS的高性能服务端开发。所以很早就想要用NodeJS作为后台服务器来开发一款网络游戏。
自己写过原生的游戏服务端然而性能并不高。本地测试就会占用很大一部分资源,可以预见的是原生开发的难度远远大于基于框架开发。毕竟框架虽然需要一定的学习成本但是毕竟框架是无数程序员不断优化的成果。写出来的东西一定是好过自己单干的。
因此在一定的市场调查(其实就是推度娘)过后我选中了网易开发的pomelo框架。有完整的DEMO,和完善的文档(顺便吐个槽,国人开发的东西API文档居然全是用的英文)

安装

此处为官网WIKI

windows环境

  • NodeJS
  • python(2.5<version<3.0)
  • VC++ 编译器,包含在Visual Studio 2010中(VC++ 2010 Express亦可)。对于windows8的用户,需要安装Microsoft Visual Studio C++ 2012。

    Mac OS环境

  • NodeJS
  • Xcode Command Line Tools或者Xcode的完整包
  • make工具

pomelo

npm 安装

1
$ npm install pomelo -g

git 安装

1
2
3
$ git clone https://github.com/NetEase/pomelo.git
$ cd pomelo
$ npm install -g

HelloWorld

新建项目

1
2
3
$ mkdir HelloWorld
$ cd HelloWorld
$ pomelo init

1
$ pomelo init ./HelloWorld

两者等价

然后进入HelloWorld文件夹,安装依赖包

1
$ sh npm-install.sh

npm-install.sh的逻辑就是分别进入该项目的两个主要文件夹game-server和web-server
使用npm install命令安装文件依赖

启动项目

启动项目需要分别进入两个主要文件夹
启动game-server服务器:

1
2
$ cd game-server
$ pomelo start

启动web-server服务器:

1
2
$ cd web-server
$ node app

node [appName]是NodeJS启动传统NodeJS应用的方法,至于pomelo start的作用尚不明确。暂时无需理会

运行项目

根据启动web-server的提示打开 http://127.0.0.1:3001/ 。点击按钮发生产生响应。则说明服务器正常。否则则说明服务器不连通。可以通过Pomelo Club咨询排除错误

关闭项目

官方给出的关闭方法是

1
2
$ cd game-server
$ pomelo stop #正常关闭

1
2
$ cd game-server
$ pomelo kill #强制关闭

然而我发现其实用Ctrl + C 也可以实现关闭服务器的作用,可以通过命令 pomelo list 查看到服务器已经被关闭。可能与pomelo kill命令同理