├── ActionTool.cpp ├── ActionTool.h ├── AppDelegate.cpp ├── AppDelegate.h ├── GameLayer.cpp ├── GameLayer.h ├── GameMap.cpp ├── GameMap.h ├── GateMapLayer.cpp ├── GateMapLayer.h ├── GlobalData.cpp ├── GlobalData.h ├── GlobalDefine.h ├── HelloWorldScene.cpp ├── HelloWorldScene.h ├── HelpLayer.cpp ├── HelpLayer.h ├── Hero.cpp ├── Hero.h ├── IconvString.cpp ├── IconvString.h ├── MijiLayer.cpp ├── MijiLayer.h ├── Monster.cpp ├── Monster.h ├── MonsterOne.cpp ├── MonsterOne.h ├── PauseLayer.cpp ├── PauseLayer.h ├── README.md ├── SelectGate.cpp ├── SelectGate.h ├── SetLayer.cpp ├── SetLayer.h ├── SplashLayer.cpp ├── SplashLayer.h ├── StartLayer.cpp ├── StartLayer.h ├── TujiLayer.cpp ├── TujiLayer.h ├── XMLParser.cpp ├── XMLParser.h └── 请先阅读我.rtf /ActionTool.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/ActionTool.cpp -------------------------------------------------------------------------------- /ActionTool.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/ActionTool.h -------------------------------------------------------------------------------- /AppDelegate.cpp: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "HelloWorldScene.h" 3 | #include "SplashLayer.h" 4 | 5 | USING_NS_CC; 6 | 7 | AppDelegate::AppDelegate() { 8 | 9 | } 10 | 11 | AppDelegate::~AppDelegate() 12 | { 13 | } 14 | 15 | bool AppDelegate::applicationDidFinishLaunching() { 16 | // initialize director 17 | auto director = Director::getInstance(); 18 | auto glview = director->getOpenGLView(); 19 | if(!glview) { 20 | glview = GLView::create("My Game"); 21 | glview->setFrameSize(1280, 720); 22 | director->setOpenGLView(glview); 23 | } 24 | 25 | // turn on display FPS 26 | director->setDisplayStats(false); 27 | 28 | // set FPS. the default value is 1.0/60 if you don't call this 29 | director->setAnimationInterval(1.0 / 60); 30 | 31 | // create a scene. it's an autorelease object 32 | auto scene = SplashLayer::createScene(); 33 | 34 | // run 35 | director->runWithScene(scene); 36 | 37 | return true; 38 | } 39 | 40 | // This function will be called when the app is inactive. When comes a phone call,it's be invoked too 41 | void AppDelegate::applicationDidEnterBackground() { 42 | Director::getInstance()->stopAnimation(); 43 | 44 | // if you use SimpleAudioEngine, it must be pause 45 | // SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); 46 | } 47 | 48 | // this function will be called when the app is active again 49 | void AppDelegate::applicationWillEnterForeground() { 50 | Director::getInstance()->startAnimation(); 51 | 52 | // if you use SimpleAudioEngine, it must resume here 53 | // SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); 54 | } 55 | -------------------------------------------------------------------------------- /AppDelegate.h: -------------------------------------------------------------------------------- 1 | #ifndef _APP_DELEGATE_H_ 2 | #define _APP_DELEGATE_H_ 3 | 4 | #include "cocos2d.h" 5 | 6 | /** 7 | @brief The cocos2d Application. 8 | 9 | The reason for implement as private inheritance is to hide some interface call by Director. 10 | */ 11 | class AppDelegate : private cocos2d::Application 12 | { 13 | public: 14 | AppDelegate(); 15 | virtual ~AppDelegate(); 16 | 17 | /** 18 | @brief Implement Director and Scene init code here. 19 | @return true Initialize success, app continue. 20 | @return false Initialize failed, app terminate. 21 | */ 22 | virtual bool applicationDidFinishLaunching(); 23 | 24 | /** 25 | @brief The function be called when the application enter background 26 | @param the pointer of the application 27 | */ 28 | virtual void applicationDidEnterBackground(); 29 | 30 | /** 31 | @brief The function be called when the application enter foreground 32 | @param the pointer of the application 33 | */ 34 | virtual void applicationWillEnterForeground(); 35 | }; 36 | 37 | #endif // _APP_DELEGATE_H_ 38 | 39 | -------------------------------------------------------------------------------- /GameLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class GameLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 六月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | #include "GameLayer.h" 22 | #include "GameMap.h" 23 | #include "Hero.h" 24 | #include "Monster.h" 25 | #include "PauseLayer.h" 26 | #include "GateMapLayer.h" 27 | #include "MonsterOne.h" 28 | #include "extensions/cocos-ext.h" 29 | #include "cocostudio/CocoStudio.h" 30 | 31 | USING_NS_CC; 32 | using namespace CocosDenshion; 33 | using namespace cocos2d::extension; //引用cocos2d::extension命名空间 34 | 35 | Scene* GameLayer::createScene() 36 | { 37 | Scene* scene = Scene::create(); 38 | GameLayer* layer = GameLayer::create(); 39 | scene->addChild(layer); 40 | 41 | return scene; 42 | } 43 | 44 | bool GameLayer::init() 45 | { 46 | if (!Layer::init()) 47 | { 48 | return false; 49 | } 50 | 51 | if (getBoolFromXML(MUSIC_KEY)) 52 | { 53 | float music = getFloatFromXML(MUSICVOL)*100.0f; 54 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 55 | if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) 56 | { 57 | aduioEngine->pauseBackgroundMusic(); 58 | aduioEngine->playBackgroundMusic("Sound/gameBGM.wav", true); 59 | } 60 | else 61 | aduioEngine->playBackgroundMusic("Sound/gameBGM.wav", true); 62 | } 63 | else 64 | aduioEngine->pauseBackgroundMusic(); 65 | 66 | velocity = 10.0f; 67 | m_bDirection = false; 68 | m_bRun = false; 69 | m_bJump = false; 70 | 71 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapBefore.plist"); 72 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapRoad.plist"); 73 | 74 | String *bgName = String::createWithFormat("bgmap%d.png", m_iSelectGate); 75 | String *midName = String::createWithFormat("MapMiddle%d.png", m_iSelectGate); 76 | String *groundName = String::createWithFormat("MapGround%d.png", m_iSelectGate); 77 | String *beforeName = String::createWithFormat("MapBefore%d.png", m_iSelectGate); 78 | String *comoboName = String::createWithFormat("comboBtn%d.png", m_iSelectGate); 79 | 80 | auto bgPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(bgName->getCString())); 81 | bgPic->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 82 | this->addChild(bgPic, 0); 83 | myMap = GameMap::create(); 84 | myMap->InitMap(midName->getCString(), groundName->getCString(), beforeName->getCString()); 85 | this->addChild(myMap, 1); 86 | 87 | // 界面控制键初始化 88 | // 技能键 89 | auto m_pFistBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("fist.png")); 90 | auto m_pFistBtn = ControlButton::create(m_pFistBG); 91 | m_pFistBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("fist.png"))->getContentSize()); 92 | 93 | auto m_pFootBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("foot.png")); 94 | auto m_pFootBtn = ControlButton::create(m_pFootBG); 95 | m_pFootBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("foot.png"))->getContentSize()); 96 | 97 | auto m_pJumpBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("jump.png")); 98 | auto m_pJumpBtn = ControlButton::create(m_pJumpBG); 99 | m_pJumpBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("jump.png"))->getContentSize()); 100 | 101 | auto m_pComboBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(comoboName->getCString())); 102 | m_pComboBtn = ControlButton::create(m_pComboBG); 103 | m_pComboBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(comoboName->getCString()))->getContentSize()); 104 | 105 | // 按键背景 106 | auto m_pFistPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("quan.png")); 107 | auto m_pFootPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("jiao.png")); 108 | auto m_pJumpPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tiao.png")); 109 | m_pComboPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tiao.png")); 110 | 111 | auto m_pFistPicSize = m_pFistPic->getContentSize(); 112 | m_pFistBtn->setPosition(ccp(m_pFistPicSize.width / 2, m_pFistPicSize.height / 2)); 113 | m_pFistBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::fistAttack), Control::EventType::TOUCH_UP_INSIDE); 114 | 115 | auto m_pFootPicSize = m_pFootPic->getContentSize(); 116 | m_pFootBtn->setPosition(ccp(m_pFootPicSize.width / 2, m_pFootPicSize.height / 2)); 117 | m_pFootBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::footAttack), Control::EventType::TOUCH_UP_INSIDE); 118 | 119 | auto m_pJumpPicSize = m_pJumpPic->getContentSize(); 120 | m_pJumpBtn->setPosition(ccp(m_pJumpPicSize.width / 2.0 - 1.5, m_pJumpPicSize.height / 2)); 121 | m_pJumpBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::jump), Control::EventType::TOUCH_UP_INSIDE); 122 | 123 | auto m_pComboPicSize = m_pComboPic->getContentSize(); 124 | m_pComboBtn->setPosition(ccp(m_pComboPicSize.width / 2 - 1.5, m_pComboPicSize.height / 2)); 125 | m_pComboBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::comboAttack), Control::EventType::TOUCH_UP_INSIDE); 126 | 127 | m_pFistPic->addChild(m_pFistBtn, 1); 128 | m_pFootPic->addChild(m_pFootBtn, 1); 129 | m_pJumpPic->addChild(m_pJumpBtn, 1); 130 | m_pComboPic->addChild(m_pComboBtn, 1); 131 | 132 | m_pFistPic->setPosition(WINSIZE.width - 230, 76); 133 | m_pFootPic->setPosition(WINSIZE.width - 73, 76); 134 | m_pJumpPic->setPosition(WINSIZE.width - 60, 220); 135 | m_pComboPic->setPosition(WINSIZE.width - 387, 76); 136 | 137 | m_pComboPic->setVisible(false); 138 | 139 | 140 | this->addChild(m_pFistPic, 1); 141 | this->addChild(m_pFootPic, 1); 142 | this->addChild(m_pJumpPic, 1); 143 | this->addChild(m_pComboPic, 1); 144 | 145 | // 行走控制键,暂停键 146 | auto puaseGameItem = MenuItemSprite::create( 147 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("pauseNormal.png")), 148 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("pauseSelected.png")), 149 | CC_CALLBACK_1(GameLayer::gamePause, this)); // Pause 150 | 151 | auto backwardBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directionNormal.png")); 152 | auto backwardSelBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directionSelected.png")); 153 | auto backwardBtn = ControlButton::create(backwardBG); 154 | backwardBtn->setBackgroundSpriteForState(backwardSelBG, Control::State::HIGH_LIGHTED); 155 | backwardBtn->setZoomOnTouchDown(false); 156 | backwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::backward), Control::EventType::TOUCH_DOWN); 157 | backwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::backward), Control::EventType::TOUCH_UP_INSIDE); 158 | backwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::backward), Control::EventType::DRAG_OUTSIDE); 159 | backwardBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directionNormal.png"))->getContentSize()); 160 | 161 | auto forwardBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directForNor.png")); 162 | auto forwardSelBG = Scale9Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directForSel.png")); 163 | auto forwardBtn = ControlButton::create(forwardBG); 164 | forwardBtn->setBackgroundSpriteForState(forwardSelBG, Control::State::HIGH_LIGHTED); 165 | forwardBtn->setZoomOnTouchDown(false); 166 | forwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::forward), Control::EventType::TOUCH_DOWN); 167 | forwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::forward), Control::EventType::TOUCH_UP_INSIDE); 168 | forwardBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(GameLayer::forward), Control::EventType::DRAG_OUTSIDE); 169 | forwardBtn->setPreferredSize(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("directForNor.png"))->getContentSize()); 170 | 171 | puaseGameItem->setPosition(WINSIZE.width - 50, WINSIZE.height - 48); 172 | backwardBtn->setPosition(117, 70); 173 | forwardBtn->setPosition(304, 70); 174 | 175 | auto menuWalk = Menu::create(puaseGameItem, NULL); 176 | menuWalk->setPosition(Point::ZERO); 177 | this->addChild(backwardBtn, 1); 178 | this->addChild(forwardBtn, 1); 179 | this->addChild(menuWalk, 1); 180 | 181 | // 状态条 182 | m_pBG = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("barGround.png")); 183 | 184 | m_pHPBar = ProgressTimer::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("HPBar.png"))); 185 | m_pHPBar->setType(ProgressTimer::Type::BAR); 186 | m_pHPBar->setMidpoint(ccp(0, 0.5)); 187 | m_pHPBar->setBarChangeRate(ccp(1, 0)); 188 | m_pHPBar->setPercentage(100); 189 | 190 | m_pMPBar = ProgressTimer::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("MPBar.png"))); 191 | m_pMPBar->setType(ProgressTimer::Type::BAR); 192 | m_pMPBar->setMidpoint(ccp(0, 0.5)); 193 | m_pMPBar->setBarChangeRate(ccp(1, 0)); 194 | m_pMPBar->setPercentage(0); 195 | 196 | m_pHPBar->setPosition(240, 45); 197 | m_pMPBar->setPosition(226, 30); 198 | 199 | m_pBG->addChild(m_pHPBar); 200 | m_pBG->addChild(m_pMPBar); 201 | 202 | m_pBG->setPosition(260, WINSIZE.height - 60); 203 | 204 | this->addChild(m_pBG, 1); 205 | 206 | // 英雄 207 | m_pHero = Hero::create(); 208 | m_pHero->InitHeroSprite("idle.png", 1); 209 | m_pHero->setPosition(100, 360); 210 | this->addChild(m_pHero, 3); 211 | 212 | 213 | MonsterOne *monster = MonsterOne::createWithMapAndHero(myMap, m_pHero); 214 | 215 | this->scheduleUpdate(); 216 | return true; 217 | } 218 | 219 | // 拳击 220 | void GameLayer::fistAttack(Ref* pSender, Control::EventType type) 221 | { 222 | if (m_pHero->IsRunning || m_pHero->IsAttack || m_pHero->IsHurt || m_pHero->m_bIsJumping) 223 | { 224 | return; 225 | } 226 | PLAYEFFECT; 227 | m_pHero->AttackAnimation("fist", 0.1f, m_bDirection); 228 | } 229 | 230 | // 腿击 231 | void GameLayer::footAttack(Ref* psender, Control::EventType type) 232 | { 233 | if (m_pHero->IsRunning || m_pHero->IsAttack || m_pHero->IsHurt || m_pHero->m_bIsJumping) 234 | { 235 | return; 236 | } 237 | PLAYEFFECT; 238 | m_pHero->AttackAnimation("leg", 0.1f, m_bDirection); 239 | } 240 | 241 | // 242 | void GameLayer::jump(Ref* pSender, Control::EventType type) 243 | { 244 | 245 | if (m_pHero->IsRunning || m_pHero->IsAttack || m_pHero->IsHurt || m_bJump) 246 | { 247 | return; 248 | } 249 | 250 | if (getBoolFromXML(SOUND_KEY)) 251 | { 252 | aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL)); 253 | aduioEngine->playEffect("Sound/Jump.wav"); 254 | } 255 | 256 | m_bJump = true; 257 | } 258 | 259 | void GameLayer::comboAttack(Ref* pSender, Control::EventType type) 260 | { 261 | if (m_pHero->IsAttack || m_pHero->m_bIsJumping == true || m_pHero->m_bCanCrazy) 262 | { 263 | return; 264 | } 265 | if (getBoolFromXML(SOUND_KEY)) 266 | { 267 | aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL)); 268 | aduioEngine->playEffect("Sound/combo.wav"); 269 | } 270 | m_pHero->m_bCanCrazy = true; 271 | switch (m_iSelectGate) 272 | { 273 | case 1: 274 | m_pHero->AttackAnimation("combo", 0.1, m_bDirection); 275 | break; 276 | case 2: 277 | m_pHero->AttackAnimation("bakandao", 0.1, m_bDirection); 278 | break; 279 | case 3: 280 | m_pHero->AttackAnimation("gun", 0.1, m_bDirection); 281 | break; 282 | default: 283 | break; 284 | } 285 | } 286 | 287 | 288 | 289 | void GameLayer::gamePause(Ref* pSender) 290 | { 291 | //可以直接使用pause方法暂停当前的场景,但是这样做有一个bug,就是不能够屏蔽触摸事件,所以采用截图的方法 292 | //Director::getInstance()->pause(); 293 | 294 | /*截取当前场景的图片并且保存*/ 295 | 296 | auto size = Director::getInstance()->getWinSize(); 297 | //RenderTexture是一个纹理渲染类,我们需要把要渲染的当前场景放进去,这是初始化它的大小 298 | render = RenderTexture::create(size.width, size.height); 299 | //开始获取内容 300 | render->begin(); 301 | //是用节点的visit方法加入到渲染中 302 | Director::getInstance()->getRunningScene()->visit(); 303 | //结束 304 | render->end(); 305 | render->retain(); 306 | 307 | //3.0 截屏需要在截完屏的下一帧才能处理RenderTexture,这点要注意 308 | auto _schedule = this->getScheduler(); 309 | auto replaceScene = [&](float tm) 310 | { 311 | //最后切换场景 312 | Director::getInstance()->pushScene(PauseLayer::createScene(render)); 313 | }; 314 | _schedule->schedule(replaceScene, this, 0.0f, 0, 0.0f, false, "screenshot"); 315 | } 316 | 317 | 318 | void GameLayer::backward(Ref* pSender, Control::EventType type) 319 | { 320 | if (m_pHero->IsAttack && m_pHero->m_bIsJumping == true) 321 | { 322 | return; 323 | } 324 | switch (type) 325 | { 326 | case cocos2d::extension::Control::EventType::TOUCH_DOWN: 327 | m_bRun = true; 328 | m_bDirection = true; 329 | break; 330 | case cocos2d::extension::Control::EventType::DRAG_INSIDE: 331 | break; 332 | case cocos2d::extension::Control::EventType::DRAG_OUTSIDE: 333 | m_bRun = false; 334 | m_pHero->StopAnimation(); 335 | break; 336 | case cocos2d::extension::Control::EventType::DRAG_ENTER: 337 | break; 338 | case cocos2d::extension::Control::EventType::DRAG_EXIT: 339 | break; 340 | case cocos2d::extension::Control::EventType::TOUCH_UP_INSIDE: 341 | m_bRun = false; 342 | m_pHero->StopAnimation(); 343 | break; 344 | case cocos2d::extension::Control::EventType::TOUCH_UP_OUTSIDE: 345 | break; 346 | case cocos2d::extension::Control::EventType::TOUCH_CANCEL: 347 | break; 348 | case cocos2d::extension::Control::EventType::VALUE_CHANGED: 349 | break; 350 | default: 351 | break; 352 | } 353 | } 354 | 355 | void GameLayer::forward(Ref* pSender, Control::EventType type) 356 | { 357 | if (m_pHero->IsAttack && m_pHero->m_bIsJumping == true) 358 | { 359 | return; 360 | } 361 | switch (type) 362 | { 363 | case cocos2d::extension::Control::EventType::TOUCH_DOWN: 364 | m_bRun = true; 365 | m_bDirection = false; 366 | break; 367 | case cocos2d::extension::Control::EventType::DRAG_INSIDE: 368 | break; 369 | case cocos2d::extension::Control::EventType::DRAG_OUTSIDE: 370 | m_bRun = false; 371 | m_pHero->StopAnimation(); 372 | break; 373 | case cocos2d::extension::Control::EventType::DRAG_ENTER: 374 | break; 375 | case cocos2d::extension::Control::EventType::DRAG_EXIT: 376 | break; 377 | case cocos2d::extension::Control::EventType::TOUCH_UP_INSIDE: 378 | m_bRun = false; 379 | m_pHero->StopAnimation(); 380 | break; 381 | case cocos2d::extension::Control::EventType::TOUCH_UP_OUTSIDE: 382 | break; 383 | case cocos2d::extension::Control::EventType::TOUCH_CANCEL: 384 | break; 385 | case cocos2d::extension::Control::EventType::VALUE_CHANGED: 386 | break; 387 | default: 388 | break; 389 | } 390 | } 391 | 392 | void GameLayer::gameOver(float delta) 393 | { 394 | // 对声音的处理 395 | if (getBoolFromXML(MUSIC_KEY)) 396 | { 397 | float music = getFloatFromXML(MUSICVOL)*100.0f; 398 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 399 | if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) 400 | { 401 | aduioEngine->pauseBackgroundMusic(); 402 | aduioEngine->playBackgroundMusic("Sound/failure.wav", true); 403 | } 404 | else 405 | aduioEngine->playBackgroundMusic("Sound/failure.wav", true); 406 | } 407 | else 408 | aduioEngine->pauseBackgroundMusic(); 409 | // 弹出游戏失败的界面 410 | auto bgSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("heiping.png")); 411 | bgSprite->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 412 | this->addChild(bgSprite, 5); 413 | auto bgTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgTitle.png")); 414 | bgTitle->setPosition(WINSIZE.width / 2 + 23, WINSIZE.height / 2 + 17); 415 | auto faliureTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("faliure.png")); 416 | faliureTitle->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 + 227); 417 | auto energyTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tili.png")); 418 | energyTitle->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 23); 419 | auto tips = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tipsNext.png")); 420 | tips->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 227); 421 | 422 | auto m_pEnergyLabel = LabelTTF::create("- 1", "", 45); 423 | m_pEnergyLabel->setColor(ccc3(0, 255, 255)); 424 | m_pEnergyLabel->setPosition(300, 60); 425 | 426 | bgSprite->addChild(bgTitle); 427 | bgSprite->addChild(faliureTitle); 428 | bgSprite->addChild(energyTitle); 429 | bgSprite->addChild(tips); 430 | 431 | // 获取事件分发器 432 | auto dispatcher = Director::getInstance()->getEventDispatcher(); 433 | // 触摸监听器 434 | auto listener = EventListenerTouchOneByOne::create(); 435 | listener->onTouchBegan = [](Touch* touch, Event* event){return true; }; 436 | listener->onTouchMoved = [](Touch* touch, Event* event){}; 437 | listener->onTouchEnded = [](Touch* touch, Event* event){ 438 | Director::getInstance()->replaceScene(GateMapLayer::createScene()); 439 | }; 440 | listener->setSwallowTouches(true); 441 | dispatcher->addEventListenerWithSceneGraphPriority(listener, bgSprite); 442 | } 443 | 444 | void GameLayer::gameVictory(float delta) 445 | { 446 | // 对声音的处理 447 | if (getBoolFromXML(MUSIC_KEY)) 448 | { 449 | float music = getFloatFromXML(MUSICVOL)*100.0f; 450 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 451 | if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) 452 | { 453 | aduioEngine->pauseBackgroundMusic(); 454 | aduioEngine->playBackgroundMusic("Sound/victory.wav", true); 455 | } 456 | else 457 | aduioEngine->playBackgroundMusic("Sound/victory.wav", true); 458 | } 459 | else 460 | aduioEngine->pauseBackgroundMusic(); 461 | 462 | if (m_iSelectGate == 1) 463 | { 464 | setBoolToXML(GATEONE, true); 465 | } 466 | else if (m_iSelectGate == 2) 467 | { 468 | setBoolToXML(GATETWO, true); 469 | } 470 | else 471 | setBoolToXML(GATETHREE, true); 472 | 473 | // 弹出游戏胜利的界面 474 | auto bgSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("heiping.png")); 475 | bgSprite->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 476 | this->addChild(bgSprite, 5); 477 | auto bgTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgTitle.png")); 478 | bgTitle->setPosition(WINSIZE.width / 2 + 23, WINSIZE.height / 2 + 17); 479 | auto victoryTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("victory.png")); 480 | victoryTitle->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 + 227); 481 | auto energyTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tili.png")); 482 | energyTitle->setPosition(WINSIZE.width / 2 + 116, WINSIZE.height / 2 - 23); 483 | auto moneyTitle = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("jinbi.png")); 484 | moneyTitle->setPosition(WINSIZE.width / 2 - 275, WINSIZE.height / 2 - 27); 485 | auto tips = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tipsNext.png")); 486 | tips->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 227); 487 | bgSprite->addChild(bgTitle); 488 | bgSprite->addChild(victoryTitle); 489 | bgSprite->addChild(energyTitle); 490 | bgSprite->addChild(moneyTitle); 491 | bgSprite->addChild(tips); 492 | 493 | // 获取事件分发器 494 | auto dispatcher = Director::getInstance()->getEventDispatcher(); 495 | // 触摸监听器 496 | auto listener = EventListenerTouchOneByOne::create(); 497 | listener->onTouchBegan = [](Touch* touch, Event* event){return true; }; 498 | listener->onTouchMoved = [](Touch* touch, Event* event){}; 499 | listener->onTouchEnded = [](Touch* touch, Event* event){ 500 | Director::getInstance()->replaceScene(GateMapLayer::createScene()); 501 | }; 502 | listener->setSwallowTouches(true); 503 | dispatcher->addEventListenerWithSceneGraphPriority(listener, bgSprite); 504 | } 505 | 506 | bool GameLayer::isAttackMonster(Hero * hero, Monster* monster) 507 | { 508 | bool hero_dire = hero->HeroDirecton; 509 | bool monster_dire = monster->MonsterDirecton; 510 | float hero_x = hero->getPositionX(); 511 | float monster_x = monster->getPositionX() + myMap->getPositionX(); 512 | if (hero_dire) 513 | { 514 | if (monster_x <= hero_x) 515 | { 516 | return true; 517 | } 518 | } 519 | else 520 | { 521 | if (monster_x >= hero_x) 522 | { 523 | return true; 524 | } 525 | } 526 | 527 | return false; 528 | } 529 | 530 | float GameLayer::getVelocity() 531 | { 532 | velocity = velocity - 0.3f; 533 | return velocity; 534 | } 535 | 536 | void GameLayer::update(float delta) 537 | { 538 | // 人物跳起 539 | if (m_bJump) 540 | { 541 | getVelocity(); 542 | 543 | if (velocity >= 0.1) // 速度不为0 544 | { 545 | m_pHero->JumpUpAnimation("jumpup", 0.1f, m_bDirection); 546 | if (m_bDirection == false) 547 | { 548 | if (m_pHero->getPositionX() <= WINSIZE.width - 8)//不让精灵超出右边,8可以改成你喜欢的 549 | { 550 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero)) //精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 551 | m_pHero->setPosition(ccp(m_pHero->getPosition().x + m_pHero->m_iSpeed, m_pHero->getPosition().y + velocity)); //向右走 552 | else 553 | { 554 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 555 | } 556 | //下面是移动地图 557 | myMap->MoveMap(m_pHero); 558 | } 559 | else 560 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 561 | } 562 | else 563 | { 564 | if (m_pHero->getPositionX() >= 8)//不让精灵超出左边,8可以改成你喜欢的 565 | { 566 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 567 | m_pHero->setPosition(ccp(m_pHero->getPosition().x - m_pHero->m_iSpeed, m_pHero->getPosition().y + velocity)); //向左走 568 | else 569 | { 570 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 571 | } 572 | //下面是移动地图 573 | myMap->MoveMap(m_pHero); 574 | } 575 | else 576 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 577 | } 578 | 579 | } 580 | else 581 | { 582 | m_pHero->JumpDownAnimation("jumpdown", 0.1f, m_bDirection); 583 | if (m_bDirection == false) 584 | { 585 | if (m_pHero->getPositionX() <= WINSIZE.width - 8)//不让精灵超出右边,8可以改成你喜欢的 586 | { 587 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 588 | m_pHero->setPosition(ccp(m_pHero->getPosition().x + m_pHero->m_iSpeed, m_pHero->getPosition().y + velocity)); //向右走 589 | else 590 | { 591 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 592 | } 593 | //下面是移动地图 594 | myMap->MoveMap(m_pHero); 595 | } 596 | else 597 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 598 | } 599 | else 600 | { 601 | if (m_pHero->getPositionX() >= 8)//不让精灵超出左边,8可以改成你喜欢的 602 | { 603 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 604 | m_pHero->setPosition(ccp(m_pHero->getPosition().x - m_pHero->m_iSpeed, m_pHero->getPosition().y + velocity)); //向左走 605 | else 606 | { 607 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 608 | } 609 | //下面是移动地图 610 | myMap->MoveMap(m_pHero); 611 | } 612 | else 613 | m_pHero->setPosition(ccp(m_pHero->getPosition().x, m_pHero->getPosition().y + velocity)); //向左走 614 | } 615 | } 616 | 617 | if (m_pHero->getPositionY() <= 359) 618 | { 619 | m_pHero->JumpEnd(); 620 | m_pHero->setPosition(ccp(m_pHero->getPosition().x + 3, 360)); 621 | velocity = 10.0f; 622 | m_bJump = false; 623 | } 624 | } 625 | 626 | // 人物移动 627 | if (m_bRun && m_bDirection == false && m_pHero->IsHurt == false && m_pHero->IsAttack == false && m_pHero->m_bIsJumping == false) 628 | { 629 | m_pHero->SetAnimation("run", 0.07f, m_bDirection); 630 | if (m_pHero->getPositionX() <= WINSIZE.width - 8)//不让精灵超出右边,8可以改成你喜欢的 631 | { 632 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 633 | m_pHero->setPosition(ccp(m_pHero->getPosition().x + m_pHero->m_iSpeed, m_pHero->getPosition().y)); //向右走 634 | //下面是移动地图 635 | myMap->MoveMap(m_pHero); 636 | } 637 | } 638 | else if (m_bRun && m_bDirection == true && m_pHero->IsHurt == false && m_pHero->m_bIsJumping == false) 639 | { 640 | m_pHero->SetAnimation("run", 0.07f, m_bDirection); 641 | if (m_pHero->getPositionX() >= 8)//不让精灵超出左边,8可以改成你喜欢的 642 | { 643 | if (!m_pHero->JudgePosition(WINSIZE) || myMap->JudgeMap(m_pHero))//精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 644 | m_pHero->setPosition(ccp(m_pHero->getPosition().x - m_pHero->m_iSpeed, m_pHero->getPosition().y)); //向右走 645 | //下面是移动地图 646 | myMap->MoveMap(m_pHero); 647 | } 648 | } 649 | 650 | // 主角和怪物攻击碰撞检测 651 | if (m_pHero->IsAttack) 652 | { 653 | for (auto monster : monsterShowList) 654 | { 655 | // 怪物没死 656 | if (monster->Isdead == false && isAttackMonster(m_pHero, monster) && m_pHero->m_bIsJumping == false) 657 | { 658 | // 得到两点x的距离, 记得怪物的坐标要加上地图的 659 | float x = m_pHero->getPositionX() - (monster->getPositionX() + myMap->getPositionX()); 660 | 661 | //先计算怪物和英雄的距离 662 | auto dis = fabs(x); 663 | if (dis <= 150) 664 | { 665 | if (monster->m_iType == 1) 666 | { 667 | monster->HurtAnimation("monsterHurt", monster->MonsterDirecton, 0.2f, 1); 668 | } 669 | else if (monster->m_iType == 2) 670 | { 671 | monster->HurtAnimation("lionHurt", monster->MonsterDirecton, 0.2f, 1); 672 | } 673 | else 674 | { 675 | monster->HurtAnimation("stoneHurt", monster->MonsterDirecton, 0.2f, 1); 676 | } 677 | } 678 | // if (this->isRectCollision(CCRectMake(m_pHero->getPositionX(), m_pHero->getPositionY(), m_pHero->GetSprite()->getContentSize().width-30, m_pHero->GetSprite()->getContentSize().height-20), 679 | // CCRectMake(monster->getPositionX(), monster->getPositionY(), monster->GetSprite()->getContentSize().width - 30, monster->GetSprite()->getContentSize().height - 20))) 680 | // { 681 | // monster->HurtAnimation("monsterHurt", monster->MonsterDirecton, 0.2f, 1); 682 | // } 683 | } 684 | } 685 | } 686 | 687 | for (auto monster : monsterShowList) 688 | { 689 | if (!monster->Isdead) 690 | { 691 | if (monster->IsAttack && m_pHero->IsDead == false && m_pHero->m_bIsJumping == false) 692 | { 693 | // 得到两点x的距离, 记得怪物的坐标要加上地图的 694 | float x = m_pHero->getPositionX() - (monster->getPositionX() + myMap->getPositionX()); 695 | 696 | //先计算怪物和英雄的距离 697 | auto dis = fabs(x); 698 | if (dis <= 130) 699 | { 700 | m_pHero->HurtByMonsterAnimation("hurt", 0.2f, m_bDirection); 701 | m_pHPBar->setPercentage(m_pHero->percentage); 702 | } 703 | } 704 | } 705 | } 706 | 707 | m_pMPBar->setPercentage(m_pHero->m_iCurrentMp); 708 | if (m_pMPBar->getPercentage() >= 100) 709 | { 710 | m_pComboPic->setVisible(true); 711 | } 712 | else 713 | { 714 | m_pComboPic->setVisible(false); 715 | } 716 | 717 | // 主角和怪物攻击碰撞检测 718 | if (m_pHero->IsAttack && m_pHero->m_bCanCrazy) 719 | { 720 | for (auto monster : monsterShowList) 721 | { 722 | // 怪物没死 723 | if (monster->Isdead == false && isAttackMonster(m_pHero, monster) && m_pHero->m_bIsJumping == false) 724 | { 725 | // 得到两点x的距离, 记得怪物的坐标要加上地图的 726 | float x = m_pHero->getPositionX() - (monster->getPositionX() + myMap->getPositionX()); 727 | 728 | //先计算怪物和英雄的距离 729 | auto dis = fabs(x); 730 | if (dis <= 350) 731 | { 732 | monster->HurtAnimation("monsterHurt", monster->MonsterDirecton, 0.2f, 1); 733 | } 734 | // if (this->isRectCollision(CCRectMake(m_pHero->getPositionX(), m_pHero->getPositionY(), m_pHero->GetSprite()->getContentSize().width-30, m_pHero->GetSprite()->getContentSize().height-20), 735 | // CCRectMake(monster->getPositionX(), monster->getPositionY(), monster->GetSprite()->getContentSize().width - 30, monster->GetSprite()->getContentSize().height - 20))) 736 | // { 737 | // monster->HurtAnimation("monsterHurt", monster->MonsterDirecton, 0.2f, 1); 738 | // } 739 | } 740 | } 741 | } 742 | 743 | // 游戏结束判定 744 | if (m_pHero->IsDead) 745 | { 746 | // 游戏结束 747 | this->scheduleOnce(schedule_selector(GameLayer::gameOver), 1.0f); 748 | this->unscheduleUpdate(); 749 | } 750 | // 怪物全死 751 | if (m_bFlag3 == false) 752 | { 753 | bool noMonster = true; 754 | for (auto monster : monsterShowList) 755 | { 756 | if (!monster->Isdead) 757 | { 758 | noMonster = false; 759 | } 760 | } 761 | if (noMonster) 762 | { 763 | this->scheduleOnce(schedule_selector(GameLayer::gameVictory), 2.0f); 764 | this->unscheduleUpdate(); 765 | } 766 | } 767 | } 768 | -------------------------------------------------------------------------------- /GameLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file GameLayer.h 3 | * \date 2015/06/13 16:55 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 游戏场景 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __GameLayer__H__ 16 | #define __GameLayer__H__ 17 | 18 | #include 19 | #include "cocos2d.h" 20 | #include "SimpleAudioEngine.h" 21 | #include "ActionTool.h" 22 | #include "GlobalData.h" 23 | #include "GlobalDefine.h" 24 | #include "extensions/cocos-ext.h" 25 | #include "Monster.h" 26 | 27 | USING_NS_CC; 28 | using namespace extension; 29 | 30 | class Hero; 31 | class ProgressBar; 32 | class GameMap; 33 | 34 | class GameLayer : public Layer 35 | { 36 | public: 37 | 38 | static Scene* createScene(); 39 | virtual bool init(); 40 | 41 | // 暂停 42 | void gamePause(Ref* pSender); 43 | 44 | void gameOver(float delta); 45 | void gameVictory(float delta); 46 | // 技能--拳击--脚踢--超级技能--蹦 47 | void fistAttack(Ref* pSender, Control::EventType type); 48 | void footAttack(Ref* psender, Control::EventType type); 49 | void comboAttack(Ref* pSender, Control::EventType type); 50 | void jump(Ref* pSender, Control::EventType type); 51 | 52 | // 前进,后退 53 | void forward(Ref* pSender, Control::EventType type); 54 | void backward(Ref* pSender, Control::EventType type); 55 | 56 | bool isAttackMonster(Hero * hero, Monster* monster); 57 | 58 | virtual void update(float delta); 59 | 60 | CREATE_FUNC(GameLayer); 61 | 62 | private: 63 | 64 | // 英雄&怪物 65 | Hero* m_pHero; 66 | Monster* m_pMonster1; 67 | 68 | GameMap* myMap; 69 | 70 | // 背景条 71 | Sprite* m_pBG; 72 | // 血条,能量前景条 73 | ProgressTimer* m_pHPBar; 74 | ProgressTimer* m_pMPBar; 75 | 76 | ControlButton * m_pComboBtn; 77 | Sprite* m_pComboPic; 78 | 79 | RenderTexture* render; 80 | RenderTexture* renderResult; 81 | 82 | float velocity = 0.0f; // 跳起速度 83 | float getVelocity(); // 获取跳跃的速度 84 | 85 | bool m_bDirection; // 行走的方向 86 | bool m_bRun; // 是否在跑 87 | bool m_bJump; // 是否在跳 88 | 89 | }; 90 | 91 | #endif -------------------------------------------------------------------------------- /GameMap.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class GameMap 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 六月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "GameMap.h" 23 | #include "GlobalDefine.h" 24 | #include "Hero.h" 25 | #include "cocos2d.h" 26 | 27 | USING_NS_CC; 28 | 29 | GameMap::GameMap() 30 | { 31 | m_map1 = NULL; 32 | m_map2 = NULL; 33 | m_map3 = NULL; 34 | } 35 | GameMap::~GameMap() 36 | { 37 | } 38 | 39 | void GameMap::InitMap(const char *map_name1,const char *map_name2,const char *map_name3) 40 | { 41 | this->m_map1 = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(map_name1)); 42 | this->m_map2 = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(map_name2)); 43 | this->m_map3 = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(map_name3)); 44 | 45 | m_map1->setAnchorPoint(Point(0, 0)); 46 | m_map1->setTag(11); 47 | m_map2->setAnchorPoint(Point(0, 0)); 48 | m_map3->setAnchorPoint(Point(0, 0)); 49 | 50 | parallax = ParallaxNode::create(); 51 | parallax->addChild(m_map1, 1, Point(1.18, 0), Point(0,360)); 52 | parallax->addChild(m_map2, 2, Point(1, 0), Point(0,0)); 53 | parallax->addChild(m_map3, 3, Point(0.7, 0), Point(0, 0)); 54 | 55 | this->setAnchorPoint(ccp(0, 0)); 56 | this->addChild(parallax); 57 | log("%f%f", parallax->getPositionX(), parallax->getPositionY()); 58 | log("%f%f", parallax->getContentSize().width, parallax->getContentSize().height); 59 | log("%f%f", m_map1->getContentSize().width, m_map1->getContentSize().height); 60 | } 61 | 62 | void GameMap::MoveMap(Hero *hero)// 63 | { 64 | auto map = (Sprite*)parallax->getChildByTag(11); 65 | 66 | if (hero->JudgePosition(WINSIZE) && hero->HeroDirecton == false)//精灵运动到中间,地图才移动 67 | { 68 | if (this->getPositionX() >= -(m_map2->getContentSize().width - WINSIZE.width))//防止地图左边运动后超出边缘 69 | this->setPosition(this->getPositionX() - hero->m_iSpeed, this->getPositionY()); 70 | log("map is %f", this->getPositionX()); 71 | } 72 | if (hero->JudgePosition(WINSIZE) && hero->HeroDirecton == true)//精灵运动到中间,地图才移动 73 | { 74 | log("Hero Walk Left %f", hero->getPositionX()); 75 | log("map is %f", this->getPositionX()); 76 | if (this->getPositionX() <= -10) //防止地图左边运动后超出边缘 77 | this->setPosition(this->getPositionX() + hero->m_iSpeed, this->getPositionY()); 78 | } 79 | } 80 | bool GameMap::JudgeMap(Hero *hero) 81 | { 82 | if (this->getPositionX() >= -(m_map2->getContentSize().width - WINSIZE.width) && hero->HeroDirecton == false)//防止地图左边运动后超出边缘 83 | return false; 84 | else if (this->getPositionX() <= -10 && hero->HeroDirecton == true) //防止地图左边运动后超出边缘 85 | return false; 86 | else //地图已经移动到达边缘 87 | return true; 88 | } -------------------------------------------------------------------------------- /GameMap.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file GameMap.h 3 | * \date 2015/06/08 11:19 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __GameMap__H__ 16 | #define __GameMap__H__ 17 | 18 | #include "cocos2d.h" 19 | USING_NS_CC; 20 | 21 | class Hero; 22 | 23 | class GameMap : public Node 24 | { 25 | public: 26 | GameMap(); 27 | ~GameMap(); 28 | // 初始化地图 29 | void InitMap(const char *map_name1,const char *map_name2, const char *map_name3); 30 | //根据精灵的位置移动地图,visibleSize为当前窗口的大小 31 | void MoveMap(Hero *hero); 32 | //判断地图是否到达边缘 33 | bool JudgeMap(Hero *hero); 34 | 35 | CREATE_FUNC(GameMap); 36 | private: 37 | Sprite* m_map1; 38 | Sprite* m_map2; 39 | Sprite* m_map3; 40 | ParallaxNode* parallax; 41 | }; 42 | 43 | #endif -------------------------------------------------------------------------------- /GateMapLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class GateMapLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 选关功能场景 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "cocos2d.h" 23 | #include "SimpleAudioEngine.h" 24 | #include "GateMapLayer.h" 25 | #include "GlobalDefine.h" 26 | #include "GlobalData.h" 27 | #include "StartLayer.h" 28 | #include "SelectGate.h" 29 | #include "GameLayer.h" 30 | #include "HelloWorldScene.h" 31 | 32 | USING_NS_CC; 33 | using namespace CocosDenshion; 34 | 35 | Scene* GateMapLayer::createScene() 36 | { 37 | auto scene = Scene::create(); 38 | auto layer = GateMapLayer::create(); 39 | scene->addChild(layer); 40 | return scene; 41 | } 42 | 43 | bool GateMapLayer::init() 44 | { 45 | if (! Layer::init()) 46 | { 47 | return false; 48 | } 49 | 50 | if (getBoolFromXML(MUSIC_KEY)) 51 | { 52 | float music = getFloatFromXML(MUSICVOL)*100.0f; 53 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 54 | if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) 55 | { 56 | aduioEngine->pauseBackgroundMusic(); 57 | aduioEngine->playBackgroundMusic("Sound/gateMap.wav", true); 58 | } 59 | else 60 | aduioEngine->playBackgroundMusic("Sound/gateMap.wav", true); 61 | } 62 | else 63 | aduioEngine->pauseBackgroundMusic(); 64 | 65 | Size visibleSize = Director::getInstance()->getVisibleSize(); 66 | Point origin = Director::getInstance()->getVisibleOrigin(); 67 | 68 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/gateMap.plist"); 69 | 70 | bgPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("GateMapBG.png")); 71 | bgPic->setPosition(WINSIZE.width / 2.0, WINSIZE.height / 2); 72 | this->addChild(bgPic); 73 | 74 | auto closeItem = MenuItemSprite::create( 75 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CloseNormal.png")), 76 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CloseSelected.png")), 77 | CC_CALLBACK_1(GateMapLayer::closeFunc, this)); // 退出 78 | 79 | auto challengeItem = MenuItemSprite::create( 80 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tiaozhanNormal.png")), 81 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("tiaozhanSelected.png")), 82 | CC_CALLBACK_1(GateMapLayer::challengeFunc, this)); // 挑战 83 | 84 | closeItem->setPosition(WINSIZE.width - 47, WINSIZE.height - 44); 85 | challengeItem->setPosition(WINSIZE.width - 253, 7 * WINSIZE.height / 72); 86 | auto menu = Menu::create(closeItem, challengeItem, NULL); 87 | menu->setPosition(Point::ZERO); 88 | this->addChild(menu); 89 | 90 | auto gateOneItem = MenuItemSprite::create( 91 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_1.png")), 92 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_1.png")), 93 | CC_CALLBACK_1(GateMapLayer::gateOneCallBack, this)); // 退出 94 | 95 | auto gateTwoItem = MenuItemSprite::create( 96 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_2.png")), 97 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_2.png")), 98 | CC_CALLBACK_1(GateMapLayer::gateTwoCallBack, this)); // 退出 99 | 100 | auto gateThreeItem = MenuItemSprite::create( 101 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_3.png")), 102 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Gate_3.png")), 103 | CC_CALLBACK_1(GateMapLayer::gateThreeCallBack, this)); // 退出 104 | 105 | selectGateMenu = SelectGate::create(); 106 | selectGateMenu->addMenuItem(gateOneItem); 107 | selectGateMenu->addMenuItem(gateTwoItem); 108 | selectGateMenu->addMenuItem(gateThreeItem); 109 | selectGateMenu->setPosition(visibleSize.width / 2, visibleSize.height / 2 + 74); 110 | this->addChild(selectGateMenu, 2); 111 | 112 | auto m_pMoneyLabel = LabelTTF::create("1000", "", 45); 113 | m_pMoneyLabel->setColor(ccc3(0, 255, 255)); 114 | m_pMoneyLabel->setPosition(300, 60); 115 | 116 | auto m_pEnergyLabel = LabelTTF::create("10", "", 45); 117 | m_pEnergyLabel->setColor(ccc3(0, 255, 255)); 118 | m_pEnergyLabel->setPosition(640, 60); 119 | 120 | this->addChild(m_pMoneyLabel); 121 | this->addChild(m_pEnergyLabel); 122 | 123 | return true; 124 | } 125 | 126 | // a selector callback 127 | void GateMapLayer::gateOneCallBack(cocos2d::Ref* pSender) 128 | { 129 | PLAYEFFECT; 130 | setIntToXML(GAMELEVEL_KEY, 1); 131 | setIntToXML(SELECTGATE, 1); 132 | UserDefault::getInstance()->flush(); 133 | m_iSelectGate = 1; 134 | log("First gate select!"); 135 | Director::getInstance()->replaceScene(GameLayer::createScene()); 136 | } 137 | void GateMapLayer::gateTwoCallBack(cocos2d::Ref* pSender) 138 | { 139 | PLAYEFFECT; 140 | log("Second gate select!"); 141 | if (getBoolFromXML(GATEONE, false)) 142 | { 143 | setIntToXML(GAMELEVEL_KEY, 2); 144 | setIntToXML(SELECTGATE, 2); 145 | UserDefault::getInstance()->flush(); 146 | m_iSelectGate = 2; 147 | Director::getInstance()->replaceScene(HelloWorld::createScene()); 148 | 149 | } 150 | } 151 | void GateMapLayer::gateThreeCallBack(cocos2d::Ref* pSender) 152 | { 153 | PLAYEFFECT; 154 | log("Third gate select!"); 155 | if (getBoolFromXML(GATETWO, false)) 156 | { 157 | setIntToXML(GAMELEVEL_KEY, 3); 158 | setIntToXML(SELECTGATE, 3); 159 | UserDefault::getInstance()->flush(); 160 | m_iSelectGate = 3; 161 | Director::getInstance()->replaceScene(HelloWorld::createScene()); 162 | } 163 | else 164 | { 165 | //Label * label = Label::cr(""); 166 | } 167 | } 168 | 169 | void GateMapLayer::closeFunc(Ref* pSender) 170 | { 171 | PLAYEFFECT; 172 | Director::getInstance()->replaceScene(StartLayer::createScene()); 173 | } 174 | void GateMapLayer::challengeFunc(Ref* pSender) 175 | { 176 | PLAYEFFECT; 177 | selectGateMenu->getCurrentItem()->activate(); 178 | // m_iSelectGate = 1; 179 | // Director::getInstance()->replaceScene(GameLayer::createScene()); 180 | } -------------------------------------------------------------------------------- /GateMapLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file GateMapLayer.h 3 | * \date 2015/05/31 20:09 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 选关功能场景 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __GateMapLayer__H__ 16 | #define __GateMapLayer__H__ 17 | 18 | #include "cocos2d.h" 19 | USING_NS_CC; 20 | 21 | class SelectGate; 22 | 23 | class GateMapLayer : cocos2d::Layer 24 | { 25 | public: 26 | static Scene* createScene(); 27 | virtual bool init(); 28 | CREATE_FUNC(GateMapLayer); 29 | 30 | Sprite *bgPic; 31 | Sprite *closeBtn; 32 | Sprite *tips; 33 | LabelTTF * coin; 34 | LabelTTF * energy; 35 | 36 | SelectGate* selectGateMenu; 37 | 38 | void gateOneCallBack(Ref* pSender); 39 | void gateTwoCallBack(Ref* pSender); 40 | void gateThreeCallBack(Ref* pSender); 41 | 42 | void closeFunc(Ref* pSender); 43 | void challengeFunc(Ref* pSender); 44 | 45 | }; 46 | 47 | #endif 48 | 49 | -------------------------------------------------------------------------------- /GlobalData.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file GlobalData.cpp 3 | * \date 2015/04/18 0:08 4 | * 5 | * \author SuooL_振生 6 | * Blog suool.net || blog.csdn.net/suool 7 | * Contact 1020935219@qq.com 8 | * 9 | * \brief 多文件共享变量 10 | * 11 | * \version 1.0 12 | * 13 | * TODO: 14 | * 15 | * \note 16 | */ 17 | #include "GlobalData.h" 18 | #include "Monster.h" 19 | 20 | int m_iSelectGate; 21 | bool m_bFlag1; 22 | bool m_bFlag2; 23 | bool m_bFlag3; 24 | bool m_bFlag4; 25 | bool m_bFlag5; 26 | 27 | Vector monsterOneList; 28 | Vector monsterTwoList; 29 | Vector monsterThreeList; 30 | Vector monsterFourList; 31 | Vector monsterFiveList; 32 | Vector monsterShowList; -------------------------------------------------------------------------------- /GlobalData.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/GlobalData.h -------------------------------------------------------------------------------- /GlobalDefine.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/GlobalDefine.h -------------------------------------------------------------------------------- /HelloWorldScene.cpp: -------------------------------------------------------------------------------- 1 | #include "HelloWorldScene.h" 2 | 3 | USING_NS_CC; 4 | 5 | Scene* HelloWorld::createScene() 6 | { 7 | // 'scene' is an autorelease object 8 | auto scene = Scene::create(); 9 | 10 | // 'layer' is an autorelease object 11 | auto layer = HelloWorld::create(); 12 | 13 | // add layer as a child to scene 14 | scene->addChild(layer); 15 | 16 | // return the scene 17 | return scene; 18 | } 19 | 20 | // on "init" you need to initialize your instance 21 | bool HelloWorld::init() 22 | { 23 | ////////////////////////////// 24 | // 1. super init first 25 | if ( !Layer::init() ) 26 | { 27 | return false; 28 | } 29 | 30 | Size visibleSize = Director::getInstance()->getVisibleSize(); 31 | Point origin = Director::getInstance()->getVisibleOrigin(); 32 | 33 | ///////////////////////////// 34 | // 2. add a menu item with "X" image, which is clicked to quit the program 35 | // you may modify it. 36 | 37 | // add a "close" icon to exit the progress. it's an autorelease object 38 | auto closeItem = MenuItemImage::create( 39 | "CloseNormal.png", 40 | "CloseSelected.png", 41 | CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 42 | 43 | closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , 44 | origin.y + closeItem->getContentSize().height/2)); 45 | 46 | // create menu, it's an autorelease object 47 | auto menu = Menu::create(closeItem, NULL); 48 | menu->setPosition(Point::ZERO); 49 | this->addChild(menu, 1); 50 | 51 | ///////////////////////////// 52 | // 3. add your codes below... 53 | 54 | // add a label shows "Hello World" 55 | // create and initialize a label 56 | 57 | auto label = LabelTTF::create("Hello World", "Arial", 24); 58 | 59 | // position the label on the center of the screen 60 | label->setPosition(Point(origin.x + visibleSize.width/2, 61 | origin.y + visibleSize.height - label->getContentSize().height)); 62 | 63 | // add the label as a child to this layer 64 | this->addChild(label, 1); 65 | 66 | // add "HelloWorld" splash screen" 67 | auto sprite = Sprite::create("HelloWorld.png"); 68 | 69 | // position the sprite on the center of the screen 70 | sprite->setPosition(Point(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); 71 | 72 | // add the sprite as a child to this layer 73 | this->addChild(sprite, 0); 74 | 75 | return true; 76 | } 77 | 78 | 79 | void HelloWorld::menuCloseCallback(Ref* pSender) 80 | { 81 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) 82 | MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); 83 | return; 84 | #endif 85 | 86 | Director::getInstance()->end(); 87 | 88 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) 89 | exit(0); 90 | #endif 91 | } 92 | -------------------------------------------------------------------------------- /HelloWorldScene.h: -------------------------------------------------------------------------------- 1 | #ifndef __HELLOWORLD_SCENE_H__ 2 | #define __HELLOWORLD_SCENE_H__ 3 | 4 | #include "cocos2d.h" 5 | 6 | class HelloWorld : public cocos2d::Layer 7 | { 8 | public: 9 | // there's no 'id' in cpp, so we recommend returning the class instance pointer 10 | static cocos2d::Scene* createScene(); 11 | 12 | // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone 13 | virtual bool init(); 14 | 15 | // a selector callback 16 | void menuCloseCallback(cocos2d::Ref* pSender); 17 | 18 | // implement the "static create()" method manually 19 | CREATE_FUNC(HelloWorld); 20 | }; 21 | 22 | #endif // __HELLOWORLD_SCENE_H__ 23 | -------------------------------------------------------------------------------- /HelpLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class HelpLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 帮助关于界面 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "HelpLayer.h" 23 | #include "StartLayer.h" 24 | #include "GlobalDefine.h" 25 | #include "cocos2d.h" 26 | #include "XMLParser.h" 27 | #include "extensions/cocos-ext.h" 28 | 29 | USING_NS_CC; 30 | USING_NS_CC_EXT; 31 | 32 | Scene* HelpLayer::createScene() 33 | { 34 | Scene* scene = Scene::create(); 35 | HelpLayer* helpLayer = HelpLayer::create(); 36 | 37 | scene->addChild(helpLayer); 38 | 39 | return scene; 40 | } 41 | 42 | bool HelpLayer::init() 43 | { 44 | if (!Layer::init()) 45 | { 46 | return false; 47 | } 48 | auto bgSprite = Sprite::create("Help.png"); 49 | bgSprite->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 50 | this->addChild(bgSprite); 51 | 52 | auto closeItem = MenuItemSprite::create( 53 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("GalleryOffNormal.png")), 54 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("GalleryOffSelected.png")), 55 | [&](Ref * ref){ 56 | PLAYEFFECT; 57 | //弹出场景 58 | Director::getInstance()->replaceScene(StartLayer::createScene()); }); 59 | // 关闭按钮 60 | closeItem->setPosition(WINSIZE.width / 2 + 580, WINSIZE.height / 2 + 320); 61 | auto menu = Menu::create(closeItem, NULL); 62 | menu->setPosition(Point::ZERO); 63 | this->addChild(menu); 64 | 65 | auto titleSp = Sprite::create("TitleLogo.png"); 66 | titleSp->setPosition(WINSIZE.width / 2 + 200, WINSIZE.height / 2); 67 | this->addChild(titleSp); 68 | 69 | // 创建文字Label 70 | XMLParser *pXmlParser = XMLParser::parseWithFile("tujiLayer.xml"); 71 | String *label = pXmlParser->getString("label_help"); 72 | text = LabelTTF::create(label->getCString(), "", 23); 73 | text->setColor(ccc3(0, 255, 255)); 74 | text->setTag(15); 75 | text->setPosition(250, 100); 76 | 77 | // 绘制裁剪区域 78 | DrawNode* area = DrawNode::create(); 79 | Point point[4] = { Point(50, 100), Point(500, 100), Point(500, 450), Point(50, 450) }; 80 | area->drawPolygon(point, 4, ccc4f(255, 255, 255, 255), 0, ccc4f(255, 255, 255, 255)); 81 | 82 | // 创建遮罩层 83 | ClippingNode* m_pClipArea = ClippingNode::create(); 84 | m_pClipArea->setInverted(false); 85 | m_pClipArea->setStencil(area); 86 | m_pClipArea->addChild(text); 87 | this->addChild(m_pClipArea); 88 | 89 | MoveBy* moveact = CCMoveBy::create(5.0f, Point(0, 400)); //10秒向上移动400 90 | CallFunc* callFunc = CallFunc::create(this, callfunc_selector(HelpLayer::scrollback)); 91 | // 创建连续动作 92 | ActionInterval* attackact = Sequence::create(moveact, callFunc, NULL); 93 | 94 | text->runAction(RepeatForever::create(attackact)); 95 | 96 | 97 | return true; 98 | } 99 | 100 | void HelpLayer::scrollback() 101 | { 102 | text->setPosition(250, 100); 103 | } -------------------------------------------------------------------------------- /HelpLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file HelpLayer.h 3 | * \date 2015/05/30 15:43 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 帮助关于界面 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __HelpLayer__H__ 16 | #define __HelpLayer__H__ 17 | 18 | #include "cocos2d.h" 19 | #include "extensions/cocos-ext.h" 20 | 21 | USING_NS_CC; 22 | USING_NS_CC_EXT; 23 | 24 | class HelpLayer : public Layer { 25 | public: 26 | static Scene* createScene(); 27 | virtual bool init(); 28 | CREATE_FUNC(HelpLayer); 29 | 30 | private: 31 | LabelTTF* text; 32 | void scrollback(); 33 | }; 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Hero.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/Hero.cpp -------------------------------------------------------------------------------- /Hero.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/Hero.h -------------------------------------------------------------------------------- /IconvString.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/IconvString.cpp -------------------------------------------------------------------------------- /IconvString.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/IconvString.h -------------------------------------------------------------------------------- /MijiLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file MijiLayer.cpp 3 | * \date 2015/05/17 21:58 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 秘籍场景 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #include "MijiLayer.h" 16 | #include "GlobalDefine.h" 17 | #include "StartLayer.h" 18 | #include "cocos2d.h" 19 | #include "extensions/cocos-ext.h" 20 | 21 | USING_NS_CC; 22 | using namespace cocos2d::extension; 23 | 24 | Scene* MijiLayer::createScene() 25 | { 26 | Scene* scene = Scene::create(); 27 | MijiLayer* layer = MijiLayer::create(); 28 | scene->addChild(layer); 29 | return scene; 30 | } 31 | 32 | bool MijiLayer::init() 33 | { 34 | if (!Layer::init()) 35 | { 36 | return false; 37 | } 38 | flag = true; 39 | // 背景 40 | spriteBG = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsBackground.png")); 41 | spriteBG->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 42 | this->addChild(spriteBG); 43 | 44 | // 秘籍技能界面 45 | interface_1 = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsInterface1.png")); 46 | interface_2 = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsInterface2.png")); 47 | interface_1->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 10); 48 | interface_1->setVisible(true); 49 | interface_2->setPosition(WINSIZE.width / 2, WINSIZE.height / 2 - 10); 50 | interface_2->setVisible(false); 51 | spriteBG->addChild(interface_1); 52 | spriteBG->addChild(interface_2); 53 | 54 | // 关闭按钮 55 | auto closeItem = MenuItemSprite::create( 56 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("OffNormal.png")), 57 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("offSelected.png")), 58 | [](Ref * ref){ 59 | // 切换主界面场景 60 | PLAYEFFECT; 61 | Director::getInstance()->replaceScene(StartLayer::createScene()); }); 62 | closeItem->setPosition(WINSIZE.width-164, WINSIZE.height-132); 63 | 64 | // 点击切换按钮 65 | auto nextRightItem = MenuItemSprite::create( 66 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PageTurnNormal.png")), 67 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PageTurnSelected.png")), 68 | [&](Ref * ref){ 69 | PLAYEFFECT; 70 | // 切换秘籍 71 | if (flag) 72 | { 73 | interface_2->setVisible(true); 74 | flag = false; 75 | } 76 | else 77 | { 78 | interface_2->setVisible(false); 79 | flag = true; 80 | } 81 | }); 82 | nextRightItem->setPosition(WINSIZE.width - 55, WINSIZE.height / 2 - 14); 83 | 84 | // 点击切换按钮 85 | auto nor = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PageTurnNormal.png")); 86 | nor->setFlippedX(true); 87 | auto sel = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PageTurnSelected.png")); 88 | sel->setFlippedX(true); 89 | auto nextLeftItem = MenuItemSprite::create(nor, sel, 90 | [&](Ref * ref){ 91 | PLAYEFFECT; 92 | // 切换秘籍 93 | if (flag) 94 | { 95 | interface_2->setVisible(true); 96 | flag = false; 97 | } 98 | else 99 | { 100 | interface_2->setVisible(false); 101 | flag = true; 102 | } 103 | }); 104 | nextLeftItem->setPosition(55, WINSIZE.height / 2 - 14); 105 | 106 | auto menu = Menu::create(closeItem, nextRightItem, nextLeftItem, NULL); 107 | menu->setPosition(Point::ZERO); 108 | 109 | spriteBG->addChild(menu); 110 | 111 | return true; 112 | } -------------------------------------------------------------------------------- /MijiLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file MijiLayer.h 3 | * \date 2015/05/16 11:08 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 秘籍界面实现 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __MijiLayer__H__ 16 | #define __MijiLayer__H__ 17 | #include "cocos2d.h" 18 | #include "extensions/cocos-ext.h" 19 | 20 | USING_NS_CC; 21 | using namespace cocos2d::extension; 22 | 23 | class MijiLayer :public Layer { 24 | public: 25 | static Scene* createScene(); 26 | virtual bool init(); 27 | CREATE_FUNC(MijiLayer); 28 | 29 | Sprite* spriteBG; 30 | Sprite* interface_1; 31 | Sprite* interface_2; 32 | 33 | bool flag; 34 | }; 35 | 36 | #endif -------------------------------------------------------------------------------- /Monster.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class Monster 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 怪物实体类 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "Monster.h" 23 | #include "ActionTool.h" 24 | #include "Hero.h" 25 | #include "GameMap.h" 26 | 27 | USING_NS_CC; 28 | 29 | Monster::Monster() 30 | { 31 | IsRunning = false; // 不在跑动 32 | MonsterDirecton = true; // 向右运动 33 | Monster_name = NULL; 34 | IsAttack = false; 35 | my_hero = NULL; // 当前英雄 36 | my_map = NULL; // 当前地图 37 | dis = 10000; 38 | IsHurt = false; 39 | Isdead = false; 40 | } 41 | 42 | Monster::~Monster() 43 | { 44 | } 45 | 46 | Sprite* Monster::GetSprite() 47 | { 48 | return m_MonsterSprite; 49 | } 50 | 51 | void Monster::InitMonsterSprite(char *name, char *a, char *die, char *walk, char *dieLast,int m_iLevel) 52 | { 53 | Monster_name = name; 54 | Monster_a = a; 55 | Monster_walk = walk; 56 | Monster_die = die; 57 | Die_name = dieLast; 58 | 59 | m_iHP = 100 * (1+ 0.3*m_iLevel); 60 | this->m_MonsterSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(name)); 61 | this->addChild(m_MonsterSprite); 62 | } 63 | 64 | void Monster::SetAnimation(const char *name_each, bool run_directon, float delay, int iLoops) 65 | { 66 | // 设置怪物方向 67 | if (MonsterDirecton!= run_directon) 68 | { 69 | MonsterDirecton = run_directon; 70 | m_MonsterSprite->setFlippedX(run_directon); 71 | } 72 | // 怪物在走动或,受伤,攻击,死亡,返回 73 | if (IsRunning || IsAttack || IsHurt || Isdead) 74 | return; 75 | // 创建动作 76 | Animate* action = ActionTool::animationWithFrameName(name_each, iLoops, delay); 77 | m_MonsterSprite->runAction(RepeatForever::create(action)); 78 | CCLog("walk~!!!"); 79 | IsRunning = true; 80 | } 81 | 82 | // 停止走动后 83 | void Monster::StopAnimation() 84 | { 85 | if (!IsRunning) 86 | return; 87 | 88 | m_MonsterSprite->stopAllActions();// 当前精灵停止所有动画 89 | // 恢复精灵原来的初始化贴图 90 | this->removeChild(m_MonsterSprite, true);// 把原来的精灵删除掉 91 | m_MonsterSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Monster_name));//恢复精灵原来的贴图样子 92 | m_MonsterSprite->setFlipX(MonsterDirecton); 93 | this->addChild(m_MonsterSprite); 94 | IsRunning = false; 95 | } 96 | 97 | // 攻击 98 | void Monster::AttackAnimation(const char *name_each, bool run_directon, float delay, int iLoops) 99 | { 100 | // 正在走动、攻击、受伤或已死亡,就返回 101 | if (IsRunning || IsAttack || IsHurt || Isdead) 102 | return; 103 | // 创建动作 104 | Animate* action =ActionTool::animationWithFrameName(name_each, 1, delay); 105 | //创建回调动作,攻击结束后调用AttackEnd() 106 | CallFunc* callFunc = CallFunc::create(this, callfunc_selector(Monster::AttackEnd)); 107 | //创建连续动作 108 | 109 | m_MonsterSprite->runAction(Sequence::create(action, callFunc, NULL)); 110 | IsAttack = true; 111 | 112 | } 113 | void Monster::AttackEnd() 114 | { 115 | // 恢复精灵原来的初始化贴图 116 | this->removeChild(m_MonsterSprite, true); // 把原来的精灵删除掉 117 | m_MonsterSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Monster_name)); // 恢复精灵原来的贴图样子 118 | m_MonsterSprite->setFlipX(MonsterDirecton); 119 | this->addChild(m_MonsterSprite); 120 | IsAttack = false; 121 | } 122 | 123 | // 受伤 124 | void Monster::HurtAnimation(const char *name_each, bool run_directon, float delay, int iLoops) 125 | { 126 | if (IsHurt || Isdead) 127 | return; 128 | //受伤优先 129 | if (IsRunning || IsAttack) 130 | { 131 | m_MonsterSprite->stopAllActions();// 当前精灵停止所有动画 132 | // 恢复精灵原来的初始化贴图 133 | this->removeChild(m_MonsterSprite, true);// 把原来的精灵删除掉 134 | m_MonsterSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Monster_name));//恢复精灵原来的贴图样子 135 | m_MonsterSprite->setFlipX(MonsterDirecton); 136 | this->addChild(m_MonsterSprite); 137 | IsRunning = false; 138 | IsAttack = false; 139 | } 140 | 141 | Animate* action = ActionTool::animationWithFrameName(name_each, 1, delay); 142 | // 创建回调动作,受伤动画结束调用HurtEnd() 143 | CallFunc* callFunc = CallFunc::create(this, callfunc_selector(Monster::HurtEnd)); 144 | // 创建连续动作 145 | ActionInterval* hurtackact = Sequence::create(action, callFunc, NULL); 146 | 147 | m_MonsterSprite->runAction(hurtackact); 148 | IsHurt = true; 149 | } 150 | // 受伤结束 151 | void Monster::HurtEnd() 152 | { 153 | IsHurt = false; 154 | 155 | 156 | if (my_hero->m_bCanCrazy) 157 | { 158 | m_iHP -= 100; 159 | } 160 | else 161 | m_iHP -= 30; 162 | 163 | if (m_iHP <= 0) 164 | { 165 | //播放怪物死亡 166 | DeadAnimation(Monster_die, MonsterDirecton, 0.1f, 1.0f); 167 | } 168 | log("Monster Hurt"); 169 | } 170 | // 死亡 171 | void Monster::DeadAnimation(const char *name_each, bool run_directon, float delay, int iLoops) 172 | { 173 | Isdead = true; 174 | // 创建动作 175 | Animate* action = ActionTool::animationWithFrameName(name_each, 1, delay); 176 | // 创建回调动作,死亡结束后调用deadact() 177 | CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(Monster::DeadEnd)); 178 | // 创建连续动作 179 | CCActionInterval* deadact = Sequence::create(action, callFunc, NULL); 180 | m_MonsterSprite->runAction(deadact); 181 | if (my_hero->m_iCurrentMp < 100) 182 | { 183 | my_hero->m_iCurrentMp = (my_hero->m_iCurrentMp + 50); 184 | if (my_hero->m_iCurrentMp > 100) 185 | { 186 | my_hero->m_iCurrentMp = 100; 187 | } 188 | } 189 | } 190 | // 死亡结束 191 | void Monster::DeadEnd() 192 | { 193 | // 恢复死亡的样子 194 | this->removeChild(m_MonsterSprite, true); // 把原来的精灵删除掉 195 | m_MonsterSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Die_name)); // 恢复死亡的样子 196 | m_MonsterSprite->setFlipX(MonsterDirecton); 197 | this->addChild(m_MonsterSprite); 198 | 199 | // 怪物闪下再死亡 200 | Blink* blinkact = Blink::create(3, 3);//3是持续时间,6是闪的次数 201 | 202 | // 创建回调动作,闪烁结束后调用BlinkEnd() 203 | CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(Monster::BlinkEnd)); 204 | // 创建连续动作 205 | CCActionInterval* deadact = Sequence::create(blinkact, callFunc, NULL); 206 | m_MonsterSprite->runAction(deadact); 207 | 208 | } 209 | // 闪烁结束 210 | void Monster::BlinkEnd() 211 | { 212 | this->removeAllChildren();//把怪物和血条都删除掉; 213 | } 214 | 215 | void Monster::FollowRun(Hero* m_hero, GameMap* m_map) 216 | { 217 | 218 | // 得到两点x的距离,记得怪物的坐标要加上地图的 219 | float x = m_hero->getPositionX() - (this->getPositionX() + my_map->getPositionX()); 220 | 221 | // 先计算怪物和英雄的距离 222 | dis = fabs(x); 223 | 224 | if (x >= 1280)// 当怪物与英雄距离超过1280 225 | return; 226 | if (dis <= 120)// 在怪物攻击范围内,怪物停止移动 227 | { 228 | this->StopAnimation();// 停止跑动 229 | scheduleOnce(schedule_selector(Monster::JudegeAttack),2.5f); //以一定的概率判断是是否出动攻击 230 | return; 231 | } 232 | 233 | if (x < -100)// 判断怪物横坐标和英雄的距离 234 | { 235 | MonsterDirecton = false; 236 | m_MonsterSprite->setFlippedX(MonsterDirecton);// 设置方向 237 | if (IsAttack) 238 | return; 239 | this->SetAnimation(Monster_walk, MonsterDirecton, 0.1f, -1);// 播放动画 240 | this->setPosition(this->getPositionX() - 1.5, this->getPositionY());// 怪物向英雄移动 241 | } 242 | else if (x > 100) 243 | { 244 | 245 | MonsterDirecton = true; 246 | m_MonsterSprite->setFlippedX(MonsterDirecton);// 设置方向 247 | if (IsAttack) 248 | return; 249 | this->SetAnimation(Monster_walk, MonsterDirecton, 0.1f, -1);// 播放动画 250 | this->setPosition(this->getPositionX() + 1.5, this->getPositionY()); 251 | } 252 | 253 | } 254 | void Monster::JudegeAttack(float dt) 255 | { 256 | 257 | this->AttackAnimation(Monster_a, MonsterDirecton, 0.08f, 0); 258 | } 259 | 260 | // 启动监听 261 | void Monster::StartListen(Hero* m_hero, GameMap* m_map) 262 | { 263 | my_hero = m_hero; 264 | my_map = m_map; 265 | this->schedule(schedule_selector(Monster::updateMonster), 1.0f);// 每隔1秒计算距离 266 | this->scheduleUpdate();// 英雄一旦进入可视范围,怪物追着英雄打 267 | } 268 | 269 | // 监听函数,每隔1秒检测下 270 | void Monster::updateMonster(float delta) 271 | { 272 | // 已死亡,就返回 273 | if (Isdead || my_hero->IsDead) 274 | return; 275 | // 得到两点x的距离,记得怪物的坐标要加上地图的 276 | float x = my_hero->getPositionX() - (this->getPositionX() + my_map->getPositionX()); 277 | 278 | // 先计算怪物和英雄的距离 279 | dis = fabs(x); 280 | 281 | } 282 | void Monster::update(float delta) 283 | { 284 | // 已死亡,就返回 285 | if (Isdead || my_hero->IsDead) 286 | return; 287 | if (dis < 1280 && my_hero->IsDead == false)// 当英雄在它的可视范围内,不断追着英雄 288 | FollowRun(my_hero, my_map); 289 | } -------------------------------------------------------------------------------- /Monster.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file Monster.h 3 | * \date 2015/05/10 11:14 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 怪物实体类 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __Monster__H__ 16 | #define __Monster__H__ 17 | #include "cocos2d.h" 18 | class Hero; 19 | class GameMap; 20 | 21 | USING_NS_CC; 22 | 23 | class Monster :public cocos2d::Node 24 | { 25 | public: 26 | Monster(void); 27 | ~Monster(void); 28 | // 公有属性 29 | // 怪物种类 30 | int m_iType; 31 | //判断是否在跑动画 32 | bool IsRunning; 33 | //判断是否在攻击动画 34 | bool IsAttack; 35 | //判断是否在受伤动画 36 | bool IsHurt; 37 | //判断是否死亡 38 | bool Isdead; 39 | //怪物运动的方向 40 | bool MonsterDirecton; 41 | 42 | // 方法 43 | // 根据图片名创建怪物,不带血条的怪物 44 | void InitMonsterSprite(char *name, char *a, char *die, char *walk, char *dieLast, int m_iLevel); 45 | //返回英雄 46 | Sprite* GetSprite(); 47 | 48 | //设置走动动画,num为图片数目,run_directon为精灵脸朝向,false朝右,name_each为name_png中每一小张图片的公共名称部分 49 | void SetAnimation(const char *name_each, bool run_directon, float delay, int iLoops); 50 | //停止走动动画 51 | void StopAnimation(); 52 | 53 | //攻击动画 54 | void AttackAnimation(const char *name_each, bool run_directon, float delay, int iLoops); 55 | //攻击动画结束 56 | void AttackEnd(); 57 | 58 | //受伤动画 59 | void HurtAnimation(const char *name_each, bool run_directon, float delay, int iLoops); 60 | //受伤动画结束 61 | void HurtEnd(); 62 | 63 | //死亡动画 64 | void DeadAnimation(const char *name_each, bool run_directon, float delay, int iLoops); 65 | //死亡动画结束 66 | void DeadEnd(); 67 | 68 | //怪物死亡闪烁结束 69 | void BlinkEnd(); 70 | 71 | //在可视范围内,怪物跟随英雄运动 72 | void FollowRun(Hero* m_hero, GameMap* m_map); 73 | //判断是否攻击 74 | void JudegeAttack(float dt); 75 | 76 | 77 | //怪物启动监听英雄 78 | void StartListen(Hero* m_hero, GameMap* m_map); 79 | //监听函数,每隔3秒检测下,计算英雄与怪物的距离 80 | void updateMonster(float delta); 81 | //更新函数,如果英雄在可视范围内,不断触发 82 | void update(float delta); 83 | 84 | CREATE_FUNC(Monster); 85 | 86 | private: 87 | Sprite* m_MonsterSprite; // 怪物精灵 88 | char *Monster_name; // 用来保存初始状态的精灵图片名称 89 | char *Monster_a; // 怪物攻击帧 90 | char *Monster_die; // 死亡帧 91 | char *Monster_walk; // 行走帧 92 | char *Die_name; 93 | 94 | Hero* my_hero; // 当前英雄 95 | GameMap* my_map; // 当前地图 96 | float dis; // 当前怪物和英雄的距离 97 | int m_iHP; 98 | }; 99 | #endif 100 | -------------------------------------------------------------------------------- /MonsterOne.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file MonsterOne.cpp 3 | * \date 2015/04/05 7:45 4 | * 5 | * \author SuooL_振生 6 | * Contact: 1020935219@qq.com 7 | * 8 | * \brief 第一关怪物管理器 9 | * 10 | * \version 1.0 11 | * 12 | * TODO: long description 13 | * 14 | * \note 15 | */ 16 | #include "cocos2d.h" 17 | #include "MonsterOne.h" 18 | #include "GameMap.h" 19 | #include "GlobalData.h" 20 | #include "GlobalDefine.h" 21 | #include "Monster.h" 22 | #include "Hero.h" 23 | 24 | MonsterOne::MonsterOne() 25 | { 26 | 27 | } 28 | MonsterOne::~MonsterOne() 29 | { 30 | 31 | } 32 | 33 | MonsterOne* MonsterOne::createWithMapAndHero(GameMap* map, Hero* hero) 34 | { 35 | MonsterOne* monsterOne = new MonsterOne(); 36 | 37 | if (monsterOne && monsterOne->initMonster(map, hero)) 38 | { 39 | monsterOne->autorelease(); 40 | } 41 | else 42 | { 43 | CC_SAFE_DELETE(monsterOne); 44 | } 45 | 46 | return monsterOne; 47 | 48 | 49 | } 50 | 51 | bool MonsterOne::initMonster(GameMap* map, Hero* hero) 52 | { 53 | this->m_pMap = map; 54 | this->m_pHero = hero; 55 | 56 | monsterOneList.clear(); 57 | monsterTwoList.clear(); 58 | monsterThreeList.clear(); 59 | monsterShowList.clear(); 60 | 61 | auto m_pMonster1 = Monster::create(); 62 | m_pMonster1->InitMonsterSprite("monsterWalk5.png", "monsterA", "monsterDie", "monsterWalk", "monsterDie6.png", 1); 63 | m_pMonster1->m_iType = 1; 64 | m_pMonster1->setVisible(true); 65 | m_pMonster1->setPosition(1100, 365); 66 | m_pMap->addChild(m_pMonster1); 67 | m_pMonster1->StartListen(m_pHero, m_pMap); 68 | monsterShowList.pushBack(m_pMonster1); 69 | m_bFlag1 = false; 70 | // 第二波 71 | auto m_pMonster2 = Monster::create(); 72 | m_pMonster2->InitMonsterSprite("monsterWalk5.png", "monsterA", "monsterDie", "monsterWalk", "monsterDie6.png", 1); 73 | m_pMonster2->m_iType = 1; 74 | m_pMonster2->setVisible(false); 75 | m_pMonster2->setPosition(2000, 365); 76 | monsterTwoList.pushBack(m_pMonster2); 77 | auto m_pMonster3 = Monster::create(); 78 | m_pMonster3->InitMonsterSprite("monsterWalk5.png", "monsterA", "monsterDie", "monsterWalk", "monsterDie6.png", 1); 79 | m_pMonster3->m_iType = 1; 80 | m_pMonster3->setVisible(false); 81 | m_pMonster3->setPosition(-150, 365); 82 | monsterTwoList.pushBack(m_pMonster3); 83 | // 第三波 84 | for (int i = 0; i < 3; i++) 85 | { 86 | auto m_pMonster = Monster::create(); 87 | m_pMonster->InitMonsterSprite("monsterWalk5.png", "monsterA", "monsterDie", "monsterWalk", "monsterDie6.png", 1); 88 | m_pMonster->m_iType = 1; 89 | if (i == 0 || i == 1) 90 | { 91 | m_pMonster->setPosition(-100 * i, 365); 92 | } 93 | else 94 | { 95 | m_pMonster->setPosition(2000, 365); 96 | } 97 | m_pMonster->setVisible(false); 98 | monsterThreeList.pushBack(m_pMonster); 99 | } 100 | 101 | this->schedule(schedule_selector(MonsterOne::updateMonster)); 102 | 103 | return true; 104 | } 105 | 106 | 107 | 108 | void MonsterOne::updateMonster(float delta) 109 | { 110 | // 第二波 111 | if (m_bFlag1 == false && m_bFlag2 == true) 112 | { 113 | bool noMonster = true; 114 | for (auto monster : monsterShowList) 115 | { 116 | if (!monster->Isdead) 117 | { 118 | noMonster = false; 119 | } 120 | } 121 | if (noMonster) 122 | { 123 | this->scheduleOnce(schedule_selector(MonsterOne::showSecMon), 4.0f); 124 | } 125 | } 126 | 127 | // 第三波 128 | if (m_bFlag2 == false && m_bFlag3 == true) 129 | { 130 | bool noMonster = true; 131 | for (auto monster : monsterShowList) 132 | { 133 | if (!monster->Isdead) 134 | { 135 | noMonster = false; 136 | } 137 | } 138 | if (noMonster) 139 | { 140 | this->scheduleOnce(schedule_selector(MonsterOne::showThrMon), 3.0f); 141 | } 142 | } 143 | } 144 | 145 | void MonsterOne::showSecMon(float delta) 146 | { 147 | for (auto monster : monsterTwoList) 148 | { 149 | monster->setVisible(true); 150 | m_pMap->addChild(monster); 151 | monster->StartListen(m_pHero, m_pMap); 152 | monsterShowList.pushBack(monster); 153 | m_bFlag2 = false; 154 | } 155 | } 156 | void MonsterOne::showThrMon(float delta) 157 | { 158 | for (auto monster : monsterThreeList) 159 | { 160 | monster->setVisible(true); 161 | m_pMap->addChild(monster); 162 | monster->StartListen(m_pHero, m_pMap); 163 | monsterShowList.pushBack(monster); 164 | m_bFlag3 = false; 165 | } 166 | } -------------------------------------------------------------------------------- /MonsterOne.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file MonsterOne.h 3 | * 4 | * \author SuooL_振生 5 | * \date 四月 2015 6 | * 7 | * 第一关怪物管理器 8 | */ 9 | 10 | #ifndef __MonsterOne__H__ 11 | #define __MonsterOne__H__ 12 | #include "cocos2d.h" 13 | #include "GameMap.h" 14 | 15 | USING_NS_CC; 16 | 17 | class Monster; 18 | class Hero; 19 | class GameMap; 20 | 21 | class MonsterOne : public Node{ 22 | public: 23 | MonsterOne(); 24 | ~MonsterOne(); 25 | void updateMonster(float delta); 26 | void showSecMon(float delta); 27 | void showThrMon(float delta); 28 | static MonsterOne* createWithMapAndHero(GameMap* map, Hero* hero); 29 | bool initMonster(GameMap* map, Hero* hero); 30 | private: 31 | GameMap* m_pMap; 32 | Hero* m_pHero; 33 | }; 34 | 35 | #endif -------------------------------------------------------------------------------- /PauseLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file PauseLayer.cpp 3 | * \date 2015/04/08 15:30 4 | * 5 | * \author SuooL 6 | * Contact: 1020935219@qq.com 7 | * 8 | * \brief 暂停界面 9 | * 10 | * \version 1.0 11 | * 12 | * TODO: long description 13 | * 14 | * \note 15 | */ 16 | #include "PauseLayer.h" 17 | #include "GlobalDefine.h" 18 | #include "GlobalData.h" 19 | #include "GameLayer.h" 20 | #include "StartLayer.h" 21 | #include "cocos2d.h" 22 | #include "extensions/cocos-ext.h" 23 | 24 | USING_NS_CC; 25 | using namespace cocos2d::extension; 26 | 27 | Scene* PauseLayer::createScene(RenderTexture* rt) 28 | { 29 | Scene* scene = Scene::create(); 30 | PauseLayer* layer = PauseLayer::create(); 31 | 32 | auto sprite = Sprite::createWithTexture(rt->getSprite()->getTexture()); 33 | sprite->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 34 | sprite->setFlippedY(true); 35 | // sprite->setColor(cocos2d::ccGRAY); 36 | scene->addChild(sprite, 0); 37 | 38 | scene->addChild(layer); 39 | 40 | return scene; 41 | } 42 | 43 | bool PauseLayer::init() 44 | { 45 | if (!Layer::init()) 46 | { 47 | return false; 48 | } 49 | 50 | auto size = Director::getInstance()->getWinSize(); 51 | 52 | // 背景黑色的图片 53 | spriteOn = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("pauseBG1.png")); 54 | spriteDown = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("pauseBG2.png")); 55 | spriteOn->setPosition(size.width / 2, size.height + spriteOn->getContentSize().height / 2); 56 | spriteDown->setPosition(size.width / 2, - (spriteDown->getContentSize().height / 2)); 57 | this->addChild(spriteOn); 58 | this->addChild(spriteDown); 59 | 60 | /* 61 | 继续游戏按钮: X:630.5 Y349.0 62 | 声音按键:X:190.0 Y294.0 63 | 重置键按钮:X346.0 Y:294.0 64 | 返回关卡界面键按钮:X890.0 Y:294.0 65 | 下一关键按钮:X1053.0 Y:294.0 66 | */ 67 | // 继续游戏按钮 68 | auto resumeItem = MenuItemSprite::create( 69 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("playNormal.png")), 70 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("playSelected.png")), 71 | [&](Ref * ref){ 72 | PLAYEFFECT; 73 | //弹出保存的场景 74 | auto moveOn = MoveBy::create(0.5f, Point(0, (spriteOn->getContentSize().height))); 75 | auto moveDown = MoveBy::create(0.5f, Point(0, -spriteDown->getContentSize().height)); 76 | CallFunc* replace = CallFunc::create([](){Director::getInstance()->popScene();}); 77 | Action* resume = Sequence::create(moveOn, replace, NULL); 78 | spriteDown->runAction(moveDown); 79 | spriteOn->runAction(resume); 80 | }); 81 | resumeItem->setPosition(spriteOn->getContentSize().width / 2-5, 110.0f); 82 | 83 | // 返回游戏主界面 84 | auto startItem = MenuItemSprite::create( 85 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("backNormal.png")), 86 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("backSelected.png")), 87 | [](Ref * ref){ 88 | PLAYEFFECT; 89 | //弹出保存的场景 90 | Director::getInstance()->replaceScene(StartLayer::createScene());}); 91 | startItem->setPosition(890.0f, 180.0f); 92 | 93 | // 重新开始游戏 94 | auto againItem = MenuItemSprite::create( 95 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("againNormal.png")), 96 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("againSelected.png")), 97 | [](Ref * ref){ 98 | PLAYEFFECT; 99 | //弹出保存的场景 100 | Director::getInstance()->replaceScene(GameLayer::createScene());}); 101 | againItem->setPosition(346.0f, 180.0f); 102 | // 下一关 103 | auto nextItem = MenuItemSprite::create( 104 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("nextNormal.png")), 105 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("nextSelected.png")), 106 | [](Ref * ref){ 107 | PLAYEFFECT; 108 | //弹出保存的场景 109 | if (m_iSelectGate++ < 3) 110 | { 111 | Director::getInstance()->replaceScene(GameLayer::createScene()); 112 | } 113 | }); 114 | nextItem->setPosition(1053.0f, 180.0f); 115 | 116 | // 声音设置按钮 117 | auto musicOn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("musicOn.png")), 118 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("musicOff.png"))); 119 | auto musicOff = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("musicOff.png")), 120 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("musicSelected.png"))); 121 | auto musciToggle = MenuItemToggle::createWithTarget(this, menu_selector(PauseLayer::musicSet), musicOn, musicOff, NULL); 122 | musciToggle->setPosition(190.0f, 180.0f); 123 | 124 | auto menu = Menu::create(resumeItem, startItem, againItem, nextItem,musciToggle, NULL); 125 | menu->setPosition(Point::ZERO); 126 | spriteOn->addChild(menu); 127 | 128 | auto moveDown = MoveBy::create(0.6f, Point(0, - (spriteOn->getContentSize().height))); 129 | auto moveUp = MoveBy::create(0.6f, Point(0, spriteDown->getContentSize().height)); 130 | spriteOn->runAction(moveDown); 131 | spriteDown->runAction(moveUp); 132 | 133 | } 134 | 135 | void PauseLayer::musicSet(Ref* pSender) 136 | { 137 | PLAYEFFECT; 138 | auto musicTemp = (MenuItemToggle*)pSender; 139 | if (getBoolFromXML(SOUND_KEY)) 140 | { 141 | aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL)); 142 | aduioEngine->playEffect(""); 143 | } 144 | if (musicTemp->getSelectedIndex() == 1) 145 | { 146 | SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); 147 | } 148 | else 149 | { 150 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 151 | SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); 152 | } 153 | } -------------------------------------------------------------------------------- /PauseLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file PauseLayer.h 3 | * 4 | * \author SuooL 5 | * \date 六月 2015 6 | * 7 | * 暂停界面 8 | */ 9 | 10 | #ifndef __PauseLayer__H__ 11 | #define __PauseLayer__H__ 12 | #include "cocos2d.h" 13 | #include "extensions/cocos-ext.h" 14 | 15 | USING_NS_CC; 16 | using namespace cocos2d::extension; 17 | 18 | class PauseLayer : public Layer { 19 | public: 20 | static Scene* createScene(RenderTexture* rt); 21 | virtual bool init(); 22 | CREATE_FUNC(PauseLayer); 23 | 24 | Sprite* spriteOn; 25 | Sprite* spriteDown; 26 | 27 | void musicSet(Ref* pSender); 28 | 29 | private: 30 | 31 | }; 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cocos2d-x横版游戏功夫小子系列教程 2 | 3 | 这是我学习 Cocos2d-x 做的第一个游戏项目。由于是站在一个对 Cocos2d-x 一无所知的起点接的这个项目,所以做出来的效果和表现可想而知。整个游戏项目完成的过程也就是我的 Cocos2d-x 的学习过程,边学边做,就出来了这样一个半成品的游戏,代码实现和逻辑处理存在一定的问题,这里只是希望抛砖引玉,后面有时间我也会再次改进这个代码和设计。 4 | 5 | 这个教程的初衷是希望借助这个游戏项目带领那些想学习或者入门 Cocos2d-x 的人体会到 Cocos2d-x 的魅力,通过这个游戏教程学习 Cocos2d-x 的基本组件和核心模块。所以,本教程的意义不在于教你如何做出一个成功的表现卓越的游戏,而在于教你学习 Cocos2dx-x 本身以及思考如何实现一个游戏的功能和场景,并通过适时查看引擎的源码深入学习 Cocos 的一些基本组件和核心模块的设计。 6 | 7 | 8 | 教程分为视频教程和文字教程两种。 9 | ## 视频教程 10 | 视频教程是首发,已经在极客学院发布完毕。以下是各节课的链接地址: 11 | 12 | [Cocos2d-x项目实战开发:功夫小子之需求分析和开发准备](http://www.jikexueyuan.com/course/904.html?hmsr=teacher_suool_c904) 13 | 14 | [Cocos2d-x项目实战开发:功夫小子之基础类分析与实现](http://www.jikexueyuan.com/course/1005.html?hmsr=teacher_suool_c1005) 15 | 16 | [Cocos2d-x项目实战开发:功夫小子之过渡场景和开始菜单的实现](http://www.jikexueyuan.com/course/1280.html?hmsr=teacher_suool_c1280) 17 | 18 | [Cocos2d-x项目实战开发:功夫小子之设置功能和图籍场景的实现](http://www.jikexueyuan.com/course/1304.html?hmsr=teacher_suool_c1304) 19 | 20 | [Cocos2d-x项目实战开发:功夫小子之帮助场景和选关功能的实现](http://www.jikexueyuan.com/course/1399.html?hmsr=teacher_suool_c1399) 21 | 22 | [Cocos2d-x项目实战开发:功夫小子之游戏主功能场景的分析与实现](http://www.jikexueyuan.com/course/1425.html?hmsr=teacher_suool_c1425) 23 | 24 | [Cocos2d-x项目实战开发:功夫小子之游戏逻辑的功能分析与实现](http://www.jikexueyuan.com/course/1494.html?hmsr=teacher_suool_c1494) 25 | 26 | [Cocos2d-x项目实战开发:功夫小子之发布安卓版本和课程总结](http://www.jikexueyuan.com/course/1543.html?hmsr=teacher_suool_c1543) 27 | 28 | ## 文字教程 29 | 文字教程是视频教程的补充,当然还是希望您能够直接观看视频教程,更加详细。 30 | 31 | 文字教程首发在 CSDN,也在 Cocos 的官网进行了连载。下面是CSDN的地址: 32 | 33 | [Cocos2d-x项目实战开发:功夫小子之需求分析和开发准备](http://blog.csdn.net/suool/article/details/45789429) 34 | 35 | [Cocos2d-x项目实战开发:功夫小子之基础类分析与实现](http://blog.csdn.net/suool/article/details/46236317) 36 | 37 | [Cocos2d-x项目实战开发:功夫小子之过渡场景和开始菜单的实现](http://blog.csdn.net/suool/article/details/46416079) 38 | 39 | [Cocos2d-x项目实战开发:功夫小子之设置功能和图籍场景的实现](http://blog.csdn.net/suool/article/details/46553463) 40 | 41 | [Cocos2d-x项目实战开发:功夫小子之帮助场景和选关功能的实现](http://blog.csdn.net/suool/article/details/46661231) 42 | 43 | [Cocos2d-x项目实战开发:功夫小子之游戏主功能场景的分析与实现](http://blog.csdn.net/suool/article/details/46851335) 44 | 45 | [Cocos2d-x项目实战开发:功夫小子之游戏逻辑的功能分析与实现](http://blog.csdn.net/suool/article/details/47128637) 46 | 47 | [Cocos2d-x项目实战开发:功夫小子之发布安卓版本和课程总结](http://blog.csdn.net/suool/article/details/47129067) 48 | 49 | 在 Cocos 官网的连载专栏地址是: 50 | 51 | [Cocos 官网【功夫小子专栏】](http://cn.cocos2d-x.org/tutorial/lists?id=165) 52 | 53 | 下一个即将连载的系列教程是 Lua 脚本语言,也是将以视频的形式首发极客学院,同时也会有博文的形式出现,敬请期待~ 54 | 55 |
Written By SuooL_Hu
56 |
2015年7月30日 于校
57 | -------------------------------------------------------------------------------- /SelectGate.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/SelectGate.cpp -------------------------------------------------------------------------------- /SelectGate.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/SelectGate.h -------------------------------------------------------------------------------- /SetLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class SetLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 设置功能实现 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "cocos2d.h" 23 | #include "extensions/cocos-ext.h" 24 | #include "SetLayer.h" 25 | #include "GlobalDefine.h" 26 | #include "StartLayer.h" 27 | #include "SimpleAudioEngine.h" 28 | 29 | USING_NS_CC; 30 | using namespace cocos2d::extension; 31 | using namespace CocosDenshion; 32 | 33 | Scene* SetLayer::createScene() 34 | { 35 | Scene* setScene = Scene::create(); 36 | SetLayer* layer = SetLayer::create(); 37 | setScene->addChild(layer); 38 | return setScene; 39 | } 40 | 41 | bool SetLayer::init() 42 | { 43 | if (!Layer::init()) 44 | { 45 | return false; 46 | } 47 | 48 | float music = getFloatFromXML(MUSICVOL)*100.0f; 49 | float effect = getFloatFromXML(SOUNDVOL)*100.0f; 50 | 51 | auto BG = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("image-0.png")); 52 | BG->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 53 | //BG->setColor(cocos2d::ccGRAY); 54 | 55 | auto bgInterface = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("BGPicSet.png")); 56 | bgInterface->setPosition(WINSIZE.width / 2 + 50, WINSIZE.height / 2); 57 | 58 | auto closeBtn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("closeSetNormal.png")), 59 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("closeSetSelected.png")), CC_CALLBACK_1(SetLayer::closeBtn, this)); 60 | closeBtn->setPosition(WINSIZE.width - 150, WINSIZE.height - 100); 61 | 62 | 63 | auto saveBtn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SaveSettings.png")), 64 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SaveSettings.png")), CC_CALLBACK_1(SetLayer::saveSet, this)); 65 | saveBtn->setPosition(WINSIZE.width/2+40, WINSIZE.height / 2 - 190); 66 | 67 | auto musicOn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")), 68 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png"))); 69 | auto musicOff = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")), 70 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png"))); 71 | 72 | auto effectOn = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png")), 73 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("unchecked.png"))); 74 | auto effectOff = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png")), 75 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Hook.png"))); 76 | 77 | auto musicToggle = MenuItemToggle::createWithTarget(this, menu_selector(SetLayer::musicSet), musicOn, musicOff, NULL); 78 | musicToggle->setPosition(369.5, 457); 79 | auto effectToggle = MenuItemToggle::createWithTarget(this, menu_selector(SetLayer::effectSet), effectOn, effectOff, NULL); 80 | effectToggle->setPosition(369.5, 357); 81 | 82 | if (getBoolFromXML(MUSIC_KEY)) 83 | { 84 | musicToggle->setSelectedIndex(1); 85 | } 86 | else 87 | { 88 | musicToggle->setSelectedIndex(0); 89 | } 90 | if (getBoolFromXML(SOUND_KEY)) 91 | { 92 | effectToggle->setSelectedIndex(1); 93 | } 94 | else 95 | { 96 | effectToggle->setSelectedIndex(0); 97 | } 98 | 99 | auto menu = Menu::create(closeBtn, saveBtn, musicToggle, effectToggle, NULL); 100 | menu->setPosition(Point::ZERO); 101 | 102 | auto musicSlider = ControlSlider::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgBar.png")), 103 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("progressBar.png")), Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ThumbBtn.png"))); 104 | musicSlider->addTargetWithActionForControlEvents(this, cccontrol_selector(SetLayer::changeMusicVol), Control::EventType::VALUE_CHANGED); 105 | auto effectSlider = ControlSlider::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bgBar.png")), 106 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("progressBar.png")), Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ThumbBtn.png"))); 107 | effectSlider->addTargetWithActionForControlEvents(this, cccontrol_selector(SetLayer::changeEffectVol), Control::EventType::VALUE_CHANGED); 108 | musicSlider->setPosition(800, 457); 109 | musicSlider->setMinimumValue(0.0f); 110 | musicSlider->setMaximumValue(100.0f); 111 | musicSlider->setMinimumAllowedValue(0.0f); 112 | musicSlider->setMaximumAllowedValue(100.0f); 113 | 114 | musicSlider->setValue(music); 115 | effectSlider->setPosition(800, 357); 116 | effectSlider->setMinimumValue(0.0f); 117 | effectSlider->setMaximumValue(100.0f); 118 | effectSlider->setMinimumAllowedValue(0.0f); 119 | effectSlider->setMaximumAllowedValue(100.0f); 120 | effectSlider->setValue(effect); 121 | 122 | 123 | this->addChild(BG); 124 | this->addChild(bgInterface); 125 | this->addChild(musicSlider); 126 | this->addChild(effectSlider); 127 | this->addChild(menu); 128 | 129 | return true; 130 | 131 | } 132 | 133 | void SetLayer::changeMusicVol(Ref* pSender, Control::EventType type) 134 | { 135 | auto temp = (ControlSlider*)pSender; 136 | setFloatToXML(MUSICVOL, temp->getValue()/100.0f); 137 | UserDefault::getInstance()->flush(); 138 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 139 | } 140 | 141 | void SetLayer::changeEffectVol(Ref* pSender, Control::EventType type) 142 | { 143 | auto temp = (ControlSlider*)pSender; 144 | setFloatToXML(SOUNDVOL, temp->getValue()/100.0f); 145 | UserDefault::getInstance()->flush(); 146 | aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL)); 147 | } 148 | 149 | void SetLayer::closeBtn(Ref* pSender) 150 | { 151 | PLAYEFFECT; 152 | Director::getInstance()->replaceScene(StartLayer::createScene()); 153 | } 154 | 155 | 156 | void SetLayer::saveSet(Ref* pSender) 157 | { 158 | PLAYEFFECT; 159 | Director::getInstance()->replaceScene(StartLayer::createScene()); 160 | } 161 | 162 | void SetLayer::musicSet(Ref* pSender) 163 | { 164 | auto musicTemp = (MenuItemToggle*)pSender; 165 | PLAYEFFECT; 166 | if (musicTemp->getSelectedIndex() == 0) 167 | { 168 | setBoolToXML(MUSIC_KEY, false); 169 | UserDefault::getInstance()->flush(); 170 | SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); 171 | } 172 | else 173 | { 174 | setBoolToXML(MUSIC_KEY, true); 175 | UserDefault::getInstance()->flush(); 176 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 177 | SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); 178 | } 179 | } 180 | 181 | void SetLayer::effectSet(Ref* pSender) 182 | { 183 | auto effectTemp = (MenuItemToggle*)pSender; 184 | if (effectTemp->getSelectedIndex() == 0) 185 | { 186 | setBoolToXML(SOUND_KEY, false); 187 | UserDefault::getInstance()->flush(); 188 | } 189 | else 190 | { 191 | setBoolToXML(SOUND_KEY, true); 192 | UserDefault::getInstance()->flush(); 193 | } 194 | } -------------------------------------------------------------------------------- /SetLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file SetLayer.h 3 | * \date 2015/05/23 8:21 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 设置场景,用来设置音效,音乐,音量等 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | 16 | #ifndef __SetLayer__H__ 17 | #define __SetLayer__H__ 18 | #include "cocos2d.h" 19 | #include "extensions/cocos-ext.h" 20 | 21 | USING_NS_CC; 22 | using namespace cocos2d::extension; 23 | 24 | class SetLayer : public Layer { 25 | public: 26 | static Scene* createScene(); 27 | virtual bool init(); 28 | CREATE_FUNC(SetLayer); 29 | 30 | void changeMusicVol(Ref* pSender, Control::EventType type); 31 | void changeEffectVol(Ref* pSender, Control::EventType type); 32 | void saveSet(Ref* pSender); 33 | void closeBtn(Ref* pSender); 34 | void musicSet(Ref* pSender); 35 | void effectSet(Ref* pSender); 36 | 37 | }; 38 | 39 | #endif -------------------------------------------------------------------------------- /SplashLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file SplashLayer.cpp 3 | * \date 2015/05/17 21:59 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 过渡场景 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #include "SimpleAudioEngine.h" 16 | #include "GlobalDefine.h" 17 | #include "SplashLayer.h" 18 | #include "StartLayer.h" 19 | 20 | USING_NS_CC; 21 | using namespace CocosDenshion; 22 | 23 | Scene* SplashLayer::createScene() 24 | { 25 | Scene* splashScene = Scene::create(); 26 | SplashLayer* layer = SplashLayer::create(); 27 | splashScene->addChild(layer); 28 | return splashScene; 29 | } 30 | 31 | bool SplashLayer::init() 32 | { 33 | if (!Layer::init()) 34 | { 35 | return false; 36 | } 37 | 38 | // 初始化logo精灵 39 | logoSprite = Sprite::create("logo.png"); 40 | logoSprite->setPosition(WINSIZE.width/2, WINSIZE.height/2); 41 | this->addChild(logoSprite); 42 | 43 | // 首次运行初始化用户数据 44 | if (!getBoolFromXML("_IS_EXISTED")) 45 | { 46 | initUserData(); 47 | setBoolToXML("_IS_EXISTED", true); 48 | UserDefault::getInstance()->flush(); 49 | } 50 | 51 | setFloatToXML(SOUNDVOL, 0.80f); 52 | setFloatToXML(MUSICVOL, 0.35f); 53 | UserDefault::getInstance()->flush(); 54 | 55 | m_iNumOfLoad = 0; 56 | // 图片和声音的异步加载 57 | // 主界面 58 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/startGame.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 59 | // 图籍 60 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/gameLayer.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 61 | // 设置 62 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/setLayer.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 63 | // 秘籍 64 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/cheatsLayer.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 65 | // 选关 66 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/gateMap.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 67 | // 暂停 68 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/pauseLayer.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 69 | 70 | // 英雄 71 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/hero.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 72 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/heroComobo.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 73 | Director::getInstance()->getTextureCache()->addImageAsync("pnglist/heroGun.png", CC_CALLBACK_1(SplashLayer::loadingTextureCallBack, this)); 74 | 75 | _loadingAudioThread = new std::thread(&SplashLayer::loadingAudio, this); 76 | 77 | return true; 78 | } 79 | 80 | void SplashLayer::loadingTextureCallBack(Texture2D * texture) 81 | { 82 | switch (m_iNumOfLoad++) 83 | { 84 | case 0: 85 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/startGame.plist", texture); 86 | break; 87 | case 1: 88 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/gameLayer.plist", texture); 89 | break; 90 | case 2: 91 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/setLayer.plist", texture); 92 | break; 93 | case 3: 94 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/cheatsLayer.plist", texture); 95 | break; 96 | case 4: 97 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/gateMap.plist", texture); 98 | break; 99 | case 5: 100 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/pauseLayer.plist", texture); 101 | break; 102 | case 6: 103 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/hero.plist", texture); 104 | break; 105 | case 7: 106 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/heroComobo.plist", texture); 107 | break; 108 | case 8: 109 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/heroGun.plist", texture); 110 | this->schedule(schedule_selector(SplashLayer::nextScene), 1, 1, 1); 111 | break; 112 | default: 113 | break; 114 | } 115 | } 116 | 117 | void SplashLayer::loadingAudio() 118 | { 119 | log("loadAudio"); 120 | //初始化 音乐 121 | SimpleAudioEngine::getInstance()->preloadBackgroundMusic("Sound/startBGM.mp3"); 122 | //初始化音效 123 | SimpleAudioEngine::getInstance()->preloadEffect("Sound/button.wav"); 124 | } 125 | 126 | void SplashLayer::initUserData() 127 | { 128 | setIntToXML(GAMELEVEL_KEY, 1); // 初始化关卡 129 | setIntToXML(HEROENERGY_KEY, 10); // 初始化体力 130 | setIntToXML(HEROCOIN_KEY, 1000); // 初始化金币 131 | setBoolToXML(SOUND_KEY, true); 132 | setBoolToXML(MUSIC_KEY, true); 133 | // 刷新 134 | UserDefault::getInstance()->flush(); 135 | } 136 | 137 | void SplashLayer::nextScene(float dt) 138 | { 139 | Director::getInstance()->replaceScene(TransitionFade::create(2.0f, StartLayer::createScene())); 140 | } 141 | 142 | void SplashLayer::onExit() 143 | { 144 | Layer::onExit(); 145 | _loadingAudioThread->join(); 146 | CC_SAFE_DELETE(_loadingAudioThread); 147 | this->unschedule(schedule_selector(SplashLayer::nextScene)); 148 | } -------------------------------------------------------------------------------- /SplashLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file SplashLayer.h 3 | * 4 | * \author SuooL_振生 5 | * \date 三月 2015 6 | * 7 | * 工作室Logo Splash界面 8 | */ 9 | 10 | #ifndef __SplashScene__H__ 11 | #define __SplashScene__H__ 12 | 13 | #include "cocos2d.h" 14 | #include "SimpleAudioEngine.h" 15 | 16 | USING_NS_CC; 17 | 18 | class SplashLayer : public Layer 19 | { 20 | public: 21 | virtual bool init(); 22 | static Scene* createScene(); 23 | CREATE_FUNC(SplashLayer); 24 | 25 | private: 26 | Sprite* logoSprite; 27 | // 场景切换 28 | void nextScene(float dt); 29 | void loadingTextureCallBack(Texture2D * texture); 30 | void loadingAudio(); 31 | void onExit(); 32 | // 初始化用户数据 33 | void initUserData(); 34 | int m_iNumOfLoad; 35 | std::thread* _loadingAudioThread; 36 | }; 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /StartLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class StartLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 开始主界面,包含设置,开始游戏等控制按钮 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #include "cocos2d.h" 23 | #include "SimpleAudioEngine.h" 24 | #include "GlobalDefine.h" 25 | #include "StartLayer.h" 26 | #include "MijiLayer.h" 27 | #include "SetLayer.h" 28 | #include "TujiLayer.h" 29 | #include "HelpLayer.h" 30 | #include "GateMapLayer.h" 31 | #include "HelloWorldScene.h" 32 | 33 | 34 | using namespace cocos2d; 35 | using namespace CocosDenshion; 36 | 37 | Scene* StartLayer::createScene() 38 | { 39 | Scene* startScene = Scene::create(); 40 | StartLayer* layer = StartLayer::create(); 41 | startScene->addChild(layer); 42 | 43 | return startScene; 44 | } 45 | 46 | bool StartLayer::init() 47 | { 48 | if (!Layer::init()) 49 | { 50 | return false; 51 | } 52 | 53 | // 加载游戏图片资源缓存 54 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/galleryLayer.plist"); 55 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/monster.plist"); 56 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/resultLayer.plist"); 57 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapBg.plist"); 58 | SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapMid.plist"); 59 | 60 | // 根据音乐的开关来播放背景音乐 61 | if (getBoolFromXML(MUSIC_KEY)) 62 | { 63 | float music = getFloatFromXML(MUSICVOL)*100.0f; 64 | aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL)); 65 | if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()) 66 | { 67 | aduioEngine->pauseBackgroundMusic(); 68 | aduioEngine->playBackgroundMusic("Sound/startBGM.mp3", true); 69 | } 70 | else 71 | aduioEngine->playBackgroundMusic("Sound/startBGM.mp3", true); 72 | } 73 | else 74 | aduioEngine->pauseBackgroundMusic(); 75 | 76 | // 精灵初始化及位置设定 77 | title = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Title.png")); 78 | title->setPosition(WINSIZE.width / 2 - 222, WINSIZE.height / 2 + 186); 79 | bgPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("MainMenuBackground.png")); 80 | bgPic->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 81 | 82 | this->addChild(bgPic); 83 | this->addChild(title); 84 | 85 | // 按钮初始化以及时间绑定 86 | auto helpItem = MenuItemSprite::create( 87 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("HelpNormal.png")), 88 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("HelpSelected.png")), 89 | CC_CALLBACK_1(StartLayer::touchHelp, this)); // 帮助 90 | 91 | auto tujiItem = MenuItemSprite::create( 92 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PhotoGalleryNormal.png")), 93 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PhotoGallerySelected.png")), 94 | CC_CALLBACK_1(StartLayer::touchLib, this)); // 图籍 95 | 96 | auto setItem = MenuItemSprite::create( 97 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SetNormal.png")), 98 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SetSelected.png")), 99 | CC_CALLBACK_1(StartLayer::touchSet, this)); // 设置 100 | 101 | 102 | auto mijiItem = MenuItemSprite::create( 103 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsNormal.png")), 104 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsSelected.png")), 105 | CC_CALLBACK_1(StartLayer::touchMiJi, this)); // 秘籍 106 | 107 | auto chuangguanItem = MenuItemSprite::create( 108 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("EmigratedNormal.png")), 109 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("EmigratedSelected.png")), 110 | CC_CALLBACK_1(StartLayer::touchCG, this)); // 闯关 111 | 112 | auto tiaozhanItem = MenuItemSprite::create( 113 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ChallengeNormal.png")), 114 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ChallengeSelected.png")), 115 | CC_CALLBACK_1(StartLayer::touchTZ, this)); // 挑战 116 | 117 | tujiItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 73); 118 | mijiItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 209); 119 | setItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 346); 120 | helpItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 473); 121 | chuangguanItem->setPosition(WINSIZE.width / 2 - 240, WINSIZE.height / 2 - 86); 122 | tiaozhanItem->setPosition(WINSIZE.width / 2 - 240, WINSIZE.height / 2 - 250); 123 | 124 | 125 | auto menu = Menu::create(tujiItem,mijiItem, setItem, helpItem, chuangguanItem, tiaozhanItem, NULL); 126 | menu->setPosition(Point::ZERO); 127 | this->addChild(menu, 2); 128 | 129 | 130 | return true; 131 | } 132 | 133 | // 按钮事件实现 134 | void StartLayer::touchSet(Ref* pSender) 135 | { 136 | PLAYEFFECT; 137 | Director::getInstance()->replaceScene(SetLayer::createScene()); 138 | } 139 | 140 | void StartLayer::touchLib(Ref* pSender) 141 | { 142 | PLAYEFFECT; 143 | Director::getInstance()->replaceScene(TujiLayer::createScene()); 144 | } 145 | 146 | void StartLayer::touchMiJi(Ref* pSender) 147 | { 148 | PLAYEFFECT; 149 | Director::getInstance()->replaceScene(MijiLayer::createScene()); 150 | } 151 | 152 | void StartLayer::touchCG(Ref* pSender) 153 | { 154 | if (getBoolFromXML(SOUND_KEY)) 155 | { 156 | aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL)); 157 | aduioEngine->playEffect("Sound/button.mp3"); 158 | } 159 | Director::getInstance()->replaceScene(GateMapLayer::createScene()); 160 | } 161 | 162 | void StartLayer::touchTZ(Ref* pSender) 163 | { 164 | PLAYEFFECT; 165 | // Director::getInstance()->replaceScene(GateMapLayer::createScene()); 166 | } 167 | 168 | void StartLayer::touchHelp(Ref* pSender) 169 | { 170 | PLAYEFFECT; 171 | Director::getInstance()->replaceScene(HelpLayer::createScene()); 172 | } 173 | -------------------------------------------------------------------------------- /StartLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \class StartLayer 3 | * 4 | * \ingroup GroupName 5 | * 6 | * \brief 开始主菜单场景 7 | * 8 | * TODO: long description 9 | * 10 | * \note 11 | * 12 | * \author SuooL 13 | * 14 | * \version 1.0 15 | * 16 | * \date 五月 2015 17 | * 18 | * Contact: hu1020935219@gmail.com 19 | * 20 | */ 21 | 22 | #ifndef __StartLayer__H__ 23 | #define __StartLayer__H__ 24 | 25 | #include "cocos2d.h" 26 | #include "extensions/cocos-ext.h" 27 | #include "SimpleAudioEngine.h" 28 | 29 | USING_NS_CC; 30 | USING_NS_CC_EXT; 31 | 32 | class StartLayer : Layer 33 | { 34 | public: 35 | virtual bool init(); 36 | static Scene* createScene(); 37 | CREATE_FUNC(StartLayer); 38 | private: 39 | // 开始主界面的按钮控件监控事件 40 | void touchSet(Ref* pSender); 41 | void touchLib(Ref* pSender); 42 | void touchMiJi(Ref* pSender); 43 | void touchCG(Ref* pSender); 44 | void touchTZ(Ref* pSender); 45 | void touchHelp(Ref* pSender); 46 | 47 | // 图片精灵 48 | Sprite* title; 49 | Sprite* bgPic; 50 | 51 | }; 52 | 53 | #endif -------------------------------------------------------------------------------- /TujiLayer.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file TujiLayer.cpp 3 | * \date 2015/04/12 22:45 4 | * 5 | * \author SuooL_振生 6 | * Contact: 1020935219@qq.com 7 | * 8 | * \brief 9 | * 10 | * \version 1.0 11 | * 12 | * TODO: long description 13 | * 14 | * \note 15 | */ 16 | #include "TujiLayer.h" 17 | #include "StartLayer.h" 18 | #include "IconvString.h" 19 | #include "XMLParser.h" 20 | #include "GlobalDefine.h" 21 | #include "cocos2d.h" 22 | #include "extensions/cocos-ext.h" 23 | 24 | USING_NS_CC; 25 | USING_NS_CC_EXT; 26 | 27 | Scene* TujiLayer::createScene() 28 | { 29 | Scene* scene = Scene::create(); 30 | TujiLayer* tjLayer = TujiLayer::create(); 31 | scene->addChild(tjLayer); 32 | 33 | return scene; 34 | } 35 | 36 | bool TujiLayer::init() 37 | { 38 | if (!Layer::init()) 39 | { 40 | return false; 41 | } 42 | 43 | m_iBeforeSel = 0; 44 | 45 | // 背景 46 | auto bgSprite = Sprite::create("PhotoGalleryBackground.png"); 47 | bgSprite->setPosition(WINSIZE.width / 2, WINSIZE.height / 2); 48 | this->addChild(bgSprite); 49 | 50 | auto closeItem = MenuItemSprite::create( 51 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("GalleryOffNormal.png")), 52 | Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("GalleryOffSelected.png")), 53 | [&](Ref * ref){ 54 | PLAYEFFECT; 55 | //弹出场景 56 | Director::getInstance()->replaceScene(StartLayer::createScene()); }); 57 | // 关闭按钮 58 | closeItem->setPosition(WINSIZE.width/2+580, WINSIZE.height/2+320); 59 | auto menu = Menu::create(closeItem, NULL); 60 | menu->setPosition(Point::ZERO); 61 | bgSprite->addChild(menu); 62 | 63 | // 怪物图鉴 64 | // char *inBuf = "木\n桩\n怪"; 65 | // size_t inLen = strlen(inBuf); 66 | // size_t outLen = inLen << 1; 67 | // char *outBuf = (char *)malloc(outLen); 68 | // gbk2utf8(inBuf, inLen, outBuf, outLen); 69 | 70 | XMLParser *pXmlParser = XMLParser::parseWithFile("tujiLayer.xml"); 71 | String *mz = pXmlParser->getString("muzhuang"); 72 | 73 | m_pMZ_Pic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ManWood.png")); 74 | m_pMZ_Txt = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Text.png")); 75 | m_pMZLabel = LabelTTF::create(mz->getCString(), "", 30); 76 | m_pMZLabel->setColor(ccc3(0, 255, 255)); 77 | 78 | // free(outBuf); 79 | m_pLion_Pic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ManLion.png")); 80 | m_pLionLabel = LabelTTF::create("狮\n子\n怪 ", "", 30); 81 | m_pLionLabel->setColor(ccc3(0, 255, 255)); 82 | m_pStone_Pic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ManStone.png")); 83 | m_pStoneLabel = LabelTTF::create("石\n头\n怪 ", "", 30); 84 | m_pStoneLabel->setColor(ccc3(0, 255, 255)); 85 | m_pStoneLabel->setRotation(90); 86 | 87 | m_pMZ_Pic->setPosition(WINSIZE.width / 2 + 50, WINSIZE.height / 2); 88 | m_pMZ_Pic->setVisible(true); 89 | m_pMZ_Txt->setPosition(WINSIZE.width / 2 + 460, WINSIZE.height / 2 ); 90 | m_pMZ_Txt->setVisible(true); 91 | m_pMZLabel->setPosition(WINSIZE.width / 2 + 265, WINSIZE.height / 2 - 120); 92 | m_pMZLabel->setVisible(true); 93 | 94 | m_pLion_Pic->setPosition(WINSIZE.width / 2+50, WINSIZE.height / 2); 95 | m_pLion_Pic->setVisible(false); 96 | m_pLionLabel->setPosition(WINSIZE.width / 2 + 265, WINSIZE.height / 2 - 120); 97 | m_pLionLabel->setVisible(false); 98 | 99 | m_pStone_Pic->setPosition(WINSIZE.width / 2 , WINSIZE.height / 2 ); 100 | m_pStone_Pic->setVisible(false); 101 | m_pStoneLabel->setPosition(WINSIZE.width / 2 + 265, WINSIZE.height / 2 - 120); 102 | m_pStoneLabel->setVisible(false); 103 | 104 | bgSprite->addChild(m_pMZ_Pic); 105 | bgSprite->addChild(m_pMZ_Txt); 106 | bgSprite->addChild(m_pMZLabel); 107 | bgSprite->addChild(m_pLion_Pic); 108 | bgSprite->addChild(m_pLionLabel); 109 | bgSprite->addChild(m_pStone_Pic); 110 | bgSprite->addChild(m_pStoneLabel); 111 | 112 | listView = ListView::create(); 113 | listView->setDirection(SCROLLVIEW_DIR_VERTICAL); 114 | listView->setTouchEnabled(true); 115 | listView->setBounceEnabled(true); // 反弹 116 | listView->setSize(Size(445, 500)); 117 | listView->ignoreContentAdaptWithSize(false); 118 | listView->setAnchorPoint(Point(0.0, 0.0)); 119 | listView->setPosition(Point(0, WINSIZE.height / 4)); 120 | listView->addEventListenerListView(this, SEL_ListViewEvent(&TujiLayer::selectedItemEvent)); 121 | 122 | bgSprite->addChild(listView); 123 | 124 | Button* default_button = Button::create("Cell_0.png", "CellSel_0.png", "", UI_TEX_TYPE_PLIST); 125 | 126 | default_button->setName("Title Button"); 127 | 128 | Layout* default_item = Layout::create(); 129 | default_item->setTouchEnabled(true); 130 | default_item->setSize(default_button->getSize()); 131 | default_button->setPosition(Point(default_item->getSize().width / 2.0f, 132 | default_item->getSize().height / 2.0f)); 133 | default_item->addChild(default_button); 134 | 135 | // set model 将创建的模板设置为项目模板 136 | listView->setItemModel(default_item); 137 | 138 | 139 | // 1 140 | Button* custom_buttonMZ = Button::create("CellSel_0.png", "Cell_0.png", "", UI_TEX_TYPE_PLIST); 141 | custom_buttonMZ->setName("one Button"); 142 | custom_buttonMZ->setScale9Enabled(true); 143 | custom_buttonMZ->setSize(default_button->getSize()); 144 | Layout *custom_itemMZ = Layout::create(); 145 | custom_itemMZ->setSize(custom_buttonMZ->getSize()); 146 | custom_buttonMZ->setPosition(Point(custom_itemMZ->getSize().width / 2.0f, custom_itemMZ->getSize().height / 2.0f)); 147 | custom_itemMZ->addChild(custom_buttonMZ); 148 | 149 | // 2 150 | Button* custom_buttonLion = Button::create("CellSel_1.png", "Cell_1.png", "", UI_TEX_TYPE_PLIST); 151 | custom_buttonLion->setName("two Button"); 152 | custom_buttonLion->setScale9Enabled(true); 153 | custom_buttonLion->setSize(default_button->getSize()); 154 | Layout *custom_itemLion = Layout::create(); 155 | custom_itemLion->setSize(custom_buttonLion->getSize()); 156 | custom_buttonLion->setPosition(Point(custom_itemLion->getSize().width / 2.0f, custom_itemLion->getSize().height / 2.0f)); 157 | custom_itemLion->addChild(custom_buttonLion); 158 | 159 | // 3 160 | Button* custom_buttonStone = Button::create("CellSel_2.png", "Cell_2.png", "", UI_TEX_TYPE_PLIST); 161 | custom_buttonStone->setName("three Button"); 162 | custom_buttonStone->setScale9Enabled(true); 163 | custom_buttonStone->setSize(default_button->getSize()); 164 | Layout *custom_itemStone = Layout::create(); 165 | custom_itemStone->setSize(custom_buttonStone->getSize()); 166 | custom_buttonStone->setPosition(Point(custom_itemStone->getSize().width / 2.0f, custom_itemStone->getSize().height / 2.0f)); 167 | custom_itemStone->addChild(custom_buttonStone); 168 | 169 | // 4 170 | Button* custom_buttonWood = Button::create("CellSel_3.png", "Cell_3.png", "", UI_TEX_TYPE_PLIST); 171 | custom_buttonWood->setName("four Button"); 172 | custom_buttonWood->setScale9Enabled(true); 173 | custom_buttonWood->setSize(default_button->getSize()); 174 | Layout *custom_itemWood = Layout::create(); 175 | custom_itemWood->setSize(custom_buttonWood->getSize()); 176 | custom_buttonWood->setPosition(Point(custom_itemWood->getSize().width / 2.0f, custom_itemWood->getSize().height / 2.0f)); 177 | custom_itemWood->addChild(custom_buttonWood); 178 | 179 | listView->pushBackCustomItem(custom_itemMZ); 180 | listView->pushBackCustomItem(custom_itemLion); 181 | listView->pushBackCustomItem(custom_itemStone); 182 | listView->pushBackCustomItem(custom_itemWood); 183 | 184 | 185 | return true; 186 | } 187 | 188 | // ListView触摸监听 189 | void TujiLayer::selectedItemEvent(Ref* pSender, ListViewEventType type)//ListView触摸事件 190 | { 191 | ListView* listView = static_cast(pSender); 192 | CC_UNUSED_PARAM(listView); 193 | 194 | // if (m_iBeforeSel == listView->getCurSelectedIndex()) 195 | // { 196 | // return; 197 | // } 198 | // String *normalBtn = String::createWithFormat("Cell_%d.png", m_iBeforeSel); 199 | // String *SelctBtn = String::createWithFormat("CellSel_%d.png", listView->getCurSelectedIndex()); 200 | 201 | m_iBeforeSel = listView->getCurSelectedIndex(); 202 | 203 | switch (m_iBeforeSel) 204 | { 205 | case 0: 206 | m_pMZ_Pic->setVisible(true); 207 | m_pMZ_Txt->setVisible(true); 208 | m_pMZLabel->setVisible(true); 209 | m_pLion_Pic->setVisible(false); 210 | m_pLionLabel->setVisible(false); 211 | m_pStone_Pic->setVisible(false); 212 | m_pStoneLabel->setVisible(false); 213 | break; 214 | case 1: 215 | m_pMZ_Pic->setVisible(false); 216 | m_pMZLabel->setVisible(false); 217 | m_pMZ_Txt->setVisible(false); 218 | m_pLionLabel->setVisible(true); 219 | m_pLion_Pic->setVisible(true); 220 | m_pStoneLabel->setVisible(false); 221 | m_pStone_Pic->setVisible(false); 222 | break; 223 | case 2: 224 | m_pMZ_Pic->setVisible(false); 225 | m_pMZ_Txt->setVisible(false); 226 | m_pMZLabel->setVisible(false); 227 | m_pLion_Pic->setVisible(false); 228 | m_pLionLabel->setVisible(false); 229 | m_pStone_Pic->setVisible(true); 230 | m_pStoneLabel->setVisible(true); 231 | break; 232 | case 3: 233 | m_pMZ_Pic->setVisible(false); 234 | m_pMZ_Txt->setVisible(false); 235 | m_pLion_Pic->setVisible(false); 236 | m_pStone_Pic->setVisible(false); 237 | m_pLionLabel->setVisible(false); 238 | m_pStoneLabel->setVisible(false); 239 | m_pMZLabel->setVisible(false); 240 | break; 241 | default: 242 | break; 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /TujiLayer.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * \file TujiLayer.h 3 | * \date 2015/05/23 13:54 4 | * 5 | * \author SuooL 6 | * Contact: hu1020935219@gmail.com 7 | * 8 | * \brief 图籍场景的实现 9 | * 10 | * TODO: long description 11 | * 12 | * \note 13 | */ 14 | 15 | #ifndef __TujiLayer__H__ 16 | #define __TujiLayer__H__ 17 | 18 | #include "cocos2d.h" 19 | #include "ui/CocosGUI.h" 20 | #include "extensions/cocos-ext.h" 21 | USING_NS_CC; 22 | USING_NS_CC_EXT; 23 | using namespace ui; 24 | 25 | class TujiLayer : public Layer 26 | { 27 | public: 28 | static Scene* createScene(); 29 | virtual bool init(); 30 | CREATE_FUNC(TujiLayer); 31 | 32 | ListView* listView; 33 | 34 | void selectedItemEvent(Ref* pSender, ListViewEventType type); // ListView触摸事件 35 | 36 | private: 37 | size_t m_iBeforeSel; 38 | Sprite* m_pMZ_Pic; 39 | LabelTTF* m_pMZLabel; 40 | Sprite* m_pMZ_Txt; 41 | Sprite* m_pLion_Pic; 42 | LabelTTF* m_pLionLabel; 43 | Sprite* m_pStone_Pic ; 44 | LabelTTF* m_pStoneLabel; 45 | 46 | }; 47 | 48 | #endif -------------------------------------------------------------------------------- /XMLParser.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/XMLParser.cpp -------------------------------------------------------------------------------- /XMLParser.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SuooL/KungfuBoy/5fe8a89fecbe4f4eb5e6e4bbcdbf4e47bfbcad8c/XMLParser.h -------------------------------------------------------------------------------- /请先阅读我.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\adeflang1025\ansi\ansicpg936\uc2\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe2052\themelang1033\themelangfe2052\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} 2 | {\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};} 3 | {\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;} 4 | {\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};} 5 | {\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} 6 | {\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};} 7 | {\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} 8 | {\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} 9 | {\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} 10 | {\f173\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f173\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} 11 | {\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} 12 | {\f433\fbidi \fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} 13 | {\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} 14 | {\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} 15 | {\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;} 16 | {\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;} 17 | {\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} 18 | {\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} 19 | {\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} 20 | {\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} 21 | {\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} 22 | {\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};} 23 | {\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} 24 | {\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} 25 | {\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} 26 | {\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} 27 | {\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; 28 | \red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green176\blue80;}{\*\defchp 29 | \fs21\kerning2\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ 30 | \qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs21\lang1033\langfe2052\kerning2\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 31 | \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* 32 | \ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 33 | \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs21\alang1025 \ltrch\fcs0 \fs21\lang1033\langfe2052\kerning2\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 34 | \snext11 \ssemihidden \sunhideused Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \sunhideused \styrsid16396533 Hyperlink;}{ 35 | \s16\qj \fi420\li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\cufi200 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs21\lang1033\langfe2052\kerning2\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 36 | \sbasedon0 \snext16 \sqformat \spriority34 \styrsid12987973 List Paragraph;}}{\*\listtable{\list\listtemplateid-1119588084\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext 37 | \leveltemplateid67698705\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li420\lin420 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 38 | \leveltemplateid67698713\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li840\lin840 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 39 | \leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1260\lin1260 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 40 | \leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1680\lin1680 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 41 | \leveltemplateid67698713\'02\'04);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2100\lin2100 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 42 | \leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 43 | \leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2940\lin2940 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 44 | \leveltemplateid67698713\'02\'07);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3360\lin3360 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 45 | \leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3780\lin3780 }{\listname ;}\listid320155636}{\list\listtemplateid-286341442\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 46 | \levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1649497576\'02\'00\'a3\'a9;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1 47 | \lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li840\lin840 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative 48 | \levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1260\lin1260 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 49 | \levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1680\lin1680 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 50 | {\leveltext\leveltemplateid67698713\'02\'04);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2100\lin2100 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 51 | \leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 52 | \leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2940\lin2940 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 53 | \leveltemplateid67698713\'02\'07);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3360\lin3360 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 54 | \leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3780\lin3780 }{\listname ;}\listid353767559}{\list\listtemplateid-384004998\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0 55 | \levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698705\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li420\lin420 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative 56 | \levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li840\lin840 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 57 | \levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1260\lin1260 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 58 | {\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li1680\lin1680 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 59 | \leveltemplateid67698713\'02\'04);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2100\lin2100 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 60 | \leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 61 | \leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li2940\lin2940 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 62 | \leveltemplateid67698713\'02\'07);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3360\lin3360 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext 63 | \leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-420\li3780\lin3780 }{\listname ;}\listid749542737}}{\*\listoverridetable{\listoverride\listid353767559\listoverridecount0\ls1}{\listoverride\listid320155636 64 | \listoverridecount0\ls2}{\listoverride\listid749542737\listoverridecount0\ls3}}{\*\rsidtbl \rsid556879\rsid610100\rsid925434\rsid1120783\rsid1203508\rsid2294833\rsid2891379\rsid3748962\rsid4654734\rsid4737559\rsid4871704\rsid5077835\rsid5325643 65 | \rsid6367409\rsid6962086\rsid7413974\rsid7502948\rsid7938158\rsid8014025\rsid8141753\rsid8153312\rsid9001525\rsid9010431\rsid9254048\rsid9584868\rsid9982137\rsid10305489\rsid10433414\rsid10570949\rsid10697708\rsid10951378\rsid12274742\rsid12652700 66 | \rsid12987973\rsid13786388\rsid14222357\rsid14554045\rsid14702909\rsid14879790\rsid15169943\rsid15426247\rsid15680689\rsid16011783\rsid16396533\rsid16398855\rsid16587670}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0 67 | \mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author \'ba\'fa\'d5\'f1\'bd\'dc}{\operator \'ba\'fa\'d5\'f1\'bd\'dc}{\creatim\yr2015\mo5\dy10\hr16\min51}{\revtim\yr2015\mo6\dy15\hr20\min24}{\version35}{\edmins152}{\nofpages1}{\nofwords59} 68 | {\nofchars338}{\*\company china}{\nofcharsws396}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect 69 | \deftab420\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\formshade\horzdoc\dgmargin\dghspace180\dgvspace156 70 | \dghorigin1800\dgvorigin1440\dghshow0\dgvshow2\jcompress\lnongrid 71 | \viewkind1\viewscale108\splytwnine\ftnlytwnine\htmautsp\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot7502948\newtblstyruls 72 | \nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat {\upr{\*\fchars 73 | !%),.:\'3b>?]\'7d\'a1\'e9\'a1\'a7\'a1\'e3\'a1\'a4\'a1\'a6\'a1\'a5\'a8\'44\'a1\'ac\'a1\'af\'a1\'b1\'a1\'ad\'a1\'eb\'a1\'e4\'a1\'e5?\'a1\'e6\'a1\'c3\'a1\'a2\'a1\'a3\'a1\'a8\'a1\'b5\'a1\'b7\'a1\'b9\'a1\'bb\'a1\'bf\'a1\'b3\'a1\'bd\'a8\'95\'a6\'e1\'a6\'e3\'a6\'e7\'a6\'e5\'a6\'eb\'a9\'77\'a9\'79\'a9\'7b\'a3\'a1\'a3\'a2\'a3\'a5\'a3\'a7\'a3\'a9\'a3\'ac\'a3\'ae\'a3\'ba\'a3\'bb\'a3\'bf\'a3\'dd\'a3\'e0\'a3\'fc\'a3\'fd\'a1\'ab\'a1\'e9 74 | }{\*\ud\uc0{\*\fchars 75 | !%),.:\'3b>?]\'7d{\uc2\u162 \'a1\'e9\'a1\'a7\'a1\'e3\'a1\'a4\'a1\'a6\'a1\'a5\'a8D\'a1\'ac\'a1\'af\'a1\'b1\'a1\'ad\'a1\'eb\'a1\'e4\'a1\'e5}{\uc1\u8250 ?\'a1\'e6\'a1\'c3\'a1\'a2\'a1\'a3\'a1\'a8\'a1\'b5\'a1\'b7\'a1\'b9\'a1\'bb\'a1\'bf\'a1\'b3\'a1\'bd\'a8\'95\'a6\'e1\'a6\'e3\'a6\'e7\'a6\'e5\'a6\'eb\'a9w\'a9y\'a9\'7b\'a3\'a1\'a3\'a2\'a3\'a5\'a3\'a7\'a3\'a9\'a3\'ac\'a3\'ae\'a3\'ba\'a3\'bb\'a3\'bf\'a3\'dd\'a3\'e0\'a3\'fc\'a3\'fd\'a1\'ab\'a1\'e9} 76 | }}}{\upr{\*\lchars $([\'7b\'a1\'ea\'a3\'a4\'a1\'a4\'a1\'ae\'a1\'b0\'a1\'b4\'a1\'b6\'a1\'b8\'a1\'ba\'a1\'be\'a1\'b2\'a1\'bc\'a8\'94\'a9\'76\'a9\'78\'a9\'7a\'a1\'e7\'a3\'a8\'a3\'ae\'a3\'db\'a3\'fb\'a1\'ea\'a3\'a4}{\*\ud\uc0{\*\lchars 77 | $([\'7b{\uc2\u163 \'a1\'ea\u165 \'a3\'a4\'a1\'a4\'a1\'ae\'a1\'b0\'a1\'b4\'a1\'b6\'a1\'b8\'a1\'ba\'a1\'be\'a1\'b2\'a1\'bc\'a8\'94\'a9v\'a9x\'a9z\'a1\'e7\'a3\'a8\'a3\'ae\'a3\'db\'a3\'fb\'a1\'ea\'a3\'a4}}}}\fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1 78 | \ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery851\footery992\colsx425\endnhere\sectlinegrid312\sectspecifyl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \dbch .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang 79 | {\pntxta \dbch .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \dbch .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta \dbch )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl6 80 | \pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}{\*\pnseclvl9 81 | \pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \dbch (}{\pntxta \dbch )}}\pard\plain \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 82 | \fs21\lang1033\langfe2052\kerning2\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1120783 \loch\af31506\hich\af31506\dbch\f31505 \'b1\'be\'bd\'da\'bf\'ce\'b5\'c4\'b4\'fa\'c2\'eb}{\rtlch\fcs1 83 | \af0 \ltrch\fcs0 \insrsid5077835 \loch\af31506\hich\af31506\dbch\f31505 \'ba\'cd\'d7\'ca\'d4\'b4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1120783 \loch\af31506\hich\af31506\dbch\f31505 \'b7\'ee\'c9\'cf\'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1120783 84 | 85 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid2891379 86 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid10951378 \loch\af31506\hich\af31506\dbch\f31505 \'d5\'e2\'bd\'da\'bf\'ce\'d6\'f7\'d2\'aa\'ca\'c7\'bd\'e2\'be\'f6}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid4737559 \loch\af31506\hich\af31506\dbch\f31505 87 | \'d3\'ce\'cf\'b7\'ba\'cb\'d0\'c4\'b3\'a1\'be\'b0\'b5\'c4\'c2\'df\'bc\'ad\'ca\'b5\'cf\'d6}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid10951378 \loch\af31506\hich\af31506\dbch\f31505 \'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid2891379 88 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid10951378 89 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 \loch\af31506\hich\af31506\dbch\f31505 \'d4\'da\'d6\'ae\'c7\'b0\'b5\'c4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 \hich\af31506\dbch\af31505\loch\f31506 ActionTool}{\rtlch\fcs1 \af0 \ltrch\fcs0 90 | \insrsid4737559 \loch\af31506\hich\af31506\dbch\f31505 \'b4\'fa\'c2\'eb\'d6\'d0\'d3\'d0}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 \hich\af31506\dbch\af31505\loch\f31506 Bug}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 91 | \loch\af31506\hich\af31506\dbch\f31505 \'a3\'ac}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid610100 \loch\af31506\hich\af31506\dbch\f31505 \'be\'df\'cc\'e5\'b4\'ed\'ce\'f3\'be\'cd\'ca\'c7\'b6\'af\'bb\'ad\'d6\'a1\'cd\'bc\'c6\'ac\'c3\'fb\'d7\'d6\'ba\'f3\'d7\'ba}{ 92 | \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid610100 \hich\af31506\dbch\af31505\loch\f31506 .png}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid610100 \loch\af31506\hich\af31506\dbch\f31505 \'b1\'bb\'d2\'c5\'c2\'a9\'c1\'cb\'a3\'ac\'b6\'af\'bb\'ad\'b5\'c4\'d1\'ad\'bb\'b7 93 | \'b2\'a5\'b7\'c5\'ca\'f4\'d0\'d4\'c3\'bb\'d3\'d0\'c9\'e8\'d6\'c3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 \loch\af31506\hich\af31506\dbch\f31505 \'a1\'a3\'b4\'f3\'bc\'d2\'c7\'eb\'bd\'ab\'d5\'e2\'b4\'ce\'cc\'e1\'b9\'a9\'b5\'c4\'b6\'af\'bb\'ad\'b4\'b4 94 | \'bd\'a8\'c6\'f7\'b4\'fa\'c2\'eb\'cc\'e6\'bb\'bb\'d4\'ad\'d3\'d0\'b5\'c4\'b4\'fa\'c2\'eb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid610100 \loch\af31506\hich\af31506\dbch\f31505 \'a3\'ac}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14879790 95 | \loch\af31506\hich\af31506\dbch\f31505 \'b6\'d4\'b1\'c8}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid610100 \loch\af31506\hich\af31506\dbch\f31505 \'bf\'c9\'bf\'b4\'b3\'f6\'d4\'ad\'d3\'d0\'b4\'fa\'c2\'eb\'b5\'c4\'b4\'ed\'ce\'f3\'d4\'da\'c4\'c4\'b6\'f9}{ 96 | \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4737559 \loch\af31506\hich\af31506\dbch\f31505 \'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2891379 97 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid4737559 98 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid2294833\charrsid15426247 \loch\af31506\hich\af31506\dbch\f31505 \'c6\'e4\'b4\'ce\'b9\'d8\'d3\'da\'d7\'ca\'d4\'b4\'b5\'c4\'cb\'b5\'c3\'f7\'a3\'ba}{\rtlch\fcs1 \af0 \ltrch\fcs0 99 | \b\cf17\insrsid9001525\charrsid15426247 100 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10433414 \loch\af31506\hich\af31506\dbch\f31505 \'b4\'fa\'c2\'eb\'bb\'b9\'ca\'c7\'d4\'da}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10433414 \hich\af31506\dbch\af31505\loch\f31506 class}{\rtlch\fcs1 \af0 \ltrch\fcs0 101 | \insrsid10433414 \loch\af31506\hich\af31506\dbch\f31505 \'c4\'bf\'c2\'bc\'cf\'c2\'c3\'e6\'a3\'ac\'ce\'d2\'c3\'c7\'cb\'e6\'d7\'c5\'bf\'ce\'b3\'cc\'b5\'c4\'c9\'ee\'c8\'eb\'bd\'f8\'d0\'d0\'bb\'e1\'b6\'d4\'d6\'ae\'c7\'b0\'b5\'c4\'b4\'fa\'c2\'eb\'d3\'d0 102 | \'d2\'bb\'d0\'a9\'d4\'f6\'c9\'be\'b8\'c4\'bd\'f8\'a3\'ac\'c7\'eb\'b4\'f3\'bc\'d2\'bc\'b0\'ca\'b1\'b8\'fc\'d0\'c2\'b5\'fc\'b4\'fa\'d2\'d4\'c7\'b0\'b5\'c4\'b4\'fa\'c2\'eb\'c9\'e8\'bc\'c6\'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10305489 103 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15426247 104 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid15426247\charrsid15426247 \loch\af31506\hich\af31506\dbch\f31505 \'d7\'ee\'ba\'f3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\cf17\insrsid8153312\charrsid3748962 105 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5325643 \loch\af31506\hich\af31506\dbch\f31505 \'cf\'c2\'bd\'da\'bf\'ce\'ce\'d2\'c3\'c7\'bd\'ab\'b6\'d4\'d3\'ce\'cf\'b7\'cf\'ee\'c4\'bf\'b5\'c4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5325643 106 | \hich\af31506\dbch\af31505\loch\f31506 APK}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5325643 \loch\af31506\hich\af31506\dbch\f31505 \'b4\'f2\'b0\'fc\'ba\'cd\'d5\'e2\'b8\'f6\loch\af31506\hich\af31506\dbch\f31505 \'cf\'ee\'c4\'bf\'bd\'f8\'d0\'d0\'d2\'bb\'b8\'f6 107 | \'d7\'dc\'bd\'e1}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid556879 \loch\af31506\hich\af31506\dbch\f31505 \'a3\'ac}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid556879 \loch\af31506\hich\af31506\dbch\f31505 \'ce\'d2\'c3\'c7\'b5\'c4\'d5\'e2\'b8\'f6\'d3\'ce\'cf\'b7}{ 108 | \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid556879 \loch\af31506\hich\af31506\dbch\f31505 \'bf\'aa\'b7\'a2}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid556879 \loch\af31506\hich\af31506\dbch\f31505 \'ca\'b5\'d5\'bd\'cf\'b5\'c1\'d0\'bf\'ce\'b3\'cc\'d2\'b2\'bd\'ab 109 | \'b8\'e6\'d2\'bb\'b6\'ce\'c2\'e4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5325643 \loch\af31506\hich\af31506\dbch\f31505 \'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10305489 110 | \par 111 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid925434 \loch\af31506\hich\af31506\dbch\f31505 \'b9\'d8\'d3\'da\'d3\'ce\'cf\'b7\'c6\'e4\'cb\'fb\'b9\'d8\'bf\'a8\'b5\'c4\'b1\'e0\'d0\'b4\'ba\'cd\'ca\'b5\'cf\'d6\'ba\'cd\'b5\'da\'d2\'bb\'b9\'d8\'ca\'c7\'c0\'e0\'cb\'c6 112 | \'b5\'c4\'a3\'ac\'ce\'d2\'d5\'e2\'c0\'ef\'be\'cd\'c3\'bb\'d3\'d0\'d7\'f6\'d6\'d8\'b8\'b4\'b5\'c4\'b9\'a4\'d7\'f7\'a3\'ac\'d7\'ca\'d4\'b4\'d2\'d1\'be\'ad\'cc\'e1\'b9\'a9\'b8\'f8\'b4\'f3\'bc\'d2\'a3\'ac\'b4\'f3\'bc\'d2\'bf\'c9\'d2\'d4\'d7\'d4\'bc\'ba 113 | \'cd\'ea\'c9\'c6\'d5\'e2\'b8\'f6\'d3\'ce\'cf\'b7\'cf\'ee\'c4\'bf\'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid925434 114 | \par 115 | \par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid925434 \loch\af31506\hich\af31506\dbch\f31505 \'cd\'ac\'ca\'b1\'b1\'be\'cf\'ee\'c4\'bf\'cb\'f9\'b2\'c9\'d3\'c3\'b5\'c4\'b7\'bd\'b7\'a8\'d2\'b2\'ca\'c7\'b1\'c8\'bd\'cf\'bb\'f9\'b4\'a1\'b5\'c4\'a3\'ac\'cf\'a3\'cd\'fb 116 | \'b4\'f3\'bc\'d2\'c4\'dc\'b9\'bb\'bd\'e1\'ba\'cf\'d7\'d4\'bc\'ba\'b5\'c4\'d1\'a7\'cf\'b0\'b5\'c4\'cb\'bc\'bf\'bc\'a3\'ac\'b6\'d4\'cf\'d6\'d3\'d0\'b5\'c4\'b4\'fa\'c2\'eb\'ba\'cd\'c9\'e8\'bc\'c6\'bd\'f8\'d0\'d0\'d6\'d8\'d0\'c2\'b5\'c4\'b8\'c4\'bd\'f8 117 | \'ba\'cd\'c9\'e8\'bc\'c6\'a3\'ac\'d0\'b4\'b3\'f6\'d2\'bb\'b8\'f6\'ca\'f4\'d3\'da\'d7\'d4\'bc\'ba\'b5\'c4\'d3\'ce\'cf\'b7\'a1\'a3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid925434\charrsid925434 118 | \par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a 119 | 9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad 120 | 5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 121 | b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 122 | 0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 123 | a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f 124 | c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 125 | 0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 126 | a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 127 | 6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b 128 | 4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b 129 | 4757e8d3f729e245eb2b260a0238fd010000ffff0300504b0304140006000800000021002f8baafbd30600008c1a0000160000007468656d652f7468656d652f 130 | 7468656d65312e786d6cec595d8b1b37147d2ff43f0cf3eef86bc61f4bbcc11edbd936bb49889d943c6a6dd9a3ac666446f26e4c0894e4b150284d4b1e1a287d 131 | e943691b48a085a6bf66d3943485fc855e69ecb164cbdd64496129c9429891cfbd3abaf7ceb9d2ccf90bb723ea1ce284131637dce2b982ebe078c086241e37dc 132 | ebfd6eaee63a5ca07888288b71c39d61ee5ed8fef083f3684b8438c20ed8c77c0b35dc5088c9563ecf07308cf83936c131fc3662498404dc26e3fc304147e037 133 | a2f952a150c94788c4ae13a308dc5e198dc8003bcf7ffdede5770fdded85f70e852962c1e5c080263de91b1b260a3b3c284a049ff18026ce21a20d17261ab2a3 134 | 3ebe2d5c87222ee087865b50ffdcfcf6f93cda9a1b51b1c156b30baa9d7610ccede606c383929a3319ef67937a9eef559a997f05a0621dd7a9762a9d4ae64f01 135 | d060002b4db9e83efd56bdd5f6e7580d945e5a7cb7abed72d1c06bfecb6b9c9bbefc33f00a94faf7d6f0dd6e005134f00a94e2fd35bce7554b8167e01528c557 136 | d6f0d542b3ed550dbc028594c4076be8825f29078bd5669011a33b5678ddf7bad5d2dcf91205d59055979c62c462b1a9d622748b255d0048204582c48e984df0 137 | 080da08c0344c97e429c5d320ea1f02628661c860ba542b75086ffe59fa7ae5444d016469ab5e4054cf8da90e4e3f0414226a2e17e0c5e5d0df2fad98faf9f3d 138 | 718eef3d3dbef7cbf1fdfbc7f77e4e1d19563b281eeb56afbeffe2ef479f3a7f3df9f6d583afec78aee3fff8e9b3e7bf7f6907c24a972178f1f5e33f9f3e7ef1 139 | f0f3973f3cb0c09b09dad7e17d1261ee5cc647ce3516c1c254084ce6783f793b8b7e88886ed18cc71cc548ce62f1df11a181be3c431459702d6c46f046021263 140 | 035e9cde3208f7c2642a88c5e3a53032807b8cd1164bac51b824e7d2c2dc9fc663fbe4c954c75d43e8d03677806223bf9de904b495d85c062136685ea5281668 141 | 8c632c1cf91b3bc0d8b2ba9b841871dd238384713612ce4de2b410b186a44ff68d6a5a1aed9008f232b311847c1bb1d9bbe1b418b5adba8d0f4d243c15885ac8 142 | f73135c278114d058a6c2efb28a27ac07791086d247bb364a0e33a5c40a6c79832a733c49cdb6cae24b05e2de997405eec69dfa3b3c84426821cd87cee22c674 143 | 649b1d04218a26366c8fc4a18efd881f408922e72a1336f81e339f10790f7940f1c674df20d848f7c96a701d9455a7b42c10f9cb34b1e4f2226646fdf6667484 144 | b0921a107e43cf23129f28ee2bb2eeffb7b20e42fae29b4796559d55416f26c4fa44edacc8f826dcaa78072c1992b3afdd6d348daf62785cd61bd87be97e2fdd 145 | eeff5eba373dcfef5eb0971a0df22db78ae9565d6ddca38dfbf611a1b4276614ef72b575e7d099865d189476ead08ab373dc24844bf924c304066e9c2065e324 146 | 4c7c4244d80bd104f6f745573a19f3b9eb3177268cc3b65f0d5b7d4b3c9d467b6c981e578b4579344dc58323b11c2ff8d9381c35448aae549747b0ccbd623b56 147 | 47e5050169fb3624b4c94c12650b89ea625006491dcc216816126a65ef8445ddc2a226dd2f52b5c602a8655981ad93031bae86eb7b60024670a242140f659ed2 148 | 542fb2ab92f92e33bd29984605c03e625101cb4cd725d78dcb93ab4b4bed0d326d90d0cacd24a122a37a180fd110cfab538ebe098db7cd757d9952839e0c859a 149 | 0f4a6b49a35afb3716a7cd35d8ad6a038d75a5a0b173d4702b651f4a6680260d7704c77eb88c26503b5c6e79111dc3cbb38148d207fe34ca3249b868231ea601 150 | 57a293aa4144044e1c4aa2862b979fa581c64a4314b7620904e1cc92ab83ac9c3572907433c97834c203a1a75d1b91914e6f41e153adb0feaacc4f0f96966c0a 151 | e9ee85c323679f4e936b084accaf1665008784c3db9f621acd2181d79999902deb6fa531cd65577f9fa86a281d477412a27947d1c53c852b29cfe8a8bb2c06da 152 | dd7ccd10502d24f346b83f960d560faad14db3ae9172d8d8754f369291d34473d9330d55915dd3ae62c60c8b36b012cbd335798dd522c4a0697a874fa57b5572 153 | eb0bad5bd927645d02029ec5cfd275dfa02168d4969319d424e37519969a3d1f357bc7628127507b9326a1a97e65e176256e598fb04e0783a7eafc60b75ab530 154 | 345aec2b55a4d5870ffdd304dbbf05e2d18697c0532ab84a257c7848106c887a6a4f92ca063c22b7c5fcd1802b679a90867ba7e037bda0e407b942cdefe4bcb2 155 | 57c8d5fc6639d7f4fd72b1e3170bed56e92e34161146453ffde8d28557517436fff4a2c6d73ebf448bb76de7062cca33f57925af88abcf2fc592edf34b5f7e5e 156 | 711d02a273a752ead6cbf55625572f37bb39afddaae5ea41a5956b57826abbdb0efc5abd7bd7750e15d86b9603afd2a9e52ac520c8799582a45fabe7aa5ea9d4 157 | f4aacd5ac76bde9d6f6360e5a97ccc6301e155bcb6ff010000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d65 158 | 2f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d36 159 | 3f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e 160 | 3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d985 161 | 0528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000000000 162 | 0000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000 163 | 000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019020000 164 | 7468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021002f8baafbd30600008c1a00001600000000000000 165 | 000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000 166 | 00000000000000000000dd0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000d80a00000000} 167 | {\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d 168 | 617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 169 | 6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 170 | 656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} 171 | {\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; 172 | \lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; 173 | \lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; 174 | \lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1; 175 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5; 176 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9; 177 | \lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; 178 | \lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; 179 | \lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent; 180 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer; 181 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures; 182 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference; 183 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text; 184 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List; 185 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3; 186 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3; 187 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3; 188 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing; 189 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent; 190 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4; 191 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; 192 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading; 193 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3; 194 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong; 195 | \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature; 196 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym; 197 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition; 198 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter; 199 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1; 200 | \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid; 201 | \lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; 202 | \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; 203 | \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; 204 | \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; 205 | \lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; 206 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; 207 | \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; 208 | \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; 209 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; 210 | \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; 211 | \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; 212 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; 213 | \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; 214 | \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; 215 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; 216 | \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; 217 | \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; 218 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; 219 | \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; 220 | \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; 221 | \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; 222 | \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; 223 | \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; 224 | \lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; 225 | \lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; 226 | \lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; 227 | \lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; 228 | \lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; 229 | \lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; 230 | \lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; 231 | \lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; 232 | \lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; 233 | \lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; 234 | \lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; 235 | \lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; 236 | \lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; 237 | \lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; 238 | \lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; 239 | \lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; 240 | \lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; 241 | \lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; 242 | \lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; 243 | \lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; 244 | \lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; 245 | \lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; 246 | \lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; 247 | \lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; 248 | \lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 249 | 4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 250 | d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 251 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 252 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 253 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 254 | fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 255 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 256 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 257 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 258 | ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000b089 259 | 644a66a7d0010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000b089644a66a7d001 260 | b089644a66a7d001000000000000000000000000d00046003000d9005300d70049004c00cf0045004f004500d00055005400c9005600cd00d9005a005700d0003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000b089644a66a7 261 | d001b089644a66a7d0010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 262 | 00000000000000000000000000000000d900000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 263 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 264 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 265 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 266 | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d2222205374796c654e616d653d22222056657273696f6e3d22302220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72 267 | 672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e000000 268 | 0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b34424239 269 | 353643302d304237322d343342432d383443312d3434453935364445353935427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c 270 | 64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 271 | 0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 272 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 273 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff 274 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f 275 | 72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 276 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 277 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 278 | 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} --------------------------------------------------------------------------------