Cocos2d-X的一个示例

来源:互联网 发布:上海万户网络 编辑:程序博客网 时间:2024/05/13 05:21

场景资源由Cocostudio示例项目导出.

#include "HelloWorldScene.h"#include "cocostudio/CocoStudio.h"#include "ui/CocosGUI.h"USING_NS_CC;Scene* HelloWorld::createScene(){    // 'scene' is an autorelease object    auto scene = Scene::create();        // 'layer' is an autorelease object    auto layer = HelloWorld::create();    // add layer as a child to scene    scene->addChild(layer);    // return the scene    return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){    if ( !Layer::init() )    {        return false;    }    // 初始化全局变量;m_fTime  = 0.0f;m_bStart = false;m_bDead  = false;m_fPercentage = 100.0f;m_fSpeed = 4.0f;m_fAttackDis  = 120.0f;m_pGameScene = cocostudio::SceneReader::getInstance()->createNodeWithSceneFile("publish/FightScene.json");this->addChild(m_pGameScene);// 获取英雄节点;auto render  = (cocostudio::ComRender *)(m_pGameScene->getChildByTag(10005)->getComponent("CCArmature"));// 将节点转换为Armature类型对象;auto pArmature  = (cocostudio::Armature *)(render->getNode());// 播放“run”动画;pArmature->getAnimation()->play("run");m_bStart = true;// 创建关闭菜单项;//auto closeItem = MenuItemFont::create("End", this, menu_selector(HelloWorld::menuCloseCallback));//closeItem->setColor(Color3B(255, 255, 255));auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));// 设置关闭菜单项的位置;auto visibleSize = Director::getInstance()->getVisibleSize();closeItem->setPosition(Vec2(visibleSize.width - closeItem->getContentSize().width/2, closeItem->getContentSize().height/2));// 添加菜单项;auto menu = Menu::create(closeItem, NULL);menu->setPosition(Vec2::ZERO);menu->setZOrder(4);this->addChild(menu);scheduleUpdate();return true; }void HelloWorld::menuCloseCallback(Ref* pSender){// 清理内存并退出游戏;cocostudio::ArmatureDataManager::getInstance()->purge();Director::getInstance()->getActionManager()->pauseAllRunningActions();cocostudio::GUIReader::getInstance()->purgeGUIReader();Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)exit(0);#endif}void HelloWorld::animationEvent(cocostudio::Armature *pArmature, cocostudio::MovementEventType movementType, const char *movementID){// 获取右侧的怪物节点;auto render = (cocostudio::ComRender *)(m_pGameScene->getChildByTag(10006)->getComponent("CCArmature"));// 转换为Armature类型对象;auto pEnemy = (cocostudio::Armature *)(render->getNode());// 如果是动画播放完成;if (movementType == cocostudio::MovementEventType::COMPLETE){// 怪物播放death动画;pEnemy->getAnimation()->play("death");// 给怪物添加事件监听;pArmature->getAnimation()->setMovementEventCallFunc(NULL, NULL);// 记录B的死亡;m_bDead = true;}}void HelloWorld::update(float delta){// 判断是否是第一次更新;if (m_bStart){// 获取英雄节点;auto pHeroRender = (cocostudio::ComRender *)(m_pGameScene->getChildByTag(10005)->getComponent("CCArmature"));auto pHero = (cocostudio::Armature *)(pHeroRender->getNode());// 给英雄设置坐标;pHero->getParent()->setPositionX(pHero->getParent()->getPositionX() + m_fSpeed);// 获取怪物节点;auto pEnemyRender = (cocostudio::ComRender *)(m_pGameScene->getChildByTag(10006)->getComponent("CCArmature"));auto pEnemy = (cocostudio::Armature *)(pEnemyRender->getNode());// 计算两个armature的间隔,如果小于预设值,则执行英雄的攻击动作;if (ccpDistance(ccp(pHero->getParent()->getPositionX(), 0), ccp(pEnemy->getParent()->getPositionX(), 0)) < m_fAttackDis){// 执行攻击动作;pHero->getAnimation()->play("attack");// 添加帧事件监听;pHero->getAnimation()->setMovementEventCallFunc(this, movementEvent_selector(HelloWorld::animationEvent));m_bStart = false;// 标记已经开始;}}// 判断B是否死亡;if (m_bDead){// 获取ui界面;auto pUIRender = static_cast<cocostudio::ComRender *>(m_pGameScene->getChildByTag(10007)->getComponent("GUIComponent"));auto pUILayer  = static_cast<cocos2d::ui::Widget *>(pUIRender->getNode());// 获取血条;auto pHPLoadingBar = static_cast<cocos2d::ui::LoadingBar *>(cocos2d::ui::Helper::seekWidgetByName(pUILayer, "hp02_LoadingBar"));// 获取魔法值;auto pMPLoadingBar = static_cast<cocos2d::ui::LoadingBar *>(cocos2d::ui::Helper::seekWidgetByName(pUILayer, "mp02_LoadingBar"));// 更新血条和魔法值;pHPLoadingBar->setPercent(m_fPercentage);pMPLoadingBar->setPercent(m_fPercentage);// 递减血量;m_fPercentage -= 2.0f;if (m_fPercentage < 0.0f){// 如果血条为空,注销掉帧刷新监听;unscheduleUpdate();}}}


0 0
原创粉丝点击