iOS-Cocos2d游戏开发】使用plist文件制作简单精灵_wanglang3081的博客-程序员宅基地

技术标签: Cocos2D 学习  action  游戏  interface  工作  ISO Game开发总结  layer  


分类: 【IOS-cocos2d-iphone】 34人阅读 评论(0) 收藏 举报

最近学cocos2d,看一般都用Zwoptex,但是这个软件要钱,所以用了一个在线版本的http://zwoptexapp.com/flashversion/基本功能也很好,需要注意的是,在最后导出png图片和plist文件时,一定要取相同的名字(切记啊切记),下面是素材



//=================================================================================


上代码:
@interface HelloWorldLayer :CCLayer

{

    CCSprite *_sprite;

    CCAction *_walkAction;

    CCAction *_moveAction;

 

}



@property(nonatomic,retain)CCSprite*sprite;

@property(nonatomic,retain)CCAction*walkAction;

@property(nonatomic,retain)CCAction*moveAction;


// returns a CCScene that contains the HelloWorldLayer as the onlychild

+(CCScene *) scene;


@end


#import "HelloWorldLayer.h"


// HelloWorldLayer implementation

@implementationHelloWorldLayer

@synthesizesprite=_sprite;

@synthesize moveAction =_moveAction;

@synthesize walkAction =_walkAction;


+(CCScene *) scene

{

// 'scene' is an autorelease object.

CCScene *scene = [CCScenenode];

 

// 'layer' is an autorelease object.

HelloWorldLayer*layer =[HelloWorldLayernode];

 

// add layer as a child to scene

[scene addChild: layer];

 

// return the scene

return scene;

}

-(id)init{

     

     if((self=[super init])){


        [[CCSpriteFrameCachesharedSpriteFrameCache]addSpriteFramesWithFile:

       @"AnimHero.plist"];//第1步

       CCSpriteBatchNode*spriteSheet =[CCSpriteBatchNode 

                                   batchNodeWithFile:@"AnimHero.png"];

       [selfaddChild:spriteSheet];//第2步

      NSMutableArray *walkAnimFrames =[NSMutableArrayarray];

      for(inti=1; i<=3; i++)

       {

          [walkAnimFramesaddObject:

           [[CCSpriteFrameCacheshared SpriteFrameCache]spriteFrameByName:

            [NSStringstringWithFormat:@"hero%i.png",i]]];

       } //第3步

                  

      CCAnimation*walkAnim = [CCAnimation 

                           animationWithFrames:walkAnimFramesdelay:0.1f];//第4步

       

      _sprite=[CCSprite spriteWithSpriteFrameName:@"hero1.png"];

    _sprite.position=ccp(240,160);

       self.walkAction=[CCRepeatForever actionWithAction:

                  [CCAnimateactionWithAnimation:walkAni restoreOriginalFrame:NO]];

       [_spriterunAction:_walkAction];        

    [spriteSheet addChild:_sprite]; //第5步 


     }

 

return self;

}

 

-(void) dealloc

{

   self.sprite=nil;

  self.moveAction=nil;

  self.walkAction=nil;

   [superdealloc];

}

@end


逐步解析:
第1步: 缓冲sprite帧和纹理。    [[CCSpriteFrameCache sharedSpriteFrameCacheaddSpriteFramesWithFile:

       @"AnimHero.plist"];


 

     首先,调用CCSpriteFrameCache的addSpriteFramesWithFile方法,然后把Zwoptex生成的plist文件当作参数传进去。这个方法做了以下几件事:1:寻找resource下和输入的参数名字一样但是后缀是.png的图片文件,然后把这个文件加入到共享的CCTextureCache中。就是AnimHero.png

   2:解析plist文件,追踪所有的sprite在spritesheet中的位置,内部使用CCSpriteFrame对象追踪这些信息。



第2步:创建一个精灵处理批节点。


CCSpriteBatchNode *spriteSheet= [CCSpriteBatchNode 

                                   batchNodeWithFile:@"AnimHero.png"];

       [self addChild:spriteSheet];



接下来,创建CCSpriteBatchNode对象,把spritesheet当作参数传进去,spritesheet工作原理:1:创建一个CCSpriteBatchNode对象,通过传递一个包含所有sprite的spritesheet的名字作为参数,并加入到当前场景中。2:在spritesheet中创建的任何一个sprite,都应该当作CCSpriteBatchNode的一个孩子加进去,只要sprite包含在sprite中,就ok了。3:CCSpriteBatchNode可以智能遍历所有的孩子节点。



第3步:收集帧列表。


NSMutableArray *walkAnimFrames =[NSMutableArray array];

       for(int i=1;i <=3;i++)

       {

          [walkAnimFrames addObject:

           [[CCSpriteFrameCache sharedSpriteFrameCachespriteFrameByName:

            [NSString stringWithFormat:@"hero%i.png",i]]];

       


  为了创建一系列的动画帧,我们简单地遍历我们的图片名字(它们是按照hero1.png-->hero3.png的方式命名的),然后使用共享的CCSpriteFrameCache来获得每一个动画帧。记住,它们已经在缓存里了,因为我们前面调用了addSpriteFramesWithFile方法。


第4步:创建对象动画

CCAnimation *walkAnim = [CCAnimation 

                            animationWithFrames:walkAnimFrames delay:0.1f]


接下来,我们通过传入sprite帧列表来创建一个CCAnimation对象,并且指定动画播放的速度。我们使用0.1来指定每个动画帧之间的时间间隔。

第5步:创建sprite并且让他run动画action


_sprite=[CCSprite spriteWithSpriteFrameName:@"hero1.png"];

    _sprite.position=ccp(240,160);

      self.walkAction =[CCRepeatForever actionWithAction:

                  [CCAnimate actionWithAnimation:walkAni restoreOriginalFrame:NO]];

       [_sprite runAction:_walkAction];        

    [spriteSheet addChild:_sprite];


我们首先通过spriteframe来创建一个sprite,并把它放在屏幕中间。然后,生成CCAnimationAction,并赋值给场景的walkAction属性,最后让熊来运行这个action。

  最后,我们把hero加个场景中--把它当作spritesheet的孩子加到spritesheet中去。注意,如果在这里我们没有把它加到spritsheet中,而是加到当前层里面的话。那么我们将得不到spritesheet为我们带来的性能提升!!




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wanglang3081/article/details/7637585

智能推荐

WIFI 认证表_专业开发者的博客-程序员宅基地

Test plan Test Program AP Mode Support STA Mode Support Test Requirement Note Wi-Fi CERTIFIED 802.11 a/b/g/n (1 role: STA or AP) Full Test 11a/b/g/n 11a/b/g/n DUT must support Sigma tool or other throughput test tool - ..

开源Xen是如何衰落的?_weixin_34272308的博客-程序员宅基地

原文地址:http://www.searchvirtual.com.cn/showcontent_60278.htm 开源Xen到底肿么了?   五年前,开源Xen通过其最新的半虚拟化技术震撼了数据中心用户。Xen的技术支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品。然而,现在开源Xen已经远远落后于其他hypervisor,如VMwa...

Warnsdorff‘s algorithm 完成骑兵游行(Knight tour)问题_doubiiii的博客-程序员宅基地

问题描述:在一个8x8(或者nxn)的棋盘上,一个骑兵(马)走日(对角)能否遍历整个棋盘。http://en.wikipedia.org/wiki/Knight%27s_tourWarnsdorff's algorithm: Heruistic剪枝,排除不需要的回溯路规则如下两条:1)我们可以从棋盘上任意一处开始移动2)我们每次移动到最近,最狭隘(周围没遍历过点最少)的点(be more greedy!)算法的基本结构:1.任意选取点P为棋盘上起点2.标记P...

js利用document.visibilityState 实现类似原生的onShow onHide事件的监听 以及 监听 切换标签页_大米绿豆的博客-程序员宅基地_js实现onshow

移动端嵌入的webview一直有一个困扰就是网页端没有onShow事件 这样有很多需求都不太好做; 其实早就有了一个事件来做这个事儿; 经过我测试 目前最新版本的ios14和安卓10 11 兼容性都没问题; 可以正常使用. 所以把这个方法记录一下 分享给还不知道的小伙伴; 具体的文档我放个地址 可以自行去查看 这里我简单放一个录像演示一下https://developer.mozilla.org/zh-CN/docs/Web/API/Document/visibilityState视频展示...

不同位宽赋值方法_ChlorineBlue的博客-程序员宅基地_verilog不同位宽赋值

问题: x, y, z 位宽为 8bit, c位宽为 4bit, a=1'b1; b=8'h12; 如果 c=~a; x=b+{~a}; y=b+~a; z=b+c; 则x, y, z用二进制数表示分别是多少?c = ~a = ~4'b0001 = 4'b1110b = 8'h12 = 8'd18 = 8'b 00000001x = b + {~a} = 8'b00010010 + 1'b0 = 8'b00010010 //由于{~a},所以先对a进行取反,再补充到8位相加y = ...

深读源码-java并发包总结篇_陌隋的博客-程序员宅基地

概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型或引用类型如果是基本类型,则替换其值,如果是引用,则替换其引用地址,这些类主要有:(1)AtomicBoolean原子更新布尔类型,内部使

随便推点

springcloud负载均衡中RestTemplate与@LoadBalanced_择业的博客-程序员宅基地

负载均衡对于一个系统架构来说非常重要,是必须要有的一个基础设施,它能够有效的缓解网络压力和流量扩容。我们知道的负载均衡可能分为两种,一种是硬件的负载均衡,比如F5服务器或者SLB负载设施;另外一种是软件负载均衡设施,比如我们耳熟能详的Nginx反向代理负载均衡、Lvs负载均衡、Haproxy负载均衡等等。但是只要是负载均衡服务都是能以类似的架构方式来构建。1.硬件方面负载均衡:F5服务器或者SLB负载设施2.软件级别负载均衡:Nginx反向代理负载均衡、Lvs负载均衡、Haproxy负载均衡等等。但

android URL 和 URI编程_pku_android的博客-程序员宅基地

作者:鲍先强涉及到网络编程时,很容易混淆的两个概念就是URL和URI,本文将会通过一个简单的程序,比较一下两者的区别,主要内容包括:1,URL。2,相对URI和绝对URI 。3,不透明的URI。4.一个演示两者区别的程序。 1.  URL: 通用资源定位器(Universal Resource Locator),按照RFC2396标准,URL对象用来定位网络里的

2022-01-24 五.Swagger API文档_不爱吃奶昔的博客-程序员宅基地_swagger的api文档

Swagger-API文档Swagger配置导包编写配置类配置类资源类yaml注解@[email protected]@[email protected]@[email protected]@ApiIgnoreswagger-ui3以下版本3及以上版本参考文章Swagger配置导包3.0.0以下版本maven导入依赖:&lt;!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagg

hdu 1248完全背包二维数组做法_昔拉天使的博客-程序员宅基地_完全背包二维数组

有几个注意点:k数量循环必须降序,jj金钱遍历必须从1或0开始code:#include &lt;iostream&gt;using namespace std;int c[4]={0,150,200,350};int w[4]={0,150,200,350};int main(int argc, char *argv[]){ int n; scanf("%d",&...

gulp 编译es6 探究_weixin_30340775的博客-程序员宅基地

1.gulp配置:var gulp = require('gulp')var fs = require("fs")var babelify = require('babelify')var browserify = require('browserify')var rename=require('gulp-rename')var uglifyjs = require('...

python绘制logistic曲线_Python使用matplotlib绘制Logistic曲线操作示例_罗让的博客-程序员宅基地

本文实例讲述了Python使用matplotlib绘制Logistic曲线操作。分享给大家供大家参考,具体如下:标准Logistic函数为:f(x) = 1 / ( 1 + exp(-x) )其导函数为:f'(x) = f(x) * ( 1 - f(x) )下面使用matplotlib绘制逻辑斯蒂函数及其导函数的曲线。Python代码:# -*- coding:utf-8 -*-#!python3...

推荐文章

热门文章

相关标签