cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同时带着刚体

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变

我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点。

对于Runner,我的设计思路如下:

1.主角有一个动作集合,包括跑动,跳起来,以及蹲下。那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作

2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同

3.我们给主角设定一个状态,那么根据状态,就能知道执行动作和刚体

反正在这一步主要是看

那么上马:Runner.h

#ifndef __Runner__H__
#define __Runner__H__

#include "cocos2d.h"

enum runnerState{
	running,
	jumpUp,
	jumpDown,
	crouch
};

class Runner : public cocos2d::Node{
public:
	virtual bool init();
	CREATE_FUNC(Runner);

	//初始化 action 集合
	void initActionSet(cocos2d::SpriteFrameCache* frameCache);

	//根据动作名称执行动作
	void doAction(const char* actionName);//

	void initBody();//初始化物理刚体

	runnerState getState(){ return m_state;};//获取当前的状态,后面要用到

	cocos2d::Size getRunJumpSize(){ return run_jumpSize;};//获取不同时候的SIze
	cocos2d::Size getCrouchSize() { return crouchSize;};

	void Run();
private:
	//  需要一个主要的精灵执行动作
	cocos2d::Sprite* m_runner;

	// 不同的动作需要不同的刚体大小
	cocos2d::Size run_jumpSize;//跑和跳的大小一样
	cocos2d::Size crouchSize;//蹲下来的大小

	runnerState m_state;
};/**/

#endif

这里的刚体Size只有两个,因为跑的时候和跳起来的时候的精灵大小是差不多的,那么处于这两个状态的的刚体绑定大小可以一样,然后下蹲的时候的Size就不同

Runner.cpp

#include "Runner.h"

USING_NS_CC;

bool Runner::init(){
	//加载图片到缓存池
	auto frameCache = SpriteFrameCache::getInstance();
	frameCache->addSpriteFramesWithFile("parkour.plist","parkour.png");

	m_runner = Sprite::createWithSpriteFrameName("runner0.png");

	run_jumpSize = m_runner->getContentSize();
	crouchSize = Sprite::createWithSpriteFrameName("runnerCrouch0.png")->getContentSize();

	this->addChild(m_runner);

	initActionSet(frameCache);//初始化动作集合

	m_state = running;

	initBody();

	return true;
}

void Runner::initActionSet(SpriteFrameCache* frameCache){
	SpriteFrame* frame = NULL;
	//3.0中改用vector 而不是用Array
	Vector<SpriteFrame*>frameVector;

	/* 1.----------------加载跑动的Animation-----------------*/
	for(int i = 0; i <= 7; i ++) {
		//从缓存池中加载精灵到Vector
		frame = frameCache->spriteFrameByName(String::createWithFormat("runner%d.png",i)->getCString());
		frameVector.pushBack(frame);
	}

	//用vector里面的SpriteFrame列表创建Animation  以及设置一些参数
	auto run_animation = Animation::createWithSpriteFrames(frameVector,0.1f,-1);
	//将跑动的 Animation 取名为 running
	AnimationCache::getInstance()->addAnimation(run_animation,"running");

}

void Runner::doAction(const char* actionName){
	auto animation = AnimationCache::getInstance()->animationByName(actionName);
	auto action = Animate::create(animation);
	m_runner->runAction(action);
}

void Runner::initBody(){
	//根据不同状态设置不同刚体大小
	Size bodySize;
	if(m_state == crouch){
		bodySize = crouchSize;
	}
	else{
		bodySize = run_jumpSize;
	}

	//创建runner的刚体
	auto runerBody = PhysicsBody::createBox(bodySize,PHYSICSBODY_MATERIAL_DEFAULT);

	//绑定刚体
	this->setPhysicsBody(runerBody);
}

void Runner::Run(){
	m_state = running;
	initBody();
	doAction("running");
}

init
函数里面我们做了一些事:

1.先把图片加载到缓存池,初始化主精灵,和两个Size,以及当前状态

这里的图片实际上是一张整合了很多小图片的集合,不同的图片有不同纹理,那么集合到同一图片中纹理就相同的,那么同一纹理的图片,我们就可以减少渲染批次,3.0中的渲染好像是自动处理的,看了一篇文章,说是不推荐使用那个SpriteBachNode啦,然后说得也比较抽象,我这里也不特别解释,有好的教程麻烦推荐,谢谢

2.我们初始化了动作集合,这一步当中,我们只初始化跑动的帧动画

initActionSet函数当中,我都有详细注释

doAction函数中,我们可以根据传入的参数动作名称来执行动作,也就是在initActionSet 当中给动作取名字的那里

initBody函数当中,根据不同的状态,我们就给主角绑定不同大小的刚体,关于重复setPhysicsBody,你可能会有疑问,本来有一个刚体,换了一个状态,又设定一个刚体可以吗?答案是可以的,我们可以查看源码

void Node::setPhysicsBody(PhysicsBody* body)
{
    /*省略*/

    if (_physicsBody != nullptr)
    {
        PhysicsWorld* world = _physicsBody->getWorld();
        _physicsBody->removeFromWorld();
        _physicsBody->_node = nullptr;
        _physicsBody->release();

        if (world != nullptr && body != nullptr)
        {
            world->addBody(body);
        }
    }

    _physicsBody = body;
    if (body != nullptr)
    {
        Node* parent = getParent();
        Point pos = parent != nullptr ? parent->convertToWorldSpace(getPosition()) : getPosition();
        _physicsBody->setPosition(pos);
        _physicsBody->setRotation(getRotation());
    }
}

这里我们可以看到,它会判断_physicsBody(也就是Node的刚体)是不是为空,如有已有刚体,会先删除,然后重新绑定

好啦,到这里主角类以及初步设置完啦,我们在PlayScene.h 中加入一个成员变量  Runner* m_runner;

然后在PlayScene.cpp 的init函数中对 m_runner初始化:

m_runner = Runner::create();
m_runner->setPosition(runner_posX,ground_hight+m_runner->getRunJumpSize().height/2);
m_runner->Run();
this->addChild(m_runner);

那么这里的runner_posX 就是在 ground_hight  下面定义的一个宏,也就是主角的X坐标位置,我这里定义 80

OK运行测试如图:

如果你把那些资源都放在Resouce 文件下了,还能听到背景音乐

这里我也有一个问题,就是有的人可以插入动态的那种图片,比较好的演示了运行结果,用QQ好像不能对这个屏幕进行截取动态图,求方法推荐

下面我们就加入PlayScene的背景,以及地图无限滚动,让主角看起来更像是跑动 ,同时也为主角的Jump跳跃动作以及Crouch下蹲动作的执行做准备

个人愚昧观点,欢迎指正与讨论

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同时带着刚体

时间: 2024-11-06 23:28:20

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同时带着刚体的相关文章

cocos2d-x 3.0游戏实例学习笔记 《跑酷》一 开始界面

开始界面和前辈的基本上差不多:cocos2d-x游戏开发 跑酷(一)开始界面     但是也有不同 下面先给出游戏过程中用到的所有资源 开始界面定义为:MainScene 有如下功能: 1.背景 2.进入游戏界面按钮 3.预先加载背景音乐文件 .h文件 #ifndef __MainScene__H__ #define __MainScene__H__ #include "cocos2d.h" class MainScene : cocos2d::Layer{ public: virtu

cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 好吧,自从上次<跑酷>完结之后,就什么没做什么的,主要是修复了一点点bug ,也在相应的文章里面做出了相应的改动.不过,只能在window上看着玩又有什么太大意思呢!!!于是乎又尝试着弄到手机上试试--OK,初生牛犊不要脸,哦不!不怕喷.这里记录一下我的移植过程.(这里会用到新的大小的资源.待会也会

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第六步--物理碰撞检测(1)

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 那么这一步,我们先不急着给主角和金币岩石碰撞检测,我这里把cocos2d-x 3.0 的物理碰撞检测单独抽取出来,之前看了cocos的官网,有一个教程:用新物理引擎完成碰撞检测,就是一个车和猫的碰撞检测,车撞倒猫,猫就消失.我之前也单独试了下.但是那个教程的代码好像完整性不好,不能运行...于是我又借

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要公布源码.那么这里有两种方式: 第一种:将我运行成功的整个项目打包,VS2012+win7下的,这种方式就比较大,但是可以打开打开 Run/proj.win32/Run.sln 就可以啦 第二种:就是我只打包

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要发布源代码.那么这里有两种方式: 第一种:将我执行成功的整个项目打包,VS2012+win7下的,这样的方式就比較大,可是能够打开打开 Run/proj.win32/Run.sln 就能够啦 另外一种:就是我

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--按钮控制主角Jump&amp;Crouch

这一步当中,我们给PlayScene中 添加两个按钮,让主角Jump and Crouch,按钮功能如下: Jump按钮,按下主角跳起来 Crouch按钮,按下主角下蹲,一直按着一直蹲,松开之后主角才站起来 这里用按钮包含头文件"cocos-ext.h"会遇到一点点问题,后面给出详细解决方法: 首先PlayScene.h中要包含头文件: <span style="font-size:14px;">#include "cocos-ext.h&qu

cocos2d-x 3游戏实例学习笔记 跑酷(前言)

游戏开发环境:coco2d-x 3.0正式版 . C++ .Win7.VS2012 自己的现状: 大二学生一枚,刚刚接触cocos2dx 不久,是看着笨木头的<游戏开发之旅>入门的,并且也只是学习了基本的知识点用法,木头的代码是基于2.X写的,但是我一开始就是使用3.0的引擎,所以也是一边学习一边把之前的代码向3.0转变.也看了许多网上教程,star特530等许多人的博客....而且C++那些也只是学习了皮毛.看到网上许多游戏实例教程,于是自己决定用实例来学习cocos. 学习背景: 网上有许