用cocos2dx做一个简单的单机捕鱼达人游戏(5)

子弹和鱼都写好了。该写新手村了
在这里插入图片描述
这里就是新手村截图,为了偷点懒,我就只加了两种鱼,一种大鱼,一种小鱼
鱼是随机从四面八方出来的,自带游泳动画,子弹打中鱼了也有子弹死亡动画也就是变网的动画
下面就是gameLayer的代码
gamelayer.h

#pragma once
#ifndef _GameLayer_H_
#define _GameLayer_H_
#include"cocos2d.h"
class Pao;
class Fish;
class Bullet;
class BulletManage;
class FishManage;
enum PAOTYPE;
using namespace cocos2d;
#include "ui\CocosGUI.h"
using namespace ui;
class GameLayer:public Layer
{
public:
	GameLayer();
	~GameLayer();
	void onEnter() override;
	void onExit() override;
	void onCollision2();//子弹与鱼的碰撞检测2方法
	//静态创建场景函数
	static Scene* createScene();
	//静态函数创建本类对象指针
	static GameLayer* create();
	//初始化
	virtual bool init();
	//生产鱼
	void FishCreate(float dt);
	//默认调度器的update函数
	void update(float dt);
	 int m_iScore;//金币数
private:
	TextAtlas * numScore;

	
	Fish* m_cFish;//鱼
	Pao * m_cPao;//大炮主成员
	Pao *m_pc1;//大炮电脑成员1
	BulletManage *bulletManage;
	FishManage*fishManage;
	bool isTouchScreen;//是否触摸到屏幕
};
#endif // !_GameLayer_H_

gameLayer.cpp

#include "GameLayer.h"
#include"Pao.h"
#include"Fish.h"
#include"Bullet.h"
#include"BulletManage.h"
#include"FishManage.h"
#include"FishFactory.h"
#include"SceneManager.h"
GameLayer::GameLayer()
{
}
GameLayer::~GameLayer()
{
	this->unscheduleUpdate();//关闭默认调度器
}
void GameLayer::onEnter()
{
	Node::onEnter();
	bulletManage = BulletManage::getInstance();
	fishManage = FishManage::getInstance();//
}
void GameLayer::onExit()
{
	Node::onExit();
	delete bulletManage;
	bulletManage = nullptr;
	delete fishManage;
	fishManage = nullptr;//
}

void GameLayer::onCollision2()
{
	//范围for遍历
	for (Bullet* bullet : bulletManage->BulletLive)
	{
		if (bullet->koufei==false)
		{
			bullet->koufei = true;//用于gamelayer中子弹发出扣金币判断
			m_iScore -= bullet->getCostCoin();//发出子弹扣金币
		}

		for (Fish* enemy : fishManage->FishLive)
		{
			//鱼死亡状态
			if (!enemy->getLive()||enemy->isPeng==true)
				continue;
			//碰撞检测
			bool isCrash = bullet->getBoundingBox().
				intersectsRect(enemy->getBoundingBox());
			
			if (isCrash)
			{
				enemy->reduceHp(bullet->getAtt());//鱼减血
				bullet->setLive(false);//子弹死亡
				//鱼死了就开启死亡动画并且回收
				if (enemy->getHp() <= 0)
				{	//关掉update函数 死亡了就停止移动
					enemy->unscheduleUpdate();
					(enemy)->isPeng = true; //增加一个bool值用于阻挡死了的鱼应为要回调播放动画造成的阻碍别的子弹
					m_iScore += enemy->getCoin();//金币增加
					switch (enemy->getFishType())
					{
					case FishTypeOne:
						(enemy)->DeadCartoonOne();//鲸鱼的死亡动画加上回收的回调函数
						break;
					case FishTypeTwo:
						enemy->DeadCartoonTwo();//小鲤鱼的死亡动画加上回收的回调函数
						break;
					case FishTypeThree:
						enemy->DeadCartoonThree();//小金鱼的死亡动画加上回收的回调函数
						break;
					default:
						break;
					}
				}
				break;
			}
			
		}
	}
}
Scene * GameLayer::createScene()
{
	//创建场景
	Scene* pScene = Scene::create();
	GameLayer* pGameLayer = GameLayer::create();
	pScene->addChild(pGameLayer);
	return pScene;
}

GameLayer * GameLayer::create()
{
	GameLayer*pLayer = new GameLayer;
	if (pLayer&&pLayer->init())
	{
		//添加到自动释放池
		pLayer->autorelease();
		return pLayer;
	}
	else
	{
		delete pLayer;
		pLayer = nullptr;
		return nullptr;
	}
}

bool GameLayer::init()
{
	if (!Layer::init())
	{
		return false;
	}

	
	//屏幕大小获取
	Size winSize = Director::getInstance()->getWinSize();
	//背景图片的添加
	Sprite*beijin = Sprite::create("bj01.jpg");
	this->addChild(beijin);
	beijin->setPosition(512,384);
	//游戏下方图片
	Sprite*GameDown = Sprite::create("gamedown.png");
	this->addChild(GameDown);
	GameDown->setPosition(450, 90);
	//大炮添加
	m_cPao = Pao::create(PaoTypeOne);
	this->addChild(m_cPao);
	//将大炮的位置设置为居中
	m_cPao->setPosition(Vec2(winSize.width / 2 + 15, m_cPao->getBoundingBox().size.height / 2 - 20));


	//返回按钮
	Button*back = Button::create("btn_back.png",
		"btn_back.png",
		"btn_back.png");
	this->addChild(back);
	//位置设置
	back->setPosition(Vec2(980, 600));
	//触摸事件响应
	back->addTouchEventListener([&](Ref* ref, Widget::TouchEventType type)
	{
		//切换场景(点击进入菜单界面)
		Director::getInstance()->replaceScene(SceneManager::create(MENU_SCENE));

	});


	//自动开炮按钮
	Button*zidong = Button::create("AutomaticFire_Normal.png",
		"AutomaticFire_Normal.png",
		"AutomaticFire_Normal.png");
	this->addChild(zidong);
	zidong->setScale(0.65f);//缩小为原来的0.5倍
	//位置设置
	zidong->setPosition(Vec2(980, 300));
	//触摸事件响应
	zidong->addTouchEventListener([&](Ref* ref, Widget::TouchEventType type)
	{
		//调用pao的自定义调度器  自动发炮
		m_cPao->schedule(schedule_selector(Pao::zidong), 1, -1, 0);

	});

	//手动开炮按钮
	Button*shoudong = Button::create("AutomaticFire_Normal2.png",
		"AutomaticFire_Normal2.png",
		"AutomaticFire_Normal2.png");
	this->addChild(shoudong);
	shoudong->setScale(0.65f);//缩小为原来的0.5倍
							//位置设置
	shoudong->setPosition(Vec2(980, 220));
	//触摸事件响应
	shoudong->addTouchEventListener([&](Ref* ref, Widget::TouchEventType type)
	{
		//调用pao的自定义调度器  自动发炮
		m_cPao->unschedule(schedule_selector(Pao::zidong));

	});
	//炮的等级增加按钮
	Button*addPao = Button::create("fish_review_btn_add_multiple_02.png",
		"fish_review_btn_add_multiple_02.png",
		"fish_review_btn_add_multiple_02.png");
	this->addChild(addPao);
	//位置设置
	addPao->setPosition(Vec2(600, 25));
	//触摸事件响应
	addPao->addTouchEventListener([&](Ref* ref, Widget::TouchEventType type)
	{
		if(type== cocos2d::ui::Widget::TouchEventType::ENDED)
		m_cPao->addPao();//炮等级增加

	});
	//炮的等级减少按钮
	Button*reducePao = Button::create("fish_review_btn_sub_multiple_01.png",
		"fish_review_btn_sub_multiple_01.png",
		"fish_review_btn_sub_multiple_01.png");
	this->addChild(reducePao);
	//位置设置
	reducePao->setPosition(Vec2(450, 25));
	//触摸事件响应
	reducePao->addTouchEventListener([&](Ref* ref, Widget::TouchEventType type)
	{
		if (type == cocos2d::ui::Widget::TouchEventType::ENDED)
			m_cPao->reducePao();//炮等级减少

	});
	// 艺术数字。参数:数字字符串;图片;单个字符宽;单个字符高;起始字符串字符
	m_iScore = 1000;
	numScore = TextAtlas::create("1000",
		"level_num.png",
		37, 37, "0");
	this->addChild(numScore);
	numScore->setPosition(Vec2(808, 25));
	//开启自定义调度器生产鱼
	schedule(schedule_selector(GameLayer::FishCreate),0.5f,-1,0);
	//开启默认调度器
	scheduleUpdate();
	return true;
}

void GameLayer::FishCreate(float dt)
{
	//屏幕大小获取
	Size winSize = Director::getInstance()->getWinSize();
	int num = rand()%100;
	//按概率创建鱼
	Fish* pFish = nullptr;
	if (num<20)
	{
		pFish = FishFactory::create(FishTypeOne);
	}
	else if(20<=num&&num<50)
	{
		pFish = FishFactory::create(FishTypeTwo);
	}
	else if (50<=num&&num<=100)
	{
		pFish = FishFactory::create(FishTypeTwo);

	}
	//添加到图层
	addChild(pFish);
	//设置鱼的位置
	switch (pFish->birth)
	{
	case 1:
		pFish->setPosition((rand() % 600)+100, 800);
		break;
	case 2:
		pFish->setPosition(winSize.width + pFish->getContentSize().width, rand() % 700);
		break;
	case 3:
		pFish->setPosition(rand() % 700, 0);
		break;
	case 4:
		pFish->setPosition(0, (rand() % 600)+300);
		break;
	default:
		break;
	}
	
}

void GameLayer::update(float dt)
{
	//判断鱼与子弹的碰撞
	onCollision2();
	//默认调度器实时更新金币数
	CCString* str =
		CCString::createWithFormat("%d", m_iScore);
	numScore->setStringValue(str->getCString());

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值