【cocos2d-x 手游研发小技巧(17)封装动画插件,序列帧 plist+png】

今天是2014年的最后一天  明天就是2015年了 今天给大家一点干活

我就直接上代码了

#ifndef __ENTITY_ACTION_H__

#define __ENTITY_ACTION_H__

#include "cocos2d.h"

#include "cocos-ext.h"

#include "game/entity/UISprite.h"

class EntityAction : public CCNode

{

public:

EntityAction(void);

~EntityAction(void);

virtual void update(F32 dt);//定时器

void PlistDownload(const C8* Plist,const C8 *Image,const C8 *SpriteName,float SequenceFrameTime = 0.2f,float SpritePositionX = 0.0f,float SpritePositionY = 0.0f);//第一个是plist     第二个  Image  第三个 int con 是数量

void RequestOnePlist(const char* url);

void RequestOneImage(const char* url);

void onPlistCompleted(cocos2d::CCNode* sender, void* data);

void onImageCompleted(cocos2d::CCNode* sender, void* data);

void WriteZipFileGeneralPlist( const char* pData ,int fileSize,const C8* zipPath);

void WriteZipFileGeneralImage( const char* pData ,int fileSize,const C8* zipPath);

void SequenceFrame();

private:

int nDownloadNumber;

stringc m_sPlistName;//plist的路劲

stringc m_sImageName;//Image的图片

stringc m_sSpriteName;

int m_nDownloadNum; //一个有多少

float m_fSpritePositionX;//x的位置

float m_fSpritePositionY;//y的位置

float m_fSequenceFrameTime;//时间

cocos2d::CCSpriteBatchNode *_actors;

cocos2d::CCSprite *_bear;

};

#endif

.cpp

#include "stdafx.h"

#include "EntityAction.h"

#include "network/jsonMsg/jsonMsgManager.h"

#include "cocos-ext.h"

#include "network/HttpRequest.h"

#include "io/io.h"

#include "game/FileManager.h"

#include "game/ai/timeManager.h"

#include "game/gamestate/GameStatePlay.h"

USING_NS_CC_EXT;

static HttpAdapter* httpAdapter;

static bool m_bPlistFlag;//Plist 是否下載完成

static bool m_bPngFlag;//PNG是否下載完成

EntityAction::EntityAction(void)

{

m_bPlistFlag = false;

m_bPngFlag = false;

m_fSpritePositionX = 0.0f;

m_fSpritePositionY = 0.0f;

m_fSequenceFrameTime = 0.0f;

}

EntityAction::~EntityAction(void)

{

unscheduleUpdate();

CCDirector::sharedDirector()->resume();

this->removeFromParentAndCleanup(true);

}

void EntityAction::update(F32 dt)//控制时间

{

//m_bPlistFlag

//CCLOG("%d",m_bPlistFlag);

if (m_bPlistFlag == true && m_bPngFlag == true)

{

m_bPlistFlag = false;

m_bPngFlag = false;

SequenceFrame();

}

}

//位置  多长

void EntityAction::SequenceFrame()

{

CCSpriteFrameCache *frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();

frameCache->addSpriteFramesWithFile(m_sPlistName.c_str());

int index = 1;

CCArray* pAnimFrames = CCArray::create();

CCSpriteFrame *pFrame = NULL;

do

{

char str[100] = {0};

sprintf(str, "%s_%d.png",m_sSpriteName.c_str(),index);

pFrame = frameCache->spriteFrameByName(str);

if (pFrame == NULL)

{

break;

}

pAnimFrames->addObject(pFrame);

index++;

} while (true);

CCAnimation *pAnimation = CCAnimation::createWithSpriteFrames(pAnimFrames, m_fSequenceFrameTime);

CCAnimate *pAnim = CCAnimate::create(pAnimation);

CCSprite *pGrossini = CCSprite::create();

pGrossini->setPosition(ccp(m_fSpritePositionX,m_fSpritePositionY));

this->addChild(pGrossini);

pGrossini->runAction(CCRepeatForever::create(pAnim));

}

void EntityAction::PlistDownload(const C8* Plist,const C8 *Image,const C8 *SpriteName,float SequenceFrameTime,float SpritePositionX,float SpritePositionY) //plist下载  这个是测试

{

m_sPlistName = Plist;

m_sImageName = Image;

m_sSpriteName = SpriteName;

m_fSpritePositionX = SpritePositionX;

m_fSpritePositionY = SpritePositionY;

m_fSequenceFrameTime = SequenceFrameTime;

//如果传过来的url为空  直接返回

if (strcmp(Plist,"") == 0 && strcmp(Image,"") == 0)

{

return ;

}

//判断是否为网络图片

if (strlen(Plist) > 4 && Plist[0] == ‘h‘ && Plist[1] == ‘t‘ && Plist[2] == ‘t‘ && Plist[3] == ‘p‘ && strlen(Image) > 4 && Image[0] == ‘h‘ && Image[1] == ‘t‘ && Image[2] == ‘t‘ && Image[3] == ‘p‘)

{

m_sPlistName = GameIns.GetJsonMsgMgr()->GetFullPictureNameByUrl(Plist);

//这个是返回文件路劲 大家一般不需要 可以不要

m_sImageName = GameIns.GetJsonMsgMgr()->GetFullPictureNameByUrl(Image);

}

CCSprite *m_pSprite = cocos2d::CCSprite::spriteWithFile(m_sImageName.c_str());

if (m_pSprite == NULL)

{

RequestOnePlist(Plist);//下载plist

RequestOneImage(Image);//下载图片

}

else

{

m_pSprite->removeFromParentAndCleanup(true);

m_bPlistFlag = true;

m_bPngFlag = true;

}

CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(this,0,false);

}

//下載 plist

void EntityAction::RequestOnePlist(const char* url)

{

if (httpAdapter == NULL)

{

httpAdapter = SYTX_NEW HttpAdapter();//SYTX_NEW new

}

CCHttpRequest *request = SYTX_NEW CCHttpRequest();

request->setUrl(url);

request->setRequestType(CCHttpRequest::kHttpGet);

request->setResponseCallback(httpAdapter, callfuncND_selector(EntityAction::onPlistCompleted));

request->setTag(url);

CCHttpClient::getInstance()->send(request);

request->release();

}

//下載 jpg

void EntityAction::RequestOneImage(const char* url)

{

if (httpAdapter == NULL)

{

httpAdapter = SYTX_NEW HttpAdapter();

}

CCHttpRequest *request = SYTX_NEW CCHttpRequest();

request->setUrl(url);

request->setRequestType(CCHttpRequest::kHttpGet);

request->setResponseCallback(httpAdapter, callfuncND_selector(EntityAction::onImageCompleted));

request->setTag(url);

CCHttpClient::getInstance()->send(request);

request->release();

}

//CCHttpRequest 回调方法

void EntityAction::onPlistCompleted(cocos2d::CCNode* sender, void* data)

{

stringc pszZipFilePath = cocos2d::CCFileUtils::sharedFileUtils()->getWriteablePath() + "ui_load";//路劲

cocos2d::CCFileUtils::sharedFileUtils()->createDirectory(pszZipFilePath.c_str());

CCHttpResponse *response = (CCHttpResponse*)data;

if (!response)

{

return;

}

char* szUrl;

stringc strImageName;

char szText[2048] = {0};

SPRINTF(szText, "%s", response->getHttpRequest()->getTag());

szUrl = szText;

strImageName = GameIns.GetJsonMsgMgr()->GetFullPictureNameByUrl(szUrl);

if (0 != strlen(response->getHttpRequest()->getTag()))

{

DBGPRINTLN("ui: %s image download successfully", response->getHttpRequest()->getTag());

}

S32 statusCode = response->getResponseCode();

C8 statusString[2048] = {};

SPRINTF(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());

DBGPRINTLN("response code: %d", statusCode);

const std::vector<C8> *buffer = response->getResponseData();

WriteZipFileGeneralPlist(&(*buffer)[0], buffer->size(),strImageName.c_str());

stringc UrlAddress =szUrl;//url 地址

if (UrlAddress.find_last_of("#") != -1)

{

stringc versionNumber=UrlAddress.substr(UrlAddress.find_last_of("#")+1);//版本号

GameIns.GetFileManager()->InsertOnePic(strImageName.c_str(), GameIns.GetTimeMgr()->GetDWLocalTime(), GameIns.GetTimeMgr()->GetDWLocalTime(), buffer->size(),versionNumber.c_str());

}

else

{

GameIns.GetFileManager()->InsertOnePic(strImageName.c_str(), GameIns.GetTimeMgr()->GetDWLocalTime(), GameIns.GetTimeMgr()->GetDWLocalTime(), buffer->size(),"0");

}

m_bPlistFlag = true;

CCLOG("----%d",m_bPlistFlag);

}

////CCHttpRequest 回调方法

void EntityAction::onImageCompleted(cocos2d::CCNode* sender, void* data)

{

stringc pszZipFilePath = cocos2d::CCFileUtils::sharedFileUtils()->getWriteablePath() + "ui_load";//路劲

cocos2d::CCFileUtils::sharedFileUtils()->createDirectory(pszZipFilePath.c_str());

CCHttpResponse *response = (CCHttpResponse*)data;

if (!response)

{

return;

}

char* szUrl;

stringc strImageName;

char szText[2048] = {0};

SPRINTF(szText, "%s", response->getHttpRequest()->getTag());

szUrl = szText;

strImageName = GameIns.GetJsonMsgMgr()->GetFullPictureNameByUrl(szUrl);

if (0 != strlen(response->getHttpRequest()->getTag()))

{

DBGPRINTLN("ui: %s image download successfully", response->getHttpRequest()->getTag());

}

S32 statusCode = response->getResponseCode();

C8 statusString[2048] = {};

SPRINTF(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());

DBGPRINTLN("response code: %d", statusCode);

const std::vector<C8> *buffer = response->getResponseData();

WriteZipFileGeneralImage (&(*buffer)[0], buffer->size(),strImageName.c_str());

stringc UrlAddress =szUrl;//url 地址

if (UrlAddress.find_last_of("#") != -1)

{

stringc versionNumber=UrlAddress.substr(UrlAddress.find_last_of("#")+1);//版本号

GameIns.GetFileManager()->InsertOnePic(strImageName.c_str(), GameIns.GetTimeMgr()->GetDWLocalTime(), GameIns.GetTimeMgr()->GetDWLocalTime(), buffer->size(),versionNumber.c_str());

}

else

{

GameIns.GetFileManager()->InsertOnePic(strImageName.c_str(), GameIns.GetTimeMgr()->GetDWLocalTime(), GameIns.GetTimeMgr()->GetDWLocalTime(), buffer->size(),"0");

}

m_bPngFlag = true;

CCLOG("----%d",m_bPngFlag);

}

//写plist图片

void EntityAction::WriteZipFileGeneralPlist( const char* pData ,int fileSize,const C8* zipPath)

{

stringc pszZipFilePath;

FILE* File = NULL;

#if ANDROID

pszZipFilePath = zipPath;

File = fopen(pszZipFilePath.c_str(), "wb+");

#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

pszZipFilePath = zipPath;

File = fopen(pszZipFilePath.c_str(), "wb+");

#else

pszZipFilePath = cocos2d::CCFileUtils::sharedFileUtils()->getWriteablePath() + zipPath;

IO_FOPEN(File, pszZipFilePath.c_str(), "wb+");

#endif

//ADD_FLOAT_MSG(pszZipFilePath.c_str());

if (File)

{

fwrite(pData, sizeof(U8), fileSize, File);

fflush(File);

fclose(File);

}

m_bPlistFlag = true;

CCLOG("--WriteZipFileGeneralPlist--%d",m_bPlistFlag);

}

//写Image图片

void EntityAction::WriteZipFileGeneralImage( const char* pData ,int fileSize,const C8* zipPath)

{

stringc pszZipFilePath;

FILE* File = NULL;

#if ANDROID

pszZipFilePath = zipPath;

File = fopen(pszZipFilePath.c_str(), "wb+");

#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

pszZipFilePath = zipPath;

File = fopen(pszZipFilePath.c_str(), "wb+");

#else

pszZipFilePath = cocos2d::CCFileUtils::sharedFileUtils()->getWriteablePath() + zipPath;

IO_FOPEN(File, pszZipFilePath.c_str(), "wb+");

#endif

//ADD_FLOAT_MSG(pszZipFilePath.c_str());

if (File)

{

fwrite(pData, sizeof(U8), fileSize, File);

fflush(File);

fclose(File);

}

m_bPngFlag = true;

CCLOG("--WriteZipFileGeneralImage--%d",m_bPngFlag);

}

代码下载

http://www.sundaboke.com/text/EntityAction.rar

时间: 2024-10-15 15:30:53

【cocos2d-x 手游研发小技巧(17)封装动画插件,序列帧 plist+png】的相关文章

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

手游外设,小旗捡了小米的漏吗?

15日,亿万米粉怀着激动的心情迎来了他们的节日,官方营销火力全开,小米note好,海报做地更好,还发布了小米小盒子,两日之后,包含多功能网关.人体感应器.门窗传感器.无线开关.门铃,支持WiFi.Zigbee协议的小米智能家庭套装亮相. 如今小米已把能做的.不能做到都做了,产品线覆盖智能手机.智能家居等多个领域,电视.机顶盒.路由器.手环.净化器.血压仪等等等等,就连插座和灯泡也不放过,可为何小米却漏掉了更具消费市场潜力的手游外设产品呢? 小米不做,就会有别人来抢着做,打着"如何让小米手机游戏体

编程小技巧之封装

自从面向对象开始,我们就学习抽象,继承,多态.等等.每一个都与封装 有着密不可分的关联. 那么在细节处如何做到封装,今天举几个小例说明. if-else的语句我们经常写.有时候很多地方都需要重复的去写.例如. <span style="font-family:KaiTi_GB2312;font-size:18px;"> if (flag) voice.Pause(); else voice.Resume(); </span> 别看简单.就是这举手投足间的细节才能

[转]手游研发数据专业术语科普 游戏热度跟啥有关

From : http://news.131.com/news/yejie/14/0603/1193340_1.html 对于移动游戏来说,不俗的下载量是一个好的开始,但作为一名游戏开发者,或一家游戏公司的投资人,你必须理解下载量之外的更多数据.本文所例举的指标,常被游戏公司用于衡量一款产品成功与否 玩家获取的相关指标 目前,一名新玩家的获取成本介于0.5-2.5美元之间.玩家获取成本的高低,与你选用了哪些获取玩家的渠道,以及游戏类型关系紧密.但从当前市场趋势来看,我们不难注意到,玩家获取成本正

一步之遥手游技能释放技巧 掌握要领效果翻倍

music.douban.com/doulist/35655882/music.douban.com/doulist/35655883/music.douban.com/doulist/35655884/music.douban.com/doulist/35655993/music.douban.com/doulist/35655995/music.douban.com/doulist/35656000/music.douban.com/doulist/35656121/music.douban

UWA发布 | 2017 Unity手游体检蓝皮书 — ARPG篇

报告目录: 一.ARPG手游总体性能开销分析 二.ARPG手游CPU模块性能开销分析 三.ARPG手游内存模块性能开销分析 四.ARPG手游资源管理分析 五.UWA对于ARPG手游研发团队的建议 一.ARPG手游总体性能开销分析 iOS设备的CPU性能普遍高于Android设备,Android设备的CPU均值主体范围为12.4~66.2 ms,iOS设备的CPU均值主体范围为7.0~57.5 ms. 我们选择了测评次数最多的四款机型来进行统计,这四款机型分别是红米2.红米Note2.华为6Plu

【转载】浅谈游戏开发之2D手游工具

浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK: 其它  全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯.独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.

新手2D手游该使用哪些工具

独立开发者:新手做2D手游该用哪些工具 随着全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,我们会走很多弯路,最近独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.以下是编译的博客内容: 一开始进入游戏研发领域的时候,你很难知道该选择什么工具.什么程序语言以及哪些框架,你会面临许许多多的选择和建议,我和我的团队总能发现其

IP成为手游双刃剑,运用得当方能百战百胜

在过去的一年中,手游将IP炒的是沸沸扬扬,各大手游厂商和大佬都纷纷表示,将在未来很长的一段时间内把IP作为自己家的重要方针,更有甚者通过重金买下IP版权,打算在IP上大行其道.不过这并没有错,因为IP年确实是到来了. IP年的到来,加速了手游研发和发行渠道的洗牌,一些中小厂商在没有充足资金的支持下,生存空间在不断被挤压.加上发行商的成长,渠道版权意识的增强,没有人愿意去冒险发行没有IP授权的IP游戏,这种情况下,中小心企业都只能押宝类似"三国""西游"等这些公开版的