cocos2dx 子弹反弹封装的物理引擎怎么去掉反弹效果

Cocos2d-x&3.x用物理引擎实现绳子甩动的效果
五一小短假很快就过去了,期间把自己一直想做的事情都干了一遍,我勒个歪歪吖。
那天在看熊出没之雪岭熊风的时候,哎丫丫,忽然就想到一个很神奇的东东,在物理世界中是否可以模拟绳子的效果,一甩一甩的,说不定以后哪一个小游戏就可以实现了这样的一部分,赶紧的到机房上实验下,好吧,我数数,中午两点到现在,除了吃饭时间就一直呆着这里搞,哎丫丫,没有那么简单,一把心酸一把泪。终于搞定了。
分享下吧,怎么用物理引擎做出绳子甩动的效果
代码已经上传到Github。戳个链接
/zjklyl931081//tree/master/ropePhysics
注意在创建物理世界的时候
&scene-&getPhysicsWorld()-&setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
scene-&getPhysicsWorld()-&setDebugDrawMask(PhysicsWorld::DEBUGDRAW_JOINT);
因为第一句是显示所有的刚体跟关节的。第二条是现实所有的关节。
你就会发现下面这种情况,我去,不妥。
双节棍呢?
好吧,刚体是不见了,但是关节头,还有的勒。
小提醒:关节就好比我们的手臂,手掌跟手臂之间有手腕在链接,手腕是由我们的手掌跟手臂嵌入起来的,看起来就像是一个点。
那怎么办,Let me go.就这样?what?不行。看看源码。
PhysicsDebugDraw这个跟进去
好吧,英语还不算太差,略懂,drawJoint,绘画关节,好在走进去。
发现,jointPointColor关节点颜色,这个不就是那个绿点,好,干掉,搞的跟关节的颜色一样就O了,如下图
貌似还不行,在看看。
发现目标,drawDot是什么?好吧,前段时间,看到它,我也是不懂,dot是什么意思?上有道。点。绘画点。明白了。那就更好办了,干掉,注释点。里面存在几个条件判断语句,干掉里面的drawdot,好了,返回到界面上跑跑看看。
噢了,附上小视频。
有点不O,因为我把人家的源码给改了,尝试过外部就修改,但还是不行,自己还是嫩姜,搞不定,木有办法。
五一过得小忧伤,赶紧来首贝多芬的悲伤。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。主题 : cocos2dx lua 编译时如何去掉用不到的物理引擎模块,以减小so库的体积
级别: 新手上路
可可豆: 23 CB
威望: 24 点
在线时间: 25(时)
发自: Web Page
cocos2dx lua 编译时如何去掉用不到的物理引擎模块,以减小so库的体积&&&
在网上查到把android/jni/ application.cpp中增加  CC_USE_PHYSICS := 0 APP_CPPFLAGS += -DCC_USE_PHYSICS=0这两行代码可以不用编译使用不到的物理引擎,可是在绑定lua 自动生成的lua_cocos2dx_xxx_auto.cpp/.h文件中仍然引用了物理引擎的相关类,导致编译的时候报错,怎么屏蔽掉lua绑定中的物理引擎呢?
级别: 天使
UID: 432850
发帖: 34758
可可豆: 335461 CB
威望: 335459 点
在线时间: 1063(时)
发自: Web Page
回 楼主(北极星) 的帖子
现在的引擎是自动屏蔽的没用到的功能是不会打包进去的。
论坛关注较少,若还有后续疑问请去提问
级别: 新手上路
可可豆: 23 CB
威望: 24 点
在线时间: 25(时)
发自: Web Page
回 1楼(DDDigua) 的帖子
我用的是cocos2dx-3.3 lua&&没有屏蔽任何模块的时候android打包 .so文件10.6M 当添加了下面的编译选项后 .so文件减小到9.6M 所以想试着去屏蔽物理引擎,但是一直报错。&&&&&&&&CC_USE_CCBUILDER := 0&&&&CC_USE_TIFF := 0&&&&CC_USE_WEBP := 0&&&&CC_USE_JPEG := 0&&&&CC_USE_3D := 0
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版正在播放:12.2.4Cocos2d-x 3.0中物理引擎封装- 实例:使用关节
下载学院APP缓存视频离线看
购买本课程后即可享受以下服务:
24小时讲师答疑
所有课时永久观看
购买课程返学分
价格:?599
购买本课程后,就可以记笔记了~~
开始记笔记……
记录时间点
我的笔记同学的笔记
购买本课程后,就可以提问题了~~
向老师提问……
记录时间点
我的问题同学的问题Cocos2dx物理引擎使用入门
什么是物理引擎?
科学模型:科学研究中对事物的合理简化。
物理引擎是一个计算机程序模拟牛顿力学模型,使用质量、速度、摩擦力和空气阻力等变量。
可以用来预测这种不同情况下的效果。它主要用在科学模拟和电子游戏中。
一般,物理引擎只负责物理计算,而不进行画面渲染。
Box2D是一款免费的开源二维物理引擎,由Erin Catto使用C++编写。它已被用于蜡笔物理学、愤怒的小鸟、地狱边境等游戏的开发。
Cocos2d-x本身已经集成box2d。
以上解释来自维基百科。
Box2D中文手册下载地址:/s/1o63MI
Box2D源码下载:/p/box2d/downloads/list
Box2D首页:http://box2d.org/
刚体(body)
在box2d中物体即刚体。
刚体就是坚硬的物体,碰撞不会产生形变。
物体的类型有以下3种:
静态物体:碰撞不会移动。质量为0。如:边界、墙。
动态物体:碰撞会移动。
平台物体:一直保持某一种运动的物体,如电梯会一直保持上下移动。
形状(shape)
依附于刚体的2D碰撞几何结构,形状具有摩擦(friction)和恢复(restitution)的材料性质。
在Box2D中主要有以下两种形状:
一个刚体的形状,可以是由多个形状组合而成。比如:人,头是圆形,手、脚、身体都是矩形。
约束(constraint)
一个约束(constraint)就是消除物体自由度的物理连接。在 2D 中,一个物体有 3 个自由度。如果我们把一个物体钉在墙上(像摆锤那样),那我们就把它约束到了墙上,而且此物体就只能绕着这个钉子旋转,所以这个约束消除了它 2 个自由度。
接触约束(contact constraint)
一个防止刚体穿透,以及用于模拟摩擦(friction)和恢复(restitution)的特殊约束。你永远都不必创建一个接触约束,它们会自动被 Box2D 创建。
关节(joint)
它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等等。关节可以支持限制(limits)和马达(motors)。
关节限制(joint limit)
一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运
关节马达(joint motor)
一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的
夹具(fixture)
刚体物理信息(如:类型、密度系数、摩擦系数)的封装。
一个刚体可以具有多个夹具。
每一个夹具都对应一个形状。
摩擦可以使对象逼真地沿其它对象滑动。Box2D 支持静摩擦和动摩擦,但使用相同的参数。摩擦在Box2D 中会被正确地模拟,并且摩擦力的强度与正交力(称之为库仑摩擦)成正比。摩擦参数经常会设置在 0 到 1 之间,0 意味着没有摩擦,1 会产生强摩擦。
恢复可以使对象弹起,想象一下,在桌面上方丢下一个小球。恢复的值通常设置在 0 到 1 之间,0 的意思是小球不会弹起,这称为非弹性碰撞;1 的意思是小球的速度会得到精确的反射,这称为完全弹性碰撞。
Box2D 可以根据附加形状的质量分配来计算物体的质量以及转动惯量。直接指定物体质量常常会导致不协调的模拟。因此,推荐的方法是使用 b2Body::SetMassFromShape 来根据形状设置质量。
世界(world)
世界就是一个封闭的多边形。一般世界的大小和屏幕的大小一样。处于世界中的物体才会进行计算,这是为了提高效率。
世界也是物体,是形状和约束相互作用的集合。
以上概述来自Box2D中文手册。
在Cocos2d-x中使用Box2D
开发环境说明:
引擎版本:Cocos2d-x2.2.1
开发工具:VS2012
系统:win7
1.启用Box2D:工程上右键——C/C++——预处理器——预处理器定义——编辑——添加宏(CC_ENABLE_BOX2D_INTEGRATION)
注意:Cocos2d-x中集成了Box2D和Chipmunk,但是这两个物理引擎不能同时使用。启用chipmunk的宏定义(CC_ENABLE_CHIPMUNK_INTEGRATION)
2.修改libExternsions项目的预处理指令CC_ENABLE_CHIPMUNK_INTEGRATION为CC_ENABLE_BOX2D_INTEGRATION
3.链接box2d库(libBox2d.lib)
Cocos2d-x2.2.6的一个bug
运行TestCpp中的Box2dTest时,当添加若干个方块后会报如下错误。
Box2D中使用米、千克、秒作单位。但是一般作画面渲染时都是以像素为单位的。
比如,我们在屏幕渲染一个宽为32像素的精灵,但是在物理空间中如何表示它的宽呢?
这时,就需要定义一个缩放因子用于将像素值转换为物理空间的值。
把像素/米比率设置为32是一个比较合适的值,所以定义缩放因子的值为32.
// 定义缩放因子
#define PTM_RATIO 32
创建物理世界
在CCLayer初始化的时候,初始化物理世界。
刚体与CCSprite绑定
Cocos2d-x中已经封装了一个用于物理引擎的CCSprite,就是CCPhysicsSprite,这个类就定义在扩展库中。#include &cocos-ext.h&就可以使用了。通过setB2Body方法与刚体进行关联。
b2Draw定义了用于绘制相关物理信息的接口,只需要实现这些接口。并调用世界(world)的SetDebugDraw方法关联DebugDraw。
DebugDraw在Cocos2d-x中已经有相关实现,就在cocos2d-x-2.2.1\samples\Cpp\TestCpp\Classes\Box2DTestBed目录下的GLES-Render.cpp和GLES-Render.h。
1.把GLES-Render.cpp和GLES-Render.h拷贝到工程Classes目录下。
2.包含头文件。
#ifdef _DEBUG
#include &GLES-Render.h&
3.在创建世界的时候,创建DebugDraw,设置Debug标记并关联到世界。并重写CCLayer的draw方法,绘制调试信息。
4.在析构函数中释放debugDraw占用的内存。
Box2DTest::~Box2DTest(){
CC_SAFE_DELETE(pWorld);
CC_SAFE_DELETE(m_debugDraw);
1.当物体受力的时候(碰撞、挤压或下落),碰撞盒子的颜色会变成粉红色,默认为青色。
2.最外边的是刚体的形状。
注意:建议先把缩放因子的值设置为64,然后再调试,这样便于观察,因为缩放因子为32时,碰撞盒子的大小和精灵的大小一样。
示例工程地址:https://coding.net/u/linchaolong/p/Cocos2d-x_HelloBox2D/git& &
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
Cocos2d-X跨平台游戏开发---学习笔记 第二十六课:Cocos2D-X物理引擎之Box2D11-12 ============================================================================================================================= ...
Cocos2d-X跨平台游戏开发---学习笔记 第二十六课:Cocos2D-X物理引擎之Box2D11-12 ============================================================================================================================= ...
Cocos2d-X跨平台游戏开发---学习笔记 第二十五课:Cocos2D-X物理引擎之Box2D8-10 ============================================================================================================================== ...
Cocos2d-X跨平台游戏开发---学习笔记 第二十四课:Cocos2D-X物理引擎之Box2D1-7 =============================================================================================================================== ...
PhysX物理引擎(编程入门) --PhysX,Hello World!
Author: 华文广
DATE:06/7/20
Hi,大家好,好久没有写过东西了.最近在研究物理引擎,在网上搜索了一下,发现相关的技术文章特别少,于是我心血来潮,决定给有兴趣向这方面发展的朋友写一篇入门教程,希望 ...
碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsContact是碰撞事件监听器.碰撞检测相关的API我们在前面一节介绍过了,下面通过一个实例介绍碰撞检测的实现.这个实例的运行后的场景如图所示,当场景启动后,玩家可 ...
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用.这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行是自由落体运动. HelloPhysicsWorld实例 使用物理引擎的一般步骤,如下图所示. 这个过程与上帝创建世界的过程类似,上帝首先创建了 ...
转自:http://blog.csdn.net/bill_man/article/details/7229747 在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍box2d. Box2D 是用可移植的 C++ 来 ...cocos2d-x(34)
关于cocos2dx 3.3出的physics物理引擎,如果想处理两个body碰撞一般作法都是先设置好各自Body的三个掩码,然后再在游戏场景里注册物理碰撞侦听器,然后调用onContactBegin处理,如下:
void Coin::initBody()
auto phyBody = PhysicsBody::createEdgeBox(getSprite()-&getContentSize());
phyBody-&setCategoryBitmask(1);&
phyBody-&setCollisionBitmask(1); &
phyBody-&setContactTestBitmask(1);
this-&setPhysicsBody(phyBody);
& & & &auto runerBody = PhysicsBody::createBox(bodySize, material);
//设置碰撞检测参数
& & & & runerBody-&setCategoryBitmask(1);
& & & & runerBody-&setCollisionBitmask(1);
runerBody-&setContactTestBitmask(1);
//绑定刚体
this-&setPhysicsBody(runerBody);
然后在游戏场景里注册碰撞侦听器
void PlayScene::onEnter()
Layer::onEnter();
//注册物理碰撞
auto contactListener = EventListenerPhysicsContact::create();
contactListener-&onContactBegin = CC_CALLBACK_1(PlayScene::onContactBegin, this);
_eventDispatcher-&addEventListenerWithSceneGraphPriority(contactListener, this);
然后在onContactBegin里处理碰撞就行了:
bool PlayScene::onContactBegin(cocos2d::PhysicsContact& contact)
auto body_1 = (Sprite*)contact.getShapeA()-&getBody()-&getNode(); //发生碰撞的物体1
auto body_2 = (Sprite*)contact.getShapeB()-&getBody()-&getNode(); //发生碰撞的物体2
//金币消失
if (body_1-&getTag() == coinTag){
body_1-&setVisible(false);
if (body_2-&getTag() == coinTag){
body_2-&setVisible(false);
看上去很简单,但是那三个掩码:
setCategoryBitmask,setCollisionBitmask,setContactTestBitmask是什么意思呢?看了官方的文档,注释,还有不知其数的介绍物理引擎大神的文章,还是一头雾水不知所以。一般为了省事,都把这三个掩码设为1,这样不论什么物体都会发生碰撞,也能响应处理函数,但是这样做真的好吗?所谓不求甚解只求洒脱可能就是这个意思,但这可不是什么好的治学态度,也正是国人从古到今这个态度造就了我国自古以来就诞生不了科学这种奇葩景象还不以为耻反以为荣到现在沦落为到处抱别人大腿求施舍的窘境...
CategoryBitmask好理解,表示一个物体所属哪个类别
可是CollisionBitmask和ContactTestBitmask就不好理解了,官方文档解释为前者与category掩码相与是否为1表示是否能发生碰撞,contactTest掩码与category掩码相于是否为1决定了是与能产生碰撞响应.... 这是什么话,我翻来覆去怎么看都觉得说了半天都是一个意思嘛!都是是否能产生碰撞响应。到底有什么区别呢?
后来经过我不断的尝试修改,终于搞明白两者含义的区别:
setCategoryBitmask,setCollisionBitmask决定了是否能产生碰撞。产生碰撞和发生碰撞响应是不同的概念。如人物奔跑时碰到了金币,这里如果没有碰撞处理函数,且把什么掩码都设为1,那么你会发现角色碰到金币时角色不再向前移动了,金币成了一个挡在路上的砖块,这时已经发生了碰撞 了,但如果你把人的类别设为1,金币的类别设为0,而两者的CollisionBitmask都为1,则金币和人的CategoryBitmask和CollisionBitmask掩码相与为0,则不会发生碰撞,在游戏里效果就是人奔跑时穿过了金币,金币就像空气一样,这就是没有发生碰撞的含义。
那么ContactTestBitmask呢,这个参数决定了是否能触发碰撞响应函数onContactBegin. 有些碰撞我们是不想处理的,如人物从空中落到一块大石头上,落到石头上只须停在石头上就行了,不需要做什么特殊的处理,这时你只需要将地面的类别设为0,人的类别设为1,ContactTestBitmask都设为1,这样相与的结果为0,就不会触发onContactBegin函数。那你该问了,你不处理那人怎么会停在石头上而不掉下去?不用担心,这是物理引擎的事,也正是物理引擎的强大之处,我们只要设置了刚体body就可以很轻松的写出一个像超级马里奥那种平台跳跃游戏也不需要判断马里奥脚上是否踩到地啦?跳的时候是不是头顶到地板啦?这种种复杂的情况,一个精灵设置了body,它就是一个硬硬的砖头,你只要掩码设好无论如何也穿不过去的。回到刚才人碰到金币的例子,如金币这种我们希望人碰到金币就Money
+ 1,并且金币消失,那么,就把金币和人的不论类别掩码还是ContactTest掩码都设为1,这样就瞎猫碰到死耗子一样触发了碰撞响应函数,在响应函数里再设置人的money++并且金币消失,也就达到了我们的效果
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:31619次
排名:千里之外
原创:42篇
(3)(2)(2)(1)(1)(1)(1)(2)(1)(2)(3)(3)(2)(1)(3)(1)(2)(1)(2)(5)(3)(1)(2)(1)

我要回帖

更多关于 cocos引擎下载 的文章

 

随机推荐