libgdx学习记录18——Box2d物理引擎】的更多相关文章

libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创建正交相机,并设置其宽高.Box2d中使用物理世界中米作为单位,而不是图像中的像素,通常设一个比值,这里为了方便,直接设置为10. 3. 创建世界中的动态物体(一般是方块.圆环或其他形状物体)和静态物体(主要指地面.墙壁等). 4. 在渲染函数中添加world时间布,并利用DebugRenderer…
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Box2d内置的积分器实现运动变化. 冲量是一个瞬时效果,能立马改变其效果. 主要函数: body.applyLinearImpulse( Vector2 impulse, Vector2 position, boolean wakeup ) 第一个参数表示冲量,包含x和y方向的大小. 第二个参数表示施…
Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九,学习BOX2D物理引擎! 学习路径图: 课程适合小白系统学习,仅需6个课时,在极客学院首席讲师风趣幽默的课程里轻松掌握BOX2D物理引擎.恭喜你也从此将走上为牛X程序员的不归路. 今年上午9点正式上线,请别再期待娱乐圈的新闻了,马上開始学习吧>>> 我们还有很多其它更新更实战的课程,登录极客…
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们学习了Box2d物理引擎的三大模块之中的一个的collision模块,该模块主要包括形状shape,碰撞函数和动态树等概念. 这次蛤蟆接着学习dynamics模块. 理论介绍 Dynamics模块是Box2d引擎中最复杂的,也是基本上我们打交道最多的模块了.该模块建立在common和collisio…
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::addNewSpriteAtPosition(Vec2 p) { log("Add sprite %0.2f x %02.f",p.x,p.y); //创建物理引擎精灵对象A auto spriteA = Sprite::create("BoxA2.png");       …
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体开始接触时会响应,但只调用一次.virtual void EndContact(b2Contact* contact).分离时响应.但只调用一次.virtual void PreSolve(b2Contact* contact, const b2Ma…
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行自由落体运动. HelloBox2D实例 使用Box2D引擎进行开发过程,如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件,它的代码如下: #ifndef __HELLOWORLD_SCENE_H__ #d…
在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引擎的时候,大多数开发者会选择Box2D.Box2D是一款用来模拟刚体在物理世界运动的仿真引擎.通过Box2D物理引擎,世界中的物体就可以按照运动定律进行运动. 注:Box2D下的类都是以b2为前缀的,希望不要与你的命名相冲突 1. 首先我们介绍下需要用到的基本概念. 世界(world) :世界代表了…
/******************************* I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客.向大家表示道歉 *******************************/ 前言 Box2d物理引擎 Box2d是一款开源的2d物理引擎,存在很多的版本,C++,Java,html5和python等等 著名的愤怒的小鸟就是使用了这款物理引擎进行开发的 目前也有很多的2d游戏引擎内置了对Box2d物理引擎的支持,比如cocos2d,…
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const…
1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向. word = new b2World(b2Vec2(0,-10));                        //指定物理世界的加速度 最后还要重写一下update函数.这个函数在之前的计时器学习的时候已经说过.每一帧的变动都将自己主动运行这个函数.所以我们要通过这个函数来进行创建的物理世界的刷新. 2.创建一个运动的…
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.为每个游戏使用物理引擎并不是完全必要的—简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现.然而,当游戏需要比较复杂的物体碰撞.滚动.滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了.那么着时候使用物理系统可以为游戏带来一些很明显的优点: 1)更加真实的对现实世界的模拟,以牛顿力学为基础的游戏效果. a) 游戏中的精灵们运动起来更真实:相互碰撞,自由下落等各种效果更…
libgdx动画采用Animation实现,即通过帧动画实现. 代码如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.…
前面讲到使用Hireo创建的BitmapFont以显示中文字体.这种方式效率很高,当所要显示的字的总数较少,并且大小比较固定时,可以采用这种方式. 但是这种也有弊端: (1)字体大小不能随意设置,当放大时就会变形. (2)当所要显示的字总数较多或者经常变化时,会很麻烦. libgdx对中文的支持不太好,也是很多人转向其他引擎的一个原因.幸好,其扩展模块中的FreeType能够通过ttf字体来实现随意中文显示. FreeType是libgdx的扩展模块,创建项目时需要添加对应的jar包和对应的动态…
libgdx总的来说是一个框架,而不是一个成熟的游戏引擎.Stage是其中一个比较好的封装,里面自带Camera.SpriteBatch等常用渲染绘图工具. 下面是一个简单的添加图片,并让镜头左右上下移动以显示整副图片的例子. package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10;…
libgdx对中文支持不是太好,主要通过Hireo和ttf字库两种方式实现.本文简单介绍最基本的bitmapfont的用法. 代码如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.g2d.BitmapF…
libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟. Polygon内部自带是否包含点contains这个函数,通过这个函数我们可以判断两个多变行是否碰撞,即检测两个多边形的每个点是否在另一个多边形中. 检测代码: public static boolean isOverlap(Polygon polygon1, Polygon polygon2){ for(int…
前面两章我们已经研究了如何使用Box2d来模拟游戏世界,这一章就把所有的东西拼凑在一起,最终完成我们的游戏. 一.定义物体 典型的物体: {type:'ground',name:'dirt',x:500,y:440,width:1000,height:20,isStatic:true}, {type:'ground',name:'wood',x:185,y:390,width:30,height:80,isStatic:true}, 典型的物体类型: 'glass':{ fullHealth:1…
libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为67,并设置其位置.观看点.近距离和远距离. 2. 创建模型创建器,并创建出一个物体模型.之后通过模型创建出对应的实例. 3. 创建环境和相机控制器. 4. render函数中进行渲染绘制. 具体实例: package com.fxb.newtest; import com.badlogic.gdx…
在libgdx中,一般的逻辑流程都在rende()函数中执行,这个函数是由opengl的渲染线程调用的,一般的图形显示和逻辑处理都在这个线程中. 一般情形下,在这个线程中处理就行了.但是当某些逻辑处理比较费时,可能会引起画面卡顿.不连贯等现象.这时,可以将主要的逻辑处理放在另一个线程中,然后再即将进行图形渲染时再将其传送到render线程中执行. 回传采用Gdx.app.postRunnable()函数,该函数调用后,回传的那部分代码会在下一次render()函数调用之前执行. 具体实例: pa…
libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm…
照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. Camera分为PerspectiveCamera(远景照相机)和OrthographicCamera(正交照相机). PerspectiveCamera为正常的照相机,当距离物体越远,则物体越小,一般在3D空间中使用. OrthographicCamera忽略了其Z轴,不管距离物体多远,其大小始终不…
AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. 大多数资源加载器AssetLoader都是异步加载,可以避免阻塞渲染线程. 2. 通过引用计数来进行释放资源. 3. 通过一个对象来管理所有其他资源. 主要函数: load(path,type)加载某个路径的资源文件,后面type指定所要加载的资源类型.这个函数只是将资源文件加入到资源队列中,并不会…
在游戏过程过程中,常常需要对某些数据进行保存,以确保下次运行时能够正确读取.如游戏中的金币.道具.游戏分数.已通过的关卡等. Libgdx中常用的数据保存方式有Preferences和XmlReader. 1. Perferences Preferences常用来保存一些较短的.使用较频繁的值. put存入值,存完之后需要flush. 实例: Preferences preferences = Gdx.app.getPreferences( "pre1.test" ); prefere…
libgdx提供了ShapeRenderer这个工具,用它可以画点.画线.画圆.画矩形.画椭圆.画扇形,但是没有提供画圆角矩形的方法. 刚开始自己尝试分成8端,4端画直线,4端画扇形,发现多了半径几部分,于是又改成全部画线. 4端弧采用逐个描点实现. 具体代码: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.…
地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机OthographicCamera和正交地图渲染器OrthogonalTiledMapRenderer来进行显示. 实例如下: package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.g…
libgdx中的UI设计主要通过其对应的Style类进行实现,也可以通过skin实现.如果没有编辑好的skin文件,可以创建一个默认的skin,再添加已经设计好的style类即可,然后在需要使用的地方直接调用skin会更加方便. 本文主要简单介绍Label和TextButton这两种比较常见的UI组件,代码如下. package com.fxb.newtest; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gd…
libgdx中的Action类能够有效的帮助我们实现位移.旋转.缩放.淡入淡出等效果,对游戏的设计很有用. Action是一个抽象类,本身不可以实例化.一般使用的它的继承类,常用的有 MoveToAction.MoveByAction.RotateToAction.RotateByAction.ScaleToAction.ScaleByAction.FadeInAction.FadeOutAction等. 如果要定义自己的Acion则需要重写其抽象方法act. 例如: Action action…
Actor也是libgdx中非常重要的一个元素,一般与stage配合一起使用.Actor能够设置大小,位置,旋转和动画等. 我们自定义的Actor一般需要继承于Actor,并且重写其中的act和draw方法. 自定义的actor是一个图片. class MyActor extends Actor{ TextureRegion region; public MyActor(){ Texture texture = new Texture( Gdx.files.internal( "data/bad…
libgdx底层采用opengl渲染,对图片进行了优化处理,与android原生态的bitmap不太一样. 相比而言,效率要高一些,不过只支持png,jpg,bmp三种格式. 显示中,一般将图片放在assets文件下,表示是Gdx的内部文件. gl1.x使用的图片的宽高必须是2的整次幂,而在gl2.0以后的版本则没有此限制. 使用的版本为libgx 0.9.9. 代码如下: package com.fxb.bird; import com.badlogic.gdx.ApplicationAdap…