获取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纹理像素格式

译自: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对象中的坐标就是屏幕坐标系。

继续阅读

openGL坐标系(转)

今天看3D模型动画代码中,发现用四元组来进行插值和旋转,了解了使用欧拉角做旋转会有万向锁的问题存在。但这个是建立在对模型坐标系进行旋转的基础上,于是又对OGL中矩阵变化的部分再次学习了一下。发现了一篇好文章,转发学习,留供查阅。

openGL使用右手坐标

从左到右,x递增
从下到上,y递增
从远到近,z递增

OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。
当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的。

继续阅读