cocos2d-x box2d中文教程

2015年02月26日 14:33 0 点赞 0 评论 更新于 2017-05-09 17:19

在实现物体飞翔的物理特性时,我们可以借助 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 渲染,方便我们对物理模拟进行调试。

作者信息

boke

boke

共发布了 1025 篇文章