为图层上的N多怪物创建站立时的动画
2013-10-19 14:29
363 查看
说在前面的话:
怪物在地图上的位置是不变的,但它们都有对应的原地站立时的动画。大家可能会对这些怪物分别创建动画。这样做没错,但是想想就觉得麻烦:如果有100种怪物的话,难道要定义100个动画模板吗?答案是否定的。可以参考下testcpp下的TMXReadWriteTest例子。
有DEMO下载。
看代码:
怪物在地图上的位置是不变的,但它们都有对应的原地站立时的动画。大家可能会对这些怪物分别创建动画。这样做没错,但是想想就觉得麻烦:如果有100种怪物的话,难道要定义100个动画模板吗?答案是否定的。可以参考下testcpp下的TMXReadWriteTest例子。
有DEMO下载。
看代码:
#pragma once #include "cocos2d.h" class Enemy : public cocos2d::CCObject { public: Enemy(void); ~Enemy(void); // 怪物在TileMap上的位置 cocos2d::CCPoint position; // 怪物初始的图块ID int startGid; };
class HelloWorld : public cocos2d::CCLayer { private: cocos2d::CCTMXTiledMap* m_pTiledMap; cocos2d::CCArray* m_pEnemyAry; cocos2d::CCTMXLayer* m_pEnemyLayer; private: void updateEnemyAnimation(float dt); public: HelloWorld() { m_pTiledMap = NULL; m_pEnemyAry = NULL; m_pEnemyLayer = NULL; } ~HelloWorld() { } // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommand to return the exactly class pointer static cocos2d::CCScene* scene(); // a selector callback void menuCloseCallback(CCObject* pSender); // implement the "static node()" method manually CREATE_FUNC(HelloWorld); }; #endif // __HELLOWORLD_SCENE_H__
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); m_pTiledMap = CCTMXTiledMap::create("map_01.tmx"); this->addChild(m_pTiledMap); m_pEnemyAry = CCArray::create(); m_pEnemyAry->retain(); m_pEnemyLayer = m_pTiledMap->layerNamed("enemy"); CCSize s = m_pEnemyLayer->getLayerSize(); for (int i = 0; i < s.width; i++) { for (int j = 0; j < s.height; j++) { // 位置对应的图块ID int gid = m_pEnemyLayer->tileGIDAt(ccp(i, j)); if (gid != 0) { Enemy* enemy = new Enemy(); if (enemy) enemy->autorelease(); else { CC_SAFE_DELETE(enemy); continue; } enemy->position = ccp(i, j); enemy->startGid = gid; m_pEnemyAry->addObject(enemy); } } } this->schedule(schedule_selector(HelloWorld::updateEnemyAnimation), 0.2F); bRet = true; } while (0); return bRet; }
// 更新图块位置的动画 void HelloWorld::updateEnemyAnimation(float dt) { CCObject* obj = NULL; Enemy* enemy = NULL; CCARRAY_FOREACH(m_pEnemyAry, obj) { enemy = (Enemy*) obj; if (enemy != NULL) { // 获取指定位置的图块ID int gid = m_pEnemyLayer->tileGIDAt(enemy->position); // 如果指定位置没有图块则执行下一次循环 if (gid == 0)continue; gid++; if ((gid - enemy->startGid) > 3) gid = enemy->startGid; // 在指定位置上设置新的图块ID m_pEnemyLayer->setTileGID(gid, enemy->position); } } }
相关文章推荐
- IOS7 隐藏状态栏 (电池栏)
- C#实现大数字的运算
- Codeforces Round #207 (Div. 2) A. Group of Students
- epoll()学习
- myeclipse配置tomcat
- iOS 设置UILabel的背景图片
- 21句经典语录
- 如何让菜单点击后不消失
- Cocos2d-x笔记(三)Sqlite数据库封装
- C# 执行bat批处理文件的小例子
- 系统安装提示Units specified don’t exist SHSUCDX can’t install现象的解决方法介
- mysql数据库的全量备份
- 一个程序员对职业生涯的思考和总结
- 递归倒序输出链表
- struts2 框架的使用注意事项
- exchange webservice访问类(日程新增和删除)
- 设计模式——装饰器(Decorator)
- Lucene 实例 IKAnalyzer中文分词器
- Windows8的JDK环境配置
- 视频质量,分辨率以及码率之间的关系