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


    说明:这里是借鉴:晓风残月 前辈的博客,他是将泰然网的跑酷教程。用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写。并做相关笔记

    从这里開始,就和之前前辈的有非常多不同啦。

    在MainScene中,開始button中,我们就要通过回调函数,进入到我们的游戏场景啦。

    那么在游戏场景中我们定义为:PlayScene ,并且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是非常easy的,由于它都帮我们封装好了。

    那么这一步。我们在PlayScene 中主要完毕下面功能:

    1.物理世界创建

    2.创建一个地面的物理刚体

    相关知识个人见解:

    所谓的创建物理世界,个人认为是一个抽象的东东,作为新手,開始并不能理解,開始你能够就理解为一个游戏Scene,仅仅是有它自己的特性。详细是什么特性先无论

    而所谓的刚体。你能够先觉得就是一个实体,能看得见。摸得着的东东,而且不会被力所改变形状。我们知道。一个个的游戏人物、物体都用精灵来表现出来。精灵就是一个看得见,摸不到的东西。如:有两个精灵,它们面对面走呀走,那么就会重叠起来。后面放置后绘制,也就是你会看到后面的精灵挡住前面的精灵。那么跑酷中,主角和金币也都是精灵,当主角所在的区域遇到金币。那么就会把金币“吃掉”,两个精灵重合在一起,我们就须要做出一系列的推断:“碰撞检測”,来看看主角是不是吃到金币啦。那么就能够用到物理的刚体,主角和金币用精灵展示,可是都带着一个刚体,当它们刚碰到一起,我们就能够运用物理碰撞检測


    因为在物理世界中,全部物体都是有重力的。将来主角会带有一个带刚体。那么为了不让主角掉出屏幕外,就须要创建一个地面的刚体,主角就能放置在地面刚体上。

    那么你可能要问:地板也是刚体,那么地板不也会掉下去吗?那么cocos中有两种不同的刚体。一种就是受重力影响的。第二种就是静态刚体,你能够把它放在不论什么位置,那么这里地板就是用的静态刚体

    直接看代码:

    PlayScene .h:

    #ifndef __PlayScene__H__
    #define __PlayScene__H__
    
    #include "cocos2d.h"
    
    class PlayScene : public cocos2d::Layer{
    public:
    	virtual bool init();
    	static cocos2d::Scene* createScene();
    	CREATE_FUNC(PlayScene);
    
    	//这里两行的作用是:为后面的layer->setPhysicsWorld(scene->getPhysicsWorld());
    	cocos2d::PhysicsWorld* m_world;
    	void setPhysicsWorld(cocos2d::PhysicsWorld* world){ m_world = world;};
    
    private:
    
    	//初始化一个地板的物理刚体
    	void initPhysicWorld();
    };
    
    #endif
    代码中的

    cocos2d::PhysicsWorld* m_world;
    void setPhysicsWorld(cocos2d::PhysicsWorld* world){ m_world = world;};

    这两句代码在后面的过程。看不到它的使用。可是是必要的

    PlayScene .cpp:

    #include "PlayScene.h"
    #include "SimpleAudioEngine.h"
    
    #define ground_hight 59
    
    USING_NS_CC;
    using namespace CocosDenshion;
    
    Scene* PlayScene::createScene(){
    
    	//创建带有物理的Scene
    	auto scene = Scene::createWithPhysics();
    
    	//开启调试,将物理世界描绘出来,使得其可见
    	scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
    
    	//Layer  注意这里要用 auto ,不然setPhysicsWorld不能够用
    	auto layer = PlayScene::create();
    
    	layer->setPhysicsWorld(scene->getPhysicsWorld());
    
    	scene->addChild(layer);
    
    	return scene;
    }
    
    bool PlayScene::init(){
    	if(!Layer::init()){
    		return false;
    	}
    
    	SimpleAudioEngine::getInstance()->playBackgroundMusic("background.mp3",true);
    	
    	initPhysicWorld();//这里创建地面刚体
    
    	return true;
    }
    
    void PlayScene::initPhysicWorld(){
    	auto visibleSize = Director::getInstance()->getVisibleSize();
    	auto origin = Director::getInstance()->getVisibleOrigin();
    
    	//创建一个地面边界 的刚体
    	auto boundBody = PhysicsBody::createEdgeSegment(origin,
    		ccp(visibleSize.width,0),
    		PHYSICSBODY_MATERIAL_DEFAULT,1);
    
    	//用一个Node 关联物理刚体
    	auto boundNode = Node::create();
    
    	boundNode->setPhysicsBody(boundBody);
    
    	boundNode->setPosition(0,ground_hight);
    
    	this->addChild(boundNode);
    }
    
    在createScene函数中,类似普通场景的创建:

    auto scene = Scene::create();
    我们须要创建特殊的 物理场景就这么做:

    //创建带有物理的Scene
    auto scene = Scene::createWithPhysics();
    然后我们须要把物理世界的刚体们都画出来让我们看到,就要开启 调试

    //开启调试,将物理世界描绘出来,使得其可见
    scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
    然后相同要创建Play 层,而且为这个层绑定物理世界

    而在initPhysicWorld函数中。我们为这个物理世界初始化,只只为物理世界弄一个地面刚体,那么由于刚体须要物体来展示。我们就用一个node 来绑定刚体。那么这里另一个宏定义 ground_hight  59  由于后面非常多东西的放置都是要基于这个地面的高度的,查看了一下资源中的地的图片。它的高度像素是59 ,所以。。。。尴尬

    然后我们就能够開始游戏界面的初步显示啦

    在MainScene.cpp的回调函数 start中,

    void MainScene::start(){
    	CCLOG("game is start !");
    	Scene* playScene = TransitionFade::create(1,PlayScene::createScene());
    	Director::getInstance()->replaceScene(playScene);
    }
    那么我们就能够通过開始button切换到我们的游戏场景啦。

    这里的TransitionFade::create 仅仅是一个切换场景的方式,你能够转到定义,还有其它的非常多方式,比方能够让你的游戏场景像百叶窗那样出现

    执行游戏。按下button之后的游戏场景例如以下:


    图中的那条红色的细线就是我们的地面静态刚体。因为开启的调式。全部我们这里能看到

    OK,以下就让我们的主人公,进入游戏场景而且跑起来


    这里贴出一个关于3.0物理引擎的新手教程:

    新物理引擎

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

  • 相关阅读:
    PHP AES256加密算法
    PHP字符串比较
    linux常用命令
    播放音乐方法(兼容IE FF Chrome Opera Safari)
    JS小游戏象棋暗棋
    Sublime Text 2 介紹
    php生成QRcode
    几种极其隐蔽的XSS注入的防护
    JS判断碰撞方法
    php 发送带附件邮件
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7250158.html
Copyright © 2020-2023  润新知