【cocos2d-x IOS游戏开发-捕鱼达人17】炮弹攻击判定

原创 2013年12月06日 10:24:58

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


上节回顾

【cocos2d-x IOS游戏开发-捕鱼达人16】炮弹攻击效果2


1、  炮弹攻击判定方式

判定规则
鱼网会有一个自己的包围盒
鱼会有一个自己的包围盒

若两包围盒若相交,表示鱼被捕

包围盒的计算方式
包围盒是一个正方形(避免因为旋转带来的麻烦)
以单位的宽和高的最小值作为边长

 2、 代码实现的关键点

矩形的相交算法
使用内置函数CCRect::intersectsRect或自己封装
RenderObject需要提供包围盒
鱼被攻击后,死亡判定和动画播放


具体实现:

#include "GameObject.h"
#include "GameLogic.h"
namespace fishingjoy
{
	namespace logic
	{
		void CFishObject::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){
				if(m_bMoveToAndStop){
					m_eGameObjectState = EGOS_IDLE;
					m_bMoveToAndStop = false;
					return;
				}
				if(m_bMoveToAndDestroy){
					m_eGameObjectState = EGOS_IDLE;
					m_bNeedDestroyed = true;
					m_bMoveToAndDestroy = false;
					return;
				}
				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);
				if(m_bMoveToAndStop){
					m_eGameObjectState = EGOS_IDLE;
					m_bMoveToAndStop = false;
					return;
				}
				if(m_bMoveToAndDestroy){
					m_eGameObjectState = EGOS_IDLE;
					m_bNeedDestroyed = true;
					m_bMoveToAndDestroy = false;
					return;
				}
				randomTarget();
			}
			else{
				setPosition(newX,newY);
			}
		}

		void CFishObject::onHit( int atk )
		{
			if(m_iHp <= atk){
				m_eGameObjectState = EGOS_DIE;
				m_pSceneObject->setAnimation("die");
				m_Time = 0;
				((CGameLogic*)m_pGameLogic)->addMark(m_pFishData->Mark);
			}
			else{
				m_iHp -= atk;
			}
		}
		//判断是否碰撞
		bool CBulletObject::isRectCollision (CCRect rect1, CCRect rect2){
			float x1 = rect1.origin.x;
			float y1 = rect1.origin.y;
			float w1 = rect1.size.width;
			float h1 = rect1.size.height;
			float x2 = rect2.origin.x;
			float y2 = rect2.origin.y;
			float w2 = rect2.size.width;
			float h2 = rect2.size.height;

			if (x1+w1*0.5<x2-w2*0.5)  
				return false;
			else if (x1-w1*0.5>x2+w2*0.5)
				return false;
			else if (y1+h1*0.5<y2-h2*0.5)
				return false;
			else if (y1-h1*0.5>y2+h2*0.5)
				return false;

			return true;
		}

		void CBulletObject::updateNormal( float dt )
		{
			float angle = (90-m_Dir)/180*3.1416926;
			float s = sin(angle);
			float c = cos(angle);
			float dtx = m_Speed*c*dt;
			float dty = m_Speed*s*dt;
			m_CurrentX += dtx;
			m_CurrentY += dty;
			m_pSceneObject->setPosition(m_CurrentX,m_CurrentY);

			dtx = m_CurrentX - m_OrgX;
			dty = m_CurrentY - m_OrgY;

			bool over = false;
			CGameLogic* pLogic = (CGameLogic*)m_pGameLogic;
			std::vector<CFishObject*>& rFishs = pLogic->getFishs();
			std::vector<CFishObject*>::iterator it = rFishs.begin();
			std::vector<CFishObject*>::iterator end = rFishs.end();
			for(;it!=end;++it){
				CFishObject* pFish = *it;
				if(pFish->isDead()){
					continue;
				}
				float fishW = pFish->getSceneObj()->getWidth();
				float fishH = pFish->getSceneObj()->getHeight();
				float fShort = fishW < fishH? fishW:fishH;
				CCRect rectFish = CCRectMake(pFish->getPosX()+fShort/2
					,pFish->getPosY()+fShort/2
					,fShort,fShort);

				float bulletW = m_pSceneObject->getWidth();
				float bulletH = m_pSceneObject->getHeight();

				fShort = bulletW < bulletH? bulletW:bulletH;
				CCRect rectBullet = CCRectMake(m_CurrentX+fShort/2,m_CurrentY+fShort/2
					,fShort,fShort);

				//在cocos2d-x 的2.0.4 版本中,CCRectEqualToRect 、CCRectContainsPoint、CCRectIntersectsRect已不再推荐使用,
				//取而代之的是 equals、containsPoint、intersectsRect。
				//bool intersect = CCRect::CCRectIntersectsRect(rectBullet,rectFish);

				//新版本可以使用精灵调用intersectsRect
				//if (sp1->boundingBox().intersectsRect(sp2->boundingBox()))
				//自己封装
				
				bool intersect = this->isRectCollision(rectBullet,rectFish);
				if(intersect){
				
					over = true;
					pFish->onHit(m_iAtk);
					printf("hit!!!!!!\n");
				}
			}

			if((dtx*dtx+dty*dty > m_Distance*m_Distance)|| over){
				m_Time = 0;
				m_eButtletObjectState = EBOS_EXPLODE;
				m_pSceneObject->setAnimation("net");
			}
		}

		void CBulletObject::update( float dt )
		{
			m_Time+=dt;
			switch(m_eButtletObjectState)
			{
			case EBOS_NORMAL:
				updateNormal(dt);
				break;
			case EBOS_EXPLODE:
				if(m_Time > EXPLODE_TIME){
					m_bNeedDestroyed = true;
				}
				break;
			}
		}

	}
}



可以看到效果图:


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

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

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

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

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

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

双休的时候休息了两天,玩玩游戏看看电影,也没带电脑所以搞得打包游戏都得今天才弄,然后选择继续写捕鱼游戏之炮弹的生成。 分析炮弹对象,首先炮弹肯定是有它的类型,然后根据点击的坐标发射,每点击一次发射一...
  • Cineze
  • Cineze
  • 2016年09月26日 17:23
  • 934

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

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

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

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

捕鱼游戏java源码

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

【cocos2d-x IOS游戏开发-捕鱼达人19】音乐与音效的实现

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

【cocos2d-x IOS游戏开发-捕鱼达人14】炮弹切换界面

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

《捕鱼达人3》讲解Cocos引擎3D技术(四):旋涡特效

大家好,经过前面三节课的学习,我们已经可以掌握将模型加载到游戏中进行显示,并且做出模型在水中受波光影响的效果,也学会了如何产生闪电链。这一节课,我们来学习一下如何开发旋涡特效。 在《捕鱼达人...
  • sunyazhou13
  • sunyazhou13
  • 2014年08月15日 08:47
  • 1066

15款Cocos2d-x游戏源码

(1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。 源码下载:http...
  • Jailman
  • Jailman
  • 2017年11月30日 17:52
  • 1172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【cocos2d-x IOS游戏开发-捕鱼达人17】炮弹攻击判定
举报原因:
原因补充:

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