【Cocos2D-X 学习笔记】为精灵添加单点触控
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Cocos2D-X 学习笔记】为精灵添加单点触控,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4861字,纯文字阅读大概需要7分钟。
内容图文
由于Cocos2d-x处于新学的阶段,因此最近也无法进行系统地更新,只会选择一些典型的Demo贴上来,一来是与大家分享,而来也可以作为以后回顾时的参考。
今天介绍一下Cocos2d-x的触摸事件处理,了解Android开发的朋友们知道,Android里会用一个OnClickListener()进行事件监听,而在J2SE中也会有Event类实现专门的监听处理。在Cocos2d-x中,因为是游戏引擎,用户在玩游戏时总是要通过屏幕与游戏进行交互,可想而知触摸事件是主要处理的事件。这里主要讲一下如何为精灵添加触控事件,最终的效果是做一个可以拖动的小球,内容很简单。
cocos2d-x提供的CCSprite (或者Sprite)类并没有添加触控监听接口,这就要求我们需要自己创建一个类继承CCSprite并且添加单点触控接口CCTargetedTouchDelegate (多点触控同理),并且实现三个虚方法bool ccTouchBegan() ccTouchMoved() ccTouchEnded() , 然后需要响应触摸事件还需要把该对象添加进CCTouchDispatcher中。
下面是具体的代码:
首先是Ball类的声明:
ball.h
#include "cocos2d.h" USING_NS_CC; //using namespace cocos2dclass Ball: public CCSprite,public CCTargetedTouchDelegate{ public: virtualvoid onEnter(); //新创建一个Ball对象并显示时就会调用onEnter方法,在onEnter中把该对象添加进CCTouchDispatcher(触摸事件管理器)中virtualvoid onExit(); //该对象终结时会调用onExit方法,在该方法中,把该对象从CCTouchDispatcher中删除static Ball* create(char *imageName); //重写了父类的create()方法,使得可以喝CCSprite一样通过create方法创建一个Ball精灵public: virtualbool isPointInside(CCPoint point); //判断当前触摸到的点是否刚好在精灵上 //触摸事件必须要实现的三个接口public: virtualbool ccTouchBegan(CCTouch *touch,CCEvent *pevent); virtualvoid ccTouchMoved(CCTouch *touch,CCEvent *pevent); virtualvoid ccTouchEnded(CCTouch *touch,CCEvent *pevent); };
然后是各个虚函数的具体实现部分
ball.cpp
#include "cocos2d.h" #include "ball.h" USING_NS_CC; //在类声明里面出现的静态成员必须在定义的时候进行外部引用声明!!void Ball::onEnter(){ CCDirector *director=CCDirector::sharedDirector(); director->getTouchDispatcher()->addTargetedDelegate(this,0,true); //将该对象添加进事件处理序列 CCSprite::onEnter(); //调用其父类的构造方法保证精灵能够正常初始化 CCLog("On Enter!"); } void Ball::onExit(){ CCDirector *director=CCDirector::sharedDirector(); director->getTouchDispatcher()->removeDelegate(this); //将该对象从事件处理序列中移除 CCSprite::onExit(); CCLog("On Exit!"); } Ball* Ball::create(char *imageName){ Ball *ball=new Ball(); //采用new方法创建一个对象,并设置自动释放 ball->autorelease(); ball->initWithTexture(CCTextureCache::sharedTextureCache()->addImage(imageName));
//CCTextureCache是一个单例模式,同CCDirector类似,addImage()方法回返回一个Texture2D对象供精灵初始化使用 //addIamge方法回返回一个设定图像的Texture2D对象return ball; } bool Ball::ccTouchBegan(CCTouch *touch,CCEvent *pEvent){ CCPoint point=touch->getLocation(); if(!isPointInside(point)) returnfalse; //ccTouchBegan返回false时表示不再执行ccTouchMoved 和ccTouchEnded函数,否则返回true时会执行上述两个方法 returntrue; } void Ball::ccTouchMoved(CCTouch *touch,CCEvent *pEvent){ CCPoint point=touch->getLocation(); this->setPosition(point); } void Ball::ccTouchEnded(CCTouch *touch,CCEvent *pEvent){ } //因为使用了new 方法,所以必须把所有的虚函数都实现,这是C++自身的语法bool Ball::isPointInside(CCPoint point){ CCPoint nodePoint=this->convertToNodeSpace(point); CCSize size=this->getContentSize(); if(nodePoint.x>size.width ||nodePoint.x<0 ||nodePoint.y>size.height ||nodePoint.y<0 ) returnfalse; elsereturntrue; }
然后在CCLayer中像添加一个普通精灵一个添加即可,create()创建对象,设置位置,通过addChild()添加进图层即可:
#include "HelloWorldScene.h" #include "ball.h"usingnamespace cocos2d; CCScene* HelloWorld::scene() { CCScene * scene = NULL; do { // ‘scene‘ is an autorelease object scene = CCScene::create(); CC_BREAK_IF(! scene); // ‘layer‘ is an autorelease object HelloWorld *layer = HelloWorld::create(); CC_BREAK_IF(! layer); // add layer as a child to scene scene->addChild(layer); } while (0); // return the scenereturn scene; } // on "init" you need to initialize your instancebool HelloWorld::init() { bool bRet = false; do { //////////////////////////////////////////////////////////////////////////// super init first////////////////////////////////////////////////////////////////////////// CC_BREAK_IF(! CCLayer::init()); //////////////////////////////////////////////////////////////////////////// add your codes below...//////////////////////////////////////////////////////////////////////////// 1. Add a menu item with "X" image, which is clicked to quit the program. // Create a "close" menu item with close icon, it‘s an auto release object. CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback)); CC_BREAK_IF(! pCloseItem); // Place the menu item bottom-right conner. pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20)); // Create a menu with the "close" menu item, it‘s an auto release object. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL); pMenu->setPosition(CCPointZero); CC_BREAK_IF(! pMenu); // Add the menu to HelloWorld layer as a child layer.this->addChild(pMenu, 1); Ball *ball=Ball::create("ball.png"); ball->setPosition(ccp(100,100)); this->addChild(ball); bRet = true; } while (0); return bRet; } void HelloWorld::menuCloseCallback(CCObject* pSender) { // "close" menu item clicked CCDirector::sharedDirector()->end(); }
关于资源文件配置,cocos2d-x引擎生命周期等不再详述。
原文:http://www.cnblogs.com/carlos-vic/p/Carlos_Cocos2d_3.html
内容总结
以上是互联网集市为您收集整理的【Cocos2D-X 学习笔记】为精灵添加单点触控全部内容,希望文章能够帮你解决【Cocos2D-X 学习笔记】为精灵添加单点触控所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。