- 浏览: 28727 次
- 性别:
- 来自: 北京
最新评论
-
max_eye:
archy123 写道max_eye 写道期待楼主继续更新,我 ...
libgdx学习笔记系列(九)了解物理引擎box2D -
archy123:
max_eye 写道期待楼主继续更新,我也是刚学习libgdx ...
libgdx学习笔记系列(九)了解物理引擎box2D -
max_eye:
期待楼主继续更新,我也是刚学习libgdx.觉得你谢的挺不错的 ...
libgdx学习笔记系列(九)了解物理引擎box2D
在开始地图之前,先了解下地图的概念。
大家都见过瓷砖吧,有的墙上用瓷砖拼出一幅画,这就是我们地图的概念。用小图拼出大图。
但是这个地图跟拼瓷砖不同的一点是,瓷砖一般就一层,但是地图可以铺多层。
层的概念我们用俩个透明玻璃来形容一下。例如背景图一层,然后物体等等又一层,在一块玻璃上画上蓝天白云,另外一块只画个小兔子。两块叠加。一幅画成了。只不过这幅画是两部分组成的
这里背景图只是为了好看,就跟我们平常看到的游戏背景一样,没有任何作用,就是为了好看。然后另外的那层放物体的则是为了游戏中的交互。
例如:天天酷跑,酷跑中的障碍物等等就算第二层了。
接下来我们看下地图编辑软件的使用。对于我这种不会美工的,这也算是不错的工具了。
但是画出图实在是拿不出手,只好网上找个图片凑合用下(图片资源来自于互联网,仅供学习使用,请勿用作商业用途,否则后果自负。)
官方介绍了两种工具
第一种:http://www.mapeditor.org/ 就是上面的那张图的样子。
第二种:http://tide.codeplex.com/
第一种工具可以跨平台使用,什么Windows/Linux/Mac OS X统统支持。
第二种就只能在windows平台使用了。
具体用那种看自己需要了。这里为了跨平台,我使用第一种工具简单演示下。
新建一个由20*10块组成的地图,每块像素10*10 用10*10像素是为了方便计算,一会说计算的事情
然后选择地图-新图块
好了,开始玩拼图游戏吧,在右边选择图块范围,然后放到地图上吧,因为我使用的是整张图片,(自己画的实在是惨不忍睹),直接都拖过来
接下来说说计算的事情。如果想要让图片高度正好填满屏幕,我们来计算下。
我设定的世界高度为6f,地图大小为10像素*10个=100。怎么变成6f,100*x=6 x=0.06
也就是说需要缩小。倍率为0.06。一会显示地图的时候我们需要这个数字。
接下来看看生成的地图文件 map.tmx
需要注意的就是
这个图片就是刚才我们选用的地图块的时候,选择的图片。需要拷贝到assets目录下。具体路径是和map.tmx的位置有关。
看下我的路径地址:
我放到了map目录下的又一级map目录下。map.tmx文件在它的上一级,所以,文件中的地址就是
注意下这个就可以了,一般生成的地图文件都需要修改下。还有图层的名称等,为了不给自己找麻烦就别用中文了。
然后看看如何加载。一种是直接加载,一种是使用资源管理器。
直接加载很简单:
这里为了显得咱专业,使用资源管理器进行加载,记得前面介绍的资源管理器吧。
把它加到资源列表就行了。
很简单不是,然后使用的时候直接get就可以了
如何显示地图呢。先来个地图的渲染
初始化它,这里我们使用正交
看到0.06f了吧,这里我们在渲染的时候缩小它匹配屏幕。
然后显示地图
this.camera。前几篇提到的正交相机。
效果
但是这样跑动还是没有人物移动地图倒退的感觉。前面也说过相机来实现地图,演员的移动,缩放等。现在我们试试
修改GirlView类
大家都见过瓷砖吧,有的墙上用瓷砖拼出一幅画,这就是我们地图的概念。用小图拼出大图。
但是这个地图跟拼瓷砖不同的一点是,瓷砖一般就一层,但是地图可以铺多层。
层的概念我们用俩个透明玻璃来形容一下。例如背景图一层,然后物体等等又一层,在一块玻璃上画上蓝天白云,另外一块只画个小兔子。两块叠加。一幅画成了。只不过这幅画是两部分组成的
这里背景图只是为了好看,就跟我们平常看到的游戏背景一样,没有任何作用,就是为了好看。然后另外的那层放物体的则是为了游戏中的交互。
例如:天天酷跑,酷跑中的障碍物等等就算第二层了。
接下来我们看下地图编辑软件的使用。对于我这种不会美工的,这也算是不错的工具了。
但是画出图实在是拿不出手,只好网上找个图片凑合用下(图片资源来自于互联网,仅供学习使用,请勿用作商业用途,否则后果自负。)
官方介绍了两种工具
第一种:http://www.mapeditor.org/ 就是上面的那张图的样子。
第二种:http://tide.codeplex.com/
第一种工具可以跨平台使用,什么Windows/Linux/Mac OS X统统支持。
第二种就只能在windows平台使用了。
具体用那种看自己需要了。这里为了跨平台,我使用第一种工具简单演示下。
新建一个由20*10块组成的地图,每块像素10*10 用10*10像素是为了方便计算,一会说计算的事情
然后选择地图-新图块
好了,开始玩拼图游戏吧,在右边选择图块范围,然后放到地图上吧,因为我使用的是整张图片,(自己画的实在是惨不忍睹),直接都拖过来
接下来说说计算的事情。如果想要让图片高度正好填满屏幕,我们来计算下。
我设定的世界高度为6f,地图大小为10像素*10个=100。怎么变成6f,100*x=6 x=0.06
也就是说需要缩小。倍率为0.06。一会显示地图的时候我们需要这个数字。
接下来看看生成的地图文件 map.tmx
<?xml version="1.0" encoding="UTF-8"?> <map version="1.0" orientation="orthogonal" width="20" height="10" tilewidth="10" tileheight="10"> <tileset firstgid="1" name="background" tilewidth="10" tileheight="10"> <image source="map/map1_wall.png" width="480" height="104"/> </tileset> <layer name="layer1" width="20" height="10"> <data encoding="base64" compression="zlib"> 具体base64内容我删除掉了,太多了 </data> </layer> </map>
需要注意的就是
<image source="map/map1_wall.png"
这个图片就是刚才我们选用的地图块的时候,选择的图片。需要拷贝到assets目录下。具体路径是和map.tmx的位置有关。
看下我的路径地址:
我放到了map目录下的又一级map目录下。map.tmx文件在它的上一级,所以,文件中的地址就是
map/map1_wall.png
注意下这个就可以了,一般生成的地图文件都需要修改下。还有图层的名称等,为了不给自己找麻烦就别用中文了。
然后看看如何加载。一种是直接加载,一种是使用资源管理器。
直接加载很简单:
TiledMap map = new TmxMapLoader().load("data/map/map.tmx");
这里为了显得咱专业,使用资源管理器进行加载,记得前面介绍的资源管理器吧。
把它加到资源列表就行了。
assetManager.setLoader(TiledMap.class, new TmxMapLoader(new InternalFileHandleResolver())); assetManager.load("data/map/map.tmx", TiledMap.class);
很简单不是,然后使用的时候直接get就可以了
TiledMap map = assetManager.get("data/map/map.tmx", TiledMap.class);
如何显示地图呢。先来个地图的渲染
private TiledMapRenderer tiledMapRenderer;
初始化它,这里我们使用正交
tiledMapRenderer = new OrthogonalTiledMapRenderer(map, 0.06f, spriteBatch);
看到0.06f了吧,这里我们在渲染的时候缩小它匹配屏幕。
然后显示地图
tiledMapRenderer.setView(this.camera); tiledMapRenderer.render();
this.camera。前几篇提到的正交相机。
效果
但是这样跑动还是没有人物移动地图倒退的感觉。前面也说过相机来实现地图,演员的移动,缩放等。现在我们试试
修改GirlView类
package com.me.mygdxgame.view; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TiledMapRenderer; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Disposable; import com.me.mygdxgame.actor.GirlActor; import com.me.mygdxgame.actor.World; /** * view层 * 主要负责渲染场景,演员和资源加载 */ public class GirlView implements Disposable { private GirlActor girlsActor; //资源管理器专门用来管理资源加载 private AssetManager assetManager; private SpriteBatch spriteBatch; private TextureAtlas textureAtlas; private TextureRegion[] girlRunFrameLeft; private TextureRegion[] girlRunFrameRight; private Animation animationRight; private Animation animationLeft; private TextureRegion currentFrame; private boolean isload; private OrthographicCamera camera; private World world; private TiledMap map; private TiledMapRenderer tiledMapRenderer; /** * 构造方法 初始化相关的参数。加载演员资源 * * @param world 游戏世界 */ public GirlView(World world) { this.world = world; assetManager = new AssetManager(); assetManager.load("data/image/girlRun.atlas", TextureAtlas.class); assetManager.setLoader(TiledMap.class, new TmxMapLoader(new InternalFileHandleResolver())); assetManager.load("data/map/map.tmx", TiledMap.class); girlsActor = world.getGirlActor("girl"); spriteBatch = new SpriteBatch(); currentFrame = new TextureRegion(); girlRunFrameLeft = new TextureRegion[16]; girlRunFrameRight = new TextureRegion[16]; this.camera = new OrthographicCamera(world.getWorldWidth(), world.getWorldHeight()); this.camera.position.set(world.getWorldWidth() / 2, world.getWorldHeight() / 2, 0); isload = false; } /** * 演员资源加载 */ private void loadAssets() { //使用资源管理器加载图片纹理资源 textureAtlas = assetManager.get("data/image/girlRun.atlas", TextureAtlas.class); map = assetManager.get("data/map/map.tmx", TiledMap.class); //面朝右边跑动的纹理资源 for (int i = 0; i < 16; i++) { girlRunFrameRight[i] = textureAtlas.findRegion(String.valueOf(i + 1)); } //面朝右边跑动的纹理资源 for (int i = 0; i < 16; i++) { girlRunFrameLeft[i] = new TextureRegion(girlRunFrameRight[i]); //把图片进行反转,第一个是x,第二个是y,我们只进行x方向上的反转,如果进行y反转,人物就倒立了。 girlRunFrameLeft[i].flip(true, false); } //演员左右跑动的动画 animationLeft = new Animation(0.06f, girlRunFrameLeft); animationRight = new Animation(0.06f, girlRunFrameRight); tiledMapRenderer = new OrthogonalTiledMapRenderer(map, 0.06f, spriteBatch); isload = true; } /** * 演员显示 */ public void render(float deltaTime) { camera.update(); //演员走到正中间的时候移动正交相机 //往回走的时候重置正交相机位置 if (girlsActor.getPosition().x > world.getWorldWidth() / 2 - girlsActor.getBounds().getWidth() / 2) { this.camera.translate(new Vector2(girlsActor.getVelocity().cpy().x * deltaTime, 0)); } else if (girlsActor.getPosition().x < world.getWorldWidth() / 2 - girlsActor.getBounds().getWidth() / 2) { this.camera.position.set(world.getWorldWidth() / 2, world.getWorldHeight() / 2, 0); } if (assetManager.update()) { if (!isload) { loadAssets(); } spriteBatch.setProjectionMatrix(this.camera.combined); drawMap(); spriteBatch.begin(); drawGirl(); spriteBatch.end(); } } /** * Girl的渲染逻辑 */ private void drawGirl() { //获取演员的当前状态,是站立还是跑动状态 switch (girlsActor.getState()) { //站立状态 case IDLE: //根据演员的当前面朝方向获取演员的纹理。因为图片中没有站立的,所以我们取第一个为站立图片使用 currentFrame = girlsActor.isFacingRight() ? girlRunFrameRight[0] : girlRunFrameLeft[0]; break; //跑动状态,当然是获取跑动动画了 case RUNING: currentFrame = girlsActor.isFacingRight() ? animationRight.getKeyFrame(girlsActor.getStateTime(), true) : animationLeft.getKeyFrame(girlsActor.getStateTime(), true); break; default: break; } spriteBatch.draw(currentFrame , girlsActor.getPosition().x , girlsActor.getPosition().y , girlsActor.getBounds().getWidth() , girlsActor.getBounds().getHeight()); } /** * 地图渲染 */ private void drawMap() { tiledMapRenderer.setView(this.camera); tiledMapRenderer.render(); } /** * 资源回收 */ @Override public void dispose() { map.dispose(); assetManager.dispose(); textureAtlas.dispose(); spriteBatch.dispose(); } }
发表评论
-
libgdx学习笔记系列(十)libgdx1.0版的flappybird实现
2014-04-24 10:00 01.0变化较大,特别说明下。 1.0以后版本使用的是Grad ... -
libgdx学习笔记系列(九)了解物理引擎box2D
2014-04-10 12:45 5283注意:在1.0正式版中box2d被作为一个扩展独立了出来。因为 ... -
libgdx学习笔记系列(七)控制演员的动作(二)
2014-03-26 16:55 2784昨天在编译以前的代码的时候发现Stage类发生了变化,编译出错 ... -
libgdx学习笔记系列(六)控制演员的动作(一)
2014-03-25 11:14 2181看下如何使用MVC中的控制层来控制演员的动作。 首先需要修改下 ... -
libgdx学习笔记系列(四) Action动作及游戏开发的“MVC”
2014-03-19 16:16 1963这篇笔记少写点。 因为学习到现在我发现了一个重要的问题。 问题 ... -
libgdx学习笔记系列(五)游戏的MVC结构
2014-03-21 16:29 2972先看看游戏的mvc结构 ... -
libgdx学习笔记系列(三)会动的小人
2014-03-18 09:51 3270(重要提示:Stage类在3.19号被作者更新后初始化方法已经 ... -
libgdx学习笔记系列(二)hello libgdx 文字工具类的使用
2014-03-14 15:11 3541今天了解了下项目 ... -
libgdx学习笔记系列(一)初识libgdx
2014-03-13 16:50 2254注意:1.0正式版中,项 ...
相关推荐
加载TiledMap后,我们可以选择合适的TileMapRenderer(如OrthogonalTiledMapRenderer或IsometricTiledMapRenderer)来渲染地图。对于斜45°地图,我们将使用OrthogonalTiledMapRenderer,并通过调整其参数使其呈现45...
Tiled是一款免费且易于使用的2D地图编辑器,它允许设计师绘制各种层(如背景、地形、对象等)并保存为TMX文件,这些文件随后可以在Libgdx游戏中加载和渲染。 2. **Map Rendering**:在Libgdx中,我们使用`...
你可以加载`.png`或`.jpg`格式的纹理,并使用`SpriteBatch`绘制精灵。 2. **声音与音乐**:LibGDX提供`Sound`和`Music`类来播放音频。 3. **物理引擎**:如果你的游戏需要物理效果,可以使用LibGDX的Box2D扩展。 ...
LibGDX 提供了TiledMap类,使开发者能够方便地创建、加载和渲染游戏地图。 **1. Tiled Map Editor** 首先,我们需要一个工具来设计地图。Tiled Map Editor是一款流行的免费工具,它可以用来创建Tiled Maps,这些...
本文将深入探讨 libGDX 中的“资源加载器”这一关键概念。 资源加载器,通常指的是 libGDX 中的 `AssetManager` 类,它是 libGDX 用来管理游戏或应用中各种资源的核心组件。资源可以包括音频文件(如音乐和音效)、...
- 社区提供了许多第三方库,如Ashley(实体系统)、TiledMap(地图编辑器支持)和Hiero(位图字体生成器)等,进一步扩展了LibGDX的功能。 这个“libgdx学习资料”压缩包可能包含了上述领域的教程、示例代码、API...
本篇文章将深入探讨如何使用libGDX来绘制优美的字体。 libGDX 提供了一个名为 `BitmapFont` 的类,用于处理和渲染文本。它允许开发者加载TrueType字体(TTF)文件,并自定义其大小、颜色、阴影等属性,从而创建出...
LibGDX主要通过`BitmapFont`类来处理文本渲染,这个类可以加载并绘制各种字体,包括系统字体和自定义字体文件(如.fnt格式)。对于中文字符的支持,我们需要一个包含中文字符的字体文件。通常,我们可以使用工具如...
能够生成LibGDX项目,且支持发布到桌面,Android,iOS和HTML5
在"Libgdx专题系列 第一篇 第七节"中,我们将深入探讨Libgdx中的文本渲染和处理技术。 首先,让我们了解一下Libgdx中的文本渲染基础。Libgdx提供了`BitmapFont`类来处理游戏中的文本显示。`BitmapFont`是基于位图的...
通过学习和实践这个"Libgdx专题系列 UI篇",你将掌握如何利用TWL库和TableLayout在Libgdx中创建出高效、美观的用户界面,为你的游戏或应用增添更多互动性和吸引力。记得不断尝试和迭代,让UI设计适应你的项目需求,...
5. **整合到游戏中**:在LibGdx游戏中,你可以使用`TextureAtlas`类加载这些纹理atlases,然后在渲染时通过`TiledMapRenderer`来绘制地图,这样可以高效地显示和处理地图资源。 TiledMapPacker的使用能够显著提升...
下载后将libs中的gdx.jar,gdx-backend-android.jar,spine-libgdx.jar包放入androidstudio或elipse的libs下,将armeabi中的so放入jini目录下.支持使用libgdx使用spinne。
### libgdx学习文档知识点详解 #### 一、libgdx概述 libgdx是一款功能强大的跨平台游戏开发框架,支持2D与3D游戏的创建。它旨在为开发者提供一套全面的API,覆盖从图形渲染到物理模拟的广泛领域。libgdx的亮点在于...
本专题系列将深入探讨Libgdx的使用方法,帮助你掌握这个工具并开始你的游戏开发之旅。 在“Libgdx专题系列第一篇 第一节”中,我们将着重介绍Libgdx的基础知识和环境搭建。首先,你需要下载并安装Java Development ...
总的来说,这些示例代码提供了从基础到进阶的Libgdx图形图像绘制实践,通过学习和理解这些代码,开发者可以更好地掌握Libgdx游戏开发,创造出丰富多样的游戏体验。对于想要深入学习Libgdx的人来说,这是一个很好的...
libGDX学习记录(一)源码,搭建一个桌面端和android端的libGDX框架,展示图片。 详细地址:https://blog.csdn.net/weixin_47450795/article/details/110003413
在标题"Libgdx异步加载图片到本地"中,主要涉及到的技术点是异步加载和图片的本地存储。 异步加载是一种优化性能的方法,它允许应用程序在后台线程中执行耗时操作,如下载或解压缩资源,而不阻塞主线程。在Libgdx中...
通常,这需要使用第三方库,如`tritao-gif`或者`libgdx-gif`,这些库将GIF数据解析为一系列的帧,然后可以被LibGDX的`Animation`类使用。`Animation`类是LibGDX中用于管理序列帧动画的关键组件,它可以处理帧间隔...