cocos2d删除精灵-js中怎么删除一个精灵

主题 : 请问cocos2dx如何实现 点击精灵(多个精灵) 精灵消失
级别: 新手上路
UID: 311609
可可豆: 93 CB
威望: 90 点
在线时间: 28(时)
发自: Web Page
来源于&&分类
请问cocos2dx如何实现 点击精灵(多个精灵) 精灵消失&&&
我的思路是做成按钮设置tag  然后在回调函数里执行移除for(int i=0;i&2;i++){&& CCMenuItemImage* room = CCMenuItemImage::create(&stone.png&,       &stone.png&, this, menu_selector(ClimblingGameScene::enterRoom));       room-&setPosition(ccp(100* i, 200));       room-&setTag(100+i);      CCMenu* selectRoom = CCMenu::create(room, NULL);     selectRoom-&setPosition(CCPointZero);&&//selectRoom-&setTag(100+i);     bg-&addChild(selectRoom); }回调函数:enterRoom(CCObject* pSender){bg-&removeChildByTag((CCMenuItemImage*)pSender-&getTag());}但是pSender好像无法转换,ccobject没有成员getTag();
级别: 新手上路
UID: 260205
可可豆: 79 CB
威望: 59 点
在线时间: 26(时)
发自: Web Page
bg-&removeChildByTag(((CCMenuItemImage*)pSender)-&getTag());试试这样:先将pSender转为CCMenuItemImage类型,这样就有getTag()函数了
级别: 新手上路
UID: 311609
可可豆: 93 CB
威望: 90 点
在线时间: 28(时)
发自: Web Page
回 1楼() 的帖子
怎么转化啊 不能直接转换?
级别: 新手上路
UID: 290530
可可豆: 27 CB
威望: 16 点
在线时间: 12(时)
发自: Web Page
把你要消失的精灵设为:visible= false不就行啦如果你要永久消失,那为要消失的精灵设置target,然后remove就行了
级别: 新手上路
UID: 311609
可可豆: 93 CB
威望: 90 点
在线时间: 28(时)
发自: Web Page
回 3楼(漫漫) 的帖子
如何设置啊,psender没有visible属性。实现的是点击的该精灵 消失
级别: 精灵王
UID: 308160
可可豆: 2255 CB
威望: 2537 点
在线时间: 1015(时)
发自: Web Page
ccmenu* mMenu = (ccmenu*)bg-&getchildbytag();mMenu-&setvisible(false);
世界上有10种人,一种是懂二进制的,一种是不懂二进制的
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版精灵是2D游戏中得主角,这次就总结一下cocos2d-x中精灵的使用。
首先,创建一个变量 CCSprite *pS
加载函数分为两组initWithXXXX和spriteWithXXXX,其主要的区别是使用initWithXXXX的手工作业,而spriteWithXXXX是纯自动化作业。在SpriteWithXXXX中,先分配内存,然后加载,最后加入到autorelease中。而前者只有加载的部分,分配内存以及释放都需要靠自己。下边全部以spriteWithXXXX函数说明。
1,从文件中直接加载
从文件中加载很简单,只需要 CCSprite::spriteWithFile(&文件完整名称&); 其中文件名必须是完整路径,用cocos2d-x生成的项目中Resources目录为根目录。若有一个文件目录为..\Resources\chars\a.png 则 文件名部分就应该为&chars/a.png&。值得注意的是,在WINDOWS下,后缀名大写小写无所谓,但是在MAC下,后缀的大小写必须与文件完全一致,否则无法加载。
此函数还有一个重载函数,后边多一个CCRect参数,可以通过此参数设定加载图片中某个矩形区域。
2,间接加载
有些经常被用到或者需要频繁加载移除的一些资源,如果每次都从文件中加载,程序的效率会变得非常低,通常的做法是将这些文件先读到缓存中,然后再从缓存中加载。
CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()-&addImage(pszFilename);
这个函数将一个图片加入缓存并返回一个CCTexture2D的指针。然后就可以
pSprite = CCSprite::spriteWithTexture(pTexture);
如果一个资源已经被加入到了缓存,addImage是不会再加一遍的。程序中我很少会直接用spriteWithTexture这个函数,因为需要保存pTexture的指针。而在spriteWithFile函数中起内部就已经使用了上述过程。
另一种间接加载方法是利用SpriteFrame。SpriteFrame是把一个大的图片划分掉,每一个矩形区域就是一个SpriteFrame。其实如果这个SpriteFrame在大图中的矩形区域已知的话,可以直接使用CCTexture2D的方式,使用CCRect参数。SpriteFrame给我们提供了一种快捷,简便的方式,就是将这个矩形区域信息保存到plist文件中,并通过一个名称作为索引。生成这种大图也有很多工具,我使用过两种工具,一个是
是一个在线的免费工具,另一个我常用的是 。这是一个收费软件,不过免费版也能满足基本的需要。这两种工具可以生成一个.plist文件和一个图片文件。存放的时候讲这两个关联的文件放在同一个目录下。在需要使用的时候,我们可以将它加载到缓存中:
CCSpriteFrameCache *pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
pCache-&addSpriteFramesWithFile(&XXXX.plist&);
其中plist文件的路径是完整路径。
然后可以用两种方式加载
pSprite = CCSprite::spriteWithSpriteFrame(pCache-&spriteFrameByName(szFrameName));
pSprite = CCSprite::spriteWithSpriteFrameName(szFrameName);
看起来第一个函数比较麻烦,实际上,第二个函数调用的是第一个函数。。。。值得说明的是,这里的szFrameName不需要完整路径,而是文件名索引。
二,常用操作
精灵加载完了就改各种使用了。
锚点就是所有旋转,移动,缩放的参考点。cocos2-x中默认的锚点是中心点。锚点用比例来表示范围为0-1,(0,0)点代表左下点,(1,1)代表右上点。设置的函数为setAnchorPoint(ccp(0.5, 0.5));
setRotation(angle) 其中angle为角度不是弧度。正数为顺时针旋转,负数为逆时针旋转。
setPosition(ccp(xPos, yPos)) xPos和yPos为相对于父节点锚点的位置。
setScale(s);   // 整体缩放
setScaleX(s); // 原图片坐标X轴缩放
setScaleY(s); // 原图片坐标Y轴缩放
s为比例,s = 1表示原尺寸。
setSkewX(s); // 原图片坐标X轴倾斜
setSkewY(s); // 原图片坐标Y轴倾斜
X轴向右为正,Y轴向上为正。
setOpacity(s);
s范围0-255,0完全透明,255完全不透明。
setIsVisible(bVisible)
bVisible为bool值true代表可见false代表不可见
setFlipX(bFlip);  // 水平翻转
setFlipY(bFlip);  // 竖直翻转
bFlip为true,则图片翻转,false不翻转。注意,翻转是针对原图片的操作,水平翻转相当于在图片编辑软件里水平翻转一样。不根据锚点进行翻转。翻转以后,设置的以前设置的锚点不会随着图片的翻转而改变。比如设置右下角为锚点,则翻转以后,锚点为翻转后的图片的右下角(是不是有点绕?)
最后,初始化完成后,不要忘了使用addChild加入到父节点,否则是不会显示的。
阅读(...) 评论()cocos2d-x 精灵遮罩 - Bill Yuan - 博客园
首先得理解一些东西。
1.理解颜色混合。精灵有个成员函数:setBlendFunc(),这个函数以一个ccBlendFunc类型的变量为参数。这个ccBlendFunc是个结构体。这个结构体中有两个变量:src 和 dest. 举个例子:
ccBlendFunc& spriteB
spriteBlend.src = GL_ONE;
spriteBlend.dst = GL_ZERO;
pSprite-&setBlendFunc(spriteBlend);
假设精灵pSprite是源颜色.则setBlendFunc的作用就是把精灵pSprite的各个像素的R,G,B,A分量和源颜色因子1.0(src = GL_ONE)相乘.& 如果精灵pSprite是目标颜色,则setBlendFunc的作用就是把精灵pSprite的各个像素的R,G,B,A分量和目标颜色因子(dst = GL_ZERO)相乘.
如何界定pSprite是源颜色还是目标颜色呢?
如果这个时候还存在一个精灵pSpriteOther.如果pSprite先调用visit(), 然后pSpriteOther后调用visit()(visit()的作用是递归的渲染精灵和他的孩子节点)。。。则先调用visit()的为目标颜色,后调用visit的为源颜色。即:pSprite是目标颜色 ,pSpriteOther为源颜色。
2.做精灵的遮罩效果为什么要用CCRenderTexture这个类。
你可能会觉得我们只需要先把mask(遮罩)精灵渲染上去,然后再渲染被遮罩的精灵,并且指定这两个精灵的blendFunc就行了。可是,实际上这样是行不通的!
因为被渲染上去的mask精灵下面如果还有其他的精灵。这样的话被渲染到mask精灵之上的精灵在做颜色混合的时候会出现意想不到的结果。达不到我们做遮罩的效果。
这样的话,我们需要一个比较干净的画板,这个干净的画板只有两个精灵在做颜色混合。这样的话这两个精灵在做颜色混合的时候就能达到我们想要的结果。不会受到不干净的背景造成的混合误差。这个背景就是CCRenderTexture.
当然如果我们的layer上只有精灵做混合的话就用不着CCRenderTexture了。但是实际项目中基本上是不能的。
OK。看看我们的Code.
CCSize size = CCDirector::sharedDirector()-&getWinSize();
//创建干净的画板
CCRenderTexture *pRt = CCRenderTexture::create(size.width,size.height);
CCAssert(pRt, "RenderTexture is invalid");
addChild(pRt);
pRt-&setPosition(size.width/2,size.height/2);
//创建遮罩图片
CCSprite *pMask = CCSprite::create("CalendarMask.png");
CCAssert(pMask,"mask sprite is invalid");
pMask-&setPosition(CCPointMake(pMask-&getContentSize().width/2, pMask-&getContentSize().height/2));
//创建被遮罩图片
CCSprite *pFlower = CCSprite::create("Calendar1.png");
CCAssert(pFlower, "Flower sprite is invalid");
pFlower-&setPosition(CCPointMake(pFlower-&getContentSize().width/2, pFlower-&getContentSize().height/2));
//先设置好 遮罩精灵 和 被遮罩精灵 在被渲染的时候采用什么样的颜色混合法则
ccBlendFunc maskBlend = {GL_ONE, GL_ZERO};
ccBlendFunc flowerBlend = {GL_DST_ALPHA, GL_ZERO};
pMask-&setBlendFunc(maskBlend);
pFlower-&setBlendFunc(flowerBlend);
//开始把各种精灵渲染到画板上
pRt-&begin();
//先渲染遮罩精灵。但是因为有个画板先被渲染。所以pMask是第二个被渲染的,即后被渲染。
//所以在这一刻pMask是源颜色。调用pMask-&visit()的时候吧精灵pMask上的每个像素的RGBA分量和1.0相乘。
//所以遮罩图片被元模原样的渲染出来.
pMask-&visit();
//再渲染被遮罩的精灵.在这一刻,之前先有pMask被渲染。所以pFlower后被渲染。pFlower就是源颜色。之前的pMask就是目标颜色。
//调用pFlower-&visit()的时候,精灵pFlower上的对应像素的RGBA分量和pMask上的对应像素的A分量相乘.因为前面设置了GL_DST_ALPHA。
pFlower-&visit();
//停止渲染到画板
pRt-&end();
上面看注释就懂了。
先看遮罩图片(PNG)目标颜色
这个遮罩图片是个不规则的边缘的图片,其本事是个矩形。除了白色区域有像素外,其他区域没像素,是全透明的。以上图片中显浅蓝色的区域是我截取的时候故意这样做的 。实际上这一区域是全透明的。
再看被遮挡图片(源颜色)
采用GL_DST_ALPHA把遮挡图片对应像素的RGBA分量和 被遮挡图片的A分量相乘.这样的话,遮挡图片中透明的区域在被遮挡图片上对应的区域就全透明了。
效果如下图。
黑色的区域是layer的背景.
话中貌似用CCRenderTexture的方式效率很低下,但是本人也没深究过。
2、高效率遮罩
先说下模板缓冲(stencil buffer),这在05年还算是一个比较普及的技术。cocos2d-x现在的版本是不支持stencil buffer的,但opengl es是支持的。可以简单的动手改造一下:创建stencil buffer。在ES1Renderer.m文件中找到resizeFromLayer方法,将if (depthFormat_){}大括号中的代码替换成以下内容:
if (depthFormat_)
if( ! depthBuffer_ )
glGenRenderbuffersOES(1, &depthBuffer_);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthBuffer_);
if( multiSampling_ )
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, samplesToUse_, depthFormat_,backingWidth_, backingHeight_);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, depthFormat_, backingWidth_, backingHeight_);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthBuffer_);
// add by frankyang at
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthBuffer_);
// bind color buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer_);
设置stencil buffer格式。在AppController.mm中找到的didFinishLaunchingWithOptions方法,将其中的depthFormat参数改为GL_DEPTH24_STENCIL8_OES,如下:&&&
// Add the view controller's view to the window and display.
window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
  pixelFormat: kEAGLColorFormatRGBA8
  //depthFormat: GL_DEPTH_COMPONENT16_OES
  depthFormat:GL_DEPTH24_STENCIL8_OES
  preserveBackbuffer: NO
  sharegroup:nil
  multiSampling:NO
  numberOfSamples:0];
设置每帧渲染开始时清除stencil buffer。在CCDirector.cpp中找到drawScene方法,将其中&&&&&&&&glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)改成&&&&&&&&glClear(GL_COLOR_BUFFER_BIT | GL_COLOR_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)这样就可以正确清除stencil buffer。启动模板测试,设置模板函数。这里要用到三个函数:
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0x1, 0x1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
第一个是启用模板测试,第二个是设置模板测试函数,第三个是设置模板缓冲操作方式。模板测试简单来说就是先往模板缓冲中写入模板值,然后渲染时根据模板测试结果来决定像素是否写入color buffer。具体解释大家可以看这个帖子为了灵活的写入模板值,我借鉴了Quaz2D中maskLayer的概念,在要渲染的Layer前后插入MaskBeginLayer和MaskEndLayer。用MaskBeginLayer来填充模板缓冲,并设定好之后需要的模板测试函数;用MaskEndLayer来恢复模板测试状态。
void MaskBeginLayer::visit()
  if (getChildrenCount() != 0) {
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.0);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_ALWAYS, 0x1, 0x1);
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
    CCLayer::visit();
    glDisable(GL_ALPHA_TEST);
    glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
void MaskEndLayer::visit()
  glDisable(GL_STENCIL_TEST);
  CCLayer::visit();
这里要注意透明像素也会写入stencil buffer,所有特别用了alphatest。经过真机测试,这样实现mask性能是无损的。由于不影响alpha blend,使用起来比较灵活。唯一不好的是mask不支持渐变,要么全透,要么全部透。现在我在研究直接用alpha blend操作实现mask,性能一样无损,还可以支持渐变,但也有其局限性,且听下回分解。
随笔 - 746主题 : 关于删除一个layer后层中精灵引用计数的问题
级别: 侠客
UID: 282640
可可豆: 751 CB
威望: 665 点
在线时间: 261(时)
发自: Web Page
来源于&&分类
关于删除一个layer后层中精灵引用计数的问题&&&
有一个疑问,每当addchild添加精灵的时候,精灵的引用计数会加1, 当删除层的时候,精灵的技术会减一吗?我测试的是没有减1, 那删除layer的时候  精灵什么时候减1 呢?是析构的时候减1吗?测试代码如下:    Sprite * sp = Sprite::create(&1.png&);    CCLOG(&----%d&, sp-&getReferenceCount());    auto layer = Layer::create();    layer-&addChild(sp);    this-&addChild(layer);    CCLOG(&--------%d&, sp-&getReferenceCount());    this-&removeFromParentAndCleanup(true);    CCLOG(&------------%d&, sp-&getReferenceCount());    while (1)    {        CCLOG(&---%d&, sp-&getReferenceCount());    }
级别: 侠客
UID: 282640
可可豆: 751 CB
威望: 665 点
在线时间: 261(时)
发自: Web Page
还是autorealease把所有的子节点release
级别: 侠客
UID: 282640
可可豆: 751 CB
威望: 665 点
在线时间: 261(时)
发自: Web Page
&&找到答案&&链式反应
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版cocos2d 精灵删除_百度知道}

我要回帖

更多关于 cocos2d删除精灵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信