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

原创 2013年12月05日 20:20:36

尊重开发者的劳动成果,转载的时候请务必注明出处: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

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


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

大家还可以优化相关细节,可以适当增加属性和玩法(比如显示血条等等)。

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

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

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

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

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

H5 canvas基础入门到捕鱼达人小游戏实现(1)

为什么学习canvas? 看见别人网页一些非常炫酷的效果,羡慕不已,于是对canvas产生了浓厚的兴趣,所以想仔细学习学习canvas.下面就一起来学习吧,本文为系列文章,最后会编写一个简单版的捕...
  • qq_32514043
  • qq_32514043
  • 2017年12月21日 08:50
  • 164

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

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

java实现捕鱼达人游戏之Java swing图形界面开发游戏项目捕鱼达人源码及实现方式详解

今天我们来看看Java如何实现捕鱼达人游戏的设计与开发,源码文件非产多,没办法全部贴出来,只贴部分源码,项目下载地址在最下方,先来看看运行结果: 接下来我们来看看代码: package com.m...
  • llqqxf
  • llqqxf
  • 2016年07月13日 17:04
  • 4131

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

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。 一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。 然后就可以进入代码部分,首先设置一个计时器,控制时间生成...
  • Cineze
  • Cineze
  • 2016年09月28日 19:17
  • 2701

捕鱼游戏java源码

package fishlord; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import ...
  • u014801801
  • u014801801
  • 2016年12月24日 22:55
  • 1442

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

大家好,相信许多朋友们都听过或玩过《捕鱼达人》这款游戏。今年7月中旬,《捕鱼达人3》正式发布,24小时就突破实现1千万下载,欢迎大家一起来下载试玩! 本次《捕鱼达人3》采用了Cocos2d-...
  • sunyazhou13
  • sunyazhou13
  • 2014年08月14日 08:54
  • 1264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【cocos2d-x IOS游戏开发-捕鱼达人10】鱼的产生和移动
举报原因:
原因补充:

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