2009年5月20日

     摘要: 不少朋友问我HGE上如何使用BOX2D现在我放出用BOX2D的HELLOWORD例子来跟HGE结合的代码上来~如何在C++配置BOX2D我这里就不讲了~为了让大家更加方便阅读我并没有使用面向对象思想~代码后我会把如何使用面向对象思想在BOX2D上的思路给大家讲解下~大家不要嫌我啰嗦啊,,主要对于新手来讲给大家一个思路~这个是完整的代码~并是不片段大家可以直接编译 #include &l...  阅读全文
posted @ 2009-05-20 18:11 icecoldmoon 阅读(2248) | 评论 (4)编辑 收藏
 
象DNF~冒险岛等地图他们都有很多层的地图层并且移动速度不同~那么是如何实现的呢?下面我给大家讲解一下具体实现原理,我做的是一个地图编辑器,不过原理是一样的

 
首先我们应该知道我们的这个游戏有几层我们先创建一个枚举类型
enum MAPTYPE
{
    ForeGround ,
//前景层
    Ground,//地图层
    BackGround,//背景层
    FundusGround,//背景最后层
}
;
然后创建一个基类我们这里就叫做CMap

 

class CMap
{
public:
    CMap(
float _x,float _y,const int _ID,bool _bCheck = true);
    
virtual ~CMap();
    
void GameLogic(float _dt);//游戏主逻辑函数
    void GameRender();        //游戏主渲染函数
    void GameInit();            //游戏初始化函数
    void GameReleaser();        //游戏释放函数
    virtual bool CheckActive()= 0;        //子对象碰撞检测
    virtual bool ShowActive() = 0;        //子对象是否显示
    virtual void Logic(float _dt) = 0;    //子对象逻辑
    virtual void Render() = 0;            //子对象渲染
    STRMAP StrMap;        //地图属性
protected:
    
int ID;
    
float PosX,PosY;    //对象位置
    static HGE* g_pHGE;    //HGE指针
    int Width,Height;            //对象宽和高度
    static float StrWidth,StrHeight;    //当前卷动宽度
    static float ForeWidth,ForeHeight;    //前景层卷动宽和高度
    static float FundusWidth,FundusHeight;//最后一层背景卷动宽度和高度
    static float BackWidth,BackHeight;//背景卷动宽度和高度
    static float Speed;//卷动速度
}
;

 从这里我们可以看到有3个卷动坐标,我们可以认为有3个视图窗口,
可以看图理解

我们可以通过CMap的派生类来创建地图对象然后通过一个链表来管理这些对象
但是虽然我们有3个视图但是我们要统一他们的坐标~也就是我们最后看到的屏幕左上的坐标,当然也许你创建的地图有2级缓存~有可能左上并不是0,0点。自已定义了;

我们在派生类里可以定义一个变量float x,float y;来存放这个对象的左上角坐标;
通过枚举在我们创建这个地图对象的时候给它赋值不同的视图坐标~就是我们先前定义的那3个视图坐标~
这样就实现了多卷轴视差效果~

posted @ 2009-05-20 17:51 icecoldmoon 阅读(1090) | 评论 (1)编辑 收藏

2009年2月19日

#include "Box2D.h"

#include 
<cstdio>
// 
// 这是盒子和小盒子的一个简单例子模拟使用Box2D的.
// 这里我们创造一个大地面箱子和一小动态
// 箱子. 
int main(int argc, char** argv)
{
    B2_NOT_USED(argc);
    B2_NOT_USED(argv);
    
// 定义世界的大小。 
    
//如果钢体到达世界的边缘,但是它将会速度越来越慢直到休眠。
    
// 我们创建地面体。要创建它我们需要一个物体定义(body definition),通过物体定义我们来
    
//指定地面体的初始位置。
    b2AABB worldAABB;
    worldAABB.lowerBound.Set(
-100.0f-100.0f);
    worldAABB.upperBound.Set(
100.0f100.0f);

    
// 定义重力向量
    b2Vec2 gravity(0.0f-10.0f);

    
// 是否休眠
    bool doSleep = true;

    
// 建立一个世界对象.
    b2World world(worldAABB, gravity, doSleep);

    
//我们创建地面体。要创建它我们需要定义一个静态刚体(body definition),通过物体定义我们来
    
//指定地面体的初始位置。
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(
0.0f-10.0f);

    
//将物体定义传给世界对象来创建地面体。世界对象并不保存到物体定义的引用。地面体是作
    
//为静态物体(static body)创建的,静态物体之间并没有碰撞,它们是固定的。当一个物体具有零质量的
    
//时候 Box2D 就会确定它为静态物体,物体的默认质量是零,所以它们默认就是静态的
    b2Body* groundBody = world.CreateBody(&groundBodyDef);

    
// 我们创建一个地面的多边形定义。我们使用 SetAsBox 简捷地把地面多边形规定为一个盒子
    
//(矩形)形状,盒子的中点就位于父物体的原点上。
    b2PolygonDef groundShapeDef;

    
//SetAsBox 函数接收了半个宽度和半个高度,这样的话,地面盒就是 100 个单位宽(x 轴)以及
    
//20 个单位高(y 轴)。Box2D 已被调谐使用米,千克和秒来作单位,
    groundShapeDef.SetAsBox(50.0f10.0f);

    
//我们在地面体上创建地面多边形,以完成地面体
    groundBody->CreateShape(&groundShapeDef);

    
// 现在我们已经有了一个地面体,我们可以使用同样的方法来创建一个动态物体。除了尺寸之外的主要
    
//区别是,我们必须为动态物体设置质量性质。
    
//首先我们用 CreateBody 创建物体
    b2BodyDef bodyDef;
    
//设置起始坐标
    bodyDef.position.Set(0.0f14.0f);
    b2Body
* body = world.CreateBody(&bodyDef);

    
// 接下来我们创建并添加一个多边形形状到物体上。注意我们把密度设置为 1,默认的密度是 0。并
    
//且,形状的摩擦设置到了 0.3。形状添加好以后,我们就使用 SetMassFromShapes 方法来命令物体通
    
//过形状去计算其自身的质量。这暗示了你可以给单个物体添加一个以上的形状。如果质量计算结果为 0,
    
//那么物体会变成真正的静态。物体默认的质量就是零
    b2PolygonDef shapeDef;
    
//动态刚体的大小
    shapeDef.SetAsBox(1.0f1.0f);

    
//密度,密度默认为0为0时判断为静态钢体
    shapeDef.density = 1.0f;

    
//摩擦力
    shapeDef.friction = 0.3f;

    
//创建刚体
    body->CreateShape(&shapeDef);
    
//我也可以通过这个函数设置位置和角度
    
//body->SetXForm(b2Vec2(0.0f,5.0f),0.3f);

    
//以物体形状计算
    body->SetMassFromShapes();

    
// Box2D 中有一些数学代码构成的积分器(integrator),积分器在离散的时间点上模拟物理方程,它将
    
// 与游戏动画循环一同运行。所以我们需要为 Box2D 选取一个时间步,通常来说游戏物理引擎需要至少
    
// 60Hz 的速度,也就是 1/60 的时间步。你可以使用更大的时间步,但是你必须更加小心地为你的世界调
    
// 整定义。我们也不喜欢时间步变化得太大,所以不要把时间步关联到帧频(除非你真的必须这样做)。直截
    
// 了当地,这个就是时间步:
    float32 timeStep = 1.0f / 60.0f;
    
// Box2D 中还有约束求解器(constraint solver)。约束求解器用于解决模拟中的所有
    
// 约束,一次一个。单个的约束会被完美的求解,然而当我们求解一个约束的时候,我们就会稍微耽误另
    
// 一个。要得到良好的解,我们需要迭代所有约束多次。建议的 Box2D 迭代次数是 10 次。你可以按自己
    
// 的喜好去调整这个数,但要记得它是速度与质量之间的平衡。更少的迭代会增加性能并降低精度,同样
    
// 地,更多的迭代会减少性能但提高模拟质量。这是我们选择的迭代次数:
    int32 iterations = 10;

    
// 输出坐标以及角度
    for (int32 i = 0; i < 60++i)
    
{
        
// 单个约束求解以1/60帧。每帧计算10次
        world.Step(timeStep, iterations);

        
// 得到动态刚体的坐标以及角度
        b2Vec2 position = body->GetPosition();
        float32 angle 
= body->GetAngle();

        printf(
"%4.2f %4.2f %4.2f\n", position.x, position.y, angle);
    }


    
// When the world destructor is called, all bodies and joints are freed. This can
    
// create orphaned pointers, so be careful about your world management.
    system("pause");
    
return 0;
}



注意:在2.0.0版里创建物体是CreateDynamicBody

有什么问题可以联系我
QQ群:57071430
posted @ 2009-02-19 15:28 icecoldmoon 阅读(1916) | 评论 (10)编辑 收藏

2008年11月18日

第一次写博客不知道有没有人看呵呵~我看了1个月得HGE引擎~感觉HGE很容易上手于是写了一个基于HGE引擎得2D横板得地图编辑器~如果有人有兴趣或者有什么问题可以给我留言
现在只是写了修改地图层~随后开始写背景层和前景层编辑
我是用一个map[][]数组来保存得地图信息~
前景层和背景层是根据map数组来得到位置~缓冲区设定为了1屏
在地图内是按照格子来渲染得~也就是告诉计算机我左上角得是数组当中得第几个格子

posted @ 2008-11-18 16:34 icecoldmoon 阅读(1115) | 评论 (4)编辑 收藏
仅列出标题