战斗画面完成道具部分

This commit is contained in:
ozg
2014-04-27 15:58:27 +08:00
parent d5df19d613
commit c495304860
17 changed files with 559 additions and 85 deletions
+3
View File
@@ -18,6 +18,9 @@
#define GAME_INIT_SQL "insert into save_data (map_id, player_to_x, player_to_y, player_direction, gold) values(1, 14.5, 9.5, 'down', 200);"
#define GAME_BATTLE_SELECTED_ID "GAME_BATTLE_SELECTED_ID" //战斗画面选择了一个技能或道具后,临时保存的技能id或道具id
#define GAME_BATTLE_FIELD "GAME_BATTLE_FIELD" //战斗画面的执行完毕技能或道具动作后,影响了哪个字段
#define MAX_GOLD 999999 //金钱最大值
#define MAX_STATUS1 9999 //HP最大值
#define MAX_STATUS2 999 //MP、攻击力、防御力、速度、技能攻击、技能防御的最大值
+68 -36
View File
@@ -19,6 +19,8 @@ RPGBattleMenu::~RPGBattleMenu()
this->m_parentNode->release();
this->m_playerData->release();
this->m_tableItems->release();
CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->m_parentNode->getChildByTag(kRPGBattleMenuTagBg);
if(bgLayer)
bgLayer->removeFromParentAndCleanup(true);
@@ -29,7 +31,11 @@ RPGBattleMenu::~RPGBattleMenu()
if(this->m_parentNode->getChildByTag(kRPGBattleMenuTagSeparate))
this->m_parentNode->removeChildByTag(kRPGBattleMenuTagSeparate, true);
this->m_selectDialogListData->release();
//清理技能和道具选择框
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog))
this->m_parentNode->removeChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog, true);
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog))
this->m_parentNode->removeChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog, true);
CCLog("RPGBattleMenu 释放");
}
@@ -49,9 +55,9 @@ bool RPGBattleMenu::initWithParentNode(CCDictionary* stringList, CppSQLite3DB* d
this->m_playerData = playerData;
this->m_playerData->retain();
this->m_selectDialogListData = new CCArray();
this->m_selectDialogListData->init();
this->m_tableItems = new CCArray();
this->m_tableItems->init();
this->setPosition(CCPointZero);
CCTMXTiledMap *bgLayer = (CCTMXTiledMap*)this->m_parentNode->getChildByTag(kRPGBattleMenuTagBg);
@@ -222,9 +228,11 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject)
tableView->setVerticalFillOrder(kCCTableViewFillTopDown);
tableView->setTag(197);
selectLayer->addChild(tableView);
}
this->m_selectDialogListData->removeAllObjects();
this->m_tableItems->removeAllObjects();
string wq = "";
JsonBox::Value json;
json.loadFromString(this->m_playerData->m_skill.c_str());
@@ -259,18 +267,18 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject)
skill->m_enabled = false;
else if(this->m_playerData->m_MP < skill->m_MP)
skill->m_enabled = false;
else if(skill->m_type != 2)
skill->m_enabled = false;
this->m_selectDialogListData->addObject(skill);
this->m_tableItems->addObject(skill);
query.nextRow();
}
query.finalize();
}
tableView->reloadData();
//加载技能数据 end
((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(false);
}
break;
case kRPGBattleMenuTagItems:
@@ -317,32 +325,18 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject)
tableView->setTag(197);
selectLayer->addChild(tableView);
}
this->m_selectDialogListData->removeAllObjects();
CppSQLite3Query query = this->m_db->execQuery(CCString::createWithFormat(ITEMS_EXISTING_QUERY_TYPE, 3)->getCString());
while(!query.eof())
{
RPGExistingItems *itemsData = RPGExistingItems::create();
itemsData->m_dataId = query.getIntField("id");
itemsData->m_name = query.getStringField("name_cns");
itemsData->m_buy = query.getIntField("buy");
itemsData->m_sell = query.getIntField("sell");
itemsData->m_type = query.getIntField("type");
itemsData->m_attack = query.getFloatField("attack");
itemsData->m_defense = query.getFloatField("defense");
itemsData->m_speed = query.getFloatField("speed");
itemsData->m_skillAttack = query.getFloatField("skill_attack");
itemsData->m_skillDefense = query.getFloatField("skill_defense");
itemsData->m_total = query.getIntField("total");
this->m_selectDialogListData->addObject(itemsData);
query.nextRow();
}
query.finalize();
this->m_tableItems->removeAllObjects();
CCArray *existingItems = ((RPGBattleSceneLayer*)this->m_parentNode)->m_existingItems;
for (int i = 0; i < existingItems->count(); i++)
this->m_tableItems->addObject(existingItems->objectAtIndex(i));
tableView->reloadData();
//加载道具数据 end
((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(false);
}
break;
case kRPGBattleMenuTagEscape:
@@ -417,6 +411,26 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject)
// break;
}
}
break;
case kRPGBattleMenuTagCancel2:
{
//这个选择了一个技能或道具后,到了选择目标对象的一步,使用到的取消按钮
CCMenuItemSprite *menuCancel = (CCMenuItemSprite*)this->getChildByTag(kRPGBattleMenuTagCancel);
menuCancel->setVisible(true);
CCMenuItemSprite *menuCancel2 = (CCMenuItemSprite*)this->getChildByTag(kRPGBattleMenuTagCancel2);
menuCancel2->removeFromParentAndCleanup(true);
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog))
this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog)->setVisible(true);
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog))
this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog)->setVisible(true);
((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(false);
((RPGBattleSceneLayer*)this->m_parentNode)->cancelAllSelected();
}
break;
default:
@@ -442,8 +456,26 @@ void RPGBattleMenu::onMenu(cocos2d::CCObject *pObject)
void RPGBattleMenu::onButton(cocos2d::CCObject *pSender, CCControlEvent event)
{
SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav");
CCLog("aaaa");
CCMenuItemSprite *menuCancel = (CCMenuItemSprite*)this->getChildByTag(kRPGBattleMenuTagCancel);
menuCancel->setVisible(false);
CCMenuItemSprite *menuCancel2 = CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), CCSprite::createWithSpriteFrameName("commons_btn_back_04.png"), this, menu_selector(RPGBattleMenu::onMenu));
menuCancel2->setPosition(ccp(75, 660));
menuCancel2->setTag(kRPGBattleMenuTagCancel2);
menuCancel2->setScale(0.75);
this->addChild(menuCancel2);
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog))
this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagItemsSelectDialog)->setVisible(false);
if(this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog))
this->m_parentNode->getChildByTag(kRPGBattleSceneLayerTagSkillSelectDialog)->setVisible(false);
((RPGBattleSceneLayer*)this->m_parentNode)->enabledTouched(true);
CCUserDefault::sharedUserDefault()->setIntegerForKey(GAME_BATTLE_SELECTED_ID, ((CCControlButton*)pSender)->getTag());
}
//CCTableView
@@ -478,10 +510,10 @@ CCTableViewCell* RPGBattleMenu::tableCellAtIndex(CCTableView *tableView, unsigne
else
cell->removeAllChildrenWithCleanup(true);
if(dynamic_cast<RPGSkillBtnData*>(this->m_selectDialogListData->objectAtIndex(idx)) != NULL)
if(dynamic_cast<RPGSkillBtnData*>(this->m_tableItems->objectAtIndex(idx)) != NULL)
{
//点击了技能项
RPGSkillBtnData *itemsData = (RPGSkillBtnData*)this->m_selectDialogListData->objectAtIndex(idx);
RPGSkillBtnData *itemsData = (RPGSkillBtnData*)this->m_tableItems->objectAtIndex(idx);
CCControlButton *itemBtn = CCControlButton::create(CCString::createWithFormat("%s (%i)", itemsData->m_name.c_str(), itemsData->m_MP)->getCString(), "Arial", 22);
itemBtn->setPosition(ccp(tableView->getContentSize().width / 2, 0));
@@ -490,11 +522,11 @@ CCTableViewCell* RPGBattleMenu::tableCellAtIndex(CCTableView *tableView, unsigne
cell->addChild(itemBtn);
}
else if(dynamic_cast<RPGExistingItems*>(this->m_selectDialogListData->objectAtIndex(idx)) != NULL)
else if(dynamic_cast<RPGExistingItems*>(this->m_tableItems->objectAtIndex(idx)) != NULL)
{
//点击了道具项
RPGExistingItems *itemsData = (RPGExistingItems*)this->m_selectDialogListData->objectAtIndex(idx);
RPGExistingItems *itemsData = (RPGExistingItems*)this->m_tableItems->objectAtIndex(idx);
CCControlButton *itemBtn = CCControlButton::create(CCString::createWithFormat("%s (%i)", itemsData->m_name.c_str(), itemsData->m_total)->getCString(), "Arial", 22);
itemBtn->setPosition(ccp(tableView->getContentSize().width / 2, 0));
@@ -509,6 +541,6 @@ CCTableViewCell* RPGBattleMenu::tableCellAtIndex(CCTableView *tableView, unsigne
unsigned int RPGBattleMenu::numberOfCellsInTableView(CCTableView *tableView)
{
return this->m_selectDialogListData->count();
return this->m_tableItems->count();
}
//CCTableView end
+4 -2
View File
@@ -24,7 +24,9 @@ enum RPGBattleMenuTag
kRPGBattleMenuTagItems = 5,
kRPGBattleMenuTagEscape = 6,
kRPGBattleMenuTagCancel = 7,
kRPGBattleMenuTagCancel2 = 9, //这个选择了一个技能或道具后,到了选择目标对象的一步,使用到的取消按钮
kRPGBattleMenuTagSelect = 8
};
class RPGBattleMenu : public CCMenu, CCTableViewDelegate, CCTableViewDataSource
@@ -36,7 +38,7 @@ private:
CCDictionary* m_stringList;
CCArray* m_selectDialogListData; //技能数据或道具数据
CCArray* m_tableItems; //技能数据或道具数据,需要在RPGBattleSceneLayer里面将数据加载进来
void createMenuItem(float x, float y, CCString *text, RPGBattleMenuTag tag);
void onMenu(CCObject *pObject);
@@ -48,7 +50,7 @@ public:
RPGPlayer* m_playerData;
int m_selectedMenuTag; //选中了哪个项(攻击、技能、道具)
RPGBattleMenu();
virtual ~RPGBattleMenu();
bool initWithParentNode(CCDictionary* stringList, CppSQLite3DB* db, CCNode* parentNode, RPGPlayer* playerData);
+24 -8
View File
@@ -71,22 +71,22 @@ void RPGBattleMonsterSprite::selected(bool isSelected)
}
void RPGBattleMonsterSprite::showEffectResults(cocos2d::CCObject *target, int HPResults, CCNode* player)
void RPGBattleMonsterSprite::showEffectResults(cocos2d::CCObject *target, int results, CCNode* player)
{
addLab(this, kRPGBattleMonsterSpriteTagEffectResults, CCString::createWithFormat("%i", HPResults), 24, kCCTextAlignmentCenter, ccp(this->getContentSize().width / 2, this->getContentSize().height / 2));
addLab(this, kRPGBattleMonsterSpriteTagEffectResults, CCString::createWithFormat("%i", results), 24, kCCTextAlignmentCenter, ccp(this->getContentSize().width / 2, this->getContentSize().height / 2));
CCLabelTTF *effectResults = (CCLabelTTF*)this->getChildByTag(kRPGBattleMonsterSpriteTagEffectResults);
//增加HP的话则使用绿色
if(HPResults > 0)
if(results > 0)
effectResults->setFontFillColor(ccc3(80, 255, 90));
CCMoveBy *up = CCMoveBy::create(0.5, ccp(0, 30));
CCMoveBy *down = CCMoveBy::create(1, ccp(0, -30));
this->m_HPResults = HPResults;
this->m_results = results;
effectResults->runAction(CCSequence::create(CCEaseExponentialOut::create(up), CCEaseBounceOut::create(down), CCDelayTime::create(0.5), CCCallFunc::create(this, callfunc_selector(RPGBattleMonsterSprite::showEffectResultsEnd)), CCCallFuncND::create(target, callfuncND_selector(RPGBattleSceneLayer::attackWithTargetEffectLabEnd), player), NULL));
effectResults->runAction(CCSequence::create(CCEaseExponentialOut::create(up), CCEaseBounceOut::create(down), CCDelayTime::create(0.5), CCCallFunc::create(this, callfunc_selector(RPGBattleMonsterSprite::showEffectResultsEnd)), CCCallFuncND::create(target, callfuncND_selector(RPGBattleSceneLayer::actionWithTargetEffectLabEnd), player), NULL));
}
@@ -106,9 +106,25 @@ void RPGBattleMonsterSprite::animAttack(CCObject* target, CCObject *targetObjDat
//private
void RPGBattleMonsterSprite::showEffectResultsEnd()
{
this->m_data->m_HP += this->m_HPResults;
if(strcmp(CCUserDefault::sharedUserDefault()->getStringForKey(GAME_BATTLE_FIELD, "").c_str(), "mp") == 0)
{
this->m_data->m_MP += this->m_results;
if(this->m_data->m_MP < 0)
this->m_data->m_MP = 0;
else if(this->m_data->m_MP > this->m_data->m_maxMP)
this->m_data->m_MP = this->m_data->m_maxMP;
}
else
{
this->m_data->m_HP += this->m_results;
if(this->m_data->m_HP < 0)
this->m_data->m_HP = 0;
else if(this->m_data->m_HP > this->m_data->m_maxHP)
this->m_data->m_HP = this->m_data->m_maxHP;
}
if(this->m_data->m_HP < 0)
this->m_data->m_HP = 0;
CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "");
}
+2 -2
View File
@@ -28,7 +28,7 @@ class RPGBattleMonsterSprite : public CCSprite
private:
int m_HPResults; //临时保存HP效果值
int m_results; //临时保存HP效果值
void showEffectResultsEnd(); //showEffectResults执行完毕后执行,然后再执行showEffectResults参数中的回调
@@ -45,7 +45,7 @@ public:
void selected(bool isSelected);
void showEffectResults(CCObject* target, int HPResults, CCNode* player); //显示效果值,target为回调对象,攻击的话HPResults传入的是负值,回复的话为正值
void showEffectResults(CCObject* target, int results, CCNode* player); //显示效果值,target为回调对象,攻击的话results传入的是负值,回复的话为正值
void animAttack(CCObject* target, CCObject *targetObjData); //执行一般攻击或技能攻击的动作,target为回调对象,targetObjData为攻击的对象
+37 -9
View File
@@ -285,33 +285,61 @@ void RPGBattlePlayerSprite::animSkill(cocos2d::CCObject *target, cocos2d::CCObje
CCLog("使用技能");
}
void RPGBattlePlayerSprite::showEffectResults(cocos2d::CCObject *target, int HPResults, CCNode* srcAttackObj)
void RPGBattlePlayerSprite::animUseItem(cocos2d::CCObject *target, cocos2d::CCObject *targetObjData)
{
this->stopAllActions();
if(this->getChildByTag(kRPGBattlePlayerSpriteTagArm))
this->removeChildByTag(kRPGBattlePlayerSpriteTagArm, true);
CCAnimation *animation = CCAnimation::createWithSpriteFrames(this->m_spriteFramesUseItem, 0.2);
CCSequence *animate = CCSequence::create(CCAnimate::create(animation), CCDelayTime::create(0.5), CCCallFunc::create(this, callfunc_selector(RPGBattlePlayerSprite::animNormal)), NULL);
this->runAction(CCSequence::createWithTwoActions(animate, CCCallFuncND::create(target, callfuncND_selector(RPGBattleSceneLayer::useItemResults), (void*)targetObjData)));
}
void RPGBattlePlayerSprite::showEffectResults(cocos2d::CCObject *target, int results, CCNode* srcAttackObj)
{
//srcAttackObj为发起攻击的Sprite对象
addLab(this, kRPGBattlePlayerSpriteTagEffectResults, CCString::createWithFormat("%i", HPResults), 24, kCCTextAlignmentCenter, ccp(this->getContentSize().width / 2, this->getContentSize().height / 2));
addLab(this, kRPGBattlePlayerSpriteTagEffectResults, CCString::createWithFormat("%i", results), 24, kCCTextAlignmentCenter, ccp(this->getContentSize().width / 2, this->getContentSize().height / 2));
CCLabelTTF *effectResults = (CCLabelTTF*)this->getChildByTag(kRPGBattlePlayerSpriteTagEffectResults);
//增加HP的话则使用绿色
if(HPResults > 0)
if(results > 0)
effectResults->setFontFillColor(ccc3(80, 255, 90));
CCMoveBy *up = CCMoveBy::create(0.5, ccp(0, 30));
CCMoveBy *down = CCMoveBy::create(1, ccp(0, -30));
this->m_HPResults = HPResults;
this->m_results = results;
effectResults->runAction(CCSequence::create(CCEaseExponentialOut::create(up), CCEaseBounceOut::create(down), CCDelayTime::create(0.5), CCCallFunc::create(this, callfunc_selector(RPGBattlePlayerSprite::showEffectResultsEnd)), CCCallFuncND::create(target, callfuncND_selector(RPGBattleSceneLayer::attackWithTargetEffectLabEnd), srcAttackObj), NULL));
effectResults->runAction(CCSequence::create(CCEaseExponentialOut::create(up), CCEaseBounceOut::create(down), CCDelayTime::create(0.5), CCCallFunc::create(this, callfunc_selector(RPGBattlePlayerSprite::showEffectResultsEnd)), CCCallFuncND::create(target, callfuncND_selector(RPGBattleSceneLayer::actionWithTargetEffectLabEnd), srcAttackObj), NULL));
}
//private
void RPGBattlePlayerSprite::showEffectResultsEnd()
{
this->m_data->m_HP += this->m_HPResults;
if(this->m_data->m_HP < 0)
this->m_data->m_HP = 0;
if(strcmp(CCUserDefault::sharedUserDefault()->getStringForKey(GAME_BATTLE_FIELD, "").c_str(), "mp") == 0)
{
this->m_data->m_MP += this->m_results;
if(this->m_data->m_MP < 0)
this->m_data->m_MP = 0;
else if(this->m_data->m_MP > this->m_data->m_maxMP)
this->m_data->m_MP = this->m_data->m_maxMP;
}
else
{
this->m_data->m_HP += this->m_results;
if(this->m_data->m_HP < 0)
this->m_data->m_HP = 0;
else if(this->m_data->m_HP > this->m_data->m_maxHP)
this->m_data->m_HP = this->m_data->m_maxHP;
}
CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "");
}
+4 -2
View File
@@ -28,7 +28,7 @@ class RPGBattlePlayerSprite : public CCSprite
private:
int m_HPResults; //临时保存HP效果值
int m_results; //临时保存HP效果值
CCArray* m_spriteFramesNormal; //通常
CCArray* m_spriteFramesHurt; //受到攻击
@@ -66,7 +66,9 @@ public:
void animSkill(CCObject* target, CCObject *targetObjData); //执行技能,target为回调对象,targetObjData为目标对象
void showEffectResults(CCObject* target, int HPResults, CCNode* srcAttackObj); //显示效果值target为回调对象,攻击的话HPResults传入的是负值,回复的话为正值
void animUseItem(CCObject* target, CCObject *targetObjData); //执行使用道具target为回调对象,targetObjData为目标对象
void showEffectResults(CCObject* target, int results, CCNode* srcAttackObj); //显示效果值,target为回调对象,攻击的话results传入的是负值,回复的话为正值
};
+219 -19
View File
@@ -10,11 +10,13 @@
#include "RPGLoadingSceneLayer.h"
#include "RPGComputingResults.h"
#include "RPGStartSceneLayer.h"
#include "RPGResultsLogic.h"
#define MONSTER_QUERY "select * from monster where map_id = %i order by random() limit 1" //随机出现怪物
#define SAVE_GOLD "update save_data set gold = %i where id = 1" //保存金钱
#define UPDATE_PLAYER "update player set hp = %i, mp = %i, attack = %f, defense = %f, speed = %f, skill_attack = %f, skill_defense = %f, level = %i, skill = '%s', next_exp = %i, exp = %i where id = %i" //更新player数据,升级时用到
#define UPDATE_EXISTING_ITEMS "update items_existing set total = %i where id = %i" //更新已有道具
RPGBattleSceneLayer::RPGBattleSceneLayer()
{
@@ -27,7 +29,8 @@ RPGBattleSceneLayer::~RPGBattleSceneLayer()
this->m_monsterDataList->release();
this->m_playerList->release();
this->m_monsterList->release();
this->m_existingItems->release();
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("monsters.plist");
// CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();
@@ -77,6 +80,32 @@ bool RPGBattleSceneLayer::init()
this->m_speedTotal = 0; //速度总值的初始化
//加载已有道具
this->m_existingItems = new CCArray();
this->m_existingItems->init();
CppSQLite3Query itemsQuery = this->m_db.execQuery(CCString::createWithFormat(ITEMS_EXISTING_QUERY_TYPE, 3)->getCString());
while(!itemsQuery.eof())
{
RPGExistingItems *itemsData = RPGExistingItems::create();
itemsData->m_dataId = itemsQuery.getIntField("id");
itemsData->m_name = itemsQuery.getStringField("name_cns");
itemsData->m_buy = itemsQuery.getIntField("buy");
itemsData->m_sell = itemsQuery.getIntField("sell");
itemsData->m_type = itemsQuery.getIntField("type");
itemsData->m_attack = itemsQuery.getFloatField("attack");
itemsData->m_defense = itemsQuery.getFloatField("defense");
itemsData->m_speed = itemsQuery.getFloatField("speed");
itemsData->m_skillAttack = itemsQuery.getFloatField("skill_attack");
itemsData->m_skillDefense = itemsQuery.getFloatField("skill_defense");
itemsData->m_total = itemsQuery.getIntField("total");
this->m_existingItems->addObject(itemsData);
itemsQuery.nextRow();
}
itemsQuery.finalize();
//加载已有道具 end
//player
float playerY = 620;
float separateY = 197;
@@ -207,6 +236,8 @@ bool RPGBattleSceneLayer::init()
monsterData->m_name = query.getStringField("name_cns");
monsterData->m_maxHP = query.getIntField("max_hp");
monsterData->m_HP = query.getIntField("max_hp"); //跟上面的一样
monsterData->m_maxMP = query.getIntField("max_mp");
monsterData->m_MP = query.getIntField("max_mp"); //跟上面的一样
monsterData->m_attack = query.getFloatField("attack");
monsterData->m_defense = query.getFloatField("defense");
monsterData->m_speed = query.getFloatField("speed");
@@ -448,12 +479,12 @@ void RPGBattleSceneLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
CCLog("攻击player");
RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu);
RPGPlayer *playerData = battleMenu->m_playerData;
RPGPlayer *srcPlayerData = battleMenu->m_playerData;
player->selected(false);
this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true);
this->attack(playerData, player->m_data);
this->attack(srcPlayerData, player->m_data);
}
else
player->selected(true);
@@ -476,12 +507,12 @@ void RPGBattleSceneLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
CCLog("攻击怪物");
RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu);
RPGPlayer *playerData = battleMenu->m_playerData;
RPGPlayer *srcPlayerData = battleMenu->m_playerData;
monster->selected(false);
battleMenu->removeFromParentAndCleanup(true);
this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true);
this->attack(playerData, monster->m_data);
this->attack(srcPlayerData, monster->m_data);
}
else
@@ -496,13 +527,129 @@ void RPGBattleSceneLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
break;
case kRPGBattleMenuTagSkill:
{
CCLog("技能");
CCLog("a");
//检测选中的player
for (int i = 0; i < this->m_playerList->count(); i++)
{
RPGBattlePlayerSprite *player = (RPGBattlePlayerSprite*)this->m_playerList->objectAtIndex(i);
if(player->boundingBox().containsPoint(point))
{
SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav");
if(player->m_isSelected)
{
CCLog("对player使用技能");
// RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu);
// RPGPlayer *playerData = battleMenu->m_playerData;
//
// player->selected(false);
// this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true);
//
// this->attack(playerData, player->m_data);
}
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))
{
SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav");
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;
case kRPGBattleMenuTagItems:
{
CCLog("道具");
CCLog("b");
//检测选中的player
for (int i = 0; i < this->m_playerList->count(); i++)
{
RPGBattlePlayerSprite *player = (RPGBattlePlayerSprite*)this->m_playerList->objectAtIndex(i);
if(player->boundingBox().containsPoint(point))
{
SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav");
if(player->m_isSelected)
{
CCLog("对player使用道具");
RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu);
RPGPlayer *srcPlayerData = battleMenu->m_playerData;
player->selected(false);
this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true);
this->useItem(srcPlayerData, player->m_data);
}
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))
{
SimpleAudioEngine::sharedEngine()->playEffect("audio_effect_btn.wav");
if(monster->m_isSelected)
{
CCLog("对怪物使用道具");
RPGBattleMenu *battleMenu = (RPGBattleMenu*)this->getChildByTag(kRPGBattleSceneLayerTagBattleMenu);
RPGPlayer *srcPlayerData = battleMenu->m_playerData;
monster->selected(false);
this->removeChildByTag(kRPGBattleSceneLayerTagBattleMenu, true);
this->useItem(srcPlayerData, monster->m_data);
}
else
monster->selected(true);
}
else
monster->selected(false);
}
}
break;
// default:
@@ -542,6 +689,11 @@ void RPGBattleSceneLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
}
//保存现有道具到数据库
for (int i = 0; i < this->m_existingItems->count(); i++)
{
RPGExistingItems *itemsData = (RPGExistingItems*)this->m_existingItems->objectAtIndex(i);
this->m_db.execDML(CCString::createWithFormat(UPDATE_EXISTING_ITEMS, itemsData->m_total, itemsData->m_dataId)->getCString());
}
this->goToMap();
}
@@ -712,10 +864,10 @@ void RPGBattleSceneLayer::attack(cocos2d::CCObject *attackObjData, cocos2d::CCOb
RPGBattlePlayerSprite *player = (RPGBattlePlayerSprite*)this->getChildByTag(kRPGBattleSceneLayerTagPlayer + ((RPGPlayer*)attackObjData)->m_dataId);
player->animAttack(this, targetObjData);
}
else if(dynamic_cast<RPGMonster*>(attackObjData) != NULL)
{
}
// else if(dynamic_cast<RPGMonster*>(attackObjData) != NULL)
// {
//
// }
}
@@ -739,8 +891,8 @@ void RPGBattleSceneLayer::attackResults(cocos2d::CCNode *sender, void *data)
RPGBattleMonsterSprite *targetMonster = (RPGBattleMonsterSprite*)this->getChildByTag(((RPGMonster*)data)->m_tag);
particleSysPoint = targetMonster->getPosition();
int HPResults = RPGComputingResults::attackResults(((RPGBattlePlayerSprite*)sender)->m_data->m_attack, ((RPGMonster*)data)->m_defense);
targetMonster->showEffectResults(this, -HPResults, sender);
int results = RPGComputingResults::attackResults(((RPGBattlePlayerSprite*)sender)->m_data->m_attack, ((RPGMonster*)data)->m_defense);
targetMonster->showEffectResults(this, -results, sender);
}
else if(dynamic_cast<RPGPlayer*>((CCObject*)data) != NULL)
{
@@ -750,8 +902,8 @@ void RPGBattleSceneLayer::attackResults(cocos2d::CCNode *sender, void *data)
particleSysPoint = targetPlayer->getPosition();
int HPResults = RPGComputingResults::attackResults(((RPGBattlePlayerSprite*)sender)->m_data->m_attack, ((RPGPlayer*)data)->m_defense);
targetPlayer->showEffectResults(this, -HPResults, sender);
int results = RPGComputingResults::attackResults(((RPGBattlePlayerSprite*)sender)->m_data->m_attack, ((RPGPlayer*)data)->m_defense);
targetPlayer->showEffectResults(this, -results, sender);
}
@@ -778,7 +930,49 @@ void RPGBattleSceneLayer::attackResults(cocos2d::CCNode *sender, void *data)
}
void RPGBattleSceneLayer::attackWithTargetEffectLabEnd(cocos2d::CCNode *sender, void* data)
void RPGBattleSceneLayer::useItem(cocos2d::CCObject *useItemObjData, cocos2d::CCObject *targetObjData)
{
RPGBattlePlayerSprite *srcPlayer = (RPGBattlePlayerSprite*)this->getChildByTag(kRPGBattleSceneLayerTagPlayer + ((RPGPlayer*)useItemObjData)->m_dataId);
srcPlayer->animUseItem(this, targetObjData);
}
void RPGBattleSceneLayer::useItemResults(cocos2d::CCNode *sender, void *data)
{
CCPoint particleSysPoint;
if(dynamic_cast<RPGBattlePlayerSprite*>(sender) != NULL)
{
if(dynamic_cast<RPGMonster*>((CCObject*)data) != NULL)
{
//对怪物使用道具
RPGBattleMonsterSprite *targetMonster = (RPGBattleMonsterSprite*)this->getChildByTag(((RPGMonster*)data)->m_tag);
particleSysPoint = targetMonster->getPosition();
int results = RPGResultsLogic::battleUseItems(this->m_existingItems, (RPGMonster*)data, CCUserDefault::sharedUserDefault()->getIntegerForKey(GAME_BATTLE_SELECTED_ID));
targetMonster->showEffectResults(this, results, sender);
}
else if(dynamic_cast<RPGPlayer*>((CCObject*)data) != NULL)
{
//player攻击player
RPGBattlePlayerSprite *targetPlayer = (RPGBattlePlayerSprite*)this->getChildByTag(kRPGBattleSceneLayerTagPlayer + ((RPGPlayer*)data)->m_dataId);
particleSysPoint = targetPlayer->getPosition();
int results = RPGResultsLogic::battleUseItems(this->m_existingItems, (RPGPlayer*)data, CCUserDefault::sharedUserDefault()->getIntegerForKey(GAME_BATTLE_SELECTED_ID));
targetPlayer->showEffectResults(this, results, sender);
}
}
//显示使用道具后的粒子效果
CCParticleSystemQuad *particleSys = CCParticleSystemQuad::create("use_item.plist");
particleSys->setAutoRemoveOnFinish(true);
particleSys->setPosition(particleSysPoint);
this->addChild(particleSys);
}
void RPGBattleSceneLayer::actionWithTargetEffectLabEnd(cocos2d::CCNode *sender, void* data)
{
//data为发起攻击的Sprite对象
@@ -794,6 +988,12 @@ void RPGBattleSceneLayer::attackWithTargetEffectLabEnd(cocos2d::CCNode *sender,
targetPlayer->m_data->m_status = kRPGDataStatusDeath;
targetPlayer->animDeath();
}
else
{
//player复活
targetPlayer->m_data->m_status = kRPGDataStatusNormal;
targetPlayer->animNormal();
}
sender->removeFromParentAndCleanup(true);
@@ -819,7 +1019,7 @@ void RPGBattleSceneLayer::attackWithTargetEffectLabEnd(cocos2d::CCNode *sender,
RPGBattleMonsterSprite *srcMonster = (RPGBattleMonsterSprite*)data;
srcMonster->m_data->m_progress = 0;
}
//判断是否胜利了
if(!this->judgeLose())
this->scheduleUpdate();
@@ -892,7 +1092,7 @@ void RPGBattleSceneLayer::attackWithTargetEffectLabEnd(cocos2d::CCNode *sender,
player->m_data->m_progress = 0;
CCProgressTimer *battleProgress = (CCProgressTimer*)this->getChildByTag(kRPGBattleSceneLayerTagPlayerProgress + player->m_data->m_dataId);
battleProgress->setPercentage(player->m_data->m_progress);
//判断是否胜利了
if(!this->judgeWin())
this->scheduleUpdate();
+8 -1
View File
@@ -80,6 +80,8 @@ private:
public:
CCArray* m_existingItems; //已有道具
RPGBattleSceneLayer();
virtual ~RPGBattleSceneLayer();
virtual bool init();
@@ -103,10 +105,15 @@ public:
void enabledTouched(bool enabled); //是否打开可点击状态(主要可点击player或怪物)
void cancelAllSelected(); //取消全部选中的对象
//攻击
void attack(CCObject* attackObjData, CCObject* targetObjData); //player或怪物执行攻击
void attackResults(CCNode* sender, void* data); //回调,计算攻击后的结果
void attackWithTargetEffectLabEnd(CCNode* sender, void* data); //回调,攻击流程完毕后执行,这个sender是被攻击的对象中显示的伤害值CCLabelTTF
//道具
void useItem(CCObject* useItemObjData, CCObject* targetObjData); //player执行使用道具
void useItemResults(CCNode* sender, void* data); //回调,计算使用道具后的结果
void actionWithTargetEffectLabEnd(CCNode* sender, void* data); //回调,攻击、技能、道具流程完毕后执行,这个sender是目标对象中显示的效果值CCLabelTTF
};
#endif /* defined(__OzgGameRPG__RPGBattleSceneLayer__) */
+2
View File
@@ -64,6 +64,8 @@ public:
string m_name;
int m_maxHP;
int m_HP; //数据库里面没有这个字段
int m_maxMP;
int m_MP; //数据库里面没有这个字段
float m_attack;
float m_defense;
float m_speed;
+70 -3
View File
@@ -97,13 +97,12 @@ bool RPGResultsLogic::useItems(CppSQLite3DB* db, int playerId, int itemsId)
CppSQLite3Query query = db->execQuery(CCString::createWithFormat(PLAYER_DETAIL_QUERY, playerId)->getCString());
while(!query.eof())
{
//死亡状态下不能直接恢复hp的道具
if(query.getIntField("hp") <= 0 && itemsId != 8)
return false;
return false; //死亡状态下不能直接恢复hp的道具
else if(query.getIntField("hp") <= 0 && itemsId == 8)
results = 1; //复活后是1HP
else if(query.getIntField("hp") > 0 && itemsId == 8)
return false; //活着的不能使用复活药
return false; //活着的时候不能使用复活药
else
{
//恢复HP或MP
@@ -134,6 +133,74 @@ bool RPGResultsLogic::useItems(CppSQLite3DB* db, int playerId, int itemsId)
return true;
}
int RPGResultsLogic::battleUseItems(CCArray* existingItems, cocos2d::CCObject *targetData, int itemsId)
{
/*
6 草药
7 党参
8 复活药
*/
//道具的效果值
int results = 0;
if(dynamic_cast<RPGPlayer*>(targetData) != NULL)
{
if(((RPGPlayer*)targetData)->m_status == kRPGDataStatusDeath && itemsId != 8)
return 0; //死亡状态下不能直接恢复hp的道具
else if(((RPGPlayer*)targetData)->m_status == kRPGDataStatusDeath && itemsId == 8)
results = 1; //复活后是1HP
else if(((RPGPlayer*)targetData)->m_status != kRPGDataStatusDeath && itemsId == 8)
return 0; //活着的时候不能使用复活药
else
{
//恢复HP或MP
results = RPGComputingResults::itemCure(itemsId);
if(itemsId == 7)
CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "mp");
}
}
else if(dynamic_cast<RPGMonster*>(targetData) != NULL)
{
//以下的复活部分是不会触发的
if(((RPGMonster*)targetData)->m_status == kRPGDataStatusDeath && itemsId != 8)
return 0; //死亡状态下不能直接恢复hp的道具
else if(((RPGMonster*)targetData)->m_status == kRPGDataStatusDeath && itemsId == 8)
results = 1; //复活后是1HP
else if(((RPGMonster*)targetData)->m_status != kRPGDataStatusDeath && itemsId == 8)
return 0; //活着的时候不能使用复活药
else
{
//恢复HP或MP
results = RPGComputingResults::itemCure(itemsId);
if(itemsId == 7)
CCUserDefault::sharedUserDefault()->setStringForKey(GAME_BATTLE_FIELD, "mp");
}
}
//扣减一个已有道具,没有了就在已有existingItems中删除
CCArray* noneExistingItems = CCArray::create();
for (int i = 0; i < existingItems->count(); i++)
{
RPGExistingItems *itemsData = (RPGExistingItems*)existingItems->objectAtIndex(i);
itemsData->m_total--;
if(itemsData->m_total <= 0)
noneExistingItems->addObject(itemsData); //该道具用完了之后就加入删除列表
}
//删除用完了的道具
existingItems->removeObjectsInArray(noneExistingItems);
return results;
}
bool RPGResultsLogic::useSkillCure(CppSQLite3DB *db, int srcPlayerId, int targetPlayerId, int srcSkillId)
{
RPGPlayer *srcPlayerData;
+2 -1
View File
@@ -24,7 +24,8 @@ class RPGResultsLogic
public:
static void discardItems(CppSQLite3DB* db, int itemsId); //丢弃道具
static void deductionsItems(CppSQLite3DB* db, int itemsId); //扣减道具数
static bool useItems(CppSQLite3DB* db, int playerId, int itemsId); //使用道具,返回成功或失败
static bool useItems(CppSQLite3DB* db, int playerId, int itemsId); //地图画面中使用道具,返回成功或失败
static int battleUseItems(CCArray* existingItems, CCObject* targetData, int itemsId); //战斗画面中使用道具,existingItems为已有道具,objData为RPGPlayer、RPGMonster,返回的是该道具的效果值
static bool useSkillCure(CppSQLite3DB* db, int srcPlayerId, int targetPlayerId, int srcSkillId); //使用回复技能
+2 -2
View File
@@ -1,4 +1,4 @@
ozg game — 单机版RPG(开发中…)
ozg game — RPG(开发中…)
================
本游戏主要用于技术的研究和积累
@@ -9,7 +9,7 @@ ozg game — 单机版RPG(开发中…)
声音文件来自 http://www.66rpg.com/type.php?t=17
目前只在iOS平台下进行测试,战斗系统的技能、道具未完成。
目前只在iOS平台下进行测试,战斗系统的技能未完成。
每次的更新完毕之后,数据结构都可能发生了变化,所以要把旧的数据库删除。
BIN
View File
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -216,6 +216,7 @@
46C1009316BF786A00F74D54 /* tolua_fix.c in Sources */ = {isa = PBXBuildFile; fileRef = 46C1008A16BF786A00F74D54 /* tolua_fix.c */; };
46C59AD317641FF300F43DC3 /* AudioEngine.lua in Resources */ = {isa = PBXBuildFile; fileRef = 46C59AD117641FF300F43DC3 /* AudioEngine.lua */; };
46C59AD417641FF300F43DC3 /* CCBReaderLoad.lua in Resources */ = {isa = PBXBuildFile; fileRef = 46C59AD217641FF300F43DC3 /* CCBReaderLoad.lua */; };
8905D0C1190CC5E70031F27E /* use_item.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8905D0C0190CC5E70031F27E /* use_item.plist */; };
8909857018F253DE0021AE26 /* battle_msg_style1.tmx in Resources */ = {isa = PBXBuildFile; fileRef = 8909856F18F253DE0021AE26 /* battle_msg_style1.tmx */; };
890F1B5C1902E284002F2769 /* attack1.ExportJson in Resources */ = {isa = PBXBuildFile; fileRef = 890F1B501902E284002F2769 /* attack1.ExportJson */; };
890F1B5D1902E284002F2769 /* attack2.ExportJson in Resources */ = {isa = PBXBuildFile; fileRef = 890F1B511902E284002F2769 /* attack2.ExportJson */; };
@@ -842,6 +843,7 @@
46C1008B16BF786A00F74D54 /* tolua_fix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tolua_fix.h; sourceTree = "<group>"; };
46C59AD117641FF300F43DC3 /* AudioEngine.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AudioEngine.lua; sourceTree = "<group>"; };
46C59AD217641FF300F43DC3 /* CCBReaderLoad.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CCBReaderLoad.lua; sourceTree = "<group>"; };
8905D0C0190CC5E70031F27E /* use_item.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = use_item.plist; sourceTree = "<group>"; };
8909856F18F253DE0021AE26 /* battle_msg_style1.tmx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = battle_msg_style1.tmx; sourceTree = "<group>"; };
890F1B501902E284002F2769 /* attack1.ExportJson */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = attack1.ExportJson; sourceTree = "<group>"; };
890F1B511902E284002F2769 /* attack2.ExportJson */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = attack2.ExportJson; sourceTree = "<group>"; };
@@ -2426,6 +2428,7 @@
F293BC4615EB859D00256477 /* Resources */ = {
isa = PBXGroup;
children = (
8905D0C0190CC5E70031F27E /* use_item.plist */,
89D2A12A190B431F00EDD50B /* skill_cure.plist */,
89D2A12B190B431F00EDD50B /* skill_fire.plist */,
893D34D21906B01100BFE2C5 /* attack_damage.plist */,
@@ -2658,6 +2661,7 @@
15C1569E1683138E00D239F2 /* Icon-144.png in Resources */,
89F5D10F18E7C5C0009D703C /* actor7_4.png in Resources */,
9E5C5F6E18EE59BB00A68C36 /* battle_menu_style1.tmx in Resources */,
8905D0C1190CC5E70031F27E /* use_item.plist in Resources */,
1AC3623516D47C5C000847F2 /* fonts in Resources */,
893D34D41906B01100BFE2C5 /* attack_damage.plist in Resources */,
89F5D14118E7C5DD009D703C /* map_01.tmx in Resources */,