技能部分完成,数据结构调整

This commit is contained in:
ozg
2014-04-15 22:44:39 +08:00
parent eaecd1919e
commit ac11e34a08
18 changed files with 553 additions and 59 deletions
+6
View File
@@ -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
{
+1 -1
View File
@@ -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); //道具治疗
+2 -1
View File
@@ -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();
+29 -5
View File
@@ -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);
}
+5 -2
View File
@@ -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__) */
+36 -20
View File
@@ -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);
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);
this->loadItemsData();
}
else
{
//道具使用成功
this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayerBg, true);
this->getParent()->removeChildByTag(kRPGMapSceneLayerTagChoicePlayerMenuLayer, true);
this->setVisible(true);
this->loadItemsData();
}
}
}
+14 -3
View File
@@ -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"));
+1 -1
View File
@@ -20,7 +20,7 @@ enum RPGMapSceneLayerTag
kRPGMapSceneLayerTagMainMenuCommand = 4,
kRPGMapSceneLayerTagMenuLayer = 5,
kRPGMapSceneLayerTagChoicePlayerMenuLayer = 6,
kRPGMapSceneLayerTagChoicePlayerLab = 7,
kRPGMapSceneLayerTagChoicePlayerMenuLayerBg = 7,
kRPGMapSceneLayerTagPlayer = 1999,
kRPGMapSceneLayerTagNPC = 2000
+315 -1
View File
@@ -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);
}
+34 -3
View File
@@ -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__) */
+19 -13
View File
@@ -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);
+82 -6
View File
@@ -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;
}
+2
View File
@@ -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__) */
+1 -1
View File
@@ -9,7 +9,7 @@ ozg game — 单机版RPG
声音文件来自 http://www.66rpg.com/type.php?t=17
目前只在iOS平台下进行测试,战斗画面的攻击、技能、道具,地图界面的技能、道具均未完成。
目前只在iOS平台下进行测试,战斗画面的攻击、技能、道具,地图界面的装备均未完成。
每次更新数据库都需要把模拟器里面的数据库删除。
BIN
View File
Binary file not shown.
+5 -1
View File
@@ -38,12 +38,16 @@
<string>退出</string>
<key>menu_skill</key>
<string>技能</string>
<key>menu_skill_choice</key>
<string>对谁使用[%s]技能呢?</string>
<key>menu_skill_fail</key>
<string>技能使用失败</string>
<key>menu_status</key>
<string>状态</string>
<key>menu_items</key>
<string>道具</string>
<key>menu_items_choice</key>
<string>对谁使用[%s]呢?</string>
<string>对谁使用[%s]道具呢?</string>
<key>menu_items_fail</key>
<string>道具使用失败</string>
<key>menu_equip</key>