这几天在看控件类,临时没有想好实际运用的方向。单纯的创建网上已经有非常多这方面的样例,我就不写了。接下来是学习精灵类。精灵类若是单独学习也是非常easy。于是我加了一些有关动画方面的知识点与精灵类一起使用。让精灵播放简单的帧动画。
首先我们准备好动画素材,我在网上下了一个小游戏。将里面的素材做成了png和plist大图以供程序调用。我是用TexturePackerGUI来生成plist的。我选的是一个简单的待机动作,我们的目的就是让这张图动起来~
第一种方式:使用CCSpriteFrame
// 利用 CCTexture2D读取图片 CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("hero/hero_standby.png"); // 生成序列帧。CCRectMake的4个參数(x,y,width,height)分别代表取该图片中坐标为x,y宽高为width,height的图 // 以下读出4个图暂存在frame中 CCSpriteFrame *frame0 = CCSpriteFrame::createWithTexture(texture, CCRectMake(0, 114 * 0, 66, 114)); CCSpriteFrame *frame1 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25, 114 * 0, 66, 114)); CCSpriteFrame *frame2 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25*2, 114 * 0, 66, 114)); CCSpriteFrame *frame3 = CCSpriteFrame::createWithTexture(texture, CCRectMake(66.25 * 3, 114 * 0, 66, 114)); //以下这行代码是设置默认图片和初始位置,由于COCOS2dx须要默认原始的图片 CCSprite* sprite = CCSprite::createWithSpriteFrame(frame0); sprite->setPosition(ccp(size.width / 2, size.height / 2 +100)); addChild(sprite); //将5张读出来的图加到一个动画序列 CCArray *animFrames = new CCArray(4); animFrames->addObject(frame0); animFrames->addObject(frame1); animFrames->addObject(frame2); animFrames->addObject(frame3); //将5个动画帧生成CCAnimation对象 0.2f代表每一个之间的间隔时间 CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f); //最后依据动画模板创建动画 CCAnimate *animate = CCAnimate::create(animation); //给精灵设置之前创建好的动作 sprite->runAction(CCRepeatForever::create(animate));
另外一种方式:使用CCSpriteFrameCache类读取plist
//将你须要的图片做成plist,然后用CCSpriteFrameCache读取出来 CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("hero/hero_standby.plist", "hero/hero_standby.png"); //创建精灵并将读取出来的第一张图片作为默认图片 CCSprite* sprite1 = CCSprite::createWithSpriteFrame(cache->spriteFrameByName("20005_1.png")); sprite1->setPosition(ccp(size.width / 2, size.height / 2 - 100)); addChild(sprite1); //相同设置动画序列。这下面的步骤与第一种方式相同了 CCArray *animFrames1 = new CCArray(4); animFrames1->addObject(cache->spriteFrameByName("20005_1.png")); animFrames1->addObject(cache->spriteFrameByName("20005_3.png")); animFrames1->addObject(cache->spriteFrameByName("20005_5.png")); animFrames1->addObject(cache->spriteFrameByName("20005_7.png")); CCAnimation *animation1 = CCAnimation::createWithSpriteFrames(animFrames1, 0.2f); CCAnimate *animate1 = CCAnimate::create(animation1); sprite1->runAction(CCRepeatForever::create(animate1));
认真写过这两种方式而且理解之后就能发现,第一种方式有些蛋疼,须要自己找图片位置,我也不知道是不是还有其它更加便捷的方式,只是非常明显另外一种方式更加科学。不知道还有没其它更好的方法呢?知道的同学能够交流一下哦~
可能有人不知道plist是什么。详细我就不解释了。自己去查查,我仅仅说我们这里能用到的信息,里面记录了图片的名称和在大图中的位置,所以直接读取plist是很方便的。
做完这个样例还是有些小激动的。由于最终有点认为自己在做游戏了,嘿嘿。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
时间: 2024-10-11 11:43:53