diff --git a/Classes/RPGBaseSceneLayer.h b/Classes/RPGBaseSceneLayer.h index 186990b..690a626 100755 --- a/Classes/RPGBaseSceneLayer.h +++ b/Classes/RPGBaseSceneLayer.h @@ -33,6 +33,12 @@ using namespace CocosDenshion; //查询现有道具 #define ITEMS_QUERY "select * from items where id in(%s) order by id asc" +//获取一个player的详细数据 +#define PLAYER_DETAIL_QUERY "select p.*, arms.name_cns as arms_name, armor.name_cns as armor_name from player as p left join items as arms on p.items_id_arms = arms.id left join items as armor on p.items_id_armor = armor.id where p.id = %i" + +//查询一个角色的技能 +#define SKILL_QUERY "select * from skill where id in(%s)" + //技能的属性 enum RPGSkillAttr { diff --git a/Classes/RPGComputingResults.h b/Classes/RPGComputingResults.h index 8319baf..6dc63de 100644 --- a/Classes/RPGComputingResults.h +++ b/Classes/RPGComputingResults.h @@ -21,7 +21,7 @@ public: static int attackResults(float attack, float defense); //一般攻击 static int skillAttackResults(float playerSkillAttack, float skillAttack, RPGSkillAttr attackAttr, float skillDefense, RPGSkillAttr defenseAttr); //技能攻击 - static int skillCureResults(float playerSkillAttack, float skillAttack); //治疗 + static int skillCureResults(float playerSkillAttack, float skillAttack); //技能治疗 static int itemCure(int itemsId); //道具治疗 diff --git a/Classes/RPGData.h b/Classes/RPGData.h index bbb1339..705462c 100644 --- a/Classes/RPGData.h +++ b/Classes/RPGData.h @@ -82,7 +82,8 @@ public: int m_dataId; string m_name; float m_skillAttack; - int m_mp; + int m_MP; + int m_type; RPGSkill(); virtual ~RPGSkill(); diff --git a/Classes/RPGMapChoicePlayerMenuLayer.cpp b/Classes/RPGMapChoicePlayerMenuLayer.cpp index 40156ba..4739c8c 100644 --- a/Classes/RPGMapChoicePlayerMenuLayer.cpp +++ b/Classes/RPGMapChoicePlayerMenuLayer.cpp @@ -21,7 +21,7 @@ RPGMapChoicePlayerMenuLayer::~RPGMapChoicePlayerMenuLayer() CCLog("RPGMapChoicePlayerMenuLayer 释放"); } -bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCObject* target, SEL_CallFuncO selector, float width, float height) +bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCString* titleLab, CCObject* target, SEL_CallFuncO selector, float width, float height) { if(CCLayerColor::initWithColor(ccc4(0, 0, 0, 200), width, height)) { @@ -41,6 +41,16 @@ bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCObject* target, SEL_C mainMenu->setPosition(CCPointZero); this->addChild(mainMenu); + CCMenuItemSprite *menuBack = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapChoicePlayerMenuLayerTagMainMenuBack); + if(!menuBack) + { + menuBack = CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), this, menu_selector(RPGMapChoicePlayerMenuLayer::onMenu)); + menuBack->setPosition(ccp(40, 600)); + menuBack->setTag(kRPGMapChoicePlayerMenuLayerTagMainMenuBack); + menuBack->setScale(0.5); + mainMenu->addChild(menuBack); + } + this->setPosition(ccp((CCDirector::sharedDirector()->getWinSize().width - width) / 2, (CCDirector::sharedDirector()->getWinSize().height - height) / 2)); //显示4个角色 @@ -48,9 +58,20 @@ bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCObject* target, SEL_C CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); while(!query.eof()) { - CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + CCSprite *playerSprite = NULL; + if(query.getIntField("hp") <= 0) + { + //死亡 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_2.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(10)); + } + else + { + //正常 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); + } - CCSprite *playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); CCMenuItemSprite *player = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapChoicePlayerMenuLayerTagMainMenuPlayer + query.getIntField("id")); if(!player) { @@ -66,6 +87,8 @@ bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCObject* target, SEL_C } query.finalize(); + addLab(this, kRPGMapChoicePlayerMenuLayerTagTitleLab, titleLab, ccp(600, 400)); + CCNotificationCenter::sharedNotificationCenter()->addObserver(this->m_target, selector, "onChoicePlayer", NULL); return true; @@ -73,10 +96,10 @@ bool RPGMapChoicePlayerMenuLayer::init(CppSQLite3DB *db, CCObject* target, SEL_C return false; } -RPGMapChoicePlayerMenuLayer* RPGMapChoicePlayerMenuLayer::create(CppSQLite3DB *db, CCObject* target, SEL_CallFuncO selector, float width, float height) +RPGMapChoicePlayerMenuLayer* RPGMapChoicePlayerMenuLayer::create(CppSQLite3DB *db, CCString* titleLab, CCObject* target, SEL_CallFuncO selector, float width, float height) { RPGMapChoicePlayerMenuLayer *obj = new RPGMapChoicePlayerMenuLayer(); - if(obj && obj->init(db, target, selector, width, height)) + if(obj && obj->init(db, titleLab, target, selector, width, height)) { obj->autorelease(); return obj; @@ -88,4 +111,5 @@ RPGMapChoicePlayerMenuLayer* RPGMapChoicePlayerMenuLayer::create(CppSQLite3DB *d void RPGMapChoicePlayerMenuLayer::onMenu(cocos2d::CCObject *pObject) { CCNotificationCenter::sharedNotificationCenter()->postNotification("onChoicePlayer", pObject); + } diff --git a/Classes/RPGMapChoicePlayerMenuLayer.h b/Classes/RPGMapChoicePlayerMenuLayer.h index 52d181d..b9acb3b 100644 --- a/Classes/RPGMapChoicePlayerMenuLayer.h +++ b/Classes/RPGMapChoicePlayerMenuLayer.h @@ -22,6 +22,7 @@ #include "cocos2d.h" #include "RPGBaseSceneLayer.h" +#include "RPGBaseSceneLayer.h" #include "OzgCCUtility.h" USING_NS_CC; @@ -29,7 +30,9 @@ USING_NS_CC; enum RPGMapChoicePlayerMenuLayerTag { kRPGMapChoicePlayerMenuLayerTagMainMenu = 1, + kRPGMapChoicePlayerMenuLayerTagMainMenuBack = 4, kRPGMapChoicePlayerMenuLayerTagBg = 2, + kRPGMapChoicePlayerMenuLayerTagTitleLab = 3, kRPGMapChoicePlayerMenuLayerTagMainMenuPlayer = 100 }; @@ -48,8 +51,8 @@ public: RPGMapChoicePlayerMenuLayer(); virtual ~RPGMapChoicePlayerMenuLayer(); - bool init(CppSQLite3DB *db, CCObject* target, SEL_CallFuncO selector, float width, float height); - static RPGMapChoicePlayerMenuLayer* create(CppSQLite3DB *db, CCObject* target, SEL_CallFuncO selector, float width, float height); + bool init(CppSQLite3DB *db, CCString* titleLab, CCObject* target, SEL_CallFuncO selector, float width, float height); + static RPGMapChoicePlayerMenuLayer* create(CppSQLite3DB *db, CCString* titleLab, CCObject* target, SEL_CallFuncO selector, float width, float height); }; #endif /* defined(__OzgGameRPG__RPGMapChoicePlayerMenuLayer__) */ diff --git a/Classes/RPGMapItemsMenuLayer.cpp b/Classes/RPGMapItemsMenuLayer.cpp index cdfff91..6ba862d 100644 --- a/Classes/RPGMapItemsMenuLayer.cpp +++ b/Classes/RPGMapItemsMenuLayer.cpp @@ -248,8 +248,8 @@ void RPGMapItemsMenuLayer::onMenu(cocos2d::CCObject *pObject) void RPGMapItemsMenuLayer::onDialog(cocos2d::CCObject *pObject) { this->getParent()->removeChildByTag(kRPGMapItemsMenuLayerTagDialog, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); - this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerLab, true); this->setVisible(true); } @@ -272,13 +272,19 @@ void RPGMapItemsMenuLayer::onButton(cocos2d::CCObject *pSender, CCControlEvent e //因为动态获取地图的大小会导致了菜单层显示错位,所以定死了 float width = 960; float height = 640; - RPGMapChoicePlayerMenuLayer *choicePlayer = RPGMapChoicePlayerMenuLayer::create(this->m_db, this, callfuncO_selector(RPGMapItemsMenuLayer::onChoicePlayer), width, height); + + //临时背景 + CCTMXTiledMap *mainBg = CCTMXTiledMap::create("map_menu3_style1.tmx"); + mainBg->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width / 2, CCDirector::sharedDirector()->getWinSize().height / 2)); + mainBg->setAnchorPoint(ccp(0.5, 0.5)); + mainBg->setTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg); + this->getParent()->addChild(mainBg); + + CCString *title = CCString::createWithFormat(((CCString*)this->m_stringList->objectForKey("menu_items_choice"))->getCString(), this->m_selectedItems->m_name.c_str()); + RPGMapChoicePlayerMenuLayer *choicePlayer = RPGMapChoicePlayerMenuLayer::create(this->m_db, title, this, callfuncO_selector(RPGMapItemsMenuLayer::onChoicePlayer), width, height); choicePlayer->setTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer); this->getParent()->addChild(choicePlayer); - CCString *labText = CCString::createWithFormat(((CCString*)this->m_stringList->objectForKey("menu_items_choice"))->getCString(), this->m_selectedItems->m_name.c_str()); - addLab(this->getParent(), kRPGMapSceneLayerTagChoicePlayerLab, labText, ccp(650, 470)); - this->setVisible(false); } @@ -286,25 +292,35 @@ void RPGMapItemsMenuLayer::onChoicePlayer(cocos2d::CCObject *pObject) { SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav"); - CCMenuItem *player = (CCMenuItem*)pObject; - - bool isSuccess = RPGResultsLogic::useItems(this->m_db, player->getTag() - kRPGMapChoicePlayerMenuLayerTagMainMenuPlayer, this->m_selectedItems->m_dataId); - if(!isSuccess) + CCMenuItem *menuItem = (CCMenuItem*)pObject; + if(menuItem->getTag() == kRPGMapChoicePlayerMenuLayerTagMainMenuBack) { - //道具使用失败 - CCSize winSize = CCDirector::sharedDirector()->getWinSize(); - RPGDialogLayer *dialog = RPGDialogLayer::create(((CCString*)this->m_stringList->objectForKey("menu_items_fail"))->getCString(), ((CCString*)this->m_stringList->objectForKey("confirm_exit_ok"))->getCString(), kRPGMapItemsMenuLayerTagDialogOK, winSize.width, winSize.height, this, menu_selector(RPGMapItemsMenuLayer::onDialog)); - dialog->setTag(kRPGMapItemsMenuLayerTagDialog); - this->getParent()->addChild(dialog); - + //按了退出 + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); + this->setVisible(true); } else { - //道具使用成功 - this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); - this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerLab, true); - this->setVisible(true); - - this->loadItemsData(); + bool isSuccess = RPGResultsLogic::useItems(this->m_db, menuItem->getTag() - kRPGMapChoicePlayerMenuLayerTagMainMenuPlayer, this->m_selectedItems->m_dataId); + if(!isSuccess) + { + //道具使用失败 + CCSize winSize = CCDirector::sharedDirector()->getWinSize(); + RPGDialogLayer *dialog = RPGDialogLayer::create(((CCString*)this->m_stringList->objectForKey("menu_items_fail"))->getCString(), ((CCString*)this->m_stringList->objectForKey("confirm_exit_ok"))->getCString(), kRPGMapItemsMenuLayerTagDialogOK, winSize.width, winSize.height, this, menu_selector(RPGMapItemsMenuLayer::onDialog)); + dialog->setTag(kRPGMapItemsMenuLayerTagDialog); + this->getParent()->addChild(dialog); + + } + else + { + //道具使用成功 + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); + this->setVisible(true); + + this->loadItemsData(); + } } + } diff --git a/Classes/RPGMapMenuLayer.cpp b/Classes/RPGMapMenuLayer.cpp index 5938833..ff665e9 100755 --- a/Classes/RPGMapMenuLayer.cpp +++ b/Classes/RPGMapMenuLayer.cpp @@ -28,7 +28,7 @@ RPGMapMenuLayer::~RPGMapMenuLayer() // CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo(); -// CCLog("RPGMapMenuLayer释放"); + CCLog("RPGMapMenuLayer释放"); } bool RPGMapMenuLayer::init(CCDictionary* stringList, CppSQLite3DB* db, float width, float height) @@ -280,9 +280,20 @@ void RPGMapMenuLayer::setDefaultInterface() CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); while(!query.eof()) { - CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + CCSprite *playerSprite = NULL; + if(query.getIntField("hp") <= 0) + { + //死亡 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_2.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(10)); + } + else + { + //正常 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); + } - CCSprite *playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); playerSprite->setPosition(ccp(150, playerY)); playerSprite->setScale(2); playerSprite->setTag(kRPGMapMenuLayerTagDefualtPlayerTex + query.getIntField("id")); diff --git a/Classes/RPGMapSceneLayer.h b/Classes/RPGMapSceneLayer.h index 7993263..d8d730a 100755 --- a/Classes/RPGMapSceneLayer.h +++ b/Classes/RPGMapSceneLayer.h @@ -20,7 +20,7 @@ enum RPGMapSceneLayerTag kRPGMapSceneLayerTagMainMenuCommand = 4, kRPGMapSceneLayerTagMenuLayer = 5, kRPGMapSceneLayerTagChoicePlayerMenuLayer = 6, - kRPGMapSceneLayerTagChoicePlayerLab = 7, + kRPGMapSceneLayerTagChoicePlayerMenuLayerBg = 7, kRPGMapSceneLayerTagPlayer = 1999, kRPGMapSceneLayerTagNPC = 2000 diff --git a/Classes/RPGMapSkillMenuLayer.cpp b/Classes/RPGMapSkillMenuLayer.cpp index af44731..3cafd09 100644 --- a/Classes/RPGMapSkillMenuLayer.cpp +++ b/Classes/RPGMapSkillMenuLayer.cpp @@ -9,6 +9,8 @@ #include "RPGMapSkillMenuLayer.h" #include "RPGMapMenuLayer.h" #include "RPGMapSceneLayer.h" +#include "RPGMapChoicePlayerMenuLayer.h" +#include "OzgCCUtility.h" RPGMapSkillMenuLayer::RPGMapSkillMenuLayer() { @@ -18,6 +20,7 @@ RPGMapSkillMenuLayer::RPGMapSkillMenuLayer() RPGMapSkillMenuLayer::~RPGMapSkillMenuLayer() { this->m_stringList->release(); + this->m_skillList->release(); CCLog("RPGMapSkillMenuLayer 释放"); } @@ -31,6 +34,13 @@ bool RPGMapSkillMenuLayer::init(cocos2d::CCDictionary *stringList, CppSQLite3DB this->m_db = db; + this->m_skillList = new CCArray(); + this->m_skillList->init(); + + this->m_statusIsDefault = true; + + this->m_enabledPlayerSkill = true; //默认可以点击技能项 + CCMenu *mainMenu = CCMenu::create(); mainMenu->setTag(kRPGMapSkillMenuLayerTagMainMenu); mainMenu->setAnchorPoint(CCPointZero); @@ -52,6 +62,43 @@ bool RPGMapSkillMenuLayer::init(cocos2d::CCDictionary *stringList, CppSQLite3DB mainBg->setTag(kRPGMapSkillMenuLayerTagBg); this->addChild(mainBg); + //显示上面的4个角色 + float playerX = 200; + CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); + while(!query.eof()) + { + CCSprite *playerSprite = NULL; + if(query.getIntField("hp") <= 0) + { + //死亡 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_2.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(10)); + } + else + { + //正常 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); + } + + CCMenuItemSprite *player = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapSkillMenuLayerTagMainMenuPlayer + query.getIntField("id")); + if(!player) + { + player = CCMenuItemSprite::create(playerSprite, playerSprite, this, menu_selector(RPGMapSkillMenuLayer::onMenu)); + player->setPosition(ccp(playerX, 560)); + player->setScale(2); + player->setTag(kRPGMapSkillMenuLayerTagMainMenuPlayer + query.getIntField("id")); + mainMenu->addChild(player); + } + + playerX += 200; + query.nextRow(); + } + query.finalize(); + + //默认选中第一个 + this->onMenu(mainMenu->getChildByTag(kRPGMapSkillMenuLayerTagMainMenuPlayer + 1)); + return true; } return false; @@ -69,11 +116,93 @@ RPGMapSkillMenuLayer* RPGMapSkillMenuLayer::create(cocos2d::CCDictionary *string return NULL; } +//CCTableView +void RPGMapSkillMenuLayer::scrollViewDidScroll(CCScrollView *scrollView) +{ + +} + +void RPGMapSkillMenuLayer::scrollViewDidZoom(CCScrollView *scrollView) +{ + +} + +void RPGMapSkillMenuLayer::tableCellTouched(CCTableView *tableView, CCTableViewCell *cell) +{ + +} + +CCSize RPGMapSkillMenuLayer::cellSizeForTable(CCTableView *tableView) +{ + return CCSizeMake(tableView->getContentSize().width, 80); +} + +CCTableViewCell* RPGMapSkillMenuLayer::tableCellAtIndex(CCTableView *tableView, unsigned int idx) +{ + CCTableViewCell *cell = tableView->dequeueCell(); + if (!cell) + { + cell = new CCTableViewCell(); + cell->autorelease(); + } + else + cell->removeAllChildrenWithCleanup(true); + + float x = 100; + for (int i = 0; i < 5; i++) + { + int index = idx * 5 + i; + + if(index >= this->m_skillList->count()) + break; + + RPGSkill *skillData = (RPGSkill*)this->m_skillList->objectAtIndex(index); + + CCControlButton *skillBtn = CCControlButton::create(CCString::createWithFormat("%s (%i)", skillData->m_name.c_str(), skillData->m_MP)->getCString(), "Arial", 22); + skillBtn->setPosition(ccp(x, 0)); + skillBtn->setTag(skillData->m_dataId); + skillBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(RPGMapSkillMenuLayer::onButton), CCControlEventTouchUpInside); + cell->addChild(skillBtn); + + //如果是非回复类技能的话,则禁用点击 + if(skillData->m_type != 2) + { + skillBtn->setTitleColorForState(ccc3(144, 144, 144), CCControlStateNormal); + skillBtn->setEnabled(false); + } + //MP不够的话,禁用点击 + else if(!this->m_enabledPlayerSkill) + { + skillBtn->setTitleColorForState(ccc3(144, 144, 144), CCControlStateNormal); + skillBtn->setEnabled(false); + } + + x += 170; + } + + return cell; +} + +unsigned int RPGMapSkillMenuLayer::numberOfCellsInTableView(CCTableView *tableView) +{ + int rowItemCount = 5; + int size = this->m_skillList->count(); + + if(size % rowItemCount == 0) + return size / rowItemCount; + else + return size / rowItemCount + 1; +} +//CCTableView end + //private void RPGMapSkillMenuLayer::onMenu(cocos2d::CCObject *pObject) { + //第一次显示数据的话则不播放效果音 + if(!this->m_statusIsDefault) + SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav"); + CCMenuItem *menuItem = (CCMenuItem*)pObject; - SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav"); switch (menuItem->getTag()) { @@ -98,4 +227,189 @@ void RPGMapSkillMenuLayer::onMenu(cocos2d::CCObject *pObject) break; } + if(menuItem->getTag() >= kRPGMapSkillMenuLayerTagMainMenuPlayer && menuItem->getTag() <= kRPGMapSkillMenuLayerTagMainMenuPlayer + 99) + { +// CCLog("点击了上面4个player的其中一个"); + CCMenu *mainMenu = (CCMenu*)this->getChildByTag(kRPGMapSkillMenuLayerTagMainMenu); + + CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); + while(!query.eof()) + { + if(menuItem->getTag() == kRPGMapSkillMenuLayerTagMainMenuPlayer + query.getIntField("id")) + { + this->m_statusIsDefault = false; + + int dataId = query.getIntField("id"); + this->setPlayerSkill(dataId); + + //选中的光标部分 + CCMenuItemSprite *player = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapSkillMenuLayerTagMainMenuPlayer + dataId); + + CCSprite *handCursor = (CCSprite*)this->getChildByTag(kRPGMapMenuLayerTagHandCursor); + if(!handCursor) + { + handCursor = CCSprite::createWithSpriteFrameName("gui_hand.png"); + handCursor->setScale(0.3); + handCursor->setTag(kRPGMapMenuLayerTagHandCursor); + this->addChild(handCursor); + } + + //光标的位置 + handCursor->setPosition(ccp(player->getPositionX() + 60, 555)); + + break; + } + query.nextRow(); + } + query.finalize(); + } + +} + +void RPGMapSkillMenuLayer::setPlayerSkill(int dataId) +{ + CCTableView *tableView = (CCTableView*)this->getChildByTag(kRPGMapSkillMenuLayerTagItemListTable); + if(!tableView) + { + tableView = CCTableView::create(this, CCSizeMake(850, 420)); + tableView->setDirection(kCCScrollViewDirectionVertical); + tableView->setPosition(ccp(30, 30)); + tableView->setDelegate(this); + tableView->setVerticalFillOrder(kCCTableViewFillTopDown); + tableView->setTag(kRPGMapSkillMenuLayerTagItemListTable); + this->addChild(tableView); + } + + CppSQLite3Query query = this->m_db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, dataId)->getCString()); + while(!query.eof()) + { + this->m_selectedPlayerId = query.getIntField("id"); + + if(query.getFloatField("mp") <= 0 || query.getFloatField("hp") <= 0) + this->m_enabledPlayerSkill = false; + + //数据处理部分 + this->m_skillList->removeAllObjects(); + + string wq = ""; + JsonBox::Value json; + json.loadFromString(query.getStringField("skill")); + JsonBox::Array jsonArr = json.getArray(); + for (int i = 0; i < jsonArr.size(); i++) + { + char* str = (char*)malloc(10 * sizeof(char)); + OzgCCUtility::itoa(jsonArr[i].getInt(), str); + wq.append(str); + + if(i + 1 < jsonArr.size()) + wq.append(", "); + + free(str); + } + if((int)wq.length() > 0) + { + CppSQLite3Query skillQuery = this->m_db->execQuery(CCString::createWithFormat(SKILL_QUERY, wq.c_str())->getCString()); + while(!skillQuery.eof()) + { + RPGSkill *skill = RPGSkill::create(); + skill->m_dataId = skillQuery.getIntField("id"); + skill->m_name = skillQuery.getStringField("name_cns"); + skill->m_MP = skillQuery.getIntField("mp"); + skill->m_skillAttack = skillQuery.getIntField("skill_attack"); + skill->m_type = skillQuery.getIntField("type"); + + this->m_skillList->addObject(skill); + + skillQuery.nextRow(); + } + skillQuery.finalize(); + } + + tableView->reloadData(); + + query.nextRow(); + } + query.finalize(); + +} + +void RPGMapSkillMenuLayer::onButton(cocos2d::CCObject *pSender, CCControlEvent event) +{ + SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav"); + + CCControlButton *skillBtn = (CCControlButton*)pSender; + for (int i = 0; i < this->m_skillList->count(); i++) + { + //判断选中道具 + RPGSkill *skillData = (RPGSkill*)this->m_skillList->objectAtIndex(i); + if(skillBtn->getTag() == skillData->m_dataId) + { + this->m_selectedSkill = skillData; + break; + } + } + + //因为动态获取地图的大小会导致了菜单层显示错位,所以定死了 + float width = 960; + float height = 640; + + //临时背景 + CCTMXTiledMap *mainBg = CCTMXTiledMap::create("map_menu3_style1.tmx"); + mainBg->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width / 2, CCDirector::sharedDirector()->getWinSize().height / 2)); + mainBg->setAnchorPoint(ccp(0.5, 0.5)); + mainBg->setTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg); + this->getParent()->addChild(mainBg); + + CCString *title = CCString::createWithFormat(((CCString*)this->m_stringList->objectForKey("menu_skill_choice"))->getCString(), this->m_selectedSkill->m_name.c_str()); + RPGMapChoicePlayerMenuLayer *choicePlayer = RPGMapChoicePlayerMenuLayer::create(this->m_db, title, this, callfuncO_selector(RPGMapSkillMenuLayer::onChoicePlayer), width, height); + choicePlayer->setTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer); + this->getParent()->addChild(choicePlayer); + + this->setVisible(false); +} + +void RPGMapSkillMenuLayer::onChoicePlayer(CCObject* pObject) +{ + SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav"); + + CCMenuItem *menuItem = (CCMenuItem*)pObject; + if(menuItem->getTag() == kRPGMapChoicePlayerMenuLayerTagMainMenuBack) + { + //按了退出 + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); + this->setVisible(true); + } + else + { + + bool isSuccess = RPGResultsLogic::useSkillCure(this->m_db, this->m_selectedPlayerId, menuItem->getTag() - kRPGMapChoicePlayerMenuLayerTagMainMenuPlayer, this->m_selectedSkill->m_dataId); + if(!isSuccess) + { + CCLog("技能使用失败"); + CCSize winSize = CCDirector::sharedDirector()->getWinSize(); + RPGDialogLayer *dialog = RPGDialogLayer::create(((CCString*)this->m_stringList->objectForKey("menu_skill_fail"))->getCString(), ((CCString*)this->m_stringList->objectForKey("confirm_exit_ok"))->getCString(), kRPGMapSkillMenuLayerTagDialogOK, winSize.width, winSize.height, this, menu_selector(RPGMapSkillMenuLayer::onDialog)); + dialog->setTag(kRPGMapSkillMenuLayerTagDialog); + this->getParent()->addChild(dialog); + + } + else + { + CCLog("技能使用成功"); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); + this->setVisible(true); + + this->setPlayerSkill(this->m_selectedPlayerId); //刷新正在显示的技能数据 + } + } + +} + +void RPGMapSkillMenuLayer::onDialog(cocos2d::CCObject *pObject) +{ + this->getParent()->removeChildByTag(kRPGMapSkillMenuLayerTagDialog, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true); + this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true); + this->setVisible(true); } diff --git a/Classes/RPGMapSkillMenuLayer.h b/Classes/RPGMapSkillMenuLayer.h index 6cce218..a19ded8 100644 --- a/Classes/RPGMapSkillMenuLayer.h +++ b/Classes/RPGMapSkillMenuLayer.h @@ -15,6 +15,7 @@ #include "JsonBox.h" #include "RPGMapRoleSprite.h" #include "RPGBaseSceneLayer.h" +#include "RPGResultsLogic.h" USING_NS_CC; USING_NS_CC_EXT; @@ -23,19 +24,36 @@ enum RPGMapSkillMenuLayerTag { kRPGMapSkillMenuLayerTagMainMenu = 1, kRPGMapSkillMenuLayerTagMainMenuBack = 2, - kRPGMapSkillMenuLayerTagBg = 3 - + kRPGMapSkillMenuLayerTagBg = 3, + kRPGMapSkillMenuLayerTagItemListTable = 4, + kRPGMapSkillMenuLayerTagMainMenuPlayer = 100, + kRPGMapSkillMenuLayerTagDialogOK = 5, + kRPGMapSkillMenuLayerTagDialog = 86 }; -class RPGMapSkillMenuLayer : public CCLayerColor//, CCTableViewDelegate, CCTableViewDataSource +class RPGMapSkillMenuLayer : public CCLayerColor, CCTableViewDelegate, CCTableViewDataSource { private: CCDictionary* m_stringList; CppSQLite3DB* m_db; + CCArray* m_skillList; + + bool m_statusIsDefault; //是否为第一次进入状态界面,如果是的话就不播放效果音了 + + int m_selectedPlayerId; //选中上面的player的id + bool m_enabledPlayerSkill; //是否允许点击技能项,死亡状态、相关异常状态或MP为0时设置为false + RPGSkill* m_selectedSkill; //选中的技能 + void onMenu(cocos2d::CCObject *pObject); + void setPlayerSkill(int dataId); + + void onButton(CCObject* pSender, CCControlEvent event); //点击了items列表的其中一个后触发 + void onChoicePlayer(CCObject* pObject); //在player选择框中,选中一个player后触发 + void onDialog(cocos2d::CCObject *pObject); + public: RPGMapSkillMenuLayer(); @@ -44,6 +62,19 @@ public: bool init(CCDictionary* stringList, CppSQLite3DB* db, float width, float height); static RPGMapSkillMenuLayer* create(CCDictionary* stringList, CppSQLite3DB* db, float width, float height); + //CCTableViewDelegate继承自CCScrollViewDelegate + virtual void scrollViewDidScroll(CCScrollView* scrollView); + virtual void scrollViewDidZoom(CCScrollView* scrollView); + + //点击哪个cell + virtual void tableCellTouched(CCTableView* tableView, CCTableViewCell* cell); + //每个cell的size + virtual CCSize cellSizeForTable(CCTableView *tableView); + //生成cell + virtual CCTableViewCell* tableCellAtIndex(CCTableView *tableView, unsigned int idx); + //cell的数量 + virtual unsigned int numberOfCellsInTableView(CCTableView *tableView); + }; #endif /* defined(__OzgGameRPG__RPGMapSkillMenuLayer__) */ diff --git a/Classes/RPGMapStatusMenuLayer.cpp b/Classes/RPGMapStatusMenuLayer.cpp index 6a6134a..7367b37 100644 --- a/Classes/RPGMapStatusMenuLayer.cpp +++ b/Classes/RPGMapStatusMenuLayer.cpp @@ -11,12 +11,6 @@ #include "RPGMapSceneLayer.h" #include "OzgCCUtility.h" -//获取一个player的详细数据 -#define PLAYER_DETAIL_QUERY "select p.*, arms.name_cns as arms_name, armor.name_cns as armor_name from player as p left join items as arms on p.items_id_arms = arms.id left join items as armor on p.items_id_armor = armor.id where p.id = %i" - -//查询一个角色的技能 -#define SKILL_QUERY "select * from skill where id in(%s)" - RPGMapStatusMenuLayer::RPGMapStatusMenuLayer() { @@ -27,7 +21,7 @@ RPGMapStatusMenuLayer::~RPGMapStatusMenuLayer() this->m_stringList->release(); this->m_skillList->release(); -// CCLog("RPGMapStatusMenuLayer 释放"); + CCLog("RPGMapStatusMenuLayer 释放"); } bool RPGMapStatusMenuLayer::init(cocos2d::CCDictionary *stringList, CppSQLite3DB *db, float width, float height) @@ -70,14 +64,25 @@ bool RPGMapStatusMenuLayer::init(cocos2d::CCDictionary *stringList, CppSQLite3DB CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); while(!query.eof()) { - CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + CCSprite *playerSprite = NULL; + if(query.getIntField("hp") <= 0) + { + //死亡 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_2.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(10)); + } + else + { + //正常 + CCArray *frames = OzgCCUtility::createSpriteFrames(CCString::createWithFormat("%s_0.png", query.getStringField("tex_prefix"))->getCString(), 3, 4); + playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); + } - CCSprite *playerSprite = CCSprite::createWithSpriteFrame((CCSpriteFrame*)frames->objectAtIndex(1)); CCMenuItemSprite *player = (CCMenuItemSprite*)mainMenu->getChildByTag(kRPGMapStatusMenuLayerTagMainMenuPlayer + query.getIntField("id")); if(!player) { player = CCMenuItemSprite::create(playerSprite, playerSprite, this, menu_selector(RPGMapStatusMenuLayer::onMenu)); - player->cocos2d::CCNode::setPosition(ccp(playerX, 560)); + player->setPosition(ccp(playerX, 560)); player->setScale(2); player->setTag(kRPGMapStatusMenuLayerTagMainMenuPlayer + query.getIntField("id")); mainMenu->addChild(player); @@ -141,9 +146,9 @@ void RPGMapStatusMenuLayer::onMenu(cocos2d::CCObject *pObject) break; } - //player status if(menuItem->getTag() >= kRPGMapStatusMenuLayerTagMainMenuPlayer && menuItem->getTag() <= kRPGMapStatusMenuLayerTagMainMenuPlayer + 99) { +// CCLog("点击了上面4个player的其中一个"); CCMenu *mainMenu = (CCMenu*)this->getChildByTag(kRPGMapMenuLayerTagMainMenu); CppSQLite3Query query = this->m_db->execQuery(PLAYER_QUERY); @@ -230,8 +235,9 @@ void RPGMapStatusMenuLayer::setStatusPlayer(int dataId) RPGSkill *skill = RPGSkill::create(); skill->m_dataId = skillQuery.getIntField("id"); skill->m_name = skillQuery.getStringField("name_cns"); - skill->m_mp = skillQuery.getIntField("mp"); + skill->m_MP = skillQuery.getIntField("mp"); skill->m_skillAttack = skillQuery.getIntField("skill_attack"); + skill->m_type = skillQuery.getIntField("type"); this->m_skillList->addObject(skill); @@ -338,7 +344,7 @@ CCTableViewCell* RPGMapStatusMenuLayer::tableCellAtIndex(CCTableView *tableView, RPGSkill *skillData = (RPGSkill*)this->m_skillList->objectAtIndex(index); - CCLabelTTF *textLab = CCLabelTTF::create(CCString::createWithFormat("%s (%i)", skillData->m_name.c_str(), skillData->m_mp)->getCString(), "Arial", 20, CCSizeMake(200, 25), kCCTextAlignmentLeft); + CCLabelTTF *textLab = CCLabelTTF::create(CCString::createWithFormat("%s (%i)", skillData->m_name.c_str(), skillData->m_MP)->getCString(), "Arial", 20, CCSizeMake(200, 25), kCCTextAlignmentLeft); textLab->setPosition(ccp(x, 0)); cell->addChild(textLab); diff --git a/Classes/RPGResultsLogic.cpp b/Classes/RPGResultsLogic.cpp index 2bf1288..19012c5 100644 --- a/Classes/RPGResultsLogic.cpp +++ b/Classes/RPGResultsLogic.cpp @@ -8,15 +8,15 @@ #include "RPGResultsLogic.h" -//获取一个player的数据 -#define PLAYER_DETAIL_QUERY "select * from player where id = %i" - -//使用道具后player的数据更新 -#define ITEMS_USE_UPDATE "update player set %s = %i where id = %i" +//执行操作后player的数据更新 +#define PLAYER_UPDATE "update player set %s = %i where id = %i" //使用道具后现有道具的变化 #define SAVEDATA_ITEMS_UPDATE "update save_data set items = '%s' where id = 1" +//查询一个技能的明细 +#define SKILL_DETAIL_QUERY "select * from skill where id = %i" + void RPGResultsLogic::deductionsItems(CppSQLite3DB *db, int itemsId) { CppSQLite3Query query = db->execQuery(SAVEDATA_QUERY); @@ -104,7 +104,7 @@ bool RPGResultsLogic::useItems(CppSQLite3DB* db, int playerId, int itemsId) //使用道具 { - CCString *sql = CCString::createWithFormat(ITEMS_USE_UPDATE, field.c_str(), results, playerId); + CCString *sql = CCString::createWithFormat(PLAYER_UPDATE, field.c_str(), results, playerId); db->execDML(sql->getCString()); CCLog("%s", sql->getCString()); @@ -116,3 +116,79 @@ bool RPGResultsLogic::useItems(CppSQLite3DB* db, int playerId, int itemsId) CCLog("对player%d 使用了一个道具%d", playerId, itemsId); return true; } + +bool RPGResultsLogic::useSkillCure(CppSQLite3DB *db, int srcPlayerId, int targetPlayerId, int srcSkillId) +{ + RPGPlayer *srcPlayerData; + RPGSkill *srcSkillData; + + RPGPlayer *targetPlayerData; + + //查询使用技能的player + CppSQLite3Query srcPlayerQuery = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, srcPlayerId)->getCString()); + while(!srcPlayerQuery.eof()) + { + srcPlayerData = RPGPlayer::create(); + srcPlayerData->m_dataId = srcPlayerQuery.getIntField("id"); + srcPlayerData->m_maxMP = srcPlayerQuery.getIntField("max_mp"); + srcPlayerData->m_MP = srcPlayerQuery.getIntField("mp"); + srcPlayerData->m_skillAttack = srcPlayerQuery.getFloatField("skill_attack"); + + srcPlayerQuery.nextRow(); + } + srcPlayerQuery.finalize(); + + //查询使用的技能 + CppSQLite3Query srcSkillQuery = db->execQuery(CCString::createWithFormat(SKILL_DETAIL_QUERY, srcSkillId)->getCString()); + while(!srcSkillQuery.eof()) + { + srcSkillData = RPGSkill::create(); + srcSkillData->m_dataId = srcSkillQuery.getIntField("id"); + srcSkillData->m_MP = srcSkillQuery.getIntField("mp"); + srcSkillData->m_name = srcSkillQuery.getStringField("name_cns"); + srcSkillData->m_skillAttack = srcSkillQuery.getFloatField("skill_attack"); + + srcSkillQuery.nextRow(); + } + srcSkillQuery.finalize(); + + //查询目标player + CppSQLite3Query targetPlayerQuery = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, targetPlayerId)->getCString()); + while(!targetPlayerQuery.eof()) + { + targetPlayerData = RPGPlayer::create(); + targetPlayerData->m_dataId = targetPlayerQuery.getIntField("id"); + targetPlayerData->m_maxHP = targetPlayerQuery.getIntField("max_hp"); + targetPlayerData->m_HP = targetPlayerQuery.getIntField("hp"); + + targetPlayerQuery.nextRow(); + } + targetPlayerQuery.finalize(); + + //执行逻辑 + if(srcPlayerData && srcSkillData && targetPlayerData) + { + //计算player时候技能后的效果值 + int targetResults = RPGComputingResults::skillCureResults(srcPlayerData->m_skillAttack, srcSkillData->m_skillAttack); + targetPlayerData->m_HP += targetResults; + + CCLog("player %i 回复了 %i HP", targetPlayerId, targetResults); + + //超过HP最大值 + if(targetPlayerData->m_HP > targetPlayerData->m_maxHP) + targetPlayerData->m_HP = targetPlayerData->m_maxHP; + db->execDML(CCString::createWithFormat(PLAYER_UPDATE, "hp", targetPlayerData->m_HP, targetPlayerData->m_dataId)->getCString()); + + //扣减使用者的MP + srcPlayerData->m_MP -= srcSkillData->m_MP; + if(srcPlayerData->m_MP < 0) + srcPlayerData->m_MP = 0; + + CCLog("player %i 消耗了 %i MP", srcPlayerId, srcSkillData->m_MP); + + db->execDML(CCString::createWithFormat(PLAYER_UPDATE, "mp", srcPlayerData->m_MP, srcPlayerData->m_dataId)->getCString()); + + } + + return true; +} diff --git a/Classes/RPGResultsLogic.h b/Classes/RPGResultsLogic.h index 861e555..e4d0eeb 100644 --- a/Classes/RPGResultsLogic.h +++ b/Classes/RPGResultsLogic.h @@ -25,6 +25,8 @@ public: static void deductionsItems(CppSQLite3DB* db, int itemsId); //扣减道具数 static bool useItems(CppSQLite3DB* db, int playerId, int itemsId); //使用道具,返回成功或失败 + static bool useSkillCure(CppSQLite3DB* db, int srcPlayerId, int targetPlayerId, int srcSkillId); //使用回复技能 + }; #endif /* defined(__OzgGameRPG__RPGResultsLogic__) */ diff --git a/README.md b/README.md index 4bc5bc4..4f5c61b 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ ozg game — 单机版RPG 声音文件来自 http://www.66rpg.com/type.php?t=17 -目前只在iOS平台下进行测试,战斗画面的攻击、技能、道具,地图界面的技能、道具均未完成。 +目前只在iOS平台下进行测试,战斗画面的攻击、技能、道具,地图界面的装备均未完成。 每次更新数据库都需要把模拟器里面的数据库删除。 diff --git a/Resources/db.sys b/Resources/db.sys index 6c9cdce..69d9cb6 100755 Binary files a/Resources/db.sys and b/Resources/db.sys differ diff --git a/Resources/scene_map_cns.plist b/Resources/scene_map_cns.plist index 263410e..eefbb0d 100755 --- a/Resources/scene_map_cns.plist +++ b/Resources/scene_map_cns.plist @@ -38,12 +38,16 @@ 退出 menu_skill 技能 + menu_skill_choice + 对谁使用[%s]技能呢? + menu_skill_fail + 技能使用失败 menu_status 状态 menu_items 道具 menu_items_choice - 对谁使用[%s]呢? + 对谁使用[%s]道具呢? menu_items_fail 道具使用失败 menu_equip 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 adfd520..659d37e 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 a3245fd..b1b4649 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