懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 青岛)
原贴在此: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项目
这里别忘选上
然后在项目右键,添加“附加包含目录”
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的战立动画即可运行
==================================================
摇杆:
控制按钮能显示但无效,突然发现没有那句: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); }
源码下载
http://download.csdn.net/detail/iamlazybone/6931721