尊旭网
当前位置: 尊旭网 > 知识 >

cctouchbegan,cocos2d-x3.0怎么设置单点触摸模式

时间:2024-06-12 03:13:56 编辑:阿旭

1,cocos2d-x3.0怎么设置单点触摸模式

下面是源代码中关于单点触摸监听器的类,可以看到

[cpp] view plain copy
class EventListenerTouchOneByOne: public EventListener
{
public:
static const std::string LISTENER_ID;
static EventListenerTouchOneByOne* create();
virtual~EventListenerTouchOneByOne();
void setSwallowTouches(bool needSwallow);
bool isSwallowTouches();
///Overrides
virtual EventListenerTouchOneByOne* clone() override;
virtual bool checkAvailable() override;
//
public:
std::functiononTouchBegan;
std::functiononTouchMoved;
std::functiononTouchEnded;
std::function onTouchCancelled;
private:
EventListener TouchOneByOne();
bool init();
std::vector_claimedTouches;
bool _needSwallow;
friend class EventDispatcher;
};

这个类看上去比较容易理解,下面我们用代码来演示一下怎么使用。在HelloWorld的init函数中注册监听器并添加到事件分发器中去。

[cpp] view plain copy
//添加一个测试的精灵
autoonion = Sprite::create("onion.png");
onion->setPosition(Point(visibleSize.width/2, visibleSize.height/2));
onion->setScale(0.2);
this->addChild(onion);

//创建一个触摸监听器,这里使用单点触摸事件
autoTouchListenr = EventListenerTouchOneByOne::create();
//设置吞噬为true,不让触摸往下传递
TouchListenr->setSwallowTouches(true);
//和回调函数绑定
TouchListenr->onTouchBegan= CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
TouchListenr->onTouchMoved= CC_CALLBACK_2(HelloWorld::onTouchMoved,this);
TouchListenr->onTouchEnded= CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
//添加监听器到事件分发器中
_eventDispatcher->addEventListenerWithSceneGraphPriority(TouchListenr,onion);

2,cocos2dx,关于cctouchbegan

bool isTouched = isTouchInside(pTouch);

你这里貌似是判断了是否点击在范围内,而后面的逻辑却没有判断

bool isTouched = isTouchInside(pTouch);
if(isTouched){
CCNode* father=getParent();
int tagnum = father->getTag();
CCSprite* justfortest = CCSprite::create("HelloWorld.png");
addChild(justfortest);
}
return isTouched;

3,在cocos2d里面如何拖拽精灵

既然你们这么要求,我就满足你们啦!在这个教程中,你将学到下列内容:使用touch事件拖拽精灵的基本方法如何通过touch事件来滚动视图本身如何方便地计算坐标如何通过识别手势来实现一些更cool的效果!为了使事件变得有趣,你将要移动一些非常可爱的动画图片,它是 我可爱的妻子创作的, 背景则是由 gwebstock创建. 这个教程假设你已经有一些基本的cocos2d的知识,同时已经安装了一份cocos2d的版本。如果你对cocos2d还不熟悉,你可能需要先学习一下译者翻译的How To Make A Simple iPhone Game with Cocos2D.好了,不多说,准备好键盘,开始吧!Getting Started在实现touch事件之前,首先你需要创建一个基本的cocos2d场景来显示背景和这些动物精灵。打开XCode,点击FileNew Project,选择 User Templatescocos2d X.X.Xcocos2d Application,再点击“Choose…”。把工程命名为“DragDrop”并点击Save。接下来,继续,下载你需要的 图片 . 下载完后,解压,然后把这些图片拖到Resources分组下面。确保“ Copy items into destination group’s folder (if needed)”被选中,然后点击Add。在你把图片导入到工程之后,在Xcode中展开Classes分组,然后选择HelloWorld.h。在@interface申明处,像下面所示,申明3个实例变量:CCSprite * background; CCSprite * selSprite; NSMutableArray* movableSprites;你将使用这些变量才追踪你的背景图片、当前选中的精灵以及一个在处理touch事件时需要移动的精灵的数组。现在,回到HelloWorldScene.m,找到init方法,把它替换成下面的代码:-(id) init {if((self =[super init])){ CGSize winSize =[CCDirector sharedDirector].winSize; [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565]; background =[CCSprite spriteWithFile:@"blue-shooting-stars.png"]; background.anchorPoint = ccp(0,0); [self addChild:background]; [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_Default]; movableSprites =[[NSMutableArray alloc] init]; NSArray*images =[NSArray arrayWithObjects:@"bird.png", @"cat.png", @"dog.png", @"turtle.png", nil]; for(int i =0; i < images.count; ++i){NSString*image =[images objectAtIndex:i]; CCSprite *sprite =[CCSprite spriteWithFile:image]; float offsetFraction =((float)(i+1))/(images.count+1); sprite.position = ccp(winSize.width*offsetFraction, winSize.height/2); [self addChild:sprite]; [movableSprites addObject:sprite]; }}return self; }这里有一些新的知识点需要引入,让我们一步步来学习吧!加载背景这个方法的第一部分加载了一张本场景的背景图片(blue-shooting-stars.png)。注意,这里把图片的锚点(anchor point)设置成图片的左下角(0,0)点。在cocos2d里面,当你设置一个精灵的位置的时候,实际上,你设置的是这个精灵的锚点的位置。默认情况下,图片的锚点就是图片的中点。因此,通过把精灵锚点设置成左下角,当你设置精灵位置的时候,实际上你就是指定了精灵的中心位置在左下角。这个方法并没有设置背景的位置,因此背景的位置默认情况下是(0,0)。因此,图片的实际位置就是在(0,0)。(因此设置精灵位置是相对于锚点来的,锚点在左下角,因此图片的左下角就位于屏幕的左下角)。因此,这个图片有800个像素宽,那么超过的部分就在屏幕之外了。另外需要注意的一点就是,在加载图片之前,转换了一下像素格式。在默认情况下,cocos2d里面加载图片,它们是作为32位的图片加载进来的。这意味着每个像素占4个字节的内存空间。当你需要非常高质量的显示效果时,非常好!但是,有时候需要折中一下,因为以前的设备内存很有限,如果全部使用32的像素格式来加载图片的话,会造成内存消耗过多。当你加载大的图片的时候(比如背景图片),最佳实践是使用16位的像素格式来加载–也就是牺牲一点质量来减少内存开销。cocos2d里面有很多不同的像素格式 –这个教程中,我们选择16位的像素格式,RGB565,因为背景一般不需要透明效果。(少了Alpha通道,RGBA就是有Alpha通道)加载图片init方法的另外一部分,就是循环遍历一个图片数组,然后创建精灵并且计算精灵放置的坐标。这些精灵会一字排开,显示在屏幕上。同时把这些精灵的引用保存在movableSprites数组里面,这个数组后面会使用到。最后,我们需要一些清理内存的操作。找到dealloc方法,然后添加下列代码:[movableSprites release]; movableSprites =nil;就这么多!编译并运行,你将看到一排非常可爱的小动物,在等待你touch呢!基于touch事件选取精灵现在,我们将编写一些代码基于用户的touch事件来决定哪一个精灵被选到了。第一步,就是激活你的HelloWorldLayer层,让它能够接收touch事件。在init方法的最后添加下列代码:[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];注意,这是一种新的方式来激活层的touch事件–老的方式就是,设置层的isTouchEnabled属性为Yes,然后实现ccTouchesBegan方法。如果你非常关心,这个新的方法和旧的方法的优缺点的话,可以参考译者翻译的 《如何使用cocos2d制作基于tiled地图的游戏教程》 .接下来,在HelloWorldScene.m的底部添加一些新的方法:-(void)selectSpriteForTouch:(CGPoint)touchLocation { CCSprite * newSprite =nil; for(CCSprite *sprite in movableSprites){if(CGRectContainsPoint(sprite.boundingBox, touchLocation)){ newSprite = sprite; break; }}if(newSprite != selSprite){[selSprite stopAllActions]; [selSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]]; CCRotateTo * rotLeft =[CCRotateBy actionWithDuration:0.1 angle:-4.0]; CCRotateTo * rotCenter =[CCRotateBy actionWithDuration:0.1 angle:0.0]; CCRotateTo * rotRight =[CCRotateBy actionWithDuration:0.1 angle:4.0]; CCSequence * rotSeq =[CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil]; [newSprite runAction:[CCRepeatForever actionWithAction:rotSeq]]; selSprite = newSprite; }} -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation =[self convertTouchToNodeSpace:touch]; [self selectSpriteForTouch:touchLocation]; return TRUE; }第一个方法(selectSpriteForTouch)是一个帮助方法,这个方法遍历movableSprites数组中的所有精灵,查找第一个精灵位置与touch点位置相交的精灵。注意,CCNode有一个辅助属性叫做boundingBox,它返回精灵的边界矩形。这比你自己手动计算精灵的边界矩形要好多了。因为,第一,它更简单;第二,它考虑了精灵的位置坐标变换。(比如锚点变了,要执行相应的矩阵变换,具体可以参考源代码,这些就不再细说了。)如果找到一个匹配的精灵,那么就让这个精灵执行一些动画,这样用户就知道哪个精灵被选中了。如果动画还没执行完,又选中另一个精灵了,那么就中断前一个精灵的动画。这里的动画效果,使用了一系列的CCAction来实现的。最后,ccTouchBegan方法基于用户的touch事件调用上面的方法。注意,这里把touch坐标点从UIView的坐标系转换成了结点坐标系。为了实现这个目的,通过调用CCNode的一个辅助函数,convertTouchToNodeSpace。这个方法做了以下三件事:计算touch视图(也就是屏幕)的touch点位置(使用locaitonInView方法)转换touch坐标点为OpenGL坐标点(使用convertToGL方法)转换OpenGL坐标系为指定结点的坐标系(使用convertToNodeSpace方法)这是一个非常常用的转换过程,所以提供这个方法可以节约很多时间。编译并运行代码,并且用手触摸这些动物。当你点中一个精灵的时候,它就会以一种非常可爱的方式旋转,表明它被你选中啦!基于touch事件移动精灵和背景层是时候让小动物移动了!基本的思想就是实现ccTouchMoved回调函数,然后计算本次touch点到上一次touch点之间的距离。如果一个动物被选中,将按照计算出来的touch偏移量来移动它。如果动物没有被选中,那就移动整个层,因此用户可以从左至右滚动层。在编写代码之前,让我们花点时间来讨论一下,如何在cocos2d里面滚动一个层。首先,看到下面两张图片:如你所见,你设置背景锚点在左下角(0,0),前景其它部分就在屏幕之外。黑色框框表示当前可见的区域,也就是屏幕范围。因此,如果你将图片往右边滚动100个像素,你可以把整个cocos2d的层往左移动100个像素,如第二张图所示。同时,你要确保不会移得太多。比如,你不能够把层往右移动,因为那样左边就是空白的了。现在,你了解了一些背景信息,让我们看看代码怎么写吧!在文件的最后添加下列新的方法:-(CGPoint)boundLayerPos:(CGPoint)newPos { CGSize winSize =[CCDirector sharedDirector].winSize; CGPoint retval = newPos; retval.x = MIN(retval.x, 0); retval.x = MAX(retval.x, -background.contentSize.width+winSize.width); retval.y = self.position.y; return retval; } -(void)panForTranslation:(CGPoint)translation {if(selSprite){ CGPoint newPos = ccpAdd(selSprite.position, translation); selSprite.position = newPos; }else{ CGPoint newPos = ccpAdd(self.position, translation); self.position =[self boundLayerPos:newPos]; }} -(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLocation =[self convertTouchToNodeSpace:touch]; CGPoint oldTouchLocation =[touch previousLocationInView:touch.view]; oldTouchLocation =[[CCDirector sharedDirector] convertToGL:oldTouchLocation]; oldTouchLocation =[self convertToNodeSpace:oldTouchLocation]; CGPoint translation = ccpSub(touchLocation, oldTouchLocation); [self panForTranslation:translation]; }第一个方法(boundLayerPos),用来确保你在滚动层的时候不会超出背景图片的边界。你传递一个目标点坐标,然后相应地修改x值,保证不会超出边界。如果你不是很理解的话,可以拿出纸和笔,结合上面给出的图片,自己动手画一画。接来的方法(panForTranslation)基于传入的目标点位置移动精灵(如果有精灵被选中就移动之,否则移动整个层)。具体的做法就是设置精灵或者层的位置。最后一个方法(ccTouchMoved)是一个回调函数,它在你拖动屏幕上的手指时调用。像之前一样,把touch坐标转换成局部node坐标。因为没有一个辅助方法可以把前一个层的touch坐标转换成node坐标,因此,我们需要手工地调用那3个方法来执行这个操作。然后,计算touch偏移量,通过把当前的点坐标减去上一个点坐标,然后调用panForTranslation方法。编译并运行,现在,你可以通过拖拽来移动精灵和层啦!如何在cocos2d里面识别手势这里还有另一种方式来实现刚刚的touch处理–通过使用手势识别!手势识别是新版本的ios sdk增加的内容(iOS SDK 3.2引入)。说实话,这个功能太棒了!首先,你不再不需写一大堆代码来检测“点击(tap)、双击(double tap)、滑过(swipe)、平移(pan),挤压(pinch)“的区别了。你只需要创建一个手势识别对象,然后把它加到view里面。当有相应的手势发生的时候,会给你一个回调通知。它非常容易使用,在cocos2d里面使用也非常方便。让我们看看它是如何工作的。首先,回到init方法,把注册touch的调用注释掉,因为你将使用一种新的方法://[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];然后,回到DragDropAppDelegate.m,找到applicationDidFinishLaunching方法,把最后一行替换掉:CCScene *scene =[HelloWorld scene]; HelloWorld *layer =(HelloWorld *)[scene.children objectAtIndex:0]; UIPanGestureRecognizer *gestureRecognizer =[[[UIPanGestureRecognizer alloc] initWithTarget:layer action:@selector(handlePanFrom:)] autorelease]; [viewController.view addGestureRecognizer:gestureRecognizer]; [[CCDirector sharedDirector] runWithScene:scene];这段代码获得HelloWorld层的引用(它是HelloWorldScene的唯一孩子节点),然后,创建一个UIPanGestureRecognizer对象。注意,为了创建手势对象,你必须初使化它,并且指定回调函数–在本例中就是handlePanFrom方法。创建完手势识别对象后,你需要把它加入到OpenGL视图中(viewController.view)。接下来,在HelloWorldScene.m底部加入下面的代码:-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { if(recognizer.state == UIGestureRecognizerStateBegan){ CGPoint touchLocation =[recognizer locationInView:recognizer.view]; touchLocation =[[CCDirector sharedDirector] convertToGL:touchLocation]; touchLocation =[self convertToNodeSpace:touchLocation]; [self selectSpriteForTouch:touchLocation]; }elseif(recognizer.state == UIGestureRecognizerStateChanged){ CGPoint translation =[recognizer translationInView:recognizer.view]; translation = ccp(translation.x, -translation.y); [self panForTranslation:translation]; [recognizer setTranslation:CGPointZero inView:recognizer.view]; }elseif(recognizer.state == UIGestureRecognizerStateEnded){ if(!selSprite){float scrollDuration =0.2; CGPoint velocity =[recognizer velocityInView:recognizer.view]; CGPoint newPos = ccpAdd(self.position, ccpMult(velocity, scrollDuration)); newPos =[self boundLayerPos:newPos]; [self stopAllActions]; CCMoveTo *moveTo =[CCMoveTo actionWithDuration:scrollDuration position:newPos]; [self runAction:[CCEaseOut actionWithAction:moveTo rate:1]]; } }}这个回调函数在pan手势开始、变更(用户连续拖拽)和结束的时候被触发。通过判别不同的状态来处理不同的行为。 当手势开始的时候,把touch坐标转换成node坐标,然后调用之前写好的selectSpriteForTouch方法。 当手势变更的时候,需要计算出手势移动偏移量。这里使用手势对象的方法translationInView来获得连续的偏移量。注意,这里需要把y值设置成负值。因为UIKit的坐标和OpenGL坐标系统不一样。(UIKit 左上角是(0,0),而OpenGL左下角的坐标是(0,0)。 之后把recognizer设置为0,因为这个移动是连续的,而我们只需要得到离散的偏移量。 当手势结束的时候,这里有一些新的代码。另一个非常cool的事情就是,你可以通过UIPanGestureRocognizer对象可以得到Pan移动的速度。你可以使用这个速度来滑动层,这个效果就像你使用tableview一样。 因此,这个部分包含一些代码,基于移动的速度来计算移动点。然后运行CCMoveTo action(使用CCEaseOut效果会更好)。 编译并运行代码,你可以通过手势识别来滑动层啦!何去何从?这里有本教程的完整源代码.到目前为止,你应该知道如何在cocos2d里面使用touch事件来移动精灵了。同时,你也了解了在cocos2d里面如何使用手势识别对象。 现在,你可以尝试扩展本范例,可以使用不同的手势识别对象,比如挤压(pinch)和旋转(rotate)手势识别对象。 :]

4,怎么关闭用cocostudio做的对话框!!!

1 CocoStudio 场景编辑器
前面的文章 《使用 CocoStudio 创建 Cocos2d-x 序列帧和骨骼动画》《如何使用 CocoStudio UI 编辑器实现《乱斗堂》设置界面》,其中介绍了如何使用动画编辑器创建动画与使用 UI 编辑器创建游戏配置界面,而本文将集两者之大成,使用 CocoStudio 场景编辑器来创建游戏场景,其中包含游戏 UI 与动画,来定制一个游戏主界面。
2 使用 CocoStudio 完成《魔卡幻想》场景编辑
对于环境的搭建使用,请参考之前的文章,或者实时关注 官方 最新版本的安装使用方法。
2.1 UI 编辑器制作游戏主界面
创建项目(项目名称:MysticalCard),并导入项目 UI 资源,添加 一图片框设定背景图片。注意在工具拦设置 “画布” 的大小(如果需要),这将决定着你的设计分辨率,在运行时还需要注意屏幕的适配问题,如放大缩小,位置偏移等,视具体情况而定。
为界面添加 UI 元素,图片框等,请根据自己的需要定制
实践过程中的注意事项
添加控件时注意必要的属性设置
控件的命名规范,这有助于我们今后在后台编写代码获取界面元素
可交互的控件的 “可交互属性” 开启
2.2 建立关键帧动画
除了主界面一些必要的 UI 控件,我们还需要一个 “对话框指示” 的动画效果。这是一个帧动画。
准备工作。
如下图所示:

打开 CocoStudio ,启动 动画编辑器
创建一个新的项目,后导入资源(在 “资源窗口” 中,点击 “文件” 或者 “文件夹” 标示,添加需要的素材资源)
在 “资源窗口中” 点击关键帧动画的守帧图片,拖动至 “渲染窗口”
将第一关键帧拖动至 “渲染窗口” 中心。 可以使用工具栏,快速定位至窗口中心,使图片显示在正中间,可以让动画更好的定位。
添加其它帧图片,注意,我们需要选中剩余图片,然后 “拖动” 到 “对象结构” 视图中的 “第一关键帧” 所在的对象,如下图所示。
关键帧 与 骨骼动画操作区别:在使用骨骼动画的时候,我们将骨骼中的各部分元素,直接拖动添加到 “渲染窗口”,以摆放各骨骼的位置关系,而在 “对象结构” 视图中则表现为,一个列表,标示着每一块骨骼对象,不同帧所改变的是各个骨骼对象的位置,以达到骨骼动画效果。
而在关键帧动画中,它的对象结构只有一个,而在每一帧修改的不是其位置,而是其显示内容。这是两者之间的区别,那操作方式也有所不同。而对于它们所导出的 资源 则是相同,用法也是同样。
剩余帧添加之后,我们看见在 “关键帧” 视图中,已经有了多帧动画,可以播放动画,查看效果,并可以通过修改 “速率” 来控制动画的播放速度。
导出动画资源,导出的资源文件可以被我们在 Cocos2d-x 中以代码的方式直接加载,然后播放其动画,也可以作为 场景编辑器中的一个元素,被添加在场景编辑器里,后面的内容就是使用 场景编辑器来加载一个动画的方式。
2.3 场景编辑器的 资源“整合”
使用 CocoStudio 可以很好的帮助游戏开发过程中 分工合作。动画编辑器 和 UI 编辑器可以由多个人进行编辑,最后再由一个人统合资源,这也就是场景编辑器的优点了,它除了能支持 CocoStudio 本身所自带的动画编辑器,UI 编辑器,它还能支持,Tmx 地图资源,粒子编辑器的粒子效果资源,声音资源等~并且不断扩展中。以下将给出如何在 场景编辑器整合我们之前所创建的动画与 UI 界面的资源,来实现我们一个场景的运行效果。它的步骤如下:
启动场景编辑器,新建一个场景项目。并设置 “画布” 大小。画布大小要适量。
我们拖动一个 UI 控件到画布之上,它作为我们之前导出的 UI 资源的承载。
我们将之前的 UI 编辑器所导出的资源,导入到当前场景项目中来,导入方式与 UI 编辑器导入资源方式同样,如下图:
为 UI 控件的 “文件” 属性赋值:我们在资源视图中找到 UI 编辑器所导出的 UI 资源,其目录下包含 json 文件资源(如这里的 “MysticalCard_1.json”),将其拖动到 UI 控件的文件 属性中去,如下图所示:
前面的步骤已经将 UI 资源导入场景之内,现在需要添加之前所创建的动画资源。

我们以相同的方式导入动画编辑器所导出的动画资源文件。
拖动一个骨骼控件至场景界面,如下图所示。
为骨骼控件的 “文件” 属性赋值,其值为 动画资源中的 ExportJson(或者 json 文件,这取决于动画资源的导出方式) 文件。
运行效果:当我们建立好场景之后,可以通过工具栏运行按钮,点击查看效果,这意味着你不用将所有的资源文件,手动以代码的方式添加到 Cocos2d-x 中,便能看到效果。在运行效果中,所有的控件都是可操作的,如下图,但这里只有点击效果,如果需要实现其逻辑,那么现在需要将其加载到 Cocos2d-x 项目中,编写后台代码实现。
3 在 Cocos2d-x 中加载场景资源 并运行之
3.1 加载场景内容
前面那么多步骤,使用 CocoStudio 来创建了 UI,动画,还有一个场景,而要将其运行在实际的项目中,就非常的简单与方便了,只需几行代码,就能够将其加载到项目中去,当然在这之前我们需要将场景编辑器的资源(场景项目目录中 “Resources” 目录,其中将包含一个 json 文件)复制到项目资源目录中去:
// 加载场景资源
CCNode *pNode = CCJsonReader::sharedJsonReader()->createNodeWithJsonFile("McScene.json");
this->addChild(pNode);

通过 CCJsonReader 来读取解析 json,从而获得场景中的节点内容,直接添加到当前的场景就能运行。
3.2 在场景中播放动画
默认加载的场景资源 动画 组件是没有播放的,需要手动获取动画组件对象,然后调用其播放方法,当然这个步骤也是非常简单的:
// pNode 为 之前所获取的场景资源根节点,通过此节点获取到动画对象,获取方式根据在场景编辑其中设置的层次关系而定
CCComRender *pLoadRender = (CCComRender*)(pNode->getChildByTag(1)->getChildByTag(1)->getComponent("CCArmature"));
CCArmature* armLoad = (CCArmature*)(pLoadRender->getRender());

// 播放动画
armLoad->getAnimation()->playByIndex(0);

3.3 对场景的一些编码说明
使用 CocoStudio 就是为了帮助我们快速的建立 UI 原型,然后通过编码可以获取到里面的任意一个元素对象,并修改其属性值,调用其方法,正如上面所示播放一个动画的方法同样。其步骤如下:
通过 CCJsonReader 类读取 json 文件,将会自动解析构建对象,返回一个节点 CCNode
任何元素都能通过这个 CCNode 节点,获取到,它其实就是一个树,所不同的是层级关系(树节点的位置)
找到需要对象所在的 “树枝”,后通过 getComponent 方法获取 所在的 CCComRender 对象
通过 CCComRender 的 getRender 方法获取最终对象
得到我们所需要的具体对象之后,我们就能够对齐进行草,设置属性,调用方法等,诸如此类
本文中所有的源码示例 和 CocoStudio 项目工程都可以在 这里 查看。

5,cocos2d-x,如何实现精灵在一个动作结束前不响应其他触摸事件

这个问题很普遍,就是你点击一次,让它跳一下。等落下来了,再点一次,再跳一次。动画过程中点击不会跳跃。
一般在游戏开发中,我们都习惯用一个bool en变量来控制,你先点击事件中,也就是这个精灵runAction();的时候en设为false,并且跳跃动画推荐有jumpBy,在其中添加一个回调,专门用来当动画结束是将en设为true。
建议多看看damo。谢谢~祝你成长。

6,cocos2d-x 在当前场景中点击图片按钮进入下一场景 怎么实现。。。

按钮可以在触摸里面判断,void ccTouchesEnded(CCSet* touches, CCEvent* event);
首先获得点击屏幕的点,
CCTouch* touch = (CCTouch*)(touches->anyObject());
CCPoint touchPoint = touch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
然后在获得图片按钮的矩形(sprite),
CCRect rect = sprite->boundingBox();
在判断你点击的这个点touchPoint 是否在图片按钮矩形里面rect ;
if(rect.containsPoint(touchPoint))
{//为true就进来,说明点中在图片按钮矩形里面
CCScene* scen = /*下一场景的实例类*/HelloWorld::scene();
CCDirector::sharedDirector()->replaceScene(scen);

这是2.1版本的,希望对你有所帮助,当然也可以把图片按钮做成菜单CCMenu,然后在按钮上添加回调函数,同样可以实现进入下一场景。
最后提醒,在使用触摸实现此功能的时候,一定要先开启触摸响应。
this->setTouchEnabled(true); //开启触摸响应

7,cocos2d怎么创建scrollview

其他不多说直接进入主题:
.h文件
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC_EXT;
USING_NS_CC;
使用scrollview要引入头文件

然后继承ScrollViewDelegate

class HelloWorld :public Layer,publicScrollViewDelegate
{

public:

static Scene* createScene();

virtual bool init();

void menuCloseCallback(Object* pSender);

CREATE_FUNC(HelloWorld);

private:
//ScrollView中必须实现的2个虚函数方法
virtual void scrollViewDidScroll(ScrollView* view);

virtual void scrollViewDidZoom(ScrollView* view);

Node* create9Sprite(float pWith,float pHeight);//创建9妹精灵

bool onTouchBegan(Touch* touch,Event* event);//触摸开始方法

void onTouchMoved(Touch* touch,Event* event);//触摸移动方法

void onTouchEnded(Touch* touch,Event* event);//触摸结束方法

private:

8,Cocos2D-x和Cocos2D的主要区别?

cocos2d是OC写的,cocos2dx是c++写的
cocos2d只能在ios下运行,cocos2dx是跨平台的,ios和android平台都可以运行
cocos2d是外国人搞的,cocos2dx是中国人搞的。
cocos2dx是cocos2d的C++写法,但是游戏架构是一样的,都包含了精灵,导演,场景,动作等概念,他们是一脉相承的东西。你可以直接研究cocos2dx,没有什么障碍。虽然是有了cocos2d才有的cocos2dx,但是cocos2dx包含了cocos2d的主要思想,因此可以直接研究cocos2dx。

9,cocos2d-x中的gui和ui有什么区别

在Quick-Cocos2d-x之前的版本中使用的是菜单Menu,实现菜单的功能。在Quick-Cocos2d-x的v3.x版本中已经移除了菜单Menu,使用自己的封装Button实现菜单的功能。
按钮是一个项目中最基本的东西,因为你不论什么项目都缺少不了按钮。它是Quick中常见的UI控件。
UIButton
按钮Button是基于Node的封装,可以创建带图片的按钮或文本标签的按钮,添加到层Layer上显示。就像普通按钮一样,我们可以很方便的处理按钮事件,按钮的状态。设置背景和显示文字。
注:UIButton不直接使用
按钮的种类
Quick中有三种Button控件,分别是UIPushButton(按钮控件)、UICheckBoxButton(CheckButton控件)和UICheckBoxButtonGroup(CheckButton组控件)。它们是Quick封装的按钮控件, 源码文件分别位于Quick目录的/framework/cc/ui/目录下UIPushButton.lua/UICheckBoxButton.lua/UICheckBoxButtonGroup.lua。
事件
Quick-Cocos2d-x中的按钮控件支持如下的事件:
CLICKED 点击按钮 使用UIButton:onButtonClicked(callback)方法监听按钮的点击事件
PRESSED 按下按钮 使用UIButton:onButtonPressed(callback)方法监听按钮的按下事件
RELEASE 释放按钮 使用UIButton:onButtonRelease(callback)方法监听按钮的释放事件
STATE_CHANGED 状态改变(enable disable) 使用UIButton:onButtonStateChanged(callback)方法监听按钮的状态改变事件
Quick中的各种按钮控件都支持上面的事件。我们可以通过响应的方法监听并处理相应的事件。
UIPushButton
UIPushButton就是我们常见的点击按下按钮,类似于常用的菜单。
UIPushButton是UIButton的子类,也是我们常用的Button。我们可以通过cc.ui.UIPushButton获取UIPushButton。
可以通过cc.ui.UIPushButton.new(images, options)方法创建一个按钮。
其中images是table类型,包含各个按钮状态下的图片。options为可选参数,table类型,包含是否scale9缩放,偏移flipX、flipY值等设置。
UIPushButton按钮的创建支持参数项为空的方式创建,然后在设置按钮各状态的图片,文字等。
代码示例:
下面代码创建了一个按钮,点击按钮触发相应的事件。
myButtonLayer.PUSH_BUTTON_IMAGES = {
normal = "button/Button01.png",
pressed = "button/Button01Pressed.png",
disabled = "button/Button01Disabled.png",
}
function myButtonLayer:createUIPushButton()
pushBtn = cc.ui.UIPushButton.new(myButtonLayer.PUSH_BUTTON_IMAGES, {scale9 = true})
:setButtonSize(240, 60) --设置大小
:setButtonLabel("normal", cc.ui.UILabel.new({
UILabelType = 2,
text = "This is a PushButton",
size = 18
}))-- 设置各个状态的按钮显示文字
:setButtonLabel("pressed", cc.ui.UILabel.new({
UILabelType = 2,
text = "Button Pressed",
size = 18,
color = cc.c3b(255, 64, 64)
}))
:setButtonLabel("disabled", cc.ui.UILabel.new({
UILabelType = 2,
text = "Button Disabled",
size = 18,
color = cc.c3b(0, 0, 0)
}))
:onButtonClicked(function(event) -- 按钮的clicked事件处理
print("pushButton click")
end)
:align(display.LEFT_CENTER, display.left + 80, display.top - 80) --设置位置 锚点位置和坐标x,y
:addTo(self)
end
上面代码使用三种按钮状态图片创建了一个UIPushButton类型的按钮,并设置了大小和显示文本标签。并通过onButtonClicked方法监听按钮的点击事件。
UICheckBoxButtonGroup

UICheckBoxButtonGroup是UICheckBoxButton组控件。用来创建类似radioButton。我们可以通过cc.ui.UICheckBoxButtonGroup获取UICheckBoxButtonGroup。

我们可以通过cc.ui.UICheckBoxButtonGroup.new(direction)方法创建UICheckBoxButton组控件。其中direction为integer类型,表示checkBox排列方向(可选的值有display.LEFT_TO_RIGHT/display.RIGHT_TO_LEFT/display.TOP_TO_BOTTOM/display.BOTTOM_TO_TOP)。创建完成后,可以使用addButton方法添加按钮,removeButtonAtIndex(index)移除指定index的按钮。

注:CheckBoxButton组控件,类似RadioButton.同一时刻只能有一个被选中

最新内容