CCProgressTimer制作横向进度条

用CCProgressTimer实现进度条效果很不错,还有动画,只是中文社区、博客对横向进度条讲的比较少,自己写一个大概的用法,因为刚开始使用,有问题还请指出。

ps. 基于cocos2d 2.1。

首先是初始化一个CCProgressTimer:

然后设置其状态:

这样就得到了一个横向进度条。

获取Texture packer的免费授权码

制作cocos2d游戏的时候会经常需用精灵画册(sprite frame),如果使用精灵画册可以明显提高游戏的效率。很多人都选择使用Texure packer,这个工具不止支持cocos2d,他还支持超级多其他的引擎,最近刚出的3.1.3还添加了对Spirte kit的支持。

我在试用一周后开始考虑入手这个工具,有人说免费的就很好用,其实不是这样的,免费版会给一些图片增加作者的网址,你会发现图片一片红……

后来突然发现作者也发免费授权的,前提是你要有自己的博客,这个博客至少写了6个月,而且需要有5篇以上的相关文章。我前天发的申请,昨天收到了作者的邮件,我突然发现作者热心的把PhysicsEditor的key也给我了(申请的时候我没选择要这个),真不错。

申请地址:http://www.codeandweb.com/request-free-license

邮件末尾还说如果你写一个这个工具的入门教程,他可以考虑把你的文章放到他站点上给你提高访问量,不过我还没用明白,先算了,虽然我的博客的确没什么访问量。

cocos2d 2.1的图片后缀

因为IOS设备的多样性,导致人们需要做多个规格的图片来适用不同的设备,真的好麻烦……

cocos2d给了不错的图片支持,在文档里面搜索suffixesDict我们可以看到cocos2d默认使用的后缀名:

只要命名的时候按照这个规则来就可以了,你也可以自己设置对应的后缀,cocos2d提供了对应的方法,比如:

我一直比较好奇iphone5和iphone5 hd这两个,可能是程序性上的设计吧,等我这UI出完测试的时候再解答……或者哪位达人解答一下,谢谢。

(文档对应的cocos2d-iphone版本为2.1)

续:

把suffixesDict自己打出来后发现和文档里的默认值并不相同,详情如下:

iPhone5有些出入,使用iphone5hd后缀运行成功。

cocos2d纹理像素格式

译自:Understanding pixel format in cocos2d v0.7.3

纹理的像素格式是图像存储在GPU内存的方式。

你可能会见到以下像素格式:

  • RGBA8888(32位)(kTexture2DPixelFormat_RGBA8888)
  • RGBA4444(16位)(kTexture2DPixelFormat_RGBA4444)
  • RGB5_A1(16位)(kTexture2DPixelFormat_RGB5A1)
  • RGB565(16位)(kTexture2DPixelFormat_RGB565)

RGBA8888:

红色通道、绿色通道、蓝色通道和alpha 通道各8位。
如果想获得最好的图片质量,使用这种格式是很靠谱的。
但它会占用的内存会比16位的纹理多一倍,在IPhone上内存是很宝贵的资源,这个你懂的。
自然的,它的运算速度也是相对较慢的。
常用的地方:整个场景的背景图片、大量渐变色的图片。

RGBA4444:

红色通道、绿色通道、蓝色通道、alpha通道各4位
它对每个通道都有不错的支持,还能保证相对良好的速度和内存占用率。
常用的地方:需要有不同的透明度精灵。

RGB5A1:

红、绿、蓝三色通道各5位,Alpha通道仅有1位。
RGB通道表现良好,但是Alpha通道可就惨了。它在内存占用和速度上表现不错。
常用的地方:精灵需要透明度上的表现,但是透明度的表现上只有两种:开或者关。

RGB565:

红色通道5位,绿色通道6位,蓝色通道5位,这可怜的孩子没有Alpha通道。
它能尽最大努力的给你一个高品质的16位纹理,前提是你不需要透明度的支持。
常用的地方:游戏中的背景图像。

继续阅读

cocos2d制作触摸反馈按钮

使用cocos2d制作按钮的时候,需要触控反馈,比如有两个素材:button.png、button_hint.png。正常情况下显示button.png,而点击时选择button_hint.png。如果不想做一个精灵动画的话,可以考虑用如下方法:

首先声明支持单点触控委托:

初始化的时候使用button.png

然后在ccTouchBegan里面进行触摸检查,被触摸的时候使用setDisplayFrame来替换:

最后在ccTouchEnded里面把内容换回来:

最后不要忘记移除触摸委托就OK了。

不过如果想要更集中的管理代码或者需要动画的话,可以考虑使用如下方法:

具体实现方案可以参考平时制作精灵动画的方法。

如有错误,还请指正,谢谢。

cocos2d的坐标转换问题

cocos2d为转换坐标提供了以下几个方法:

如果对具体的坐标系不了解,可以参考下面两个文章:

以上四个方法主要涉及两种情况:

  1. 从当前坐标转换为世界坐标

    这里一定要注意的是,调用者(消息发出者)必须为需要转换坐标对象的父节点(parent node),参数是需要转换对象的坐标(相对于父类的坐标)。返回值是世界坐标;
  2. 从当前坐标点转换为相对某个CCNode的坐标

    node2并不是node1的父节点,node1获得的是相对于node2坐标系的坐标。

以上的调用并没有考虑anchorPoint(锚点)信息,如果需要获取相对于锚点作为参考点的坐标,则调用以下方法:

不使用AR相关方法则获取相对于坐标(0,0)的坐标,如果使用AR相关方法,则获取相对于锚点的坐标。

如果有错误,还请指教。

关于cocos2d坐标系

无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了。所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚。

基本的两个坐标系:屏幕坐标系和GL坐标系。

  1. 屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。
  2. GL坐标系x轴朝右,y轴朝上。默认原点在左下角。

在调用任何需要设置位置的函数,或从函数获取位置信息前,必须要明确这个函数使用哪个坐标系。比如调用CCNode类的setPosition函数,它使用的就是GL坐标系。比如在处理触摸事件时CCTouch对象中的坐标就是屏幕坐标系。

继续阅读

cocos2d 2.1中的layer启用触摸检查

学习cocos2d的时候装了个cocos2d 2.1,增加触摸事件处理的时候发现一些地方和从前不同了。

下面是并未认真查询文档,写出来的触摸事件启用方法,亲测可用。

启用触摸处理:

关闭触摸处理:

要注意的是退出场景的时候要移除触摸的委托,不然下个场景也会触发上个场景的触摸事件。