Android游戏开发(2):搭建libgdx游戏引擎

发表于2017-09-13
评论0 3.4k浏览

本篇是Android游戏开发系列的第二篇文章,这篇文章会给大家介绍下如何搭建libgdx游戏引擎。

libgdx简介

libgdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C 语言编写而成。它基于Apache License, Version 2.0协议,对商业使用和非商业使用均免费。

libgdx兼容Windows、Linux、Max OS X、Java Applet、Javascript/WebGL与Android[4](1.5版本 )平台。对于Android平台的支持在Android阵营和相关市场日益扩大的情况下libgdx的使用者越来越多。另外,基于MonoTouch,可以实现IOS兼容。


官方网站:http://libgdx.badlogicgames.com/


搭建开发环境

操作系统:Opensuse12.2  

开始前请确保配置好android开发环境。jdk最好用1.6的,官网说1.7会有bug。


1)下载libgdx-http://libgdx.badlogicgames.com/download.html

选择Release Builds。





下载好之后解压文件,就像这样:


2)自动生产开发工程

包中自带的gdx-setup-ui可以用来自动生成项目工程,免去了繁琐的初始化配置过程。

终端进入到解压后的文件夹,运行

[plain] view plain copy
  1. java -jar gdx-setup-ui.jar   

利用工具创建工程,参数如下:



注意左下角要选定Generate the desktop project,方便开发调试。

中间的libGDX要是绿色的才能生成项目,红色的话点击文件夹小图标定位到之前下载好的zip文件。

最后点击偶下角的Open the generation screen->launch



在当前文件夹下面会生产三个对应的目录,如图:



3)导入工程

在eclipse中首先导入游戏工程和desktop工程。

File->import


选中刚才创建好的test-gdx-game文件夹->finish。

同样的方法导入test-gdx-game-desktop。

接下来导入android工程。

eclipse下面Ctrl n - >Android project from exiting project->选中test-gdx-game-android->finish.

三个工程导入完成后,还需要修改一些地方。

由于我们创建项目的时候是同时创建了android版本和desktop版本,gamecode 其实都在test-gdx-game中,而资源文件其实都放在了android项目中asset文件夹中。

直接运行desktop项目会报错,提示找不到资源文件。这里需要在desktop项目中添加一个链接。

右击test-gdx-game-desktop->project -> Properties -> Java Build Path -> Source tab -> Link Source… -> Browse… -> 定位到 test-gdx-game-android project 的assert文件夹,点 Finish。

工程就算建立完成了。

desktop和android都可以直接运行,调用的是test-gdx-game中的代码。

各自的运行结果如下:





项目解析

为了初始化Application必须实现ApplicationListener这个接口, 它用来更新游戏状态(即逻辑),渲染出项,暂停游戏,保存状态,释放资源等。
它也有一个处理Application 声明周期事件的地方。每个应用,不管后台平台版本都必须实现ApplicationListener 接口。所有平台都会存在并要实现这个接口。

看一下项目代码:

[java] view plain copy
  1. package com.me.testgdxgame;  
  2.   
  3. import com.badlogic.gdx.ApplicationListener;  
  4. import com.badlogic.gdx.Gdx;  
  5. import com.badlogic.gdx.graphics.GL10;  
  6. import com.badlogic.gdx.graphics.OrthographicCamera;  
  7. import com.badlogic.gdx.graphics.Texture;  
  8. import com.badlogic.gdx.graphics.Texture.TextureFilter;  
  9. import com.badlogic.gdx.graphics.g2d.Sprite;  
  10. import com.badlogic.gdx.graphics.g2d.SpriteBatch;  
  11. import com.badlogic.gdx.graphics.g2d.TextureRegion;  
  12.   
  13. public class TestGdxGame implements ApplicationListener {  
  14.     private OrthographicCamera camera;  
  15.     private SpriteBatch batch;  
  16.     private Texture texture;  
  17.     private Sprite sprite;  
  18.       
  19.     @Override  
  20.     public void create() {        
  21.         float w = Gdx.graphics.getWidth();  
  22.         float h = Gdx.graphics.getHeight();  
  23.           
  24.         camera = new OrthographicCamera(1, h/w);  
  25.         batch = new SpriteBatch();  
  26.           
  27.         texture = new Texture(Gdx.files.internal("data/libgdx.png"));  
  28.         texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);  
  29.           
  30.         TextureRegion region = new TextureRegion(texture, 00512275);  
  31.           
  32.         sprite = new Sprite(region);  
  33.         sprite.setSize(0.9f, 0.9f * sprite.getHeight() / sprite.getWidth());  
  34.         sprite.setOrigin(sprite.getWidth()/2, sprite.getHeight()/2);  
  35.         sprite.setPosition(-sprite.getWidth()/2, -sprite.getHeight()/2);  
  36.     }  
  37.   
  38.     @Override  
  39.     public void dispose() {  
  40.         batch.dispose();  
  41.         texture.dispose();  
  42.     }  
  43.   
  44.     @Override  
  45.     public void render() {        
  46.         Gdx.gl.glClearColor(1111);  
  47.         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);  
  48.           
  49.         batch.setProjectionMatrix(camera.combined);  
  50.         batch.begin();  
  51.         sprite.draw(batch);  
  52.         batch.end();  
  53.     }  
  54.   
  55.     @Override  
  56.     public void resize(int width, int height) {  
  57.     }  
  58.   
  59.     @Override  
  60.     public void pause() {  
  61.     }  
  62.   
  63.     @Override  
  64.     public void resume() {  
  65.     }  
  66. }  

生命周期如下:




几个重要的方法:

create() : 当应用程序创建时,此方法被调用一次。

resize(int width,int,height): 每次游戏屏幕重置并且不是暂停状态的时候调用此方法。在create()后调用一次。参数是屏幕被重置后的新狂读和高度。

render(): 每次渲染发生时游戏循环调用此方法。游戏更新发生在绘制之前。意思就是说先处理逻辑再处理绘制。

pause(): 在应用destroyed()前调用此方法。在android中Home键按下或者重新进入程序时调用。这是一个保存游戏状态的好地方,在android中的resume不一定会调用。

resuem(): 这个方法爱尽在android中调用,当应用获得焦点时,桌面应用中将不会调用此方法。

dispose(): 当应用destroyed时,调用此方法,在pause()之后。


http://blog.csdn.net/silangquan/article/details/8830608

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论