1. 目标
制作一个打砖块类型的游戏Demo
2. 使用技术
Cocos2dx 3.0 基于Box2D的Physics模块
3. 具体步骤
3.1 建立Lesson1.h及Lesson1.cpp
Lesson.h 内容如下:
#ifndef __LESSON1_H__
#define __LESSON1_H__
#include "cocos2d.h"
#include "VisibleRect.h"
using namespace cocos2d;
class Lesson1 : public cocos2d::Layer
{
public:
void initPhysics();
static cocos2d::Scene* createScene();
CREATE_FUNC(Lesson1);
bool init() override;
void setPhyWorld(PhysicsWorld* world){this->world = world;}
// Touch process
bool onTouchBegan(Touch* touch, Event* pEvent);
void onTouchMoved(Touch* touch, Event* pEvent);
void onTouchEnded(Touch* touch, Event* pEvent);
// Collide callback
bool onContactBegin(PhysicsContact& contact);
void update(float dt);
void applyImpulse();
void applyImpulse_withbrick(Point p);
private:
PhysicsWorld* world;
int m_state;
};
#endif // __LESSON1_H__
Lesson1 就是一个普通的Layer,其中有一个方法用来产生一个场景,这是cocos2dx常见的编程方法。 onTouchXXX 系列方法是cocos2dx 3.0触摸回调方法。它的用法在Lesson1.cpp中可以看到。 onContactBegin是注册的一个检测碰撞信息的回调方法,通过它可以了解到具体的碰撞体信息。 update方法是我使用scheduleUpdate定制的
刷新方法,这里可以做一些每帧都需要处理的事情。 appleImpulse 和applyImpulse_withbrick是定制的帮助方法,其实更合适放在private里面,但是我们仅仅写个Demo,
所以不必过分注意系统的架构,比如面向对象或者MVC的方法。如果我们要做一个商业化的正规游戏,那么这些都是要考虑的。
介绍完头文件,接下来就进入实现文件的编写。
3.2 首先是产生场景方法的编写:
Scene* Lesson1::createScene()
{
auto scene = Scene::createWithPhysics();
auto layer = Lesson1::create();
layer->setPhyWorld(scene->getPhysicsWorld());
scene->addChild(layer);
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
return scene;
}
可以看出,这里和普通的游戏产生场景的方法并不相同。我们无须面对Box2D的细节就完成了物理世界的构建。
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
这里我们仅仅通过一句代码就完成了Debug模式的构建,所谓DebugDraw,指的是Box2D本身并不支持绘图,这里使用的OpenGL ES来绘制出图形的线框模型,可以帮助我们
可视化的看到物体的外观。我们这个Demo的外观就是利用了这点,没有使用贴图。
3.3 接下来是层的初始化方法
bool Lesson1::init()
{
if ( !Layer::init() )
{
return false;
}
m_state = STATE_INIT;
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener->onTouchBegan = CC_CALLBACK_2(Less