您的位置:首页 > 移动开发 > Cocos引擎

【cocos2d-x IOS游戏开发-捕鱼达人10】鱼的产生和移动

2013-12-05 20:20 555 查看
尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17144971

上节回顾

【cocos2d-x IOS游戏开发-捕鱼达人9】鱼与动画

1、鱼的产生

鱼的产生

在一定范围内随机产生鱼

场景和屏幕的关系

屏幕只是场景的一个小区域

鱼的坐标是相对场景的。

一些简单的限定

不同的鱼有不同的产生机率

场景中的鱼有最大上限,如果上限内则不产生鱼

鱼在完全看不见的情况下有一定机率消失(可选)

鱼的配置

正常速度,加速时速度,最大加速时间

转弯速度(转1度需要的时间)

血量(决定了能够承受攻击的次数)

2、  鱼的移动

和移动相关的属性

方向

在场景中的位置

当前速度

转弯速度

移动规则

在场景范围内随机挑选一个可用点进行移动

转向时,停止移动

具体实现看代码:

点击开始游戏之后:

#ifndef _GAME_LOGIC_H_
#define _GAME_LOGIC_H_
#include "cocos2d.h"
USING_NS_CC;

#include <vector>

#include "../include/IGameScene.h"
#include "../include/SignalSlot.h"

#include "../config/GameConfig.h"
#include "../config/FishConfig.h"
#include "GameLogicDef.h"
#include "GameUIMgr.h"
#include "GameObject.h"

namespace fishingjoy
{
namespace logic
{
class CGameLogic:public cocos2d::CCObject,public IGameLogic
{
scene::IGameScene* m_pGameScene;
CGameUIMgr mUIMgr;
std::vector<CGameObject*> m_vecObjectsList;
EGameState m_eGameState;
public:
//override base class.
void update(float dt);
public:
//implement interface for IGameLogic
virtual void enterGame()
{
const char* szPlaySceneBg = config::CGameConfig::getPlaySceneBg();
m_pGameScene->setBackground(szPlaySceneBg);

m_eGameState = EGS_GAME_PLAY;

//获取鱼的配置信息
const std::vector<config::SFishData>& rFishs = config::CFishConfig::getFishData();
//在屏幕上显示5条鱼
for(int i = 0; i < 5; ++i){
//随机生成鱼的索引
int idx = CCRANDOM_0_1()*rFishs.size();
//根据索引值取得鱼的数据
const config::SFishData& rData = rFishs[idx];
//创建对象鱼添加到m_vecObjectsList中
createGameObject(rData);
}

//emit signal... to notice that game is enter succesfully.
Event_EnterGameSuccessed();
}

virtual void exitGame()
{
shutdown();
}
public:
bool init(CCScene* pScene);

void shutdown()
{
//to do..

//exit.
CCDirector::sharedDirector()->end();
}
private:
CGameObject* createGameObject(const config::SFishData& rData);
void destroyGameObject(CGameObject* pObj);
};
}
}
#endif
再看创建游戏对象的实现:

CGameObject* CGameLogic::createGameObject(const config::SFishData& rData)
{
//根据鱼的AniID创建m_pGameScene的对象
scene::ISceneObject* pS = m_pGameScene->createObject(rData.AniID);
CGameObject* pObj = new CGameObject(pS);

int maxw = config::CGameConfig::getExtendSize()+480;
int maxh = config::CGameConfig::getExtendSize()+320;
pObj->setPosition(CCRANDOM_0_1()*maxw,CCRANDOM_0_1()*maxh);
pObj->setDuration(360*CCRANDOM_0_1());
m_vecObjectsList.push_back(pObj);
return pObj;
}
创建对象鱼:

ISceneObject* CGameScene::createObject(int tid)
{
//创建一个Scene的对象
CSceneObject* pObj = new CSceneObject(tid);
m_vecObjectsList.push_back(pObj);
pObj->getRenderObject()->setPosition(cocos2d::CCPointMake(150,150));
m_pObjectLayer->addChild(pObj->getRenderObject());
return pObj;
}
实现真正的渲染控制

#ifndef __RENDER_OBJECT_H__
#define __RENDER_OBJECT_H__
#include "cocos2d.h"
#include "../config/AniConfig.h"
namespace fishingjoy
{
namespace scene
{
class CRenderObject:public cocos2d::CCSprite
{
const config::CAniObjectData* mAniObjectData;
public:
CRenderObject(int tid)
{
init();
//获取鱼的动画的配置信息
mAniObjectData = config::CAniConfig::getData(tid);
if(mAniObjectData){
//获取默认的动画名字即move
const char* de = mAniObjectData->getDefaultAni();
//根据名字设置动画的状态
setAni(de);
}
}
void setAni(const char* aniName)
{
if(mAniObjectData){
//根据动画名字从std::vector<SAniData> mAnis中查找SAniData,即查找动画的配置信息
const config::SAniData* pData = mAniObjectData->getAni(aniName);
//根据动画的配置信息数据创建动画
cocos2d::CCAnimation* pAnimation = cocos2d::CCAnimation::createWithSpriteFrames(pData->Frames,pData->Delay);
//运行动画,CCRepeatForever的运行
this->runAction(cocos2d::CCRepeatForever::create(cocos2d::CCAnimate::create(pAnimation)));
}
}
public:
void update(float dt)
{
printf("update render object\n");
}
};
}
}
#endif


现在可以看到鱼在游动了!!



本节源代码与工程文件:【资源引用页】

大家还可以优化相关细节,可以适当增加属性和玩法(比如显示血条等等)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息