cocos2d控件(1)-使用URL创建的Sprite

前端之家收集整理的这篇文章主要介绍了cocos2d控件(1)-使用URL创建的Sprite前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 你可以使用图片名创建一个Sprite,可以使用预加载好的纹理创建一个Sprite,但是引擎没有提供一个使用url来创建Sprite方法
  2.  
  3. 在游戏中每次遇到需要从服务端获取一个玩家的头像url,然后通过这个url获取玩家头像并显示的时候,我就会想,如果能直接用url创建Sprite该多好。
  4. 需要显示配置在服务端的推广图片时。。。
  5. 需要显示配置在服务端的商品列表时。。。
  6.  
  7.  

  8.  
  9. 其实很早就想写这样一个控件了,只是一直想在其之上附加各种功能预加载 默认纹理? 使用本地缓存?等),导致自己一直想不明白要做什么,也就是需求不明确。今天终于沉下心来实现了一下这个URLSprite
  10. 需求

  11. 1.使用url创建Sprite
  12. 2.可以设置默认texture
  13. 3.下载好的资源保存在本地,并且可以指定文件
  14. 4.可以使用已下载好的本地资源
  15. 大致思路

  16. 1.URLSprite继承自Sprite
  17. 2.使用一个Texture2D指针保存默认纹理
  18. 3.使用cocos2d引擎提供的HttpClient来下载图片
  19. 4.使用FILE图片保存在本地
  20. 5.使用cocos2d引擎的FileUtils来查找本地资源
  21.  
  22.  

  23.  
  24. URLSprite

  25. 先来看看URLSprite的头文件
  26. 创建方式模仿了Cocos2d引擎的Sprite的二段构建方法,即重载不同的create方法,在create中去找对应的init方法,真正进行Sprite的初始化。
  27.  
  28. 然后使用了一个枚举来标志URLSprite的状态,在setDefaultTexture时,如果当前不是使用的url指定的图片,则显示默认纹理。
  29.  
  30. 另外还提供了refresh方法,以供控件的重用。
  31.  
  32. 上面代码比较简单,基本都有说明了,这里就不赘述了。
  33.  
  34. 下面把cpp文件也粘贴出来,懒得去看Github的童鞋可以用这个,但不保证此处是最新版本。
  35. 代码比较简单,也没有周详的去想每一个细节。例如如果url指向的不是一个可用的图片,而是一个mp3文件,要如何处理?写文件很慢要不要另外启动一个异步线程来做?
  36. 这些需要的时候再优化啦~
  37.  
  38.  

  39.  
  40. 如果小伙伴们发现有问题,或者有更好的实现方式,或者其他建议,欢迎联系噢~
  41.  
  42. 下一个UI就做个道具列表吧。

    查看原文:http://www.51xyyx.com/3176.html//
  43. // QFLURLSprite.hpp
  44. // MyTemplet
  45. //
  46. // Created by QuFangliu on 2017/1/4.
  47. // Copyright © 2017年 qufangliu. All rights reserved.
  48. //
  49. // 使用URL创建一个Sprite,可以设置默认texture,对象可以自动使用HttpClient来下载图片资源
  50.  
  51. #ifndef QFLURLSprite_hpp
  52. #define QFLURLSprite_hpp
  53.  
  54. #include <stdio.h>
  55. #include "cocos2d.h"
  56. #include "network/HttpClient.h"
  57.  
  58. /* QFLURLSprite的状态 */
  59. enum QFLURLSprite_State{
  60. URLSprite_State_NoTexture = 0,//无纹理
  61. URLSprite_State_Default = 1,//默认纹理
  62. URLSprite_State_Loaded = 2,//下载好的纹理(或者使用指定的本地文件
  63. };
  64.  
  65. /* URLSprite */
  66. class QFLURLSprite : public cocos2d::Sprite
  67. {
  68. CC_CONSTRUCTOR_ACCESS:
  69. QFLURLSprite();
  70. virtual ~QFLURLSprite();
  71.  
  72. public:
  73.  
  74. /* Create */
  75. static QFLURLSprite* create();
  76. static QFLURLSprite* create(const std::string &strURL);
  77. //指定(已)下载好的文件名,并且选择是否直接使用本地资源
  78. static QFLURLSprite* create(const std::string &strURL,const std::string &strFileName,bool bForceRefresh);
  79.  
  80. /* Init */
  81. virtual bool init();
  82. virtual bool initWithURL(const std::string &strURL);
  83. virtual bool initWithConfig(const std::string &strURL,bool bForceRefresh);
  84.  
  85. /* Refresh */
  86. void refresh(bool bShowDefault = false);
  87.  
  88. void loadImage();
  89. void loadImageCallback(cocos2d::network::HttpClient* pClient,cocos2d::network::HttpResponse* pResponse);
  90.  
  91. /* Default Texture */
  92. void setDefaultTexture(cocos2d::Texture2D* pTexture);
  93. cocos2d::Texture2D* getDefaultTexture() { return m_pDefaultTexture; }
  94.  
  95. /* Config */
  96. CC_SYNTHESIZE(std::string,m_strURL,SpriteURL); //图片的下载地址
  97. CC_SYNTHESIZE(std::string,m_strName,FileName); //下载好后或者指定的文件
  98. CC_SYNTHESIZE(bool,m_bForceRefresh,ForceRefresh); //是否强制刷新,false则找到本地文件就不刷新
  99.  
  100. private:
  101. /* tools */
  102. std::string getFileNameByURL(const std::string &strURL);
  103. std::string checkNativeFile(const std::string &strName);
  104.  
  105. cocos2d::Texture2D* m_pDefaultTexture; //默认纹理
  106. QFLURLSprite_State m_eState; //状态
  107. };
  108.  
  109. #endif /* QFLURLSprite_hpp *///
  110. // QFLURLSprite.cpp
  111. // MyTemplet
  112. //
  113. // Created by QuFangliu on 2017/1/4.
  114. // Copyright © 2017年 qufangliu. All rights reserved.
  115. //
  116.  
  117. #include "QFLURLSprite.hpp"
  118.  
  119. USING_NS_CC;
  120. using namespace network;
  121.  
  122. QFLURLSprite::QFLURLSprite()
  123. {
  124. m_strURL = "";
  125. m_strName = "";
  126. m_bForceRefresh = true;
  127. m_pDefaultTexture = nullptr;
  128. m_eState = QFLURLSprite_State::URLSprite_State_NoTexture;
  129. }
  130.  
  131. QFLURLSprite::~QFLURLSprite()
  132. {
  133.  
  134. }
  135.  
  136. QFLURLSprite* QFLURLSprite::create()
  137. {
  138. QFLURLSprite* pSprite = new (std::nothrow) QFLURLSprite();
  139.  
  140. if (pSprite && pSprite->init()) {
  141. pSprite->autorelease();
  142. return pSprite;
  143. }
  144. else {
  145. CC_SAFE_DELETE(pSprite);
  146. return nullptr;
  147. }
  148. }
  149.  
  150. QFLURLSprite* QFLURLSprite::create(const std::string &strURL)
  151. {
  152. QFLURLSprite* pSprite = new (std::nothrow) QFLURLSprite();
  153.  
  154. if (pSprite && pSprite->initWithURL(strURL)) {
  155. pSprite->autorelease();
  156. return pSprite;
  157. }
  158. else {
  159. CC_SAFE_DELETE(pSprite);
  160. return nullptr;
  161. }
  162. }
  163.  
  164. QFLURLSprite* QFLURLSprite::create(const std::string &strURL,const std::string &strFileName,bool bForceRefresh)
  165. {
  166. QFLURLSprite* pSprite = new (std::nothrow) QFLURLSprite();
  167.  
  168. if (pSprite && pSprite->initWithConfig(strURL,strFileName,bForceRefresh)) {
  169. pSprite->autorelease();
  170. return pSprite;
  171. }
  172. else {
  173. CC_SAFE_DELETE(pSprite);
  174. return nullptr;
  175. }
  176. }
  177.  
  178. bool QFLURLSprite::init()
  179. {
  180. if (Sprite::init()) {
  181. return true;
  182. }
  183. else {
  184. return false;
  185. }
  186. }
  187.  
  188. bool QFLURLSprite::initWithURL(const std::string &strURL)
  189. {
  190. if (Sprite::init()) {
  191. m_strURL = strURL;
  192. m_strName = this->getFileNameByURL(m_strURL);
  193.  
  194. //下载图片
  195. this->refresh();
  196. return true;
  197. }
  198. else {
  199. return false;
  200. }
  201. }
  202.  
  203. bool QFLURLSprite::initWithConfig(const std::string &strURL,bool bForceRefresh)
  204. {
  205. if (Sprite::init()) {
  206. m_strURL = strURL;
  207. m_strName = strFileName;
  208. m_bForceRefresh = bForceRefresh;
  209.  
  210. if (m_bForceRefresh) {
  211. this->refresh();
  212. }
  213. else {
  214. //查找纹理
  215. auto pTexture = Director::getInstance()->getTextureCache()->getTextureForKey(strFileName);
  216. if (pTexture) {
  217. m_eState = QFLURLSprite_State::URLSprite_State_Loaded;
  218. this->initWithTexture(pTexture);
  219. }
  220. else {
  221. //查找本地文件
  222. std::string strNative = this->checkNativeFile(m_strName);
  223. if (strNative != "") {
  224. m_eState = QFLURLSprite_State::URLSprite_State_Loaded;
  225. this->initWithFile(strNative);
  226. }
  227. else {
  228. //下载图片
  229. this->refresh();
  230. }
  231. }
  232. }
  233. return true;
  234. }
  235. else {
  236. return false;
  237. }
  238. }
  239.  
  240. //下载图片的逻辑
  241. void QFLURLSprite::refresh(bool bShowDefault)
  242. {
  243. if (bShowDefault && m_pDefaultTexture) {
  244. m_eState = QFLURLSprite_State::URLSprite_State_Default;
  245. this->setTexture(m_pDefaultTexture);
  246. }
  247. else {}
  248.  
  249. if (m_strURL.empty()) {
  250. CCLOG("Invalid url!");
  251. return;
  252. }
  253. else {}
  254.  
  255. if (m_strName.empty()) {
  256. m_strName = this->getFileNameByURL(m_strURL);
  257. }
  258. else {}
  259.  
  260. this->loadImage();
  261. }
  262.  
  263. void QFLURLSprite::loadImage()
  264. {
  265. HttpRequest* pRequest = new (std::nothrow) HttpRequest();
  266. if (pRequest) {
  267. pRequest->setUrl(m_strURL.c_str());
  268. pRequest->setRequestType(cocos2d::network::HttpRequest::Type::GET);
  269. pRequest->setTag("LoadImage");
  270. pRequest->setResponseCallback(CC_CALLBACK_2(QFLURLSprite::loadImageCallback,this));
  271.  
  272. HttpClient::getInstance()->send(pRequest);
  273.  
  274. pRequest->release();
  275.  
  276. //防止被删除
  277. CC_SAFE_RETAIN(this);
  278. }
  279. else {
  280. CC_SAFE_DELETE(pRequest);
  281. CCLOG("Can not create HttpRequest!");
  282. }
  283. }
  284.  
  285. void QFLURLSprite::loadImageCallback(cocos2d::network::HttpClient *pClient,cocos2d::network::HttpResponse *pResponse)
  286. {
  287. //和load对应
  288. CC_SAFE_RELEASE(this);
  289.  
  290. if (this->getReferenceCount() == 0) {
  291. return;
  292. }
  293. else {}
  294.  
  295. if (pResponse) {
  296. if (pResponse->isSucceed()) {
  297. //保存请求的图片数据
  298. std::vector<char>* pBuffer = pResponse->getResponseData();
  299. std::string strBuffer = std::string(pBuffer->begin(),pBuffer->end());
  300. std::string strPath = FileUtils::getInstance()->getWritablePath() + m_strName;
  301.  
  302. //图片保存到本地
  303. FILE *pFile = fopen(strPath.c_str(),"wb+");
  304. fwrite(strBuffer.c_str(),1,strBuffer.size(),pFile);
  305. fclose(pFile);
  306.  
  307. //使用下载的图片
  308. m_eState = QFLURLSprite_State::URLSprite_State_Loaded;
  309. this->setTexture(strPath);
  310. }
  311. else {
  312. CCLOG("Request error:%s",pResponse->getErrorBuffer());
  313. }
  314. }
  315. else {
  316. CCLOG("Request Failed!");
  317. }
  318. }
  319.  
  320. void QFLURLSprite::setDefaultTexture(cocos2d::Texture2D *pTexture)
  321. {
  322. m_pDefaultTexture = pTexture;
  323.  
  324. if (m_eState != QFLURLSprite_State::URLSprite_State_Loaded) {
  325. m_eState = QFLURLSprite_State::URLSprite_State_Default;
  326. this->initWithTexture(m_pDefaultTexture);
  327. }
  328. else {}
  329. }
  330.  
  331. std::string QFLURLSprite::getFileNameByURL(const std::string &strURL)
  332. {
  333. return strURL.substr(strURL.find_last_of("/") + 1);
  334. }
  335.  
  336. std::string QFLURLSprite::checkNativeFile(const std::string &strName)
  337. {
  338. std::string strPath = "";
  339.  
  340. //查找项目资源
  341. strPath = FileUtils::getInstance()->fullPathForFilename(strName);
  342. if (FileUtils::getInstance()->isFileExist(strPath)) {
  343. return strPath;
  344. }
  345. else {}
  346.  
  347. //查找读写路径下的资源
  348. strPath = FileUtils::getInstance()->getWritablePath() + strName;
  349. if (FileUtils::getInstance()->isFileExist(strPath)) {
  350. return strPath;
  351. }
  352. else {}
  353.  
  354. return "";
  355. }

猜你在找的Cocos2d-x相关文章