如何使用libgdx编写一个java编写简单的小游戏游戏

Libgdx开发教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Libgdx开发教程
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩18页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢&&&&&&&由于平常工作和琐事的种种原因,所以这个系列的教程更新的有点慢,还请大家见谅。在这期的中,博主给大家来的教学是关于图形图像的绘制,要知道一个最基本的应用都会有一个精美的图像,那么就更别说一个成功的了,首先要有绚丽的背景才是吸引玩家试玩的关键,不是嘛?&&&&&&&&& 在这篇中主要讲解到的有Texture、SpriteBatch、Sprite和Pixmap这四个类。&一、Texture和SpriteBatch类&1、Texture介绍&我们先来看一下官方API文档,如下图所示:&&&&&& 该类存放在com.badlogic.gdx.graphics包下,继承自Object,实现了Disposable,凡是实现了该接口的类,都应该在程序结束时对该类进行销毁(上上一篇文章中提到过)。&2、Texture用途&&&& &&&&&& 其实就是承装获取到的目的图片的容器,为了方便大家理解我就这里打一个比方,比如:你盛一碗粥,从锅里盛出来需要用到汤勺,这个汤勺就相当于Texture,他们都是用来获取东西的一个容器,是中间者。&3、SpriteBatch介绍&&&&&&该类存放在com.badlogic.gdx.graphics.g2d的包下,也是继承自Object,实现了Disposable接口。&4、SpriteBatch用途&&&&& SpriteBatch可以把许多相同纹理一起描述并一起送入GPU,同时赋予纹理和坐标以便每个图形的绘制。其实可以把SpriteBatch理解为就是一个画笔,没有画笔是画不了画的。&&&& 它的用法,首先声明类名,实例化、在绘制的的时候分三步,必须先调用begin()方法,然后再调用draw()方&法,最后画完了调用end()结束,这个顺序是绘制的固定格式,也是应该背下来的。&5、实现的&&&&&& &&&&&& 大家肯定会觉得奇怪为什么显示的图片会出现在下方?等下讲解的时候我在详细解释。&6、结构图&&7、详细代码编写& com.yangyu.mylibgdx01;
import com.badlogic.gdx.ApplicationL
import com.badlogic.gdx.G
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.T
import com.badlogic.gdx.graphics.g2d.SpriteB
public class MyGame implements ApplicationListener {
//绘图用的SpriteBatch
private SpriteB
public void create() {
batch = new SpriteBatch();
texture = new Texture(Gdx.files.internal(&image1.jpg&));
public void dispose() {
batch.dispose();
texture.dispose();
public void pause() {
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 清屏
batch.begin();
batch.draw(texture, 0, 0, 480, 320);
batch.end();
public void resize(int arg0, int arg1) {
public void resume() {
&&1& 让我们来详细分析一下这段代码,先看这行代码:texture = new Texture(Gdx.files.internal(&image1.jpg&));&&&&&&Texture一般都是作为传入的参数使用的,这行代码是获取图片的常用写法,还可以在assert下再增加文件夹,特别注意读取的文件必须注明格式,比如这个文件是“.jpg”格式就必须写明是“.jpg”格式的,否则会报错(找不到此图片)。
这里简单介绍下Gdx.files,它是libgdx的文件模块,主要提供以下5大功能:读取文件,写入文件、复制文件、移动文件、列出文件和目录。其中获取文件有几种方法: &&1& Classpath:路径相对于classpath,文件通常为只读; &2& Internal:内部文件路径相对于程序或者 的assets文件夹;&3& External:外部文件路径是相对于SD卡根目录;&4& Absolute:assets文件夹本身就是资源的文件夹,而且相比resource文件夹,它其中的资源不会生成R中的ID,用来放图片很是合适。&&2& 这里还有个地方需要注意,libgdx绘制的图片必须是2的n次方(如32*32,256*512)的图片否则识别不了,那么为什么libgdx要使用2的N次方的图片呢?&&&&&&&&&&因为Android上画图可以使用OpenGL ES,分两个不兼容的版本:OpenGL ES 1.x和&OpenGL ES&2.0。&它们之间的一个重要区别就是:OpenGL ES&1.x的图片大小必须是2的整数次幂,而OpenGL ES&2.0则无此要求。而&libgdx在早期使用OpenGL es1.x 的版本所以只支持2的整数次幂的图像,并一直沿用至今,新版本(0.9.8)中允许开&发者使用OpenGL ES 2.0,这样使用OpenGL ES 2.0就可以不用管图片分辨率的问题了。android系统对opengl es的&支持情况:&OpenGL ES&1.0---------&andoid 1.0-2.1(api 7)而 OpenGL ES 2.0------------&android 2.2(api 8)以上,但是&在上即使是4.2的系统,也只有open es 1.0可用,所以还是建议大家用安卓真机进行调试,模拟器很容易报错&不识别OpenGL ES 2.0。&图片是2的n次方是这个引擎的一大悲哀,不过有没有办法可以解决呢?答案是肯定的。解决方法:①&在MainActivity.类中,把initialize()方法中的useGL2IfAvailable参数改为true就行了,就可以随便任何分辨率图片不必是2的N次方了。不过需要特别注意的是最好在安卓真机上进行调试,模拟器很容易报错不识别OpenGLES 2.0,如下图所示:&②&还有一种方法实现起来会稍微复杂一点,所以博主会在后面的文章对其进行详细的介绍。&&3& 获取完图片,然后调用batch.draw(texture,x,y,height,width)方法绘制图形batch.draw(texture, 0, 0, 480, 320);&& 这里的(x,y)是绘图的起点坐标,(height,width)绘制图形的大小,libgdx使用的是笛卡尔坐标系,以左下角为原点,绘制方向是由下向上,由左到右。如下图所示:&二、TextureRegion类&1、TextureRegion介绍该类存放在com.badlogic.gax.graphics.g2d包下,该类的子类有Sprite、TextureAtlas、AtlasRegion。&2、API的定义大概的意思是说:定义了一个矩形区域的纹理,使用左上角的顶点为坐标系统的原点,x轴指向右,Y轴指向下。&3、TextureRegion用途&&&&& 实际操作中我们也经常使用图片的一部分,或者将多个图片资源集合在一个图片文件中。而要显示图片的一部分就可以使用TextureRegion类。其实可以理解为就是截图工具,从左上角开始截图,然后可以定义截图的大小。&&&& TextureRegion一般都是截取texture,然后定义截取起点(x,y)随后再定义宽高(width,height),如果&宽高是正数,那么就是沿x、y正方向截取,如果是负就是沿x、y负方向截取,方向只和宽高的正负有关。&&&&&比如:textureRegion = new(texture, 0 ,0 , 48, 48),他对应的截图区域和方向,如下图:&&textureRegion = new(texture, 48 , 48 , -48, -48),他对应的截图区域和方向,如下图:&4、实现效果图&&&&&&&&&&&&&&&&&&&& 正向截图&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 反向截图&&&&&&&&&&&&&&&&&&&5、项目结构图&6、详细代码编写package com.yangyu.mylibgdx01;
import com.badlogic.gdx.ApplicationL
import com.badlogic.gdx.G
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.T
import com.badlogic.gdx.graphics.g2d.SpriteB
import com.badlogic.gdx.graphics.g2d.TextureR
public class MyGame implements ApplicationListener {
//绘图用的SpriteBatch
private SpriteB
public TextureRegion textureR
public void create() {
batch = new SpriteBatch();
texture = new Texture(Gdx.files.internal(&image1.jpg&));
textureRegion = new TextureRegion(texture, 0, 0, 512, 256);
textureRegion = new TextureRegion(texture, 512, 256, -512, -256);
public void dispose() {
batch.dispose();
texture.dispose();
public void pause() {
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 清屏
batch.begin();
batch.draw(texture, 0, 0, 480, 320);
batch.draw(textureRegion, 0, 0, 480, 320);
batch.end();
public void resize(int arg0, int arg1) {
public void resume() {
&&三、Sprite类&1、Sprite介绍&&&&&&该类在com.badlogic.gdx.graphics.g2d包下,继承自TextureRegion类,它的子类有TextureAtlas、AtlasSprite。&2、API的定义&先来看一下官方的解释,如下图所示:&3、Sprite用途&&&&&&&&&TextureRegion的加强版,比TextureRegion多了一些功能,如:可以指定位置、颜色、旋转等。&其实Sprite的功能就是以上的集合。但是Sprite更方便,它用一个对象描述了一切,但是同时加入了很多&TextureRegion和Texture没有的东西,如位置、颜色、旋转等等。&4、实现效果图&&5、详细代码编写package com.yangyu.mylibgdx03;
import com.badlogic.gdx.ApplicationL
import com.badlogic.gdx.G
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.T
import com.badlogic.gdx.graphics.g2d.S
import com.badlogic.gdx.graphics.g2d.SpriteB
import com.badlogic.gdx.graphics.g2d.TextureR
public class MyGame implements ApplicationListener {
public SpriteB
// 声明纹理
public void create() {
batch = new SpriteBatch();
// 实例化texture
texture = new Texture(Gdx.files.internal(&xianjian.jpg&));
TextureRegion region = new TextureRegion(texture, 0, 0, 256, 512);
sprite = new Sprite(region);
// 设置绘制的大小
sprite.setSize(256, 512);
// 设置旋转的中心点为屏幕的中心点
sprite.setOrigin(sprite.getWidth() / 2, sprite.getHeight() / 2);
// 以中心点为旋转中心,设置旋转的角度
sprite.setRotation(50);
// 设置图片的起始位置
sprite.setPosition(150, 110);
// 颜色就设置为粉色
sprite.setColor(1, 0, 1, 1);
public void dispose() {
batch.dispose();
texture.dispose();
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);// 设置背景颜色为白色
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);// 清屏
batch.begin();
sprite.draw(batch);
batch.end();
public void resize(int width, int height) {
public void pause() {
public void resume() {
&我们来详细分析一下这段代码:&1& 在前面已经说过了,&TextureRegion是Sprite的加强版,Sprite包含TextureRegion的功能:TextureRegion region = new TextureRegion(texture, 0, 0, 256, 512);
sprite = new Sprite(region);可以把这两行代码替换为:sprite = new Sprite(texture, 0, 0, 256, 512);&&2&可以通过sprite的setColor方法为图形着色:sprite.setColor(1, 0, 1, 1);其中颜色的表述都是介于0到1之间的数。&3&& 关于清屏:Gdx.gl.glClearColor(1, 1, 1, 1);// 设置背景颜色为白色
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);// 清屏&&& 可能大家不能理解为什么要清屏?其实很简单,OpenGL中我们是将纹理贴上去的,但是要绘制动画,或者绘制另外的图片时候,他会残留上一张的痕迹,所以只有清屏后,才能显示新的图片,这个感兴趣的同学可以自己去测试一下,这两行代码,如果不是很熟悉的libgdx的新手同学的话可以当做固定格式来用,的时候在render()方法中都是必须加入的,也不需要大家理解,建议大家直接背下来。&四、&Pixmap类&1、Pixmap介绍该类存放在com.badlogic.gdx.graphics包下,继承自Object,实现了Disposable接口。&2、Pixmap用途&&&&& Libgdx所提供的像素级图像渲染用类,由于Libgdx目前以JNI方式自带图像解码器,所以我们可以直接将Pixmap理解为一个Android中 Bitmap的替代者,两者间实现细节虽有差别,但具体作用却大同小异。Pixmap支持Alpha、LuminanceAlpha、RGB565、 RGBA4444、RGB888、RGBA8888等五种图像彩色模式,支持png、jpg、bmp等三种图像文件的读取和加载。一般来说,Pixmap 必须和Texture混用才能真正显示画面。不过在事实上,Libgdx的Texture里已经内置有Pixmap了。3、实现效果图&&4、代码详细编写package com.yangyu.mylibgdx04;
import com.badlogic.gdx.ApplicationL
import com.badlogic.gdx.G
import com.badlogic.gdx.graphics.C
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.P
import com.badlogic.gdx.graphics.T
import com.badlogic.gdx.graphics.g2d.SpriteB
public class MyGame implements ApplicationListener {
// 准备绘图用SpriteBatch
SpriteBatch spriteB
// Pixmap是Libgdx提供的针对opengl像素操作的上级封装,它可以凭空构建一个像素贴图,
// 但是它的现实必须通过Texture。
// 准备Texture
public void create() {
// 构建SpriteBatch
spriteBatch = new SpriteBatch();
// 构建Pixmap(在Android环境使用internal加载模式时,文件必须放置于assets文件夹下)
pixmap = new Pixmap(Gdx.files.internal(&image1.jpg&));
// 绘制一个蓝方块到Ball图像之上
pixmap.setColor(Color.BLUE.r, Color.BLUE.g, Color.BLUE.b, Color.BLUE.a);
pixmap.drawRectangle(15, 15, 40, 40);
// 以指定Pixmap构建Texture
texture = new Texture(pixmap);
public void dispose() {
// 注入Texture后的pixmap已经没用,可以注销
pixmap.dispose();
spriteBatch.dispose();
texture.dispose();
public void pause() {
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 初始化绘图调用
spriteBatch.begin();
// 绘制精灵到游戏屏幕
spriteBatch.draw(texture, 100, 180);
// 结束绘图调用
spriteBatch.end();
public void resize(int width, int height) {
public void resume() {
&&&&&&&&&& 这一期图形图像绘制的基本内容差不多就讲完了,下一期会更加精彩!&下载地址(包含本期中所有的示例讲解)本文使用的libgdx是0.98版本,可能和最新版有一些不同地方。全文内容仅供参考。
原文地址:
libGdx是一个跨平台的2D/3D的游戏开发框架,它由Java/C/C++语言编写而成。它基于Apache License, Version 2.0协议,对商业使用和非商业使用均免费。代码托管于Github中。最新版本为0.9.8。
随着2012年Android系统的飞速发展,智能手机上面的2个格局已经显现。所以对于开发者来说,减少开发时间,提高开发效率,同时还能够跨平台的开发框架是非常首选的。libGdx就是这样一个游戏开发引擎,libgdx兼容Windows、Linux、Max OS X、Java Applet、Javascript/WebGL与Android(1.5版本以上)平台。就目前的手持设备开发者来说,Android 和 IOS游戏开发来说,libGdx真的是很好的选泽。
Libgdx游戏引擎(1群):
Libgdx游戏引擎(2群):
Libgdx游戏引擎(3群):&
& & 官方地址:
1.首先下载libgdx最新版本0.9.8的包,解压后,在libgdx-0.9.8文件夹下找到gdx-setup-ui.jar文件,双击打开(前提是你的电脑已经配置了JDK),另外Libgdx的API文档在doc文件夹下,打开docs文件夹下面的index.html即可。如下图:
2.打开后,出现下面的界面,点击Create按钮,进入编辑界面。
3.进入项目编辑界面,左面输入项目名称一列是输入项目名称、包名以及你需要的平台项目,中间列是选择你需要的libgdx版本包,我们就默认选择0.9.8的包,最右面是用来展示你所选项目,在左侧输入你的项目名、包名、目的路径,勾选你要生成的项目类型,随后点击右下角 open开头的按钮进入launch界面,点击launch按钮等待 all done!。
图(3)图(4)
4.打开Eclipse,找到刚才选中的目的路径,引入生成的项目,。PS:选中HelloWorld文件夹就可以了不必挨个项目都加入一次。如图:
5.(1)引入后,Android项目和html项目会报错。Android项目报错的原因是应为没有添加安卓原生的包,解决办法是打开项目中project.properties文件,然后将target=android-15修改为你下载的安卓版本号,例如我下载的是安卓2.3.3的包就修改为target=android-10(安卓版本号是多少,请读者自己谷歌找一下)。
(2)修改后AndroidManifest.xml文件会报错,主要原因是转屏的原因,只要将&android:configChanges="keyboard|keyboardHidden|orientation|screenSize"修改android:configChanges="keyboardHidden|orientation",这是一个转屏的基本问题,这里就不赘述了。这样XML文件的报错就消失了。如下图:
6.这里解释下几个项目的类型,第一个是主要代码项目--代码都写在这里,第二个项目是android的项目里面不需要些代码,如过想调试安卓项目的话在这里运行调试(右键run as就可以了),第三个是desktop是桌面调试项目--由于AVD启动太慢,桌面项目启动比较快,所以desktop一般用来快速调试项目(这个超级方便,我常用),如图:
7.运行效果,如图:
6.HTML文件错其实很简单,主要原因是因为你没有加入GWT SDK JAR,需要手动引入,估计一般同学也很少用Libgdx开发HTML的,我这里就直接贴图了。如图:
写在最后,libGdx作为一个既可以开发android也可以开发IOS,对于开发人员来说是最好的选择,在接下来的博文里,我会对libGdx的一些基础做一下详细的介绍,下一篇是对于libGdx如何绘制图形。PS:写了2个小时累死了。如果大家有什么问题可以加我QQ:,一起讨论下。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&------------奋斗小土豆丶
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2013 年 4 月 7 日
阅读(...) 评论()3666人阅读
libgdx(49)
今天是#Testin杯#Mkey libgdx教程的第五讲,在第二讲我就曾经对大家承诺过写一个关于Libgdx内多屏幕显示的内容,可是我脑子一时糊涂竟然忘了这事,这里向大家道歉,今天这一讲我们就来八一八libgdx中的多游戏容器的实现。我在我的Libgdx教程中尽量给大家介绍一些实用的功能,至于那些libgdx API基本的使用方法则不过多侧重,想来大家通过查询API文档也能掌握。这里再提醒一下大家,API文档可以在官网上看到,也可以在下载下来的libgdx包中的docs下的index.html中查看。
至于多容器,简单的理解就是多个游戏界面,那么大家一定联想到SDK 中的多界面是用Activity实现的,通过Intent跳转来实现多界面之间的切换。
那么libgdx中又如何实现多界面的切换呢?可不可以用Activity实现呢?我曾经在第一讲中提到过这个问题,大家可以先参看一下第一讲的内容:
libgdx游戏引擎教程(一) 性能优良的游戏引擎—libgdx
在这一讲的最后我们提到了通过查询libgdx的官方API我们可以看到:
java.lang.Object
| Activity
|com.badlogic.gdx.backends.android.AndroidApplication
也就是说,AndroidApplication继承自API中的Activity,因此我们使用它也需要在Manifest中注册,这里就不再具体说明如何注册了,大家应该都是知道的吧!另外,这里也提供了一个更好的问题供大家思考,既然AndroidApplication继承自Activity,那么是不是可以像其他Activity一样使用Intent进行跳转呢?答案是肯定的。下面我们来试一试,代码还是老规矩,在第四讲的基础上做修改。
我们新建一个类,名为ActivityForSwitch,意思就是用来跳转的类, 这是一个直接继承自SDK中Activity的类,大家注意区分。在这个类的加入后,我们的程序就将变成libgdx和SDK API混用的一个程序。想来这些都简单的不能再简单,因此我就直接贴出代码了:
这里有一点要注意,这里的Button是SDK API中的Button即android.widget.Button,要注意和我们后面在libgdx中使用的Button要区分开,后者是com.badlogic.gdx.scenes.scene2d.ui.Button
public class ActivityForSwitch extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
switchbutton=(Button)findViewById(R.id.button1);
switchbutton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setClass(ActivityForSwitch.this,LibgdxActivity.class);
ActivityForSwitch.this.startActivity(intent);
顺带贴一下Manifest.xml的代码。供大家参考一下。
&manifest xmlns:android=&/apk/res/android&
package=&edu.nju.wsj.libgdx&
android:versionCode=&1&
android:versionName=&1.0& &
android:minSdkVersion=&7&
android:targetSdkVersion=&15& /&
&application
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme& &
android:name=&edu.nju.wsj.libgdx.ActivityForSwitch&
android:screenOrientation=&landscape&
android:configChanges=&keyboardHidden|orientation&
android:label=&@string/title_activity_main& &
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
android:screenOrientation=&landscape&
android:configChanges=&keyboardHidden|orientation&
android:name=&.LibgdxActivity& &
&/activity&
&/application&
&/manifest&
至于main.xml的代码就不贴出来了,非常简单,一个最基本的layout上放了一个Button(android.widget.Button),Button的Id设置为button1,然后设置一个监听器,在点击的时候由一个Intent跳转到LibgdxActivity,到底能不能成功启动呢?点击button,诶,成功跳转了哦。(这部分的代码将和后面的修改过的代码分成两个项目上传,便于大家对比效果)
11:28 上传
11:28 上传
11:28 上传
不过有一点大家却可以感觉到,就是在程序跳转的过程中有一个比较明显的切换的过程,虽然说并算不上是卡顿,但却不是很流畅,原因在于SDK API中的Activity和libgdx中的AndroidApplication的初始化机制不完全一样,比如AndroidApplication
的OnCreate()方法中就要调用initialize()方法加载Gdx,而只有在加载了Gdx后ApplicationListener才能正常工作,因此libgdx需要做额外的工作,这样一来,切换就出现了不流畅的情况,游戏讲究的就是用户的体验,显然对于现在苛刻的用户来说这是不能接受的。
下面就是这第五讲的重点内容,讲述如何使用libgdx中的多游戏容器机制来在同一个AndroidApplication下进行多界面的切换,首先先给大家吃一个定心丸,用Libgdx的多界面机制切换的速度很流畅,对比之下比将SDK和libgdx混用(就像上面那样)要快得多,自然的多。
要使用libgdx中的多游戏界面,我们不得不先回顾一下libgdx中的游戏框架,还记得我在第二讲中画过的一个图吗?
第二讲:libgdx游戏引擎教程(二)
ApplicationListener,着手第一个程序!
11:32 上传
也就是说,我们一开始都是新建一个AndriodApplication然后调用initialize()方法启动一个实现了ApplicationListener的实例即进入了libgdx的周期。因此一个ApplicationListener就好像是一个游戏容器,一个容器就是一个游戏界面,我们在这个游戏界面中进行着各种操作,可是当我们必须要切换界面的时候怎么办呢?毕竟所有的绘制和逻辑工作都放在一个界面里未免太麻烦了。既然一个ApplicationListener就是一个游戏容器,那么我们能不能让一个AndroidApplication管理多个ApplicationListener呢?事实证明这个思路是完全正确的。
Libgdx正是用这个方法实现多界面切换的。首先我们需要看看libgdx中的API中给我们提供的两个类,Game和Screen。
首先看一看Game这个类。官方文档中的解释如下:
public abstract classGameextends java.lang.Objectimplements
看看它的方法:
11:33 上传
我们看到其实一个Game就是一个实现了ApplicationListener接口的虚类,它有所有ApplicationListener的方法,也就是说,它也可以用AndroidApplication的initialize()方法启动,那又怎么做到多界面的切换呢?我们可以看到其中有一个setScreen()方法,没错,我们就是用这个setScreen()方法进行切换。具体切换会在第六讲中演示。
我们再看看Screen类。
public interfaceScreen
同样看看它的方法
11:33 上传
我们发现,Screen是一个接口,就像我们直接实现ApplicationListener一样,它也有dispose(),pause(),render()方法,但是它还多了hide(),show()等方法(顾名思义,就是在显示和隐藏时分别调用)。现在大家应该已经明白一些了,那么我们再用一张图来表示,相信大家就更明白了:
11:34 上传
倚天一出,谁与争锋啊。此图一出,一切都明白了。解决方案就是在AndroidApplication中持有一个Game,Game中持有一个或者多个Screen,然后initialize方法中的第一个参数传入这个Game,在需要切换屏幕的时候调用Game的setScreen()方法就可以了。
我们先要自定义一个Game,因为Game是虚类必须继承后才能使用。
public class ApplicationGame extends Game {
public void create() {
// TODO Auto-generated method stub
setScreen(sc);
public ApplicationGame(Screen sc) {
// TODO Auto-generated constructor stub
public void resume() {
// TODO Auto-generated method stub
super.resume();
我们在构造函数中传入了一个Screen,并在Game初始化的时候将这个Screen用setScreen置为当前屏幕,这一步必不可少哦。
我们重新把Manifest.xml文件修改一下,把启动Activity从ActivityForSwitch(SDK中的API)重新换成Libgdx,至于这个ActivityForSwitch的类我们依然让它保留,并在Manifest中保留注册。
和上面那个相比改动很小,就是更改了启动Activity
&manifest xmlns:android=&/apk/res/android&
package=&edu.nju.wsj.libgdx&
android:versionCode=&1&
android:versionName=&1.0& &
android:minSdkVersion=&7&
android:targetSdkVersion=&15& /&
&application
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme& &
android:name=&edu.nju.wsj.libgdx.LibgdxActivity&
android:screenOrientation=&landscape&
android:configChanges=&keyboardHidden|orientation&
android:label=&@string/title_activity_main& &
&intent-filter&
&action android:name=&android.intent.action.MAIN& /&
&category android:name=&android.intent.category.LAUNCHER& /&
&/intent-filter&
&/activity&
android:screenOrientation=&landscape&
android:configChanges=&keyboardHidden|orientation&
android:name=&.ActivityForSwitch& &
&/activity&
&/application&
&/manifest&
然后我们需要修改Progress.java,让其不再直接继承ApplicationListener,转而实现Screen接口,并根据Screen中的方法对初始化代码做出相应的调整。其中最主要的调整在于,原来的Progress继承自ApplicationListener,它有create()方法,而修改后的Progress没有create()方法,只有show()方法,其实意思是比较相近的,所以我们把原来的create()方法中的代码直接复制到show()方法中就可以了。其它的方法基本都不用做修改。
public class Progress implements Screen{
public void hide() {
// TODO Auto-generated method stub
public void render(float arg0) {
// TODO Auto-generated method stub
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.gl.glClearColor(1f,1f,1f,0f);
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
if(!manager.update()){
bar.setProgress(manager.getProgress()*100);
//加载完成且之前没有初始化过AnimalActor,且在手触摸屏幕时初始化AnimalActor,并将进度条从舞台中移除,并加入AnimalActor对象
if(!hasini&&manager.update()){
bar.setProgress(100);
if(Gdx.input.isTouched()){
stage.removeActor(bar);
animal.iniResource();
stage.addActor(animal);
//我们做一个标记,看看未加载(Queued)完成的资源和已加载完成的资源的数量(Loaded)
if(!manager.update()){
System.out.println(&QueuedAssets:&+manager.getQueuedAssets());
System.out.println(&LoadedAssets:&+manager.getLoadedAssets());
System.out.println(&Progress:&+manager.getProgress());
public void resize(int arg0, int arg1) {
// TODO Auto-generated method stub
public void resume() {
// TODO Auto-generated method stub
public void show() {
// TODO Auto-generated method stub
bar=new ProgressBar(0,0);
//新建一个舞台
stage=new Stage(Gdx.graphics.getWidth(),Gdx.graphics.getHeight(), true);
stage.addActor(bar);
//记得初始化一下AssetManager实例
manager=new AssetManager();
//传入AssetManger的引用,便于animal的资源初始化,但是注意了,只有在调用iniResourse()后资源才被初始化
animal=new AnimalActor(manager);
//把资源加入加载列表,这里我放了一个29帧的动画,在asset文件夹下animal下有29张图片
for(int i=1;i&30;i++){
manager.load(&animal/&+i+&.png&, Texture.class);
public void dispose() {
// TODO Auto-generated method stub
//同样的,在结束时释放资源
bar.dispose();
animal.dispose();
manager.clear();
manager.dispose();
public void pause() {
// TODO Auto-generated method stub
我们最后需要修改LibgdxActivity(AndriodApplication)中的代码,从直接initialize()一个Progress改为initialize()一个Game,这个Game持有一个Screen,即修改过后的Progress类。
public class LibgdxActivity extends AndroidApplication {
ApplicationG
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
progress=new Progress();
ag=new ApplicationGame(progress);
initialize(ag, false);
然后我们运行程序,效果和第四讲的效果是完全一样的,但是内部的结构被我们完全修改过了。这里我为了方便,把所有的Activity包括libgdx中的AndroidApplication都在Manifest.xml中都强制设置成了横屏,大家注意一下就好。
现在我们已经做好了准备进行多界面切换了,虽然现在还是单界面,只有Progress这一个Screen,但是我们距离多界面只有一步之遥了。欢迎大家继续支持!
API和libgdx混用的源码
MB, 下载次数: 177)
11:45 上传
点击文件名下载附件
下载积分: 下载豆 -2
修改构架准备实现多界面的源码
MB, 下载次数: 287)
11:45 上传
点击文件名下载附件
下载积分: 下载豆 -2
Testin ID: 总的而言这个平台真的非常好用!我正是用这个平台发现了现在写的这个应用的一些内存管理方面的问题。另外建议能够在测试报告中看到某一台机型在整个执行过程中的cpu和内存占用的变化情况,这样可以更快地锁定问题。感谢Itestin让测试变得轻松了太多太多!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3532457次
积分:28714
积分:28714
排名:第139名
原创:20篇
转载:993篇
评论:399条
(2)(10)(3)(2)(1)(4)(5)(10)(1)(7)(13)(6)(4)(3)(9)(10)(3)(13)(6)(22)(14)(13)(19)(26)(50)(9)(12)(13)(47)(22)(31)(29)(18)(26)(12)(6)(23)(5)(12)(4)(10)(12)(79)(44)(86)(12)(9)(7)(21)(6)(10)(14)(23)(30)(4)(1)(3)(5)(3)(9)(2)(16)(3)(17)(5)(5)(8)(2)(3)(3)(20)(10)(14)(3)

我要回帖

更多关于 libgdx游戏源码 的文章

 

随机推荐