diff --git a/Classes/RPGBattleMenu.cpp b/Classes/RPGBattleMenu.cpp index 0560bd5..8e9bf0e 100644 --- a/Classes/RPGBattleMenu.cpp +++ b/Classes/RPGBattleMenu.cpp @@ -79,18 +79,39 @@ RPGBattleMenu* RPGBattleMenu::createWithParentNode(CCDictionary* stringList, CCN void RPGBattleMenu::showMenu() { - CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->getChildByTag(kRPGBattleMenuTagBg); + CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->m_parentNode->getChildByTag(kRPGBattleMenuTagBg); bgLayer->setVisible(true); - this->setVisible(true); + CCMenuItem *menuAttack = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagAttack); + menuAttack->setVisible(true); + + CCMenuItem *menuSkill = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagSkill); + menuSkill->setVisible(true); + + CCMenuItem *menuItems = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagItems); + menuItems->setVisible(true); + + CCMenuItem *menuEscape = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagEscape); + menuEscape->setVisible(true); } void RPGBattleMenu::hideMenu() { - CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->getChildByTag(kRPGBattleMenuTagBg); + CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->m_parentNode->getChildByTag(kRPGBattleMenuTagBg); bgLayer->setVisible(false); - this->setVisible(false); + CCMenuItem *menuAttack = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagAttack); + menuAttack->setVisible(false); + + CCMenuItem *menuSkill = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagSkill); + menuSkill->setVisible(false); + + CCMenuItem *menuItems = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagItems); + menuItems->setVisible(false); + + CCMenuItem *menuEscape = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagEscape); + menuEscape->setVisible(false); + } //private @@ -159,11 +180,44 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject) this->removeFromParentAndCleanup(true); } + } + break; + case kRPGBattleMenuTagCancel: + { + CCLog("取消"); + this->showMenu(); + + CCMenuItem *menuCancel = (CCMenuItem*)this->getChildByTag(kRPGBattleMenuTagCancel); + menuCancel->removeFromParentAndCleanup(true); + + switch (this->m_selectedMenuTag) + { + case kRPGBattleMenuTagAttack: + ((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(false); + ((RPGBattleSceneLayer*)this->m_parentNode)->cancelAllSelected(); + + break; + +// default: +// break; + } + } break; default: { CCLog("攻击"); + this->hideMenu(); + + this->m_selectedMenuTag = kRPGBattleMenuTagAttack; + + CCMenuItemSprite *menuCancel = CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), this, menu_selector(RPGBattleMenu::onMenu)); + menuCancel->setPosition(ccp(75, 660)); + menuCancel->setTag(kRPGBattleMenuTagCancel); + menuCancel->setScale(0.75); + this->addChild(menuCancel); + + ((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(true); } break; diff --git a/Classes/RPGBattleMenu.h b/Classes/RPGBattleMenu.h index 0f93cef..220b65d 100644 --- a/Classes/RPGBattleMenu.h +++ b/Classes/RPGBattleMenu.h @@ -20,7 +20,8 @@ enum RPGBattleMenuTag kRPGBattleMenuTagAttack = 2, kRPGBattleMenuTagSkill = 4, kRPGBattleMenuTagItems = 5, - kRPGBattleMenuTagEscape = 6 + kRPGBattleMenuTagEscape = 6, + kRPGBattleMenuTagCancel = 7 }; @@ -32,13 +33,15 @@ private: CCDictionary* m_stringList; - RPGPlayer* m_playerData; - void createMenuItem(float x, float y, CCString *text, RPGBattleMenuTag tag); void onMenu(CCObject *pObject); public: + RPGPlayer* m_playerData; + + int m_selectedMenuTag; //选中了哪个项(攻击、技能、道具) + RPGBattleMenu(); virtual ~RPGBattleMenu(); bool initWithParentNode(CCDictionary* stringList, CCNode* parentNode, RPGPlayer* playerData); diff --git a/Classes/RPGBattleMonsterSprite.cpp b/Classes/RPGBattleMonsterSprite.cpp index 719306f..97f1e9b 100644 --- a/Classes/RPGBattleMonsterSprite.cpp +++ b/Classes/RPGBattleMonsterSprite.cpp @@ -25,6 +25,8 @@ bool RPGBattleMonsterSprite::initWithMonsterData(RPGMonster* data) { this->m_data = data; + this->m_isSelected = false; + return true; } return false; @@ -41,3 +43,28 @@ RPGBattleMonsterSprite* RPGBattleMonsterSprite::createWithMonsterData(RPGMonster CC_SAFE_DELETE(obj); return NULL; } + +void RPGBattleMonsterSprite::selected(bool isSelected) +{ + this->m_isSelected = isSelected; + + if(this->m_isSelected) + { + CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGBattleMonsterSpriteTagCursor); + if(!handCursor) + { + handCursor = CCSprite::createWithSpriteFrameName("gui_hand.png"); + handCursor->setScale(0.3); + handCursor->setTag(kRPGBattleMonsterSpriteTagCursor); + handCursor->setPosition(ccp(this->getContentSize().width + 30, this->getContentSize().height / 2 - 10)); + this->addChild(handCursor); + } + } + else + { + CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGBattleMonsterSpriteTagCursor); + if(handCursor) + handCursor->removeFromParentAndCleanup(true); + } + +} diff --git a/Classes/RPGBattleMonsterSprite.h b/Classes/RPGBattleMonsterSprite.h index 79a51fc..0bebc53 100644 --- a/Classes/RPGBattleMonsterSprite.h +++ b/Classes/RPGBattleMonsterSprite.h @@ -15,20 +15,30 @@ USING_NS_CC; using namespace std; +enum RPGBattleMonsterSpriteTag +{ + kRPGBattleMonsterSpriteTagCursor = 1 + +}; + class RPGBattleMonsterSprite : public CCSprite { private: +public: + bool m_isSelected; + RPGMonster* m_data; -public: RPGBattleMonsterSprite(); virtual ~RPGBattleMonsterSprite(); bool initWithMonsterData(RPGMonster* data); static RPGBattleMonsterSprite* createWithMonsterData(RPGMonster* data); + void selected(bool isSelected); + }; #endif /* defined(__OzgGameRPG__RPGBattleMonsterSprite__) */ diff --git a/Classes/RPGBattlePlayerSprite.cpp b/Classes/RPGBattlePlayerSprite.cpp index 2c80a92..e7c8f7f 100644 --- a/Classes/RPGBattlePlayerSprite.cpp +++ b/Classes/RPGBattlePlayerSprite.cpp @@ -106,6 +106,8 @@ bool RPGBattlePlayerSprite::initWithPlayerData(RPGPlayer* data) this->m_data = data; this->setScale(1.75); + this->m_isSelected = false; + CCAnimation *animation = CCAnimation::createWithSpriteFrames(this->m_spriteFramesNormal, 0.2); CCRepeatForever *animate = CCRepeatForever::create(CCAnimate::create(animation)); this->runAction(animate); @@ -126,3 +128,29 @@ RPGBattlePlayerSprite* RPGBattlePlayerSprite::createWithPlayerData(RPGPlayer* da CC_SAFE_DELETE(obj); return NULL; } + +void RPGBattlePlayerSprite::selected(bool isSelected) +{ + this->m_isSelected = isSelected; + + if(this->m_isSelected) + { + CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGBattlePlayerSpriteTagCursor); + if(!handCursor) + { + handCursor = CCSprite::createWithSpriteFrameName("gui_hand.png"); + handCursor->setScale(0.15); + handCursor->setTag(kRPGBattlePlayerSpriteTagCursor); + handCursor->setFlipX(true); + handCursor->setPosition(ccp(-12, 10)); + this->addChild(handCursor); + } + } + else + { + CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGBattlePlayerSpriteTagCursor); + if(handCursor) + handCursor->removeFromParentAndCleanup(true); + } + +} diff --git a/Classes/RPGBattlePlayerSprite.h b/Classes/RPGBattlePlayerSprite.h index 676015d..d0c1109 100644 --- a/Classes/RPGBattlePlayerSprite.h +++ b/Classes/RPGBattlePlayerSprite.h @@ -15,12 +15,17 @@ USING_NS_CC; using namespace std; +enum RPGBattlePlayerSpriteTag +{ + kRPGBattlePlayerSpriteTagCursor = 1 + +}; + class RPGBattlePlayerSprite : public CCSprite { private: - - RPGPlayer* m_data; + CCArray* m_spriteFramesNormal; //通常 CCArray* m_spriteFramesHurt; //受到攻击 CCArray* m_spriteFramesDying; //临死 @@ -34,11 +39,17 @@ private: public: + RPGPlayer* m_data; + + bool m_isSelected; + RPGBattlePlayerSprite(); virtual ~RPGBattlePlayerSprite(); bool initWithPlayerData(RPGPlayer* data); static RPGBattlePlayerSprite* createWithPlayerData(RPGPlayer* data); + void selected(bool isSelected); + }; #endif /* defined(__OzgGameRPG__RPGBattlePlayerSprite__) */ diff --git a/Classes/RPGBattleSceneLayer.cpp b/Classes/RPGBattleSceneLayer.cpp index ddb77e4..4e2660d 100755 --- a/Classes/RPGBattleSceneLayer.cpp +++ b/Classes/RPGBattleSceneLayer.cpp @@ -22,7 +22,7 @@ RPGBattleSceneLayer::~RPGBattleSceneLayer() this->m_monsterDataList->release(); this->m_playerList->release(); this->m_monsterList->release(); - + CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("monsters.plist"); CCLog("RPGBattleSceneLayer 释放"); @@ -270,6 +270,8 @@ bool RPGBattleSceneLayer::init() //怪物部分结束 + this->m_enabledTouched = false; + this->computingProgress(); this->scheduleUpdate(); @@ -347,6 +349,86 @@ void RPGBattleSceneLayer::update(float delta) // CCLog("%f", delta); } +bool RPGBattleSceneLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) +{ + + return true; +} + +void RPGBattleSceneLayer::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) +{ + +} + +void RPGBattleSceneLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) +{ + CCPoint point = pTouch->getLocation(); + + RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu); + + switch (battleMenu->m_selectedMenuTag) + { + case kRPGBattleMenuTagAttack: + { +// CCLog("攻击"); + + //检测选中的player + for (int i = 0; i < this->m_playerList->count(); i++) + { + RPGBattlePlayerSprite *player = (RPGBattlePlayerSprite*)this->m_playerList->objectAtIndex(i); + if(player->boundingBox().containsPoint(point)) + { + if(player->m_isSelected) + { + CCLog("攻击player"); + + player->selected(false); + this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true); + + } + else + player->selected(true); + } + else + player->selected(false); + + } + + //检测选中的怪物 + for (int i = 0; i < this->m_monsterList->count(); i++) + { + RPGBattleMonsterSprite *monster = (RPGBattleMonsterSprite*)this->m_monsterList->objectAtIndex(i); + if(monster->boundingBox().containsPoint(point)) + { + if(monster->m_isSelected) + { + CCLog("攻击怪物"); + + RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu); + RPGPlayer *playerData = battleMenu->m_playerData; + + monster->selected(false); + battleMenu->removeFromParentAndCleanup(true); + + this->attack(playerData, monster->m_data); + + } + else + monster->selected(true); + } + else + monster->selected(false); + + } + + } + break; +// default: +// break; + } + +} + void RPGBattleSceneLayer::showMsg(cocos2d::CCString *msgText) { this->showMsg(msgText, true); @@ -405,6 +487,8 @@ void RPGBattleSceneLayer::goToMap() //保存player的数据 savePlayerData(&this->m_db, this->m_playerDataList); + this->enabledTouched(false); + CCArray *loadTextures = CCArray::create(); loadTextures->addObject(CCString::create("map.png")); loadTextures->addObject(CCString::create("joystick.png")); @@ -425,6 +509,62 @@ void RPGBattleSceneLayer::goToMap() CCDirector::sharedDirector()->replaceScene(t); } +void RPGBattleSceneLayer::enabledTouched(bool enabled) +{ + if(this->m_enabledTouched) + CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); + + this->m_enabledTouched = enabled; + + if(this->m_enabledTouched) + CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true); + +} + +void RPGBattleSceneLayer::cancelAllSelected() +{ + for (int i = 0; i < this->m_playerList->count(); i++) + { + RPGBattlePlayerSprite *player = (RPGBattlePlayerSprite*)this->m_playerList->objectAtIndex(i); + player->selected(false); + + } + + for (int i = 0; i < this->m_monsterList->count(); i++) + { + RPGBattleMonsterSprite *monster = (RPGBattleMonsterSprite*)this->m_monsterList->objectAtIndex(i); + monster->selected(false); + + } + +} + +void RPGBattleSceneLayer::attack(cocos2d::CCObject *attackObjData, cocos2d::CCObject *targetObjData) +{ + CCLog("aaa"); + + //发起攻击的对象 + if(dynamic_cast(attackObjData) != NULL) + { + + } + else if(dynamic_cast(attackObjData) != NULL) + { + + } + + //受到攻击的对象 + if(dynamic_cast(targetObjData) != NULL) + { + + } + else if(dynamic_cast(targetObjData) != NULL) + { + + } + +} + //private bool RPGBattleSceneLayer::monsterDataListExistWithTag(int tag) diff --git a/Classes/RPGBattleSceneLayer.h b/Classes/RPGBattleSceneLayer.h index 9367512..78bad08 100755 --- a/Classes/RPGBattleSceneLayer.h +++ b/Classes/RPGBattleSceneLayer.h @@ -40,7 +40,7 @@ private: CCArray* m_monsterDataList; //因为同一个怪物会有N个,所以这个对象是二维的 CCArray* m_playerList; - CCArray* m_monsterList; //同m_monsterDataList + CCArray* m_monsterList; //怪物列表,包括相同的 vector m_addedMonsters; //已显示的怪物tag,主要用在setMonsterPosition @@ -48,6 +48,8 @@ private: bool m_autoReleaseMsg; //是否正在执行自动释放msg框 + bool m_enabledTouched; //是否打开了可点击状态(主要可点击player或怪物) + //对应的怪物的tag是否存在m_monsterDataList bool monsterDataListExistWithTag(int tag); @@ -59,8 +61,6 @@ private: void computingProgress(); //计算战斗画面中的所有战斗对象的进度条 float computingFloat(float val); //计算浮动值 - - public: RPGBattleSceneLayer(); @@ -72,6 +72,10 @@ public: virtual void update(float delta); + virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); + virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); + virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); + void showMsg(CCString* msgText); //显示msg void showMsg(CCString* msgText, bool autoRelease); void hideMsg(); @@ -79,6 +83,11 @@ public: void goToMap(); + void enabledTouched(bool enabled); //是否打开可点击状态(主要可点击player或怪物) + void cancelAllSelected(); //取消全部选中的对象 + + void attack(CCObject* attackObjData, CCObject* targetObjData); //player或怪物执行攻击 + }; #endif /* defined(__OzgGameRPG__RPGBattleSceneLayer__) */ diff --git a/Classes/RPGMapMenuLayer.cpp b/Classes/RPGMapMenuLayer.cpp index 0b739e9..7e18aa2 100755 --- a/Classes/RPGMapMenuLayer.cpp +++ b/Classes/RPGMapMenuLayer.cpp @@ -243,7 +243,6 @@ void RPGMapMenuLayer::onMenu(cocos2d::CCObject *pObject) this->setStatusPlayer(dataId); CCMenuItemSprite *player = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapMenuLayerTagMainMenuPlayerStatus + dataId); - //光标的位置 CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGMapMenuLayerTagHandCursor); if(!handCursor) { @@ -252,6 +251,8 @@ void RPGMapMenuLayer::onMenu(cocos2d::CCObject *pObject) handCursor->setTag(kRPGMapMenuLayerTagHandCursor); this->addChild(handCursor); } + + //光标的位置 handCursor->setPosition(ccp(player->getPositionX() + 60, 555)); break; diff --git a/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/ouzhigang.xcuserdatad/UserInterfaceState.xcuserstate b/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/ouzhigang.xcuserdatad/UserInterfaceState.xcuserstate index 8106fb7..d038c62 100644 Binary files a/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/ouzhigang.xcuserdatad/UserInterfaceState.xcuserstate and b/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/ouzhigang.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/tpwid.xcuserdatad/UserInterfaceState.xcuserstate b/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/tpwid.xcuserdatad/UserInterfaceState.xcuserstate index 1d15755..4fc375f 100644 Binary files a/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/tpwid.xcuserdatad/UserInterfaceState.xcuserstate and b/proj.ios/OzgGameRPG.xcodeproj/project.xcworkspace/xcuserdata/tpwid.xcuserdatad/UserInterfaceState.xcuserstate differ