只有你足够强,别人才会和你讲道理。
文章: 280
浏览: 2,977,871
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
转载请注明,原文地址: http://www.benmutou.com/archives/804
文章来源:笨木头与游戏开发
 

这篇我要给大家介绍两个知识点:

1. 创建游戏物理世界

2. 没了(小若:我噗)

 

害怕了?不用担心,这太简单了~!

 
笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址:http://www.benmutou.com/archives/804

文章来源:笨木头与游戏开发
 

3.0新亮点,史上最简单的物理引擎

在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了。

 

那么,我要开始创建游戏的关卡场景了,大家跟紧了。

 

我们给关卡场景命名为TollgateScene,头文件如下:
[cce_cpp]
#ifndef TollgateScene_H
#define TollgateScene_H

#include "cocos2d.h" USING_NS_CC; class TollgateScene : public Layer { public:   ~TollgateScene();   static Scene* scene();   CREATE_FUNC(TollgateScene);   virtual bool init();

  virtual void onExit() override; };

#endif [/cce_cpp]
 
头文件没有什么特别的,和普通的场景头文件一样。

然后,来看看cpp文件:
[cce_cpp]
#include "TollgateScene.h"

TollgateScene::~TollgateScene() { }

Scene* TollgateScene::scene() {   auto scene = Scene::createWithPhysics();

  /* 微重力世界 */   Vect gravity(0, -0.5f);   scene->getPhysicsWorld()->setGravity(gravity);

  /* 开启测试模式 */   scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);

  //创建一个边界   Size visibleSize = Director::getInstance()->getVisibleSize();

  /*   创建一个空心盒子刚体,作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)   参数分别是刚体大小、材质(其实就是一些预设的配置数据)、边线厚度   */   auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);

  /* 创建一个节点,用于承载刚体,这样刚体就能参与到游戏的物理世界 */   auto node = Node::create();   node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));   node->setPhysicsBody(body);   scene->addChild(node);

  auto layer = TollgateScene::create();   scene->addChild(layer, 10);

  return scene; }

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

void TollgateScene::onExit() {   Layer::onExit(); } [/cce_cpp]
太复杂了,我要分几个部分来讲解(小若:但是你一开始说很简单的啊!)
 

集成物理世界的场景

在3.0里要创建一个物理世界,很简单,之前我们创建场景,调用的是Scene::create()。如果要创建物理场景,那就:
auto scene = Scene::createWithPhysics();

于是这个场景就具备了物理世界的功能,不要再做什么其他处理了。

 

设置游戏的重力方向

接下来我们要为物理世界设定一个重力方向,这个方向随大家喜欢,我也是随意设置的,不同的方向对游戏的操作也有一定的影响,说不定还更有意思。

要对物理世界进行操作,就要通过场景来获取物理世界对象,然后再进行操作:
/* 微重力世界 */

Vect gravity(0, -0.5f);

scene->getPhysicsWorld()->setGravity(gravity);

 

/* 开启测试模式 */

scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
 

Vect就是一个向量,代表x和y方向,其实它就是一个Point对象。

 

后面好像乱入了一句代码?没错,那是开启调试模式的,这个功能很爽。开启调试模式的话,所有物体对象的形状节点什么的都会被画出来,方便我们测试。当然,有个参数,可以设置你想要绘制的那些部分。

 

用最简单的方式创建刚体

一般情况下,我们要创建刚体,还要先创建形状,然后各种设置。在3.0里,不需要,只需要一句代码:
/*

创建一个空心盒子刚体,作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)

参数分别是刚体大小、材质(其实就是一些预设的配置数据)、边线厚度

*/

auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
 

createEdgeBox函数是创建空心盒子刚体,还有更多函数大家看看PhysicsBody的头文件就知道了。

在createEdgeBox函数里,已经把形状创建好,并添加给刚体了。

 

让刚体加入到物理世界

/* 创建一个节点,用于承载刚体,这样刚体就能参与到游戏的物理世界 */

auto node = Node::create();

node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));

node->setPhysicsBody(body);

scene->addChild(node);
别忘了,现在的物理世界就是我们的场景,场景就是世界,世界就是场景。按照这种思想,刚体要加入到物理世界,那就要添加到场景里,而刚体怎么添加到场景里呢?直接addChild?

 

不~!场景是用来添加节点对象的,于是,我们把刚体放到节点里,然后把节点添加到场景里。懂了吧?(小若:哦~原来如此啊(完全没听懂))

 

其实很好理解,刚体只是一些模拟数据而已,它是看不见的,而游戏里面的对象需要用各种图片、动画来表现。

因此,节点对象用于表现,刚体对象用于物理模拟,两者结合,就完美了。

 

刚体添加到节点之后,可以通过getPhysicsBody函数来获取。

 

运行效果

OK,准备看看运行效果吧,在此之前,先改改AppDelegate.cpp文件,在applicationDidFinishLaunching函数里做一些配置:
[cce_cpp]
bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLView::create("Don't Save Me!");
        director->setOpenGLView(glview);
    }

  /* 设置Win32屏幕大小为480X800, */   glview->setFrameSize(480, 800);

  /* 简单的屏幕适配,按比例拉伸,可能有黑边 */   glview->setDesignResolutionSize(480, 800, ResolutionPolicy::SHOW_ALL);

  director->setDisplayStats(true);   director->setAnimationInterval(1.0 / 60);

  /* 初始场景为关卡场景 */   auto scene = TollgateScene::scene();   director->runWithScene(scene);

  return true; } [/cce_cpp]

屏幕大小设置为480X800(这个随意了,只是windows运行时的大小而已)。
游戏设计大小设置为480X800,这个大小决定了游戏素材的规格,我只使用一套资源来做适配。然后,这是一个竖屏方向的游戏。

屏幕适配方式我使用最简单的SHOW_ALL模式,在某些手机上会有黑边。

 

然后初始运行场景为TollgateScene,好了,运行游戏,效果如图:

 

[caption id="attachment_819" align="aligncenter" width="177"]Cocos2d-x3.0游戏实例之《别救我》第二篇-截图-运行效果 《别救我》第二篇-截图-运行效果[/caption]

 

留意一下屏幕边缘的红色线条,这就是我们创建的空心盒子物体,开启了调试模式,所以会把它绘制出来。

有了这个空心盒子,在盒子里的物体就不会随便跑出屏幕外面了。

 

好了,下一篇,我们要加入游戏的背景。

 

 
23 条评论
  • 见人不会飞 2015-08-24 13:30:23

    感觉奇怪,为什么添加物理世界,那个红色的框不在正中间,跑到一边去了!
    0回复
    • 博主 糟糕_树叶的mut 2015-08-25 07:40:38

      可能版本和我不一样?你调一下锚点或者坐标试试
      0回复
      • 见人不会飞 2015-08-25 10:56:26

        嗯,解决了
        0回复
  • 一个转身的距离 2014-11-14 10:36:23

    if(!glview) { glview = GLView::createWithRect("Don`t save me",Rect(0,0,480,800)); //这里不这么创建的话还是横屏,不是竖屏吧,两边空白,哦不是空黑 director->setOpenGLView(glview); }
    0回复
    • 博主 糟糕_树叶的mut 2014-11-14 20:03:41

      不用的,横竖屏是具体的手机平台来配置的,cocos2d-x里不要处理~
      0回复
  • Joueu周大楷 2014-10-06 23:26:13

    木头木头,为什么我quickMove 的时候 player偶尔 会冲破下面的border 跳到下面去???
    0回复
    • 博主 糟糕_树叶的mut 2014-10-07 09:16:58

      力量过大,就会冲破, 就和子弹一样~
      0回复
  • 樱海 2014-06-26 11:31:58

    为什么全用auto了?难道不会不方便么?为什么不直接指定指针变量?
    0回复
    • 博主 糟糕_树叶的mut 2014-06-26 11:49:02

      auto就是因为方便才用。。。你觉得哪里不方便?当然,滥用也不好~
      0回复
  • GJ 2014-06-05 11:00:59

    这里的backgroundlayer头文件是需要自己编写吗
    0回复
    • 博主 糟糕_树叶的mut 2014-06-05 14:31:46

      这个是后面要加的类。。忘了删,这里可以暂时删了~
      0回复
  • Chrono 2014-05-14 18:59:24

    你好,我想问下,编译的时候无法打开源文件BackgroundLayer.h,需要怎样处理?
    0回复
    • 博主 糟糕_树叶的mut 2014-05-15 09:23:03

      你是不是没有include头文件
      0回复
      • Chrono 2014-05-27 21:21:16

        那个文件好像是不需要的,删了就好了
        0回复
  • 我只能哈哈 2014-05-09 05:04:43

    请问一下,VS2012如何自定义cocos2dx3.0模板?比如创建一个c++,自动头部声明。可以自己定义吗?
    0回复
    • 博主 糟糕_树叶的mut 2014-05-09 07:59:30

      那我推荐一个插件:Visual_Assist_X ,它可以自定义语法提示,同样可以实现你说的功能~具体选项是:【Insert VA Snippet】->【Edit VA Snippet】,然后研究一下~挺强大的~
      0回复
      • 我只能哈哈 2014-05-09 15:09:53

        谢谢,很好用。我研究一下
        0回复
  • yxlovemoney 2014-05-07 23:29:56

    auto scene CCScene *scene 类名都不需要了?
    0回复
    • 博主 糟糕_树叶的mut 2014-05-08 08:02:57

      其实是C++的,应该是C++11的新特性吧~
      0回复
  • yxlovemoney 2014-05-07 23:14:40

    话说 变量名前的 auto 是3.0的新特性么?
    0回复
  • star特530 2014-05-03 11:04:06

    恩恩,对物理这方面还是没啥经验,看了木头的收获颇多。木头,顶你了哦
    0回复
    • 博主 糟糕_树叶的mut 2014-05-03 17:30:40

      我也顶你
      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发