cocos2d-x box2d中文教程
在实现物体飞翔的物理特性时,我们可以借助 Box2D 来完成。网上有许多关于 Box2D 的入门教程,在此推荐官方手册的中文版(请自行补充具体地址),本文不再重复介绍基础内容,而是分享一些个人的理解。
一、Cocos2d-x 与 Box2D 集成
Cocos2d-x 能够与 Box2D 的 C++ 版本完美融合,集成过程十分便捷,只需包含相关头文件即可:
#include "Box2D.h"
不过,在使用 Cocos2d-x 2.2.1 版本通过 NDK 编译安卓版本时,需要进行一些修改,否则会找不到 Box2D 的头文件,修改后的包含语句如下:
#include "Box2D/Box2D.h"
二、开启 Box2D 的 Debug 渲染
为了便于调试 Box2D,通常会将物理世界中的物体绘制出来。官方提供了 Debug Draw 功能,在 Cocos2d-x 里有一个名为 GLESDebugDraw 的调试工具类,该类位于 test 工程中,对应的文件名为 GLES-Render.h,我们需要将其引入项目。具体步骤如下:
1. 创建 Box2D 物理世界和 Debug 渲染器
以下是一个示例代码,展示了如何创建 Box2D 物理世界和 Debug 渲染器:
// TestBox.h
// TestBox2d
// Created by lerry on 14 - 3 - 4.
// Copyright (c) 2014年 GoonearTechnology Co.,Ltd. All rights reserved.
#ifndef __TestBox2d__TestBox__
#define __TestBox2d__TestBox__
#include "cocos2d.h"
#include "Box2D.h"
#include "GLES-Render.h"
#define RATIO 96
class TestBox : public cocos2d::CCLayer {
cocos2d::CCSprite* role;
b2World* mWorld;
GLESDebugDraw* mDebugDraw;
cocos2d::CCSize visualSize;
private:
void draw();
void drawBox();
public:
~TestBox();
virtual void update(float dt);
virtual bool init();
virtual void onEnter();
virtual void onExit();
virtual bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
virtual void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
void initWorld();
void setDebug(bool isDebug);
static cocos2d::CCScene* scene();
CREATE_FUNC(TestBox);
};
#endif /* defined(__TestBox2d__TestBox__) */
2. 构建世界并开启 Debug 模式
在 initWorld 函数中,我们可以构建物理世界并开启 Debug 模式:
void TestBox::initWorld() {
mWorld = new b2World(b2Vec2(0, -10));
mWorld->SetAllowSleeping(true);
mWorld->SetContinuousPhysics(true);
setDebug(true);
}
3. 启用 Debug 绘制
当开启 Debug 模式后,需要启用 Debug 绘制功能,以下是相关代码:
void TestBox::setDebug(bool isDebug) {
if (isDebug) {
mDebugDraw = new GLESDebugDraw(RATIO);
mWorld->SetDebugDraw(mDebugDraw);
uint32 flags = 0;
flags += b2Draw::e_shapeBit;
flags += b2Draw::e_jointBit;
flags += b2Draw::e_pairBit;
flags += b2Draw::e_centerOfMassBit;
mDebugDraw->SetFlags(flags);
draw();
}
}
void TestBox::draw() {
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);
kmGLPushMatrix();
mWorld->DrawDebugData();
kmGLPopMatrix();
}
4. 在 init 函数中初始化世界并调用 update 函数
在 init 函数中,我们需要初始化物理世界,并调用 update 函数来更新物理模拟:
// 此处省略具体代码,需在 init 函数中调用 initWorld 并设置更新回调
bool TestBox::init() {
if (!CCLayer::init()) {
return false;
}
initWorld();
this->scheduleUpdate();
return true;
}
void TestBox::update(float dt) {
mWorld->Step(dt, 8, 3);
}
通过以上步骤,我们就可以在 Cocos2d-x 项目中集成 Box2D 并开启 Debug 渲染,方便我们对物理模拟进行调试。