Box2D和Chipmunk

2024-04-24 10:48
文章标签 box2d chipmunk

本文主要是介绍Box2D和Chipmunk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

物理的表现力对游戏的影响越来越重要,几乎已经是现在游戏中不可获取的要素之一,如果进入游戏开发的物理世界中,你会发现这是一个深不可测的领域,没个十几年的功力怕是难说出个头道来的,不过再难总要去面对和挑战,幸运的是随着游戏开发行业的日益成熟,物理引擎已经成为了游戏开发一个专门的方向,有PhysiX和Havok这样为AAA游戏而存在的专业级物理引擎,也有Box2D和Chipmunk这样为2D小游戏量身定做的轻量级物理引擎,使得游戏开发者已经可以实现非常出色的物理效果而不用过多的关心背后的实现机制了。不过也许2D游戏中的物理更适合像我这样的初学者来入门。其实Box2D和Chipmunk这两款物理引擎经过5、6年的发展已经非常成熟,并为数不清的游戏实现了精彩的物理效果,而在现在大红大紫的cocos2d中,同时引入了对这两款物理引擎支持,今天写一点简单的上手教程,一作笔记,二来望能帮助刚刚上手的朋友们。

首先我们需要了解的是Box2D和Chipmunk中所模拟的物理物体全部都是刚体,刚体指的是不会发生任何形变的理想化的物体,PhysX和Havok中是有支持除了刚体外比如布料和流体等高级物理特性的,不过在Box2D和Chipmunk里,刚体已经足够我们制作出出色的物理效果了。物理引擎的工作是通过我们预先为游戏内物体设定的物理参数,比如质量,动能,磨擦等,自动的更新物体的运动和位置,需要注意的物理的真实表现往往需要大量的计算,所以我们必须权衡考虑游戏中所需要的物理计算量,效果和性能的平衡永远是一个程序员需要面对的永恒不变的哲学问题。

快速了解一下Box2D和Chipmunk的主要区别,可以让我们根据自己的需求作出合适的选择。Box2D是用C++写的,而Chipmunk是C风格的,Box2D相比之下有些Chipmunk无法体现的特性,所以如果你更倾向于轻量级或者易于上手,那么也许Chipmunk更适合你一些。

Box2D

要使用Box2D首先有些类是需要我们了解的:
  1. b2World:运行在游戏里的物理世界,是所有有物理表现的物体的容器,负责遍历和更新。
  2. b2BodyDef:刚体定义,表示刚体的物理特性和参数,比如是静态还是动态,加速度角速度等等,主要用于创建b2Body。
  3. b2Body:刚体,在世界内创建的刚体。
  4. b2Shape:表示刚体的形状的,b2Shape只是基类,它的子类目前包括ChainShape、CircleShape、EdgeShape、PolygonShape等分别实现了多边形、三角形、球等形状。主要的用处是通过b2Body的CreateFixture接口来为刚体b2Body创建外形,要注意的是目前Box2D是无法创建空心球体的,只能通过多边形来近似模拟空心圆。
  5. b2FixureDef:定义形状的,表示刚体形状的具体物理特性,比如摩擦力、密度、弹性等等,主要是用于创建形状的。

我们可以通过一小段代码来了解Box2D是如何来创建这些对象的:

在Box2D的世界里,世界的大小是通过”米”来衡量的,而我们在游戏中通常都是通过像素来描述的,所以我们需要做一个将单位从像素点到米的转换,以便让我游戏背后的物理世界能和游戏画面所表示的内容完美的结合起来。

#define PTM_RATIO 32

Box2D使用”米”作为刻度衡量单位有另一个考虑是出于性能上的,内部的机制使得刚体最好的性能和质量表现是建立在合理的刚体大小基础上的,如果物体普遍太小或者普遍太大,则容易引起各种各样的问题。一般来说尽量不要让刚体小于0.1米或者大于10米。

在cocos2d中如果我们想把b2Body和CCSprite关联起来:

b2World的函数Step()负责更新物理世界,后面两个参数代表着模拟的精度。有的文章中提到这里dtTime如果帧数浮动不是很大,那么最好是固定,否则容易导致刚体的运动不稳定,不过我目前还没有非常深入的使用,所以究竟如何是需要实践一下。

Box2D的碰撞检测是通过b2ContactListenner来实现的,如果你想接受来自碰撞的回调,你需要创建一个继承自b2ContactListener的新类:

BeginContact()和EndContact()会在碰撞发生时被调用,如果要让Listener生效,需要在创建b2World时为他附上这个监听者:

Chipmunk

我在实际的开发中并没有使用过Chipmunk,所以我只能浅显的介绍一下Chipmunk的大概,更多的需要朋友们自己去查看文档,但我想我们了解了Box2D所创建的物理世界,那么理解Chipmunk应该是异曲同工的,Chipmunk和Box2D最大的不同在于它是C风格的实现,在Chipmunk中把物理世界称为Space而不是World,创建也很简单:

Chipmunk中不需要将像素转换成米,而是直接使用像素大小来表示,创建静态的body同样简单:

由于Chipmunk是C代码风格的,所以我们可以找到各种类似于cpSegmentShapeNew(),cpSpaceAddStaticShpa(),cpSpaceAddBody()各种各样的函数来为space添加各种形状。

Chipmunk的更新类似于Box2D的Step()函数,由一个cpSpaceStep(space, dtTime)来负责。而与CCSprite的同步是通过一个cpSpaceHashEach来遍历循环的:

Chipmunk的碰撞是通过函数cpSpaceAddCollisionHandler(space, defaultCollisionType, defaultCollisionType, &contactBegin, NULL, NULL, &contactEnd, NULL);来完成的。其中contactBegin和contactEnd是两个静态函数,如果碰撞发生,他们会返回YES,如果返回NO,那么我们可以忽略碰撞。

原文:http://www.ownself.org/blog/2013/box2d-he-chipmunk.html

这篇关于Box2D和Chipmunk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931544

相关文章

box2d源码解析(一)概述

box2d源码解析(一)概述 tags: box2d源码 为什么写这篇博文 前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有资料之苦,是绝不能让后来人再次承受,因为这非但不是对毅力的历练,反而是对时间的浪费。 网上的资料实在少得可怜,有关于box2d的,也是box2d的用法

box2d源码解析 一

排版问题,新文地址,谢谢 为什么写这篇博文: 前一段时间一直在花时间看box2d源码,真可谓废了九牛二虎之力,四处扒资料,皇天不负有心人,最终还是将源码看完了,可以长舒一口气了.不过会想起我在学习过程中遇到的没有资料之苦,是绝不能让后来人再次承受,因为这非但不是对毅力的历练,反而是对时间的浪费。 网上的资料实在少得可怜,有关于box2d的,也是box2d的用法,根本就不是源码的解析。所

OpenHarmony UI动画-box2d

简介 用于游戏开发,使物体的运动更加真实,让游戏场景看起来更具交互性,比如愤怒的小鸟 效果展示 下载安装 ohpm install @ohos/box2d OpenHarmony ohpm环境配置等更多内容,请参考 如何安装OpenHarmony ohpm包 使用说明 import * as box2d from '@ohos/box2d'...aboutToAppea

Box2d新系列 第八章 连接器(Joints)

http://www.firedragonpzy.com.cn/index.php/archives/2529 8.1  关于(About) 连接器起到限制世界当中物体自身或物体之间的作用。典型的例子是游戏中的木偶,跷跷板,滑轮。连接器可以用很多不同的方式创建有趣的运动。 有些连接器提供了限制,你可以以此来控制运动的范围。有的连接器提供了用指定速度驱动物体的马达,直到有一个更大的力

Box2d)box2dweb之关节joint(连接器)

box2dweb非常重要的一个概念,关节(joint)也有叫连接器的,总之是一个意思。下面是关节详细的类库说明: BOX2D.Dynamics.Joints>>>动态关节包; b2DistanceJoint 距离连接 b2DistanceJointDef 距离连接定义. b2GearJoint 齿轮链接. b2GearJointDef 齿轮连接定义. b2Joint 连接基类. b2Joi

如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第2部分

这是教你如何制作一款像Halfbrick Studios公司的Fruit Ninja一样的切割精灵游戏系列教程的第2篇。 在第1篇中,你学会了如何创建纹理多边形,并基于它制作了一个西瓜。 在第1部分中所做的努力将在第2部分中收到回报,在此部分中,你将能够切割sprite。 和第1部分一样,本篇教程需要你熟悉Cocos2D和Box2D。如果你是刚刚接触它们的话,请先学习本网站的Coco

如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第1部分

在本篇教程中,你将学到如何制作一个切图片的游戏,像Halfbrick Studios制作的Fruit Ninja一样,我们使用的工具是强大的Cocos2D和Box2D,以及一些预先做好的工具。 在大多数切东西的游戏中,当你画一条线划过一个图片精灵时,他们的做法基本上是把图片精灵转变为两个预先画好的被从中间切开的图片精灵,而并不会依照你划过的实际位置。 但是本篇教程将演示一个更cool的技

怎样在cocos2d里面如何使用物理引擎box2d制作弹球游戏

http://www.raywenderlich.com/zh-hans/18569/%E6%80%8E%E6%A0%B7%E5%9C%A8cocos2d%E9%87%8C%E9%9D%A2%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%89%A9%E7%90%86%E5%BC%95%E6%93%8Ebox2d%E5%88%B6%E4%BD%9C%E5%BC%B9

Cocos2d-x 2.x TestCPP启用box2d(CC_ENABLE_BOX2D_INTEGRATION)

1.在TestCPP项目的工程中 【项目->TestCPP属性->配置属性->C/C++->预处理器->预处理器定义】 中定义CC_ENABLE_BOX2D_INTEGRATION=1,删掉CC_ENABLE_CHIPMUNK_INTEGRATION或将其定义为0 2.在libExtensions项目中(可以通过转到声明功能进入相关类来进入项目,如CCPhysicsSprite),同1,在预处理

手把手教你使用PhysicsEditor来辅助制作Box2D刚体

 本篇教程需要读者对Box2D有了一些基本了解,如果过程中有什么概念不清楚,请参考Box2Dv2.3.0 用户指南中的相关章节进行学习。 我们知道,在利用Box2D引擎开发游戏的时候,对于规则的物体(刚体),比如圆形,矩形的物体,比较容易完成制作,但是对于稍微不规则的物体,例如不规则的多边形,甚至是具有弧线的图形,制作起来就相对比较棘手,当然如果你有足够的耐心,用b2PolygonSh