Cocos2d-x在XP上完美运行

本文描述cocos2d-x 3.x版本的windows xp版本,即完美在xp系统上运行。

必备:

vs2013 update5 vs2015 update3,笔者系统win10 x64系统
cocos2d-x 3.X版本,已成功运行起来的的版本有3.4 3.5 3.10 3.13版本,其他版没试验,都很类似的修改。

libcocos2d项目属性修改

编译发布版的Release

添加预编译宏

项目菜单->项目属性->配置属性->C/C++->预编译
WIN32_WINNT=0x0501

添加链接库

项目菜单->项目属性->配置属性->链接->输入
user32.lib
gdi32.lib
advapi32.lib
Shell32.lib
ws2_32.lib

cocos2d-x源代码修改:

5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(47): error C2065: 'LPWSAPOLLFD' : undeclared identifier (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(47): error C2146: syntax error : missing ')' before identifier 'fdarray' (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(47): error C2165: 'left-side modifier' : cannot modify pointers to data (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(47): error C2513: 'INT *' : no variable declared before '=' (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(47): error C2059: syntax error : ')' (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(50): error C2065: 'LPWSAPOLLFD' : undeclared identifier (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(50): error C2146: syntax error : missing ')' before identifier 'fdarray' (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(50): warning C4229: anachronism used : modifiers on data are ignored (..networkWebSocket.cpp)
5>e:sdkcocos2d-x-cocos2d-x-3.10externalwebsocketsincludewin32win32helpers/websock-w32.h(50): error C2059: syntax error : ')' (..networkWebSocket.cpp)

直接注释掉

5>..baseCCConsole.cpp(412): error C3861: 'inet_pton': identifier not found
5>..baseCCConsole.cpp(417): error C3861: 'inet_pton': identifier not found
5>..baseCCConsole.cpp(443): error C3861: 'inet_ntop': identifier not found
5>..baseCCConsole.cpp(450): error C3861: 'inet_ntop': identifier not found

同样注释掉,如果你要用到就自己重写net_ntop函数,网上有教程。

依赖库修改

3.4 3.5版这一步直接跳过
xp错误的提示:InitializeCriticalsectionEx,
curl新版库用了函数,xp系统是没的,删除curl文件夹,再放旧版的,这里下载:http://pan.baidu.com/s/1mhvjlHm
cocos2d-x 3.13删除替换 webp :http://pan.baidu.com/s/1qYLA1ti

编译说明&vs运行库安装

Release每次都会重新编译
1、C/C++  -> Genera -> Debug Information Format: Program Database for Edit & Continue (/ZI), 或者 Program Database (/Zi) ,或者删除None
2、在你工程加入链接库libcocos2d.lib,移除掉libcocos2d的依赖项目
除了f#不用装,都勾上下载地址:http://pan.baidu.com/s/1c1e4ALq ,注意如果是2015安装:https://www.microsoft.com/en-hk/download/details.aspx?id=48145

总结

同样如果你想编译xp项目,也可以做参考,特别是要指定WIN32_WINNT=0x0501。
项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”。
项目菜单->项目属性->配置属性->链接->系统->5.01
提示不是有效的应用程序,一般是缺少运行库。
提示无法定位程序输入点 xxx 于动态链接库XX上的,就要检查你源代码或者依赖的库里面有XP不存在函数,把函数移除,或重写。

cocos2d-3.X-xp

次世代图形接口Vulkan

Khronos在2015GDC上公布低消耗,跨平台3D 的API(如3D电子游戏)规范命名Vulkan,,作为OpenGL的下一代,提供更高性能和更低的CPU占用率,更好的利用多核,部分组件是AMD公司的Mantle。它的类似者但不能跨平台是微软DX12 苹果公司的Metal。androd 和IOS目前的是GL ES。

例子demo教程:

下一代图像接口-Vulkan教程

发布时间

1.0版本将在2016年初。

概述

直接GPU操作控制

比如直接把数据写入GPU,程序员自己控制内存分配策略

友好多线程架构

同一时间多个线程创建和填冲命令,然后有单独线程提交到GPU

跨平台

统一的API在所有的平台上

着色

接受SPIR-V格式,将提供支持GLSL。第三第三方可以用其他语言编自己的着色器

厂商支持

nvidia,amd,使用安卓系统的厂家,具体的请看驱动程序是否支持,当然得规范正式发布,厂家再根据规范更新显卡驱动。

总结

相当于把驱动的部分控制放给开发应用程序员控制,意味画三角形,更多的代码,带来的好处是不需要和厂家交涉再去更新显卡驱动。

图说明

vulkan
gles-vulkan

左边是vulkan,右边是gl es ,明显看出多核能利用和fps高。如果想了解更多的请看这个:http://vulkan-tutorial.com/

cocos2d-x背景无限滚动

最近项目做一个需要背景无限滚动,适用飞机,跑酷类型无限背景滚动等游戏,在网上找了一些例子,发现都犯严重的错误,就是滚动不和时间挂钩,会看到卡顿现象。每一帧+速度,正确来是s =v*dt,v速度,dt每一帧时间。

原理

现有一张图片,并排到一起是无缝衔接,假设你的分辨率是1280*720,用的图片长度是1552,如放一张图片,是足够长度的,至于为啥要是为了并排的图,能在移动时候,出现短暂黑的。

  1. 两个精灵分别A B 都是用同一张图片
  2. AB 同时移动 speed*dt,这里注意一定要乘时间
  3. 当B的位置移动到<0.0f时(表示后面的图片完全在屏幕上,A已移动到屏幕外面),把A放到B后面,这个时候就是BA。然后又到A移到<0.0f。

滚动代码

资源和图:http://pan.baidu.com/s/1mf2WY

BgScroll.h

#ifndef BGSCROLL_H
#define BGSCROLL_H
#include "cocos2d.h"
using namespace cocos2d;
class BgScroll :public Node
{
public:
	BgScroll();
	virtual ~BgScroll();
	CREATE_FUNC(BgScroll);
private:
	void update(float dt);
	Sprite* _sprite[2];
	float speed;
	float tex_length;
};

#endif

BgScroll.cpp

#include "BgScroll.h"
BgScroll::BgScroll():
speed(60.0f)
{
	auto tex = Director::getInstance()->getTextureCache()->addImage("taiko-bg.png");
	tex_length = tex->getPixelsWide();
	for (int i = 0; i < 2; ++i)
	{
		Sprite* node = Sprite::createWithTexture(tex);
		node->setAnchorPoint(Vec2(0, 0));
		this->addChild(node);
		node->setPosition(i*Vec2(tex_length, 0));
		_sprite[i] = node;
	}
	this->scheduleUpdate();
}
BgScroll::~BgScroll()
{

}

void BgScroll::update(float dt)
{
	for (int i = 0; i < 2; ++i)
	{
		auto node = _sprite[i];
		node->setPositionX(node->getPositionX() - speed*dt);
	}
	float x1 = _sprite[0]->getPositionX();
	float x2 = _sprite[1]->getPositionX();
	if (x2 < 0.0f)
	{
		_sprite[0]->setPositionX(x2 + tex_length);
		std::swap(_sprite[0], _sprite[1]);
	}
}

使用方法

 auto _bg_scroll = BgScroll::create();
    this->addChild(_bg_scroll);

总结

在游戏里面的任何动作,都需要*时间,因为每一帧的时间不是固定的,以前在某段时间会卡顿一下。

bgscroll

flightgear vs2013

本文描述flightgear vs2013编译调试可运行。以前也写过fg3.4的编译,如果想去看的请参考http://www.freeyun.com/flightgear-3-2-0-generation-debug.html

最早的fg2.6的编译已删除,因存在一定的误导性。适用3.4以上面的版本,注意看osg要求的版本。

必备软件

下载安装解压cmake、osg、3rdParty:http://pan.baidu.com/s/1qW9WOES

如果想自己编译osg的参考osg编译

新建环境变量OSG_DIR  D:Program Files (x86)OpenSceneGraph

flightgear simgear 开发的版本:http://sourceforge.net/p/flightgear/_list/git?source=navbar

flightgear simgear 稳定的版本:http://www.flightgear.org/download/source-code/

编译的目录说明

fg-dir

3rdParty:第三方库

flightgear-build:FG的生成vs2013目录

simgear-build:SG的生成vs2013目录

simgear及flightgear:源代码目录

bin:里面放了3rdParty的bin,和osg的bin目录,同时也需要指定fgfs.exe,比如我指定的vs2013的工作目录D:FlightGear-devbin。还有一种方法就是吧3rdParty和osg两者bin都添加到环境变量Path。

data:顾名思义就是fg的资源目录,你可以下载我提供的,那个是当前最新仓,当然你sim和fg也得是最新仓的,解压出来后,可以直接在我上面更新,省下很多时间,如你用了指定版本的,可以用安装版的data。

terrasync-dir:这个目录是空的,用于存放联网下载更新机场地景等等目录。

关于其他目录,不在这个范围之内就不解释。

Cmake简单三步

点击configure->选择编译器->点击Generate

编译simgear

修改simgearsimgearprops下面的PropertyInterpolationMgr.cxx函数

void PropertyInterpolationMgr::update(double dt)

,这个是一个bug,操作容器出错,

void PropertyInterpolationMgr::update(double dt)
  {
    if( _rt_prop )
      dt = _rt_prop->getDoubleValue();

	for (InterpolatorList::iterator it = _interpolators.begin();
		it != _interpolators.end();
		)
	{
		for (double unused_time = dt;;)
		{
			PropertyInterpolatorRef interp = it->second;
			unused_time = interp->update(*it->first, unused_time);

			if (unused_time <= 0.0)
				// No time left for next animation
			{
				++it;
				break;
			}
			if (interp->_next)
			{
				// Step to next animation. Note that we do not invalidate or delete
				// the current interpolator to allow for looped animations.
				it->second = interp->_next;
				++it;
			}
			else
			{
				// No more animations so just remove it
				it = _interpolators.erase(it);
				break;
			}
		}
	}
}

source code:D:/FlightGear-dev/simgear

the binaries:D:/FlightGear-dev/simgear-build

CMAKE_INSTALL_PRE:d:/Program Files (x86)/SimGear

打开sln文件, 编译INSTALL项目

新建环境变量SIMGEAR_DIR d:/Program Files (x86)/SimGear

编译flightgear

source code:D:/FlightGear-dev/flightgear

the binaries:D:/FlightGear-dev/flightgear-build

运行调试

设置fgfs启动项目并添加调试参数(选择fgfs->右键属性->调试->命令参数)

--fg-root="D:FlightGear-devdata" --geometry=800x600 --terrasync-dir="D:FlightGear-devterrasync-dir" --disable-ai-traffic --multiplay=out,10,127.0.0.1,5000 --multiplay=in,10,127.0.0.1,5001 --enable-terrasync  --log-level=debug

指定了data资源目录(如果按照目录结构也可以省掉fg-root参数) 分辨率 地景更新目录,关闭AI,联网的操作,然后你看你的网速了,会联网更新地景,进入到飞机画面,如果你想启动其他飞机,你也需要

--fg-aircraft=“飞机的目录名字(D:FlightGear-devdataAircraft)”比如 --aircraft="c172p"。

关于更多的参数请看手册。

最新飞机下载:https://svn.code.sf.net/p/flightgear/fgaddon/trunk/Aircraft/

图flightgear vs2013运行后

flightgear vs2013 737-100

 

总结

如果你发现出现问题了,请重复查看是否漏了那些步骤。

本文写的在后面,flightgear也一直在更新,更多的信息推荐去看wiki.flightgear.org,如果你对最新版本的感兴趣也去下载git仓,sf.net上,由于之前的git仓也已移到sf.net上面。如果你只需要制作飞机地景,就不需要编译FG,因为它有提供专门的工具制作,直接运行FG起来看效果,前提是你要知道怎么使用。作为开源的项目可能代码写的不好,可以去修改它。用的是3.7的版本号,已经有QT 5.0在里面。用来代替fgrun的那个图形启动界面。

 

flightgear联飞服务器fgms构建

本文描述关于flightgewar的联飞服务器fgms的vs2013构建及简要的分析下。

必备

fgms项目:https://gitlab.com/fgms/fgms-0-x

多线程库pthread win32:ftp://mirrors.kernel.org/sourceware/pthreads-win32/pthreads-w32-2-9-1-release.zip

fgms的配置文件http://flightgear.mxchange.org/fgms/fgms.conf

生成工程方案

打开cmake,fgms的目录下分别填入

source code:E:/fgms-0-x-master

build the binaries:E:/fgms-0-x-master/build

configure->选择vs2013->Finish。

设置pthread的路径

E:fgms-0-x-masterpthreadsPre-built.2include

E:/fgms-0-x-master/pthreads/Pre-built.2/lib/x86/pthreadVC2.lib

Generate生成解决方案->编译生成exe,拷贝pthreadVC2.dll到E:fgms-0-x-masterbuildDebug目录下。

复制文件fgms.conf到C:Usersfreeyun(备注这个是我的用户文件夹,紧供参考。)

fgms.conf这个我还域名深入去研究过它的参数,参数说明http://fgms.freeflightsim.org/fgms_conf.html。

源码简要分析

全部联机玩家的列表:m_PlayerList

//发送数据
int netSocket::sendto ( const void * buffer, int size,
                        int flags, const netAddress* to )
//接收数据
int netSocket::recvfrom ( void * buffer, int size,
                          int flags, netAddress* from )

写在后面

本来是想研究网络游戏的位置同步,不停的查找开源的项目,想起flightgear的项目,发现支持cmake生成。笔者只是初略的看源码,没深入,希望能给flighgear的研究的抛砖引玉,这里没写出联机设置,手册已经有了没必要在这里重复。

联机设置:http://wiki.flightgear.org/Howto:Multiplayer

更多的参考资料:http://fgms.freeflightsim.org/。

网站搬家

wordpress架的网站在外面好长时间,终于决定搬回来了,记录搬家到阿里云的过程。

原因

在美国的虚拟主机,便宜的,一年100多块,速度上还是接受,有每个月宽带限制,几个网站共用一个IP的,对于国内的虚拟主机价格实惠,做个小站流量小。通过DNSPOD监控发现有偶尔的无法访问,另外访问速度相对慢一点。在某些原因,写文章审核保存草稿比较慢,无法接受,通常我一篇文章写几个小时反复的查看,排版。上面种种原因,要搬到国内。

过程

1、购买云主机

通过对比选择阿里云,目前国内有腾讯云,盛大云,百度云等,价格上面阿里云优惠,还有是万网被阿里云收购,在云主机上面经历过几年的验证,稳定可靠性有保 证。另外我腾讯没512MB内存云服务器,我网站没有必要弄1GB内存云服务器。服务器地域青岛一个月49.5,在网上找个优惠码打9折。当然如果你想要1G内存的,也可以购买腾讯云。操作系统就选择linux centos 7.0。

2、备份数据:

一般在虚拟主机都有phpmyadmin,通过界面导出整个网站数据库。还有一种方法是利用wordpress工具->导出,来导出xml数据。不建议IE浏览器做这种操作,否则存在导出数据不全。拷贝你的wordpress程序。

3、安装环境

安装Xshell,登录到你的云主机。

用于相互传送文件的工具,运行:yum install lrzsz

lrzsz的命令说明 rz :本地文件到服务器,sz xx:服务器文件到本地。

安装lnmp(Nginx、PHP、MySQL、phpMyAdmin)命令:wget -c https://api.sinas3.com/v1/SAE_lnmp/soft/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && cd lnmp1.2-full && ./install.sh lnmp

上面执行时间有点长,看你主机性能。

按照提示是在mysql密码。

4、恢复网站数据

添加vhost执行: lnmp add vhost  (注意选择支持伪静态)

删除是有的插件,防止某些插件导致网站502错误等。

4.1可视化恢复:

将你备份的程序拷贝至你的目录(比如我的www.freeyun.com)下,phpmyadmin创建数据库,恢复你的sql文件,或者你登录后台通过xml的文件恢复数据。

4.2mysql命令恢复,注意mysql命令后面的分号(;):

mysql -u root -p;//登录数据库

CREATE DATABASE IF NOT EXISTS wordpress DEFAULT CHARSET utf8 COLLATE utf8_general_ci;//创建数据库wordpress

show databases;//显示全部数据库
use wordpress;//选择数据库
source  /~/wordpress.sql;//导入数据文件
drop database wordpress;//销毁wordpress数据库

为了正常升级wordpess 及插件执行:chown www:www -R www.freeyun.com

目录www.freeyun.com 下的user.ini文件无法直接修改,而且是隐藏文件可能在winscp下可能无法看到,建议使用vim编辑器或nano编辑器进行修改。

如要修或删除需要先执行:chattr -i /网站目录/.user.ini

修改完成后再执行:chattr +i /网站目录/.user.ini

如果你想要访问你的网站,你需要wp_options下面siteurl的值修改成你服务器IP地址。

5、配置mail

为了你的主机支持wordpress mail的,即发表评论,你收到邮件通知,回复评论,人家评论者收到恢复。有两种方法

  • 安装WP-Mail-SMTP插件,
  • 安装postfix这个配置有点复杂,作为sendmail的代替者,速度秒发e-mail,我后面文章再补写一篇文章

6、备案

分两步审核,第一是阿里云审核,第二是你身份证属地通信管理局,具体就看阿里云的提示,我第一步3天时间(包括了邮寄资料的时间),第二步8个工作日。这期间,你要把你的dns指向阿里云IP。

结束语

2015-8-26通过的备案,备案期间,天天上去看管局通过没,接不到管局电话。经过几天观察,没发现有宕机,访问速度杠杠的,最近在由于我网站的图片有些多,是不是得用七牛的加速下下。gravatar 的大头像有点烦,国内是加载不到,禁用中。

TrinityCore MMORPG服务器设计分析

本文是通过TrinityCore研究从而对MMORPG服务器设计分析。

网络字节序

ByteBuffer是字节(unsigned char类型)处理,没有大小端处理。在网络通信应用程序上,这种是经常有的,网络是通过字节发送。

消息包格式:包头+包类型+包体

包头rc4加密

登录认证是(srp6)安全远程密码第六版协议,包类型是占一字节。

游戏中,包类型占1.5字节。

1、封包

重载&operator<<
按顺序把数据封包

2、解包

重载&operator>>
按顺序把数据解出

消息包处理

网络是采用boost asio

1、发送

这里需要注意,在这个执行,在多线程里面操作加锁

std::unique_lock<std::mutex> guard(_writeLock);

boost::asio的发送函数:_socket.async_write_some

1.1 登录认证的发送

void AuthSession::SendPacket(ByteBuffer& packet)
{
    if (!IsOpen())
        return;

    if (!packet.empty())
    {
        MessageBuffer buffer;
        buffer.Write(packet.contents(), packet.size());

        std::unique_lock<std::mutex> guard(_writeLock);

        QueuePacket(std::move(buffer), guard);
    }
}

 2.2在游戏中发送

void WorldSocket::SendPacket(WorldPacket const& packet)
{
    if (!IsOpen())
        return;

    if (sPacketLog->CanLogPacket())
        sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort());

    ServerPktHeader header(packet.size() + 2, packet.GetOpcode());

    std::unique_lock<std::mutex> guard(_writeLock);

    _authCrypt.EncryptSend(header.header, header.getHeaderLength());

#ifndef TC_SOCKET_USE_IOCP
    if (_writeQueue.empty() && _writeBuffer.GetRemainingSpace() >= header.getHeaderLength() + packet.size())
    {
        _writeBuffer.Write(header.header, header.getHeaderLength());
        if (!packet.empty())
            _writeBuffer.Write(packet.contents(), packet.size());
    }
    else
#endif
    {
        MessageBuffer buffer(header.getHeaderLength() + packet.size());
        buffer.Write(header.header, header.getHeaderLength());
        if (!packet.empty())
            buffer.Write(packet.contents(), packet.size());

        QueuePacket(std::move(buffer), guard);
    }
}

2、接收

接收函数_socket.async_read_some

处理已收到数据包MessageBuffer& packet = GetReadBuffer();

登录认证接收处理:void WorldSocket::ReadHandler()

游戏过程处理:

void WorldSocket::ReadHandler()

bool WorldSocket::ReadHeaderHandler()

bool WorldSocket::ReadDataHandler()

流程

消息通过函数指针映射处理。

1、登录游戏

std::unordered_map<uint8, AuthHandler> const Handlers = AuthSession::InitHandlers();

2、认证通过后

void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)

内部把这次玩家会话添加 :

新建一个会话_worldSession = new WorldSession(id, shared_from_this(), AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);

添加到世界:sWorld->AddSession(_worldSession);

判断是否有同个帐号登录,如果有,把它踢下线

2、全部会话处理:

void World::UpdateSessions(uint32 diff)
{
..
 for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next)
..

}

2、游戏过程中

extern OpcodeHandler opcodeTable[NUM_MSG_TYPES]

写在后面

TrinityCore常用了TCP通信,tcp通信也是存在心跳的,网络是异常退出(比如,任务管理器直接杀死游戏进程),tcp协议不会通知说我已经退出。如果是实时再线格斗类型游戏,建议常用UDP。TrinityCore大量使用c++ 0x11,有些地方,我也不是明白,如果有存在错误的地方也请指出。

mmorpg魔兽世界服务器框架TrinityCore构建

本文对TrinityCore 版本7.x | 3.3.5编译说明通用。

简介

TrinityCore 是c++实现MMORPG框架

来自MaNGOS,大型网络对象服务,随着时间的推移,该项目代码广泛的优化,改善和清理代码。

这是完全开源的,社区参与是高度鼓励

如果你有好的想法请访问网站github 库https://github.com/TrinityCore/TrinityCore,提出。

更多TrinityCore项目信息,请访问TrinityCore.org

要求

  • 平台:Linux, Windows or Mac>
  • cpu支持SSE2
  • Boost ≥ 1.49
  • MySQL ≥ 5.1.0
  • CMake ≥ 2.8.11.2 / 2.8.9 (Windows / Linux)
  • OpenSSL ≥ 1.0.0
  • GCC ≥ 4.7.2 (Linux only)
  • MS Visual Studio ≥ 12 (2013) (Windows only)
  • 按里面提示的软件进行安装:http://collab.kpsn.org/display/tc/Requirements现在windwos的

安装

本节只讨论windows 7系统安装

TrinityCore:https://github.com/TrinityCore/TrinityCore/releases

1、生成vs2013工程解决方案

  1. 下载名字ource code (zip)
  2. 打开cmake
  3. Where is the Source code: E:/SDK/TrinityCore-stable
  4. Where to build th binaries:E:/SDK/TrinityCore-stable/build
  5. 点击Configure 现在 vs2013,把TOOLS勾上,点击Generate生成TrinityCore.sln
  6. 编译解决方案

如果是64位系统需要手动去把mysql库,指向win32的,否则出现link 2019错误。

2、生成地图

  1. 安装好World of Warcraft – 3.3.5a (12340) – enUS (No Install),建议编译Release的版本,生成地图快
    可C:\TrinityCore\contrib 复制 “extractor.bat”及地图生成工具4个exe 放wow.exe同目录,(2 3 4 5步骤可跳过)
  2. 在Wow.exe同目录下一次点击mapextractor.exe
  3. mmaps_generator.exe
  4. vmap4extractor.exe
  5. vmap4assembler.exe
  6. 生成的dbc maps mmaps vmaps拷贝v到 authserver.exe worldserver.exe目录下

3、数据库安装

  1. 默认mysql安装,添加帐号:trinity,密码:trinity
  2. 数据库图形管理工具HeidiSQL或者SQLyog,推荐用SQLyog
  3. 工具->现在执行sql文件…sqlcreatecreate_mysql.sql
  4. 选择auth数据库 工具->现在执行sql文件…sqlbaseauth_database.sql
  5. characters数据库 同上面操作执行…sqlbasecharacter_database.sql
  6. world数据库 同上面操作执行…”TDB_full_*.sql。下载名字是TDB_full

4、运行

  1. authserver.conf.dist和worldserver.conf.dist 去掉dist
  2. 运行authserver.exe,再运行worldserver.exe
  3. worldserver窗口里创建游戏帐号:account create username password
  4. 修改游戏客户端DataenUSrealmlist.wtf内容为:set realmlist 127.0.0.1
  5. 运行wow登录。。

结束语

大概步骤是和Mangos构建是类似的,上面没说到是用了那个版本,自己下载数据库和源码版本一致。

最后来个截图,这图只是研究使用,无意对暴雪侵权,图:魔兽世界:巫妖王之怒3.35

wow 3.35

Unity3d 使用boost asio在windows android

本文简单说明Unity3d c++插件,并采用boost asio打开串口设备状态在windows android平台下的交互通信。

Unity3d插件简介

Unity3D底层是c++实现的,用户用c#进行开发,不过是用mono开源,开源的 .NET 开发框架。在实际应用中,我们总有一些代码是其他编程语言实现,历史遗留。插件可以是C、C++、Objective-C等语言实现的。

构建插件

1、插件代码

1、百度云盘:里面有SimplestPluginExample-4.0和boost asio打开串口的例子http://pan.baidu.com/s/1mgy47jU

2、目录jni的MyClass.h是关于boost asio打开串口设备代码

3、下面代码来自官方SimplestPluginExample-4.0

#if _MSC_VER // this is defined when compiling with Visual Studio
#define EXPORT_API __declspec(dllexport) // Visual Studio needs annotating exported functions with this
#else
#define EXPORT_API // XCode does not need annotating exported functions, so define is empty
#endif

// ------------------------------------------------------------------------
// Plugin itself


// Link following functions C-style (required for plugins)
extern "C"
{

// The functions we will call from Unity.
//
const EXPORT_API char*  PrintHello(){
    return "Hello";
}

int EXPORT_API PrintANumber(){
    return 5;
}

int EXPORT_API AddTwoIntegers(int a, int b) {
    return a + b;
}

float EXPORT_API AddTwoFloats(float a, float b) {
    return a + b;
}

} // end of export C block

2、构建Windows插件

打开SimplestPluginExample-4.0SimplestPluginExampleVS2008PluginVisualStudioASimplePlugin.sln

3、构建Android插件

  1. 本机环境windows7
  2. 下载NDK,将Androidandroid-ndk-r9d加到系统环境变量
  3. 进入目录Unity3dPlugin-boostAsioboost-asio
  4. 执行:ndk-build

注意:一定要动态libgnustl_shared.so

 Unity3d插件boost asio应用

1、拷贝库

将编译好的dll和so文件放对应入AssetsPlugins目录下的Android、x86

2、添加到unity3d工程代码

using System.Runtime.InteropServices;
[DllImport("paokunet")]
private static extern void startNet();
[DllImport("paokunet")]
private static extern void stopNet();
[DllImport("paokunet")]
private static extern bool getNetStats();

 3、windows应用

boost库地址:http://sourceforge.net/projects/boost/files/boost-binaries/

没什么好说的

4、安卓应用

  • boost 安卓库 里面有说明编译,如不想看就结尾有现成库。
  • unity3d导出安卓项目记得导出地方对google android打勾
  • boost asio是因动态加载stl才能工作正常

1、添加一个java文件类似这样的

import com.unity3d.player.UnityPlayerActivity;

import android.os.Bundle;
import android.util.Log;

public class OverrideExample extends UnityPlayerNativeActivity {
    static
    {
        //加载.so文件
      Log.d("OverrideActivity", "paokunet freeyun ???????");
      {
          System.loadLibrary("gnustl_shared");
          System.loadLibrary("paokunet");
       }
    }
}

2、AndroidManifest.xml类似这样

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Unity3d.u3d" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@android:style/Theme.NoTitleBar" android:icon="@drawable/app_icon" android:label="@string/app_name" >
    <activity android:label="@string/app_name" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.hj.u3d.OverrideExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
    </activity>
  </application>
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="22" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

 总结

只是用用boost aiso串口代码,注意串口的设备打开是不一样的,安卓和Linux设备类似“”/dev/ttyS1”,windows类“COM8”如果需要用tcp udp通信也是可以的。

7zip开发

本文是描述7z sdk 下C语言的开发使用。

在7zip一个开源的解压缩自由软件,在LGPL协议下,即自由使用,只要你没修改7z里面的源代码,仅仅作为库的引用,勿需公开你的源码。可惜在网上找类似的开发7zip教程解压缩太少,如应用起来也需要折腾一段时间,本文应运而生。

特征

不介绍了官方挺细的。地址:http://sparanoid.com/lab/7z/中文介绍。

支持语言:(C、C++、C#、Java),因为C语言,so它是可以跨平台的,在安卓是可以使用的,比如你用来打包游戏资源,虽安卓apk包本来就是压缩包。

缺点,或者也解压的软件都有通用的特点,就是需要速度,解压的速度是消耗时间,当然有的解压压软件做的速度上杠杠,压缩率就会低。7zip做为相对高压缩率的,它的解压速度有点慢。

VS2013工程生成

  • SDK下载http://sparanoid.com/lab/7z/sdk.html
  • 路径lzma1505CUtil7z,右击7z.dsp用vs2013
  • 修改项目属性:
    • 通用->输出目录修改:$(SolutionDir)$(Configuration).win32
    • 通用->中间目录修改:$(Configuration).win32
    • 链接库->一般修改:$(OutDir)$(ProjectName).exe
  • 退出的时保存默认sln路径

源码说明

本节通过例子来阐述LZMA SDK的使用。项目属性->调试->命令参数

压缩包内容列表

“l” “lzma1505.7z”

解压

“x” “lzma1505.7z”

应用到游戏

思路,笔者没去实现也本想很cocos2d-x里面做个结合,据其他游戏引擎加载压缩包资源也是类似步骤。

  1. add压缩包到游戏资源
  2. 建立map容器:把压缩包文件内容映射进去
  3. 游戏加载的时候通过map查找是否存在这个文件,是加载,分之再从游戏指定的目录搜索文件
  4. 是否需要多线程加载?这点是个补充,多线程加载利于不卡住渲染主线程