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

原创 2013年12月05日 21:34:56

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17148421


上节回顾

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


1、鱼的产生完善

概率
不同的鱼都有不同的概率
每种鱼的出现,受概率影响
每次判定,都能生产鱼

概率的实现方案
概率精确度1%
所有相加得到的值得到一个总和 sum
在0~sum 之间随机取值,得到相应的鱼

2、  鱼的移动完善

移动实现
选定目标点
将状态设置为移动
判定当前位置,目标位置,下一位置之间的关系,判定是否移动成功。

鱼的状态
转向状态
移动状态
受攻击死亡状态


具体的代码实现:

#include "GameLogic.h"

namespace fishingjoy
{
	namespace logic
	{


		CGameObject* CGameLogic::createGameObject()
		{
			int idx = CCRANDOM_0_1()*m_vecPercentPool.size();
			idx = m_vecPercentPool[idx];
			
			//获取鱼的配置信息
			const std::vector<config::SFishData>& rFishs = config::CFishConfig::getFishData();
			const config::SFishData& rData = rFishs[idx];

			scene::ISceneObject* pS = m_pGameScene->createObject(rData.AniID);
			CGameObject* pObj = new CGameObject(pS,&rData);

			int maxw = config::CGameConfig::getExtendSize()+960;
			int maxh = config::CGameConfig::getExtendSize()+640;
			//设置方向
			pObj->setDuration(360*CCRANDOM_0_1());
			//设置目标
			pObj->setPosition(CCRANDOM_0_1()*maxw,CCRANDOM_0_1()*maxh);

			pObj->randomTarget();
			m_vecObjectsList.push_back(pObj);
			return pObj;
		}

		void CGameLogic::destroyGameObject( CGameObject* pObj )
		{
			if(pObj){
				std::vector<CGameObject*>::iterator it= m_vecObjectsList.begin();
				for(;it!=m_vecObjectsList.end();++it){
					if(*it == pObj){
						m_vecObjectsList.erase(it);
						delete (pObj);
						return;
					}
				}
			}
		}

		bool CGameLogic::init( CCScene* pScene )
		{
			//获取鱼的配置信息
			const std::vector<config::SFishData>& rFishs = config::CFishConfig::getFishData();
			for(size_t i = 0; i < rFishs.size(); ++i){
				const config::SFishData& rData = rFishs[i];
				for(int x = 0; x < rData.Percent; ++x){
					m_vecPercentPool.push_back(i);
				}
			}

			m_eGameState = EGS_BEGIN_MENU;
			if(pScene==NULL)
				return false;
			m_pGameScene = scene::createScene();
			if(m_pGameScene==NULL)
				return false;

			cocos2d::CCLayer* pSceneRoot = cocos2d::CCLayer::create();
			pScene->addChild(pSceneRoot);
			m_pGameScene->attachTo(pSceneRoot);

			const char* szBeginSceneBg = config::CGameConfig::getBeginSceneBg();
			m_pGameScene->setBackground(szBeginSceneBg);

			cocos2d::CCLayer* pUIRoot = cocos2d::CCLayer::create();
			pScene->addChild(pUIRoot);
			mUIMgr.init(this,pUIRoot);

			return true;
		}

		//每一帧都被触发
		void CGameLogic::update( float dt )
		{
			if(m_eGameState != EGS_GAME_PLAY)
				return;
			static float total = 0;
			//每隔三秒中查看已生成的鱼是否大于20,小于则新加鱼对象
			total+=dt;
			CCLOG("dt = %f, total =%f",dt, total);
			if(total > 3.0f){
				if(m_vecObjectsList.size()< config::CGameConfig::getMaxFishNum()){
					createGameObject();
				}
				total = 0;
			}

			//更新m_pGameScene
			if(m_pGameScene)
				m_pGameScene->update(dt);

			//更新对象的状态
			std::vector<CGameObject*>::iterator it = m_vecObjectsList.begin();
			std::vector<CGameObject*>::iterator end = m_vecObjectsList.end();
			for(;it!=end;++it){
				(*it)->update(dt);
			}
		}

	}
}
对象鱼的状态改变:

#ifndef __GAME_OBJECT_H__
#define __GAME_OBJECT_H__

#include "../include/IGameScene.h"
#include "../config/FishConfig.h"
#include "../config/GameConfig.h"
namespace fishingjoy
{
	namespace logic
	{
		enum EGameObjectState
		{
			EGOS_MOVE,//移动
			EGOS_ROTATE,//转向
			EGOS_DIE,//死亡
		};
		class CGameObject
		{
			scene::ISceneObject* m_pSceneObject;
			const config::SFishData* m_pFishData;
			EGameObjectState m_eGameObjectState;

			float m_TargetX;
			float m_TargetY;

			float m_CurrentX;
			float m_CurrentY;
		public:
			CGameObject(scene::ISceneObject* pObj,const config::SFishData* pData)
				:m_pSceneObject(pObj)
				,m_pFishData(pData)
				,m_eGameObjectState(EGOS_MOVE)
			{

			}
		public:
			void update(float dt)
			{
				switch(m_eGameObjectState)
				{
				case EGOS_MOVE:
					updateMove(dt);
					break;
				case EGOS_ROTATE:
					//转向就不再移动了
					break;
				case EGOS_DIE:
					break;
				default:
					break;
				}
			}

			void setPosition(int x,int y)
			{
				m_CurrentX = x;
				m_CurrentY = y;
				m_pSceneObject->setPosition(x,y);
			}

			void randomTarget()
			{
				m_TargetX = CCRANDOM_0_1()*(config::CGameConfig::getExtendSize()+960);
				m_TargetY = CCRANDOM_0_1()*(config::CGameConfig::getExtendSize()+640);
				float dx = m_TargetX - m_CurrentX;
				float dy = m_TargetY - m_CurrentY;
				float angle = atan(dy/dx);
				float degree = angle*180/3.1415926;
				if(dx<0){
					degree += 180;
				}
				setDuration(degree);
			}

			void setDuration(int degree)
			{
				m_pSceneObject->setDuration(180-degree);
			}

		private:
			void updateMove(float dt);
		};
	}
}
#endif

对象鱼的updateMove方法:

#include "GameObject.h"

namespace fishingjoy
{
    namespace logic
    {
        void CGameObject::updateMove( float dt )
        {
            float dx = m_TargetX - m_CurrentX;
            float dy = m_TargetY - m_CurrentY;
            float len = sqrt(dx*dx+dy*dy);
            if(len<0.001){
                randomTarget();
                return;
            }

            dx/=len;
            dy/=len;

            float newX = m_CurrentX + dx*dt*m_pFishData->NormalSpeed;
            float newY = m_CurrentY + dy*dt*m_pFishData->NormalSpeed;

            float dx2 = newX - m_CurrentX;
            float dy2 = newY - m_CurrentY;

            float dx3 = m_TargetX - m_CurrentX;
            float dy3 = m_TargetY - m_CurrentY;

            if(dx2*dx2+dy2*dy2 >= dx3*dx3+dy3*dy3){
                setPosition(m_TargetX,m_TargetY);
                randomTarget();
            }
            else{
                setPosition(newX,newY);
            }
        }
    }
}

新的实现结果:


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


下一节:实现鱼群效果

《捕鱼达人3》讲解Cocos引擎3D技术(二):鱼身上的波光处理

大家好,在上一节的学习中,我们已经掌握了如何使用Cocos2d-x加载鱼的模型和播放鱼的动画,这一节我们来学习一下如何为鱼的模型增加波光处理,以使它看起来像在海水中游动。 在模型的身上加入波光的...
  • sunyazhou13
  • sunyazhou13
  • 2014年08月14日 08:57
  • 773

捕鱼达人鱼游动时的转向例子

作为一个标准的程序员应该有写博客的习惯,其实早就有这个念头了,只是不知道该写点什么,最近一直有朋友问我捕鱼达人鱼游动的时候鱼的方向转动该如何实现。 其实我没有写过捕鱼达人,一年前有个朋友公司做捕鱼达人...
  • i646372587
  • i646372587
  • 2015年07月12日 20:09
  • 2471

对于基本的捕鱼游戏设计思路(四)——序列帧动画

今天,我带领大家学习一下Cocos2d-x 2.0的序列帧动画。在Cocos2d-x中,提供了相应的一些类和方法,可以方便的生成序列帧动画,这样我们就可以制做各种人物动作以及动画效果。这就是鱼在水里游...
  • Cineze
  • Cineze
  • 2016年09月27日 20:00
  • 1153

用《捕鱼达人3》讲解Cocos引擎3D技术(一):加载鱼的模型和播放动画

大家好,相信许多朋友们都听过或玩过《捕鱼达人》这款游戏。今年7月中旬,《捕鱼达人3》正式发布,24小时就突破实现1千万下载,欢迎大家一起来下载试玩! 本次《捕鱼达人3》采用了Cocos2d-...
  • sunyazhou13
  • sunyazhou13
  • 2014年08月14日 08:54
  • 1264

HTML5游戏实战(2):90行代码实现捕鱼达人

捕鱼达人是一款非常流行的游戏,几年里赚取了数以千万的收入,这里借用它来介绍一下用Gamebuilder+CanTK开发游戏的方法。其实赚钱的游戏未必技术就很难,今天我们就仅用90来行代码来实现这个游戏...
  • absurd
  • absurd
  • 2014年12月03日 06:55
  • 19842

【笔记】Cocos2d-x高级开发教程:制作自己的<捕鱼达人> 笔记一:序_前言_第一章

Cocos2d-x高级开发教程:制作自己的 摘录一:序_前言_第一章 ------------------------------------------------- 序 1.Cocos2d...
  • L_BadLuck
  • L_BadLuck
  • 2013年12月26日 16:41
  • 1892

Cocos2d-x简单游戏<捕鱼达人>代码实现|第一部分:鱼类

#ifndef __shows__Fish__ #define __shows__Fish__ #include #include "Header.h" class Fish:publ...
  • u011286702
  • u011286702
  • 2014年03月29日 10:08
  • 4318

js实现简单的动画(游动的鱼)

*{ margin: 0; padding:...
  • sweetllh
  • sweetllh
  • 2017年04月20日 00:14
  • 419

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

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17144883 上节回顾 【cocos2d-x I...
  • danielzzu
  • danielzzu
  • 2013年12月05日 20:20
  • 2526

对于基本的捕鱼游戏设计思路(五)——鱼

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。 一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。 然后就可以进入代码部分,首先设置一个计时器,控制时间生成...
  • Cineze
  • Cineze
  • 2016年09月28日 19:17
  • 2701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【cocos2d-x IOS游戏开发-捕鱼达人11】鱼的产生和移动:完善
举报原因:
原因补充:

(最多只允许输入30个字)