Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)

懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 青岛)

Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)_第1张图片

原贴在此:http://www.9miao.com/thread-45434-1-1.html

几个带服务端的游戏源码老配置不好

索性先看看简单的

找了半天,觉得9秒的这个demo比较适合

看资源不多应该只有这一个场景

走起!

报环境:vs2013+cocos2dx3.0beta2

=================================

1 用create_project.py 新建一个项目,把下载的类和资源拷贝过去

2 右键添加现有项,把类文件加载到vs中,F5一下好多错啊,全是CC开头的类,慢慢改吧。

。。。

。。。(一个十分漫长的过程,而且不一定能升级成功)

。。。

===============================

把所有CC开头的去掉CC

| v2.1       | v3.0     |
| CCSprite   | Sprite   |
| CCNode     | Node     |
| CCDirector | Director |
| etc...                |

| v2.1                | v3.0                         |
| ccDrawPoint()       | DrawPrimitives::drawPoint()  |
| ccDrawCircle()      | DrawPrimitives::drawCircle() |
| ccGLBlendFunc()     | GL::blendFunc()              |
| ccGLBindTexture2D() | GL::bindTexture2D()          |
| etc...   
还有些方法名称,比如代替了以前的shareXXXXX用下面来代替

auto director = Director::getInstance();
auto dglView = EGLView::getInstance();

具体的更改可以参考 Github上的changelog https://github.com/cocos2d/cocos2d-x/blob/develop/docs/RELEASE_NOTES.md

========================================

修改触摸事件:

	// cocos2dx2.x
	// bool ccTouchBegan( Touch* touch,  Event* event);
	// void ccTouchMoved(Touch* touch, Event* event);
	// void ccTouchEnded( Touch* touch,  Event* event);
	// cocos2dx3.X
	void onTouchesEnded(const vector<Touch*>& touches, Event* event);
	void onTouchesBegan(const vector<Touch*>& touches, Event* event);
	void onTouchesMoved(const vector<Touch*>& touches, Event* event);
void CJoypad::onTouchesMoved(const vector<Touch*>&touches,  Event* event )
{
	Touch* touch = touches[0];
	Point location = touch->getLocation();

	UpdateTouchRotation(touch, event);
	UpdateRotation();

	CCAssert(m_pGameLayer, "m_pGameLayer is null");
	if (m_pGameLayer)
		m_pGameLayer->actionJoypadUpdate(m_fRotation);	
}
其实就是单点触摸的话,只从touches里取第一个点就成,改起来很容易的

==========================================

cocostudio项目的引用

(1)解决方案右键添加cocostudio项目

Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)_第2张图片

这里别忘选上

Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)_第3张图片

然后在项目右键,添加“附加包含目录”

cocostudio的问题搞定了,其他问题出现了

============================================

动画问题:

1>f:\mygame\mygame\classes\actionbutton.cpp(193): error C2259: “CAttackEffect”: 不能实例化抽象类
1>          由于下列成员: 
1>          “void cocos2d::DirectorDelegate::updateProjection(void)”: 是抽象的
1>          f:\mygame\mygame\cocos2d\cocos\2d\ccprotocols.h(265) : 参见“cocos2d::DirectorDelegate::updateProjection”的声明

尝试过两种方法:屏蔽这个方法或者实现这个方法,结果窗口出来了,但是报错:断言错误!

各种尝试各种查还是没弄明白

苯办法吧~一点点添加。

(1)添加背景层————ok

(2)添加控制层————ok

(3)添加英雄————ok

(4)初始化动画————ok

(5)运行动画———— error

额,还好原因不是技术问题,hero没有添加cocostudio动画文件,但却在站立方法里调用了

屏蔽掉hero的战立动画即可运行

==================================================

摇杆:

Cocos2dx游戏开发笔记22:以仿《王者之剑》游戏源码为例,学习cocos2dx2.X到 3.0beta2 的升级(附源码)_第4张图片

控制按钮能显示但无效,突然发现没有那句:setTouchEnabled(true);

加上之后按钮还是无效,继续找原因。

3.0的事件处理我也不知道较2.x变简单了还是负责了,以为2.0的我也不太明白。

研究了半天终于跑通了个demo:

	auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听  
	listener1->setSwallowTouches(true);//设置是否想下传递触摸  
	listener1->onTouchBegan = [](Touch* touch, Event* event){
		CCLog("touch began");
		return true; 
	};
	//拖动精灵移动  
	listener1->onTouchMoved = [](Touch* touch, Event* event){
		auto target = static_cast<Sprite*>(event->getCurrentTarget());
		target->setPosition(target->getPosition() + touch->getDelta());
	};
	listener1->onTouchEnded = [=](Touch* touch, Event* event){
	};
	//将触摸监听添加到eventDispacher中去  
	_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1 ,sprite);

之前错误的原因之一是:看到_eventDispatcher 没有定义,竟然手贱的给定义了个。

继续

把游戏本来的几行代码贴上报错,估计和java中的内部类引用有限制差不多:这种写法估计也有很多限制

关于摇杆:

JoyPad.h类中添加:

	bool onTouchBegan(Touch* touch, Event* event);
	void onTouchMoved(Touch* touch, Event* event);
	void onTouchEnded(Touch* touch, Event* event);
JoyPad.cpp:

void CJoypad::initTouch()
{
	CCLog("test touch");
	auto touchListener = EventListenerTouchOneByOne::create();
	touchListener->setSwallowTouches(true);
	touchListener->onTouchBegan = CC_CALLBACK_2(CJoypad::onTouchBegan, this);
	touchListener->onTouchMoved = CC_CALLBACK_2(CJoypad::onTouchMoved, this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
}

ActionButton.cpp中的触摸方式也改为上面那种

。。。。

跟了一下,主角的按角度移动动画有问题

怪我没仔细看修改日志:

void CActionSprite::hRunning()
{
	m_pSprite->stopAllActions();
	//m_pSprite->runAction(( Action *)m_pActionRunning->copy());
	//m_pSprite->runAction(m_pActionRunning);
	m_pSprite->runAction((Action *)m_pActionRunning->clone());
	m_nState = csRunning;
}
原来copy方法改名为clone了,c++的提示弱爆了!!

摇杆ok了,再来看下按键:

void CActionButton::initTouch()
{
	CCLog("initTouch");
	auto touchListener = EventListenerTouchOneByOne::create(); 
	touchListener->setSwallowTouches(true);
	touchListener->onTouchBegan = CC_CALLBACK_2(CActionButton::ccTouchBegan,this);
	touchListener->onTouchMoved = CC_CALLBACK_2(CActionButton::ccTouchMoved,this);
	touchListener->onTouchEnded = CC_CALLBACK_2(CActionButton::ccTouchEnded,this);
	_eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
}

同理,用新的事件绑定,这样好像全部工作就ok了


源码下载

http://download.csdn.net/detail/iamlazybone/6931721


你可能感兴趣的:(源码,cocos2dx,游戏开发,VS2013,cocos2dx3.0)