【cocos2dx 3.2】Flappy Bird开发超详细讲解(五)游戏的总逻辑控制

本文可以任意转载,转载请出名出处。
正常来说,我们通过上面的例子,点击开始游戏那个按钮的时候我们就可以开始游戏了。所以我们要写一个正式开始游戏的逻辑,那就是我们的大管家GameLayer。

这个层可不简单,它负责我们整个游戏的逻辑,是名副其实的东厂总管,其他小角色都得由他控制。

好了,我们看代码吧:

//GameLayer.h

/*我们这个类是我们的总管,控制游戏的逻辑。
其他的东西各个部件,像小鸟啊,管道啊,草地啊,我们都可以各自封装成各自的类,然后添加到这里来,然后由这个总管控制它们。
*/
#ifndef _GAMELAYER_H_
#define _GAMELAYER_H_
#include "cocos2d.h"
USING_NS_CC;
class GameLayer:public Layer
{
public:
	static Scene* createScene();
	virtual bool init();
	CREATE_FUNC(GameLayer);
	
};

#endif


 

//GameLayer.cpp

#include "GameLayer.h"
#include "define.h"
#include "LandLayer.h"
Scene* GameLayer::createScene()
{
	//注意这里和平时创建的场景不一样,这里我们创建的是一个物理世界
	auto scene = Scene::createWithPhysics();
	scene->getPhysicsWorld()->setGravity(GRAVITY);
	auto layer = GameLayer::create();
	scene->addChild(layer);
	return scene;
}

bool GameLayer::init()
{
	if (!Layer::init())
	{
		return false;
	}
	auto winSize = Director::getInstance()->getWinSize();

	//创建背景图片
	auto bg = Sprite::createWithSpriteFrameName("bg_day.png");
	bg->setPosition(Point(winSize / 2));
	this->addChild(bg);

	//添加草地层
	auto land = LandLayer::create();
	this->addChild(land);

	return true;
}


这里要注意的是,这里我们创建的场景和之前不一样,这里我们创建的是一个物理世界,小鸟要收到重力的作用,会和其他东西碰撞等等,这些都是物理属性,所以在这里要特别留意。

还有就是我们之前创建的草地层没有物理属性,这里我们修改一下草地层,给它添上物理属性,详见代码如下(这次我把整个都贴出来了,下次有修改我就只贴修改部分,节省一下版面,还有就是大家如果有什么不清楚的地方可以下载源码下来看,我每次都会附上每期对应的源码):

//LandLayer.cpp

#include "LandLayer.h"
#include "define.h"

Scene* LandLayer::createScene()
{
	auto scene = Scene::create();
	auto layer = LandLayer::create();
	scene->addChild(layer);
	return scene;
}

bool LandLayer::init()
{
	if (!Layer::init())
	{
		return false;
	}
	auto winSize = Director::getInstance()->getWinSize();

//===================================================================================================
	//添加草地一的图片和背景位置,setAliasTexParameters是为了防止两块草地滚动起来的时候出现黑边
	land1 = Sprite::createWithSpriteFrameName("land.png");
	land1->setPosition(Point(land1->getContentSize().width / 2, land1->getContentSize().height / 2));
	land1->getTexture()->setAliasTexParameters();
	//给草地添加物理属性
	//添加身体
	auto body1 = PhysicsBody::create();
	//添加外壳
	auto shape1 = PhysicsShapeBox::create(land1->getContentSize());
	//外壳添加到身体,好难听。。。那就换一个说法,给身体披上衣服
	body1->addShape(shape1);
	//设置静态,使它不受碰撞力的作用
	body1->setDynamic(false);
	//设置不受重力的作用
	body1->setGravityEnable(false);
	//这三个暂时不知道,就先照搬吧,我也是原教程搬过来的
	body1->setCategoryBitmask(1);
	body1->setCollisionBitmask(-1);
	body1->setContactTestBitmask(-1);
	body1->setLinearDamping(0.7f);
	//给我们的草地绑上身体属性
	land1->setPhysicsBody(body1);
	this->addChild(land1);
	log("land1--point(%f,%f)", land1->getPositionX(), land1->getPositionY());
//========================================================================================================
	//添加草地二的图片和背景位置,草地二的位置是在草地一的右边,这边减2是防止两块草地之间出现空隙
	land2 = Sprite::createWithSpriteFrameName("land.png");
	land2->setPosition(Point(land1->getPositionX()+land1->getContentSize().width-2,land1->getPositionY()));
	land2->getTexture()->setAliasTexParameters();
	//给草地二添加物理属性,同草地一,这里就不详解了
	auto body2 = PhysicsBody::create();
	auto shape2 = PhysicsShapeBox::create(land2->getContentSize());
	body2->addShape(shape2);
	body2->setDynamic(false);
	body2->setGravityEnable(false);
	body2->setCategoryBitmask(1);
	body2->setCollisionBitmask(-1);
	body2->setContactTestBitmask(-1);
	body2->setLinearDamping(0.7f);
	land2->setPhysicsBody(body2);
	this->addChild(land2);
	log("land2--point(%f,%f)", land2->getPositionX(), land2->getPositionY());
	
	//添加定时器,调用草地滚动的函数,让草地滚动起来吧!
	this->schedule(schedule_selector(LandLayer::landMove));

	return true;
}

//草地滚动函数
void LandLayer::landMove(float)
{
	//通过不断改变草地x轴的位置来实现草地滚动
	land1->setPositionX(land1->getPositionX() - LAND_OFFSET);
	land2->setPositionX(land2->getPositionX() - LAND_OFFSET);
	//判断条件,当草地一滚出屏幕的时候让草地一接在草地二后面,草地二同理
	if (land1->getPositionX()==-land1->getContentSize().width/2)
	{
		land1->setPositionX(land2->getPositionX()+land2->getContentSize().width-2);
	}
	else if (land2->getPositionX()==-land2->getContentSize().width/2)
	{
		land2->setPositionX(land1->getPositionX() + land1->getContentSize().width - 2);
	}
}


这里要特别注意的一点是,由于我们添加了物理属性,草地的锚点(默认是中心点,之前我们设置为ZERO,即左小角)现在会恢复成中心点,所以我们改一下坐标设置,,当然,下面定时器里草地是否滚出屏幕的判断条件也要改一下,如上代码中所示。

记得在点击按钮的响应函数那边修改一下哈

void StartGame::gameStart()
{
	//转场特效,从右往左推进
	Director::getInstance()->replaceScene(TransitionSlideInR::create(CHANGESCENE_TIME, GameLayer::createScene()));
}


我们预览一下成果吧

好了,这期就到这里了,每期呢我尽量会在代码里多注释点

本期的源码下载地址链接: http://pan.baidu.com/s/1qWjsW9m 密码: 64y5

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值