Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

2023-11-11 15:50

本文主要是介绍Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

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

1. 创建游戏物理世界

2. 没了(小若:我噗)

 

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

 

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

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

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

 

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

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

 

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

 

我们给关卡场景命名为TollgateScene,头文件如下:

 
  1. #ifndef TollgateScene_H
  2. #define TollgateScene_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class TollgateScene : public Layer
  6. {
  7. public:
  8.     ~TollgateScene();
  9.     static Scene* scene();
  10.     CREATE_FUNC(TollgateScene);
  11.     virtual bool init();
  12.     virtual void onExit() override;
  13. };
  14. #endif
 

头文件没有什么特别的,和普通的场景头文件一样。

然后,来看看cpp文件:

 

 
  1. #include "TollgateScene.h"
  1. TollgateScene::~TollgateScene()
  2. {
  3. }
  4. Scene* TollgateScene::scene()
  5. {
  6.     auto scene = Scene::createWithPhysics();
  7.     /* 微重力世界 */
  8.     Vect gravity(0-0.5f);
  9.     scene->getPhysicsWorld()->setGravity(gravity);
  10.     /* 开启测试模式 */
  11.     scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
  12.     //创建一个边界
  13.     Size visibleSize = Director::getInstance()->getVisibleSize();
  14.     /*
  15.         创建一个空心盒子刚体,作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)
  16.         参数分别是刚体大小、材质(其实就是一些预设的配置数据)、边线厚度
  17.     */
  18.     auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
  19.     /* 创建一个节点,用于承载刚体,这样刚体就能参与到游戏的物理世界 */
  20.     auto node = Node::create();
  21.     node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
  22.     node->setPhysicsBody(body);
  23.     scene->addChild(node);
  24.     auto layer = TollgateScene::create();
  25.     scene->addChild(layer, 10);
  26.     return scene;
  27. }
  28. bool TollgateScene::init()
  29. {
  30.     if (!Layer::init())
  31.     {
  32.         return false;
  33.     }
  34.     return true;
  35. }
  36. void TollgateScene::onExit()
  37. {
  38.     Layer::onExit();
  39. }

 

太复杂了,我要分几个部分来讲解(小若:但是你一开始说很简单的啊!)

 

集成物理世界的场景

在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函数里做一些配置:

 

 
  1. #include "TollgateScene.h" /* 头文件一定不要忘了 */
  2. bool AppDelegate::applicationDidFinishLaunching() {
  3.     // initialize director
  4.     auto director = Director::getInstance();
  5.     auto glview = director->getOpenGLView();
  6.     if(!glview) {
  7.         glview = GLView::create("Don't Save Me!");
  8.         director->setOpenGLView(glview);
  9.     }
  10.     /* 设置Win32屏幕大小为480X800, */
  11.     glview->setFrameSize(480800);
  12.     /* 简单的屏幕适配,按比例拉伸,可能有黑边 */
  13.     glview->setDesignResolutionSize(480800, ResolutionPolicy::SHOW_ALL);
  14.     director->setDisplayStats(true);
  15.     director->setAnimationInterval(1.0 / 60);
  16.     /* 初始场景为关卡场景 */
  17.     auto scene = TollgateScene::scene();
  18.     director->runWithScene(scene);
  19.     return true;
  20. }

 

屏幕大小设置为480X800(这个随意了,只是windows运行时的大小而已)。

游戏设计大小设置为480X800,这个大小决定了游戏素材的规格,我只使用一套资源来做适配。然后,这是一个竖屏方向的游戏。

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

 

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

 

 

Cocos2d-x3.0游戏实例之《别救我》第二篇-截图-运行效果

 

 

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

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

 

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

 

 

这篇关于Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391173

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与