CCMenu位置的一些理解和制作一个中心放大的按钮(无需修改底层代码)

(版权所有,转载请注明出处,谢谢:)http://www.cnblogs.com/binxindoudou/archive/2013/04/26/3045737.html

  最近在做一个CCMenu中心放大的按钮时,发现始终调整不了CCMenuItem的锚点值,以至于这个放大总是以左下角位中心点放大,很是纠结。于是开始上网查找资料,发现有一篇帖子被大家疯狂转载,就是修改底层代码的那个,大家有兴趣的话可以去搜搜看看。但是我也不知道这样好不好,所以就和同学研究后另想了两种方法,虽然也不是特别好,但至少可以解决问题了。

直接上代码吧

1.方法一(推荐使用)(不修改锚点,只调整位置,适用于两个大小图片不同,直接修改位置就好)  

1 CCSprite *unselectedSprite= [CCSprite spriteWithFile:@"icon.png"];        

2 CCSprite *selectedSprite = [CCSprite spriteWithFile:@"icon-72.png"];        

3 selectedSprite.position = ccp((unselectedSprite.textureRect.size.width-selectedSprite.textureRect.size.width)/2,(unselectedSprite.textureRect.size.height-selectedSprite.textureRect.size.height)/2);        

4 CCMenuItem *item = [CCMenuItemImage itemWithNormalSprite:unselectedSprite selectedSprite:selectedSprite];        

5 CCMenu *menu = [CCMenu menuWithItems:item, nil];

6 [self addChild:menu];

2.方法二 (适用于通过调整比例,同一个图片,但是显得有点不整齐,可读性不好,因为最后调整锚点有点突兀)

1 CCSprite *unselectedSprite= [CCSprite spriteWithFile:@"icon.png"];        

2 CCSprite *selectedSprite = [CCSprite spriteWithFile:@"icon.png"];        

3 selectedSprite.scale = 1.5;        

4 selectedSprite.position = ccp((unselectedSprite.textureRect.size.width-selectedSprite.textureRect.size.width)/2,(unselectedSprite.textureRect.size.height-selectedSprite.textureRect.size.height)/2);        

5 CCMenuItem *item = [CCMenuItemImage itemWithNormalSprite:unselectedSprite selectedSprite:selectedSprite];        

6 CCMenu *menu = [CCMenu menuWithItems:item, nil];

7 [self addChild:menu];          

8 unselectedSprite.anchorPoint = ccp(0.5,0.5);

9 selectedSprite.anchorPoint = ccp(0.5,0.5);

3.上述代码的解释和CCMenu使用的一些理解

  1⃣ 第一种方法解释:不修改锚点,就算好大图正确的位置

  如图:

CCMenu位置的一些理解和制作一个中心放大的按钮(无需修改底层代码)

  2⃣ 第二种方法解释:通过理解CCMenuItem的底层实现,发现在[CCMenuItemImage itemWithNormalSprite:unselectedSprite selectedSprite:selectedSprite]的内部是修改了两个精灵的锚点,所以在之前所做的修改锚点是无效的,只有在之后修改锚点才会有效,但是看起来很别扭,不推荐使用。

  3⃣ 关于CCMenu的响应触摸事件,注意的是CCMenu一直默认都在[[[CCDirectorsharedDirectortouchDispatcher]这个响应队列里,所以无需重新吞没事件。

  但是CCMenu有时候我们需要调整它的响应优先级,比如两个CCMenu重叠时,想调整一下,有一个函数(见下)请注意:

  只有在这个函数里写才有作用,否则会报错说是Delegate没找到,现在还没弄清楚为什么,希望有大神能够指教一下。

1 - (void)onEnter

2 {  

3  [superonEnter];

4  [menu setHandlerPriority:priorityYouWant];

5 }

(版权所有,转载请注明出处,谢谢:)http://www.cnblogs.com/binxindoudou/archive/2013/04/26/3045737.html

你可能感兴趣的:(menu)