这篇我要给大家介绍两个知识点:
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"]
《别救我》第二篇-截图-运行效果[/caption]
留意一下屏幕边缘的红色线条,这就是我们创建的空心盒子物体,开启了调试模式,所以会把它绘制出来。
有了这个空心盒子,在盒子里的物体就不会随便跑出屏幕外面了。
好了,下一篇,我们要加入游戏的背景。