摘要: Cocos2d中的另一个核心应该属Action模块了,从基类CCAction到其下的各种子类,有数十个之多,通过他们之间的相互组合,可以得到非常丰富的动态内容。从名称上看,Action这套东西肯定是同显示对象的动作有关,但这些东西内部的原理又是怎样的呢?如果你熟悉设计模式,那么你可以试着回忆一下命令模式这一概念,Cocos2d中所谓的动作从设计的角度讲,就是一个命令。先来看它的接口。所谓的命令模式,其实就是对某一个或者多个操作的封装,而操作是针对于某个对象的,这个对象就是这个命令的目标:通过CCActioin的void setTarget(CCNode*pTarget)和CCNode*getT 阅读全文
posted @ 2013-05-03 16:03 Joe Physwf 阅读(730) 评论(0) 推荐(0) 编辑
摘要: 紧接着上一节,我们来深入了解一下CCSprite对象,这个对象比较核心,在继续进行下面的学习之前我们需要对它有足够的了解。与其说是了解CCSprite对象,其实是了解以CCSprite为中心的,同时包括与CCSprite紧密相关的一些对象,比如:CCContext2D,CCSpriteFrame等。你可以新建一个场景类来写相关的代码,也可以利用之前已经有的,然后修改它们的init方法即可。出于保持现场的原因,我重新创建了一个SpriteObject的类。CCSprite的创建:一般我们通过CCSprite提供的工厂方法来创建CCSprite对象,而CCSprite提供了不止一个这样的方法,我们 阅读全文
posted @ 2013-04-29 16:26 Joe Physwf 阅读(3136) 评论(0) 推荐(1) 编辑
摘要: 为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建立了一个HelloWorld项目,如果你用的的确是HelloWorld这个名字,那么你的项目中会有一个HelloWorldScene这个类,也是在这个类里实现了所有屏幕上的显示。现在我们就仿照这个类来实现自己的一个场景,这个类命名为StaticDisplayObject。首先需要声明这个类,在StaticDisplayObject.h文件中我们仿照HelloWorldScene.h将这个类声明出来:#include 阅读全文
posted @ 2013-04-26 16:46 Joe Physwf 阅读(1306) 评论(1) 推荐(1) 编辑
摘要: 声明:本教程的开发环境为Win32,并且目前只在此平台上做开发实验。平台的选择只考虑开发的方便,教程的关注点在于平台之上的层面。为了搭建一个在Windows下的Cocos2d-x开发环境,我们需要:1.安装VS(2010或者2012 Desktop),笔者安装的是VS Express 2012 For Desktop。2.下载Cocos2d-x源码库。Cocos2d-x的Github地址https://github.com/cocos2d/cocos2d-x,你可以下载zip包解压,也可以用git/svn检出,需要提醒的是不要检出全部,否则你要等好一阵子,只要检Head Revision就可以 阅读全文
posted @ 2013-04-25 02:19 Joe Physwf 阅读(3010) 评论(0) 推荐(1) 编辑
摘要: 回顾之前,我们已经实现了颜色填充的四边形,以及具有纹理贴图的四边形。如果仅仅只是这些,那实在是太无聊了,通过这些我们能够实现的东西无非就是一堆可以动的图片,当然对于某些需求这已经足够,但我们并不因此而止步。另一方面,GPU硬件的能力也远不止如此,这些单调的贴图四边形远远没有发挥为其提供的巨大资源。接下来我们该研究怎样让GPU尽量地发挥它们应有的价值了。但是为了给GPU施加指令,就需要编写shader program,于是你会发现有一个冲突,我们之前的很多显示对象是共享shader program的,但是为了实现更丰富的表现效果,应该让每个对象的shader program独立开来。所以,很明显 阅读全文
posted @ 2012-12-20 13:39 Joe Physwf 阅读(1963) 评论(6) 推荐(3) 编辑
摘要: 在硬件渲染的基础之上实现动画的方案应该很多,但比较普遍也是很基础的一种做法就是纹理动画,即通过每一帧改变纹理坐标来在同一张纹理上实现画面的切换。如下的一张精灵图序列,如果我们每一帧将纹理坐标(四个点)向前推进一步,那么就可以让人物动起来:实现这种动画其实并不难,但前提是你已经实现了静态的纹理贴图,在静态纹理贴图的基础之上我们需要做的就是将每一帧的纹理坐标数据计算并存储起来,然后在每一帧的迭代中,根据当前帧的计数,取得相应的纹理坐标即可。我们通过扩展之前的Image类来实现这种动画: 1 package psw2d.display 2 { 3 import flash.display.B... 阅读全文
posted @ 2012-12-08 13:01 Joe Physwf 阅读(1688) 评论(2) 推荐(0) 编辑
摘要: 显示列表的概念 Flash传统的显示列表实质上是一种树形数据结构,可以用下面的图来表示:这一数据结构的实现是通过两个类:DisplayObject和DisplayObjectContainer,其中前者为后者的父类(介于阅读的方便,我省略了这两个类的一些几何属性和方法,更完整的内容可以参考后面的源码资源):DisplayObject: 1 package psw2d.display 2 { 3 import flash.geom.Matrix; 4... 阅读全文
posted @ 2012-12-07 10:40 Joe Physwf 阅读(1510) 评论(0) 推荐(0) 编辑
摘要: 在进入主题之前,我们先来回顾一下之前所走过的思路:1.首先是为了绘制多个四边形,并且为了节省效率,我们将多个四边形的数据集中到一起,一次上传到缓冲,并且只执行一次绘制,一次呈现。2.但是当需要纹理贴图时,我们发现颜色填充的四边形和贴图的四边形无法公用shader program,所以我们不得不将这两者分开,执行多次绘制,最后一次呈现。在这篇文章中我们会延续以上的思路,继续探索下去,来处理多纹理的情况。如果你仔细研究了前一篇文章中的ImageRender类,你会发现有一个很严重的问题,那就是一个ImageRender对象只有一个纹理对象,因而它只能批量渲染那些拥有相同纹理的Image对象。但是实 阅读全文
posted @ 2012-11-30 21:32 Joe Physwf 阅读(915) 评论(7) 推荐(1) 编辑
摘要: 接下来我们该构建带有贴图的显示对象了。为了清楚的阐释问题,我们还是从最基本的程序开始,在本博的第一篇文章中介绍了最基本的构建一个四边形的程序,现在我们对其进行稍作修改即可让其显示贴图: 1 package test 2 { 3 import com.adobe.utils.AGALMiniAssembler; 4 import com.adobe.utils.PerspectiveMatrix3D; 5 6 import flash.display.Bitmap; 7 import flash.display.Sprite; 8 ... 阅读全文
posted @ 2012-11-27 15:57 Joe Physwf 阅读(2658) 评论(2) 推荐(3) 编辑
摘要: 目前为止我们绘制的显示对象的颜色都还是没有考虑透明度的,为了给我们的显示对象增加透明度这一特性,我们需要深入了解透明度的本质。所谓的透明度并不是真实世界中的那种透明,真实世界中的透明是物体发射或者反射的光线透过了物体和我们之间的障碍物,从而我们能够看见障碍物另一侧的物体。但是计算机世界中一切的显示都是虚拟的,所以不存在光线透过的问题。计算机图形学中的透明度实际上是通过两者的颜色混合而得到的一种模拟,参见alpha混合。具体的原理这里不多做解释,但是需要强调几点:1.alpha混合的操作对象数量为2,需要明确区分两者,可以通俗的称他们为背景层与前景层,但在很多技术文档中,他们的名称更加晦涩,比如 阅读全文
posted @ 2012-11-22 13:16 Joe Physwf 阅读(1269) 评论(4) 推荐(1) 编辑