cocos 2dx 3.12 学习笔记(六) DartGameDemo

使用 计时器,根据Tag不同进行碰撞检测,做了一个投掷飞镖,攻击小鸟。


GameDefine.h


#ifndef __GAME_DEFINE_H__
#define __GAME_DEFINE_H__
//定义每一个层的
static const int ZORDER_BG = 0;      
static const int ZORDER_PLAYER = 1;
static const int ZORDER_ENERMY = 2;
static const int ZORDER_DART = 5;
//定义 enermy和dart的Tag
static const int TAG_ENERMY = 10;
static const int TAG_DART = 20;




#endif



DartSprite.h


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

class DartGameLayer : public cocos2d::Layer
{
public :
	static cocos2d::Scene * createScene();
	CREATE_FUNC(DartGameLayer);
	virtual bool init();



	virtual bool onTouchBegan(Touch * touch, Event *unused_event);
	virtual void onTouchMoved(Touch *touch, Event *unused_event);
	virtual void onTouchEnded(Touch *touch, Event *unused_event);


	cocos2d::Size getContentSizeByImageName(std::string imageName); //定义一个通过图片名字过去图片大小的方法。

	void scheduleCreateEnermy(float dt); //创建敌人计时器

	void scheduleCollisionCheck(float dt);//碰撞检测计时器
private:

	cocos2d::Sprite * m_pPlayerSprite = nullptr; //m_pPlayerSprite 丢飞镖小人Sprite

};


#endif



DartSprite.app

#include "DartSprite.h"
USING_NS_CC;
DartSprite * DartSprite::create(const cocos2d::Rect & bounds, cocos2d::Node * pParent, int Zorder)
{
	DartSprite * pRet = new (std::nothrow)DartSprite;//当NEW不成功时,会返回一个空,而不是未命名的名称空间

	pRet->setAnchorPoint(Vec2(0.5f, 0.5f));
	//pisition
	pRet->setPosition(bounds.origin);
	//size
	pRet->setContentSize(bounds.size);
	if (pRet->init())
	{
		pParent->addChild(pRet, Zorder);
		pRet->autorelease();
	}
	else
	{
		//delete pRet;
		//pRet = nullptr;
		//C++代码,和宏的作用相同
		CC_SAFE_DELETE(pRet);
	}
	return pRet;
}

DartSprite::DartSprite()
{

}
DartSprite::~DartSprite()
{

}
bool DartSprite::init()
{
	if (!Node::init())
	{
		return false;
	}
	auto size = this->getContentSize();

	float x = 0;
	float y = 0;
	x = size.width / 2;
	y = size.height / 2;
	m_pDisplay = Sprite::create("Projectile.png");
	this->addChild(m_pDisplay);
	m_pDisplay->setPosition(Vec2(x, y));

	return true;

}


void DartSprite::moveToPos(cocos2d::Vec2 pos)
{
	Vec2 pos_dar = this->getPosition();
	float dis = pos_dar.getDistance(pos);
	float time = dis / DART_SPEED;
	float dis_x = pos.x - pos_dar.x;
	float dis_y = pos.y - pos_dar.y;

	m_speedX = (dis_x / time) / 60.0f;
	m_speedY = (dis_y / time) / 60.0f;
	this->schedule(schedule_selector(DartSprite::scheduleUpdatePosition));

}
void DartSprite::scheduleUpdatePosition(float dt)
{
	float x = this->getPositionX() + m_speedX;
	float y = this->getPositionY() + m_speedY;
	this->setPosition(Vec2(x,y));
	auto screntSize = Director::getInstance()->getVisibleSize();

	if (x < 0 || x > screntSize.width || y < 0 || y>screntSize.height)
	{
		unschedule(schedule_selector(DartSprite::scheduleUpdatePosition));
		this->removeFromParent();

	}
}




DartSprite.h


#ifndef __DART_SPRITE_H__
#define __DART_SPRITE_H__

#include "cocos2d.h"
USING_NS_CC;
#define DART_SPEED 200.0f
class DartSprite : public cocos2d::Node
{
public:
	static DartSprite * create(const cocos2d::Rect & bounds, cocos2d::Node * pParent, int Zorder);
	//用const修饰 rect  win32下无所谓,到移动端不用const修饰会报错。
	// Rect包含 Position size 
	//传入父节点 和Zorder
	//在create中吧所有的东西做完。
	DartSprite();
	~DartSprite();
	virtual bool init();

	void moveToPos(cocos2d::Vec2 pos);
	void scheduleUpdatePosition(float dt);
private:
	//定义x,y轴方向的速度 
	float m_speedX = 0;
	float m_speedY = 0;
	cocos2d::Sprite * m_pDisplay = nullptr;
};
#endif


 

DartSprite.app

#include "DartSprite.h"
USING_NS_CC;
DartSprite * DartSprite::create(const cocos2d::Rect & bounds, cocos2d::Node * pParent, int Zorder)
{
	DartSprite * pRet = new (std::nothrow)DartSprite;//当NEW不成功时,会返回一个空,而不是未命名的名称空间

	pRet->setAnchorPoint(Vec2(0.5f, 0.5f));
	//pisition
	pRet->setPosition(bounds.origin);
	//size
	pRet->setContentSize(bounds.size);
	if (pRet->init())
	{
		pParent->addChild(pRet, Zorder);
		pRet->autorelease();
	}
	else
	{
		//delete pRet;
		//pRet = nullptr;
		//C++代码,和宏的作用相同
		CC_SAFE_DELETE(pRet);
	}
	return pRet;
}

DartSprite::DartSprite()
{

}
DartSprite::~DartSprite()
{

}
bool DartSprite::init()
{
	if (!Node::init())
	{
		return false;
	}
	auto size = this->getContentSize();

	float x = 0;
	float y = 0;
	x = size.width / 2;
	y = size.height / 2;
	m_pDisplay = Sprite::create("Projectile.png");
	this->addChild(m_pDisplay);
	m_pDisplay->setPosition(Vec2(x, y));

	return true;

}


void DartSprite::moveToPos(cocos2d::Vec2 pos)
{
	Vec2 pos_dar = this->getPosition();
	float dis = pos_dar.getDistance(pos);
	float time = dis / DART_SPEED;
	float dis_x = pos.x - pos_dar.x;
	float dis_y = pos.y - pos_dar.y;

	m_speedX = (dis_x / time) / 60.0f;
	m_speedY = (dis_y / time) / 60.0f;
	this->schedule(schedule_selector(DartSprite::scheduleUpdatePosition));

}
void DartSprite::scheduleUpdatePosition(float dt)
{
	float x = this->getPositionX() + m_speedX;
	float y = this->getPositionY() + m_speedY;
	this->setPosition(Vec2(x,y));
	auto screntSize = Director::getInstance()->getVisibleSize();

	if (x < 0 || x > screntSize.width || y < 0 || y>screntSize.height)
	{
		unschedule(schedule_selector(DartSprite::scheduleUpdatePosition));
		this->removeFromParent();

	}
}


 
 
 

EnermySprite.h

#ifndef __ENERMY_SPRITE_H__
#define __ENERMY_SPRITE_H__

#include "cocos2d.h"
#define ENERMY_SPEED 100.0f  // 定义了第人的速度
class EnermySprite : public cocos2d::Node
{
public:
	static EnermySprite * create(const cocos2d::Rect & bounds, cocos2d::Node * pParent, int zOrder);  //重写了EnermySprite的create方法

public:
	EnermySprite();
	~EnermySprite();
	virtual bool init();
	void move(); // enermy移动方法
	void scheduleUpdatePosition(float dt); //更新enermy计时器
private:
	cocos2d::Sprite * m_pDisplay = nullptr; // m_pDdisplay 精灵
	float m_speedX = 0; //x轴速度
};



#endif

EnermySprite.app

#include "EnermySprite.h"
USING_NS_CC;
EnermySprite * EnermySprite::create(const cocos2d::Rect & bounds, cocos2d::Node * pParent, int zOrder)
{
	EnermySprite * pRet = new (std::nothrow)EnermySprite();
	pRet->setAnchorPoint(Vec2(0.5f, 0.5f));
	pRet->setContentSize(bounds.size);
	pRet->setPosition(bounds.origin);

	if (pRet->init())
	{
		pParent->addChild(pRet, zOrder);
		pRet->autorelease();
	}
	else
	{
		CC_SAFE_DELETE(pRet);
	}
	return pRet;
}


EnermySprite::EnermySprite()
{

}
EnermySprite::~EnermySprite()
{

}


bool EnermySprite::init()
{
	Node::init();

	auto size = this->getContentSize();
	float x = 0;
	float y = 0;

	x = size.width / 2;
	y = size.height / 2;
	m_pDisplay = Sprite::create("bird.png");
	this->addChild(m_pDisplay);
	m_pDisplay->setPosition(Vec2(x, y));
	return true;
}



void EnermySprite::move()
{
	m_speedX = ENERMY_SPEED / 60.0f;
	this->schedule(schedule_selector(EnermySprite::scheduleUpdatePosition));
}
void EnermySprite::scheduleUpdatePosition(float dt)
{
	float pos_x = this->getPositionX() - m_speedX;
	float pos_y = this->getPositionY();
	this->setPosition(Vec2(pos_x, pos_y));
	if (pos_x < 0)
	{
		unschedule(schedule_selector(EnermySprite::scheduleUpdatePosition));
		//this->removeFromParentAndCleanup(true);
		this->removeFromParent();
	}
}


 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值