libgdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。ibgdx兼容大多数微机平台(标准JavaSE实现,能运行在Mac、Linux、Windows等系统,最近加入了对html5的支持)与Android平台(Android1.5以上即可使用,Android2.1以上可满功率发挥)。Libgdx以native方式自带图像解码器,通过其提供的Pixmap可以对指定图像进行像素级渲染操作,从而不依赖Android的Bitmap加载处理图像,可以支持png、jpg、bmp,最近的两个版本中加入了对gif图片的支持(如果要做大量动画的话,gif图片可以保证在图片质量降低不了太多的情况下成倍地缩小,这点大家都懂的)。
对于libgdx平台的搭建就不过多的赘述了,大家可以参看安卓巴士里另一个帖子http://www.apkbus.com/android-19745-1-1.html ,里面一些部分讲的还是很详细的,可以帮助大家快速入门。至于本系列的教程则定位为帮助大家在入门的基础上进一步实际操作,并且分享一些我曾经遇到过的问题,避免大家再在这些问题上纠缠浪费了宝贵的时间。
大家可以去http://code.google.com/p/libgdx/下载最新的libgdx。这里还要提示一下大家,libgdx分为 latest releases和nightlies两种,前者是正式发布的版本,后者则是随时修正随时更新的版本,建议没有什么特别需要的话,最好使用lastest release的版本,避免遇见一些很奇怪的问题,我使用的是最新的0.9.4的版本,其中加入了很多新的内容(包括3D),效率相对于老版本也有很明显的提高,最好不要使用0.9.2的版本,因为0.9.4版本修改了一部分接口,我曾经在把自己的游戏的libgdx的版本从0.9.2更新到0.9.4的时候花了一部分时间重新修改代码,因为原来的接口和函数已经被废弃了…
第一篇文章主要是介绍性的内容,为了使大家先了解一些,这里就先贴出一个最简单的demo供大家学习(前提是你已经搭建好了Libgdx环境才可以哦)。这里顺便说一句,开发Android平台的游戏,只需:
- armeabi/
- armeabi-v7a/
- gdx-backend-android.jar
- gdx.jar
这四个文件就可以了,具体的使用方法可以http://www.apkbus.com/android-19745-1-1.htm
Libgdx是一款支持2D与3D游戏开发的游戏类库,兼容大多数微机平台(标准JavaSE实现,能运行在Mac、Linux、Windows等系统)与Android平台(Android1.5以上即可使用,Android2.1以上可满功率发挥)。
logo:
地址:http://code.google.com/p/libgdx/
首先下载最新的jar,我下载的是libgdx-0.9.2。
新建一个Android项目,File -> New -> Project -> Android Project。我选的SDK是1.6的,最低选择应该是1.5.
新建一个文件夹libs(这个名字是固定的,不能随意改),将下载到的jar复制进去,android平台只需要复制gdx.jar和gdx-backend-android.jar。
增加引用,然后将armeabi和armeabi-v7a两个文件夹复制到libs文件夹中。
严格按照步骤!!!!!!!!!!!!!!!!!!!!!!
然后写个小东西测试一下环境有没有问题。
新建类HelloGameActivity,继承AndroidApplication类。
- package com.cnblogs.htynkn;
- import com.badlogic.gdx.backends.android.AndroidApplication;
- import android.os.Bundle;
- public class HelloGameActivity extends AndroidApplication {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- initialize(new FirstGame(), false);
- }
- }
复制代码
- initialize(new FirstGame(), false);
复制代码
就是启动游戏的关键,FirstGame是一个实现了ApplicationListener的类。代码如下
- package com.cnblogs.htynkn;
- import com.badlogic.gdx.ApplicationListener;
- import com.badlogic.gdx.Gdx;
- import com.badlogic.gdx.graphics.GL10;
- import com.badlogic.gdx.graphics.g2d.SpriteBatch;
- public class FirstGame implements ApplicationListener {
- //绘图用的SpriteBatch
- private SpriteBatch batch;
- @Override
- public void create() {
- batch = new SpriteBatch(); //实例化
- }
- @Override
- public void dispose() {
- // TODO Auto-generated method stub
- }
- @Override
- public void pause() {
- // TODO Auto-generated method stub
- }
- @Override
- public void render() {
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //清屏
- batch.begin();
- batch.end();
- }
- @Override
- public void resize(int width, int height) {
- // TODO Auto-generated method stub
- }
- @Override
- public void resume() {
- // TODO Auto-generated method stub
- }
- }
复制代码
因为没有写实际的东西,所以效果是一个黑黑的框。
环境搭建就说到这里,下一篇是关于图片绘制的。注意:如果仔细观察Logcat,就会发现一个error:E/libEGL(382): couldn't load <libhgl.so> library (Cannot load library: load_library[984]: Library 'libhgl.so' not found)这个没什么关系,这是系统尝试加载硬件OpenGL驱动失败了,然后回到软件的处理方法上,不是缺陷或者错误。
我们先写一个类
- public class MyGame implements ApplicationListener {
- public void create () {
- // STUB
- }
- public void render () {
- // STUB
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- }
- }
复制代码
ApplicationListener是一个接口,我们很容易可以看出,实现了这个接口的类都有一个共同的特点,它们都会经历一个创建,渲染(render),暂停,继续,销毁等一系列过程,发生对应时间的时候会自用调用相应的函数。特别是render()函数,它是一个系统在不停调用的函数(当然这个实例满足正在运行的条件),因此我们可以把很多操作放在render()函数中实现,不过千万注意不要进行耗时的操作以免堵塞UI线程。
下面我们就要启动一个Libgdx游戏了!另外写一个类
- public class LibgdxActivity extends AndroidApplication {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- initialize(new MyGame(), false);
- }
- }
复制代码
这就完成了第一个libgdx程序的编写!当然源码中需要加入各种import xxxx,这里就不添加了,另外会把源码附上,可以供大家下载。
查询官方文档,可以看到
java.lang.Object
| Activity
|com.badlogic.gdx.backends.android.AndroidApplication
这意味着什么呢??也就是说,AndroidApplication继承自API中的Activity,因此我们使用它也需要在Manifest中注册,这里就不再具体说明如何注册了,大家应该都是知道的吧!另外,这里也提供了一个更好的问题供大家思考,既然AndroidApplication继承自Activity,那么是不是可以像其他Activity一样使用Intent进行跳转呢?答案是肯定的,不过事情也并没有这么简单,我将在后面的文章里面重点讨论这个问题。
至于initialize(new MyGame (), false);这一条语句,这里解释一下,这是启动libgdx的一个必备的条件,不执行该语句libgdx就无法启动,第一个参数是一个实现了ApplicationApplication接口的类的实例,第二个参数如果设为true,则在opengl 2.0可用的情况下会使用opengl 2.0