在第一节中简单介绍了2d项目模板HelloWorld的基础代码,并做了一点小小的改变,像触摸接收、旋转、移动和颜色转变序列CCSequence的使用等等,2d本身封装好了很多方便使用的动作,只需要调用即可,那么这节就来了解更多的方法,并去熟悉我们学过的方法。
  • 单例:cocos2d很好的利用了单例设计模式,单例是在程序生命周期里只被实例化过一次的类,为了确保这一点,我们利用类的一个静态方法来生成和访问对象,就是我们已经见过的的以“shared”开头的方法,而不是用 alloc/init初始化方法。如OC中的UIApplication对象,我们只能通过sharedApplication来共享这个对象,而不是创建它,它是一个单例对象,只有一个,管理全局程序。cocos2d中有一些常用到的cocos2d 单例类,最常用的就是CCDirector(导演类):CCDirector* sharedDirector = [CCDirector sharedDirector];
  • 场景图:
            
在最上面,放置场景节点,在第一节说过,我们总是在场景中布置我们的层,在层中放入元素精灵,层直接跟精灵节点打交道,它可以接收触摸和加速计的输入。图层下直属有3个节点:玩家(PlayerSprite)、游戏得分(ScoreLabel)和游戏菜单(IngameMenu),但你会注意到PlayerSprite节点中有个子节点PlayerWeaponSprite(武器),它是附加在玩家身上的,如果PlayerSprite移动,旋转或放大缩小,PlayerWeaponSprite将会跟着做同样的事情而不需要额外的代码。这就是场景图的强大之处:你对一个节点施加的影响将会影响到它的所有子节点。
  • CCNode:一个最重要的类。

所有节点都有一个共同的父类:CCNode。它定义了所有节点都通用的属性和方法。

            
图中显示了我们最常用的类,只用这些类我们就可以制作出很有意思的游戏。

以下是一些处理子节点
的方法:

  1. 生成一个新的节点 :

    CCNode* childNode = [CCNode node];

  2. 将新节点添加为子节点:

    //新节点作为一个已有节点的子节点(如之前的武器节点附加在玩家节点上)
       [myNode addChild:childNode z:0
    tag:123];//z决定了节点的绘制顺序;tag标记该节点

  3. 获取子节点://"getChildByTag:"
    CCNode* retrievedNode = [myNode
    getChildByTag:123];

  4. 通过tag删除子节点;cleanup会停止任何运行中的动作: [myNode removeChildByTag:123 cleanup:YES];

  5. 通过节点指针删除节点:
    [myNode removeChild:retrievedNode];

  1. 删除一个节点的所有子节点:
    [myNode removeAllChildrenWithCleanup:YES];

  2. 从myNode的父节点删除myNode:
    [myNode removeFromParentAndCleanup:YES];

  • 动作(Actions):贯穿整个游戏的核心

节点都可以运行动作。我们会不断的接触到一个又一个动作,它总是带来新的视觉体验,丰富我们的游戏,让它看起来更完美。首先要了解一些基本的动作:移动、旋转和缩放:

  1. //闪烁动作
        CCAction* action =
    [CCBlink actionWithDuration:10
    blinks:20];

    action.tag = 234;

    //旋转动作

    CCRotateBy *rotateBy=[CCRotateBy actionWithDuration:20
    angle:360];

    //移动动作

    CCMoveTo *moveTo=[CCMoveTo actionWithDuration:3
    position:CGPoint(200,300)];

    //除了动作本身,还可以给动作添加效果,如:逐渐加速、无限重复

    1、重复-CCRepeatForever
    *repeat=[CCRepeatForever actionWithAction:myAction];

    2、逐渐加速-CCEaseInOut
    *ease=[CCEaseInOut actionWithAction:myAction];

    //也可以对某个节点施加一系列动作,使用动作序列让其按顺序执行

    CCSequence *sequence=[CCSequence
    actions:action1,action2,action3,nil];

    CCRepeatForever
    *repeat=[CCRepeatForever actionWithAction:sequence];

  2. 运行这个动作: [myNode runAction:action];

  3. 动作也可定义标记tag,然后用tag获取:
       CCAction* retrievedAction =
    [myNode getActionByTag:234];

  4. 你可以用tag或动作指针停止相关联的动作:

    [myNode stopActionByTag:234];[myNode
    stopAction:action];

你可以停止所有在此节点上运行的动作: [myNode stopAllActions];

  • 预定信息:类似于OC中的时间片,每隔一段时间就会调用一次方法,只不过开启时间片是在预定里:(个人理解......)

-(void)scheduleUpdates

{

[self schedule:@selector(myMethods)
interval:0.1f];//interval:时间间隔(秒)

}

使用selector时,最好开启报警设置Build->Undeclared
Selector打钩,保证方法选择正确。

停止某个指定的选择器[self unschedule:@selector(method)];

  • 场景CCScene

它一般都是在CCLayer对象里
通过+(id)scene这个静态方法来创建的。

+(id) scene

{

CCScene *scene = [CCScene node]; 
CCLayer* layer = [HelloWorld node]; 
[scene addChild:layer]; 
 return scene;
}

1)

第一个创建场景的地方是在AppDelegate中directorDidReshapeProjection中:[[CCDirector sharedDirector] runWithScene:[HelloWorld scene]];


2)在其它情况下,用replaceScene方法来替换已有的场景:


[[CCDirector sharedDirector] replaceScene:[HelloWorld scene]]; 3)还有另外两个方法:pushScene(推进场景)和popScene(弹出场景) 但是最好是对“一个”常用的场景采用这种方式,否则如果多个场景都这样推进弹出,最后可能忘记哪个推进了哪个弹出了,导致内存使用浪费。

  • 过渡效果CCTransitionScene :尽量不用,因为玩家不喜欢,耽误时间

简单介绍一下。所有过渡效果的类都继承自CCTransitionScene。

过渡效果只给场景转换代码 增加了一行代码而已。如:

CCFadeTransition *tran=[CCFadeTransition transitionWithDuration:1 scene:[myScene scene withColor:ccWHITE];//白色渐隐到myScene场景

别忘记了改变之前要转到myScene的原场景,这时要

[[CCDirector sharedDirector] replaceScene:tran];

ios游戏开发--cocos2d学习(2)的更多相关文章

  1. ios游戏开发--cocos2d学习(1)

    学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...

  2. ios游戏开发--cocos2d学习(3)

    ------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...

  3. 开发者经验谈:如何一天时间搞定iOS游戏开发?

    开发者经验谈:如何一天时间搞定iOS游戏开发? 在一天时间里将完成iPhone游戏开发由梦想变为现实? 本文作者给出了从创意转变成现实的详细答案.使用苹果原生游戏引擎SpriteKit,遵循一定的原则 ...

  4. ios游戏开发 Sprite Kit教程:初学者 1

    注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点 Sprite Kit vs Cocos2D-iPhone vs Cocos2D- ...

  5. CocosCreator游戏开发---菜鸟学习之路(一)

    PS(废话): 辞职后在家好久好久了,久到经济不允许了,接着就准备再次出去找工作了,然而工作哪有那么好找,特别是像我这种菜鸟.而且我还准备转行,准备去做游戏,技能等级接近于0,那工作就更难找了.既然如 ...

  6. cocos2d-x ios游戏开发初认识(六) 渲染的优化

    做程序开发肯定要考虑到内存的优化,毕竟iphone本身的内存就不是非常大.这一节主要说这个cocos2d开发对内存的优化,详细表如今,既能够对同样的精灵(图片)仅仅渲染一次,也能够对不能的精灵仅仅渲染 ...

  7. 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C

    blog.csdn.net/totogo2010/article/details/8205810  目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...

  8. cocos2d-x ios游戏开发初认识(九) 音效、粒子系统与存储

    我们知道.一个游戏少不了声音.一些好听的声音会提起你对游戏的兴趣,当然做好听的声音不是我们要学的,我们的目的是把声音在适当的时候放出来.顺便在这节中会说下简单的粒子系统和文件存储. 一.声音的播放: ...

  9. cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

    玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...

随机推荐

  1. lintcode:三数之和

    题目 三数之和 给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组. 样例 如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集 ...

  2. WP之Sql Server CE数据库

    如何在WP8中进行数据存储,你首先想到应该是独立存储,但是独立存储似乎存储文件更方便,如果我们希望像处理对象的形式,该怎么办呢,答案就是Sql Server CE. Sql Server CE并不是新 ...

  3. 1、探究java方法参数传递——引用传递?值传递!

    原创博文,转载请注明出处.谢谢~~ java程序运行时,其对象是怎么进行放置和安排的呢?内存是怎么分配的呢?理解好这个很有好处!java有5个地方可以存储数据: 1.寄存器.这是最快的存储区,位于处理 ...

  4. shell编程基础(4)case 与 function

    case case语句不用多说和c++里一样,用作选择,但是linux的case语句在语法上和c++还是有些不同的. ###########This is program test the Case# ...

  5. 12个目标跟踪方面的资料12 Tracking

    Goal Tracking Template - FEMA.gov Goal Tracking Template Set a weekly or biweekly deadline to report ...

  6. 从Uboot到Linux技术内幕

    1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware) ...

  7. BZOJ 1923 外星千足虫(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1923 题意:有n个数字,m次测试.每个数字为0或者1.每次测试选出一些数字出来把他们加起 ...

  8. HDU 4685 Prince and Princess(二分图+强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...

  9. 转:Cache相关

    声明:本文截取自http://blog.163.com/ac_victory/blog/static/1033187262010325113928577/ (1)“Cache”是什么 Cache(即高 ...

  10. git版本库底层命令

    当我们在使用git的时候,有时候需要知道当前文件夹相对于工作目录根目录的相对路径等等,那么我们可以使用 git rev-parse 添加一个参数就可以实现,如: 显示当前仓库版本库 .git 目录所在 ...