libgdx游戏引擎教程实战篇(二)移植俄罗斯方块(附源码)
2013-03-11 14:20
519 查看
转自:http://www.apkbus.com/android-58408-1-1.html
SDK版本源码下载(是我们移植的素材):
Tetris_slide.rar(537.04
KB, 下载次数: 113)
2012-7-10 20:54 上传
点击文件名下载附件
下载积分: 下载豆 -2
[align=left]既然我们是要用libgdx移植这个游戏,我们很显然要让UiActvity从直接继承Activity改成继承AndrodApplication,并且我们用到了多界面,那么按照我在第五,第六,第七讲三讲中讲的,我们要有两个继承自Screen的界面,分别叫UiScreen,GameScreen,并且有一个管理这两个Screen的继承自Game类的类,我们叫它TetrisGame好了。[/align]
接着实战篇的第一讲,我们开始新建上面提到的这些类,便于从SDK版本中移植。
[align=left]先创建一个新类TetrisGame,继承自Game:[/align]
public class TetrisGame extends Game {
Screen screen;
@Override
public void create() {
// TODO Auto-generated method stub
setScreen(screen);
}
public TetrisGame(Screen screen) {
super();
// TODO Auto-generated constructor stub
this.screen=screen;
}
}
复制代码
我们在构造这个Game的时候,同时传入了一个Screen,内部有一个变量保存这个引用,并在这个Game被AndroidApplication调用initialize()方法的时候(Game则调用create())的时候将Game的默认屏幕变为这个传入的Screen。
2012-7-10 20:58 上传
下载附件(119.29 KB)
[align=left]这个类其实就算写完了,传入一个Screen,并在创建的时候将这个Screen设置为当前界面。[/align]
[align=left]然后是新建两个Screen, UiScreen和GameScreen,分别代表主界面和游戏界面。[/align]
2012-7-10 20:59 上传
下载附件(130.28 KB)
2012-7-10 20:59 上传
下载附件(130.6 KB)
目前这两个类也是空的,什么都没有。很简单,直接实现Screen接口就可以了,所以就不贴代码了。
[align=left]然后我们进行一个初始阶段比较重要的操作。修改UiActivity让其继承自AndroidApplication。[/align]
UiActivity.java:
public class UiActivity extends AndroidApplication {
TetrisGame tg;
UiScreen us;
GameScreen gs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
gs=new GameScreen();
us=new UiScreen();
tg=new TetrisGame(us);
initialize(tg, true);
}
}
复制代码
[align=left]然后我们运行一下,程序能正常启动,不过是是一个全黑的屏幕,这很正常,因为我们没有做任何操作。[/align]
然后我们修改UiScreen,画出基本图像,不过我们这里先不加入难度设置,并且游戏开始用一个按钮表示,最后我们会尝试将用SDK实现的滑动开始的效果和RatingBar的效果用自定义Libgdx实现。
还记得SDK版本的主界面是怎样的吗?我们回忆一下,哈哈,贴张图,然后好做对比。
当然现在我们要用Libgdx来实现它。
我们将需要的素材从SDK版本中拿过来…放心,这两个版本都是我自己写的所以没有版权问题哈=。=
将三张背景图片放在asset文件夹下,这里我们为了追求简单,只对320*240,480*320,800*480的分辨率进行适配。所以其他机型可以显示,但可能有显示的问题,比如图片拉伸的问题。
我们先修改UiScreen,这个界面修改好后将成为游戏的开始界面。
注意,这里有一个非常 非常 非常 非常 非常 非常 非常 非常 非常 非常重要的问题。 libgdx中的图片的边长只能是2的幂次,如2*4,32*64等等,但是图片不满足这个要求怎么办呢?我们可以用libgdx中的工具TextruePacker,具体使用方法可以看:
android游戏开发框架libgdx的使用(十六)
http://www.apkbus.com/android-44510-1-1.html
也可以使用将图片修改成2的幂次的边长(多余的部分可以是白色或者任意颜色)我们在绘制的时候用TextureRegion封装Textrue并且只将有用的部分绘制出来就可以了。下面我用的就是这种方法。
我们将图片做一些调整,让边长满足2的幂次的条件。多余的部分我们在绘制的时候不画出就可以了。修改后的图片如下,我们可以很清楚的看见有红色的部分,这都是不会被画出的。
这些图我改成了边长为2的幂次的:
2012-7-10 21:12 上传
下载附件(27.09 KB)
2012-7-10 21:12 上传
下载附件(71.77 KB)
2012-7-10 21:12 上传
下载附件(48.08 KB)
为了醒目,让大家明白多余的部分是不会被画出的,我用了醒目的红色。
UiScreen.java(接下来还会修改,一步步来嘛)
请大家务必看一下注释,很多问题就不便一一讲,但是又非常重要,所以我在注释中都写出来了。
public class UiScreen implements Screen {
Texture texture;
TextureRegion background;
boolean hasini;
SpriteBatch batch;
Stage stage;
Button start;
int width;
int height;
//边长的最大值和最小值
int max;
int min;
Texture tx1;
Texture tx2;
Texture tx3;
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render(float arg0) {
// TODO Auto-generated method stub
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.gl.glClearColor(0f,0f,0f,0f);
batch.begin();
batch.draw(background,0,0,min,max);
batch.end();
//舞台绘制要在背景绘制之后,不然背景会覆盖在按钮表面,我们就看不到按钮了
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}
@Override
public void resize(int arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
//做一个简单的适配。这里解释一下为什么不直接令max=height,原因在于有时候我们从锁屏回到游戏,
//从横屏切换到竖屏或者从竖屏切换到横屏的时候,libGdx有时候会来不及切换,也就是说我们可能
//getWidth得到的是实际的height值,getHeight得到的是实际的width值,所以这里增加一个长宽哪一个
//更大的语句,这样就不会出错了
width=Gdx.graphics.getWidth();
height=Gdx.graphics.getHeight();
max=width>height?width:height;
min=width>height?height:width;
//再做一个简单的适配
if(max>=320&&max<480)
max=320;
if(max>=480&&max<800)
max=480;
if(max>=800)
max=800;
if(!hasini){
batch=new SpriteBatch();
stage=new Stage(min,max,true);
texture=new Texture(Gdx.files.internal("background"+max+".jpg"));
//新建一个Button
tx2 = new Texture(Gdx.files.internal("button1.png"));
tx1 = new Texture(Gdx.files.internal("button2.png"));
tx3 = new Texture(Gdx.files.internal("button3.png"));
NinePatch n1 = new NinePatch(tx1, 14, 14, 18, 18);
NinePatch n2 = new NinePatch(tx2, 14, 14, 18, 18);
NinePatch n3 = new NinePatch(tx3, 14, 14, 18, 18);
start= new Button( new ButtonStyle(n1, n2, n3, 0f, 0f, 0f, 0f), "Start");
//让按钮的位置处在正中间
start.x=(min-tx2.getWidth())/2;
stage.addActor(start);
//重点在这条语句,我们只取了texture的一部分,红色的多余部分我们没有取
background=new TextureRegion(texture, 0, 0, min, max);
hasini=true;
}
//这句话是必须的,而且在if(hasini)之外,无论资源是否加载完成,每次显示的时候我们都养将当前屏幕
//设置能够接受用户输入
Gdx.input.setInputProcessor(stage);
}
}
复制代码
咩哈哈,老样子,我胆子比较小,学习Mars老师的,写一点就运行一下,一是可以看看小效果给自己一点信心,二是防止错误往下面积累,后面出错不好锁定错误的位置。运行一下,显示效果应该是这样的,按钮按下没有任何变化..
2012-7-10 21:17 上传
下载附件(138.64 KB)
然后我们就开始移植最重要的部分,游戏界面,GameScreen,我们将需要移植的工程的GameView里面的一些变量都复制过来,并做一些相应的修改,比如SDK中用来保存方块图片的Bitmap数组我们用libgdx中的Textrue来代替之类的。
这次的教程写的实在是太长了...我还是放在下一讲继续写...word文档摆了50页...伤不起啊
SDK版本源码下载(是我们移植的素材):
Tetris_slide.rar(537.04
KB, 下载次数: 113)
2012-7-10 20:54 上传
点击文件名下载附件
下载积分: 下载豆 -2
[align=left]既然我们是要用libgdx移植这个游戏,我们很显然要让UiActvity从直接继承Activity改成继承AndrodApplication,并且我们用到了多界面,那么按照我在第五,第六,第七讲三讲中讲的,我们要有两个继承自Screen的界面,分别叫UiScreen,GameScreen,并且有一个管理这两个Screen的继承自Game类的类,我们叫它TetrisGame好了。[/align]
接着实战篇的第一讲,我们开始新建上面提到的这些类,便于从SDK版本中移植。
[align=left]先创建一个新类TetrisGame,继承自Game:[/align]
public class TetrisGame extends Game {
Screen screen;
@Override
public void create() {
// TODO Auto-generated method stub
setScreen(screen);
}
public TetrisGame(Screen screen) {
super();
// TODO Auto-generated constructor stub
this.screen=screen;
}
}
复制代码
我们在构造这个Game的时候,同时传入了一个Screen,内部有一个变量保存这个引用,并在这个Game被AndroidApplication调用initialize()方法的时候(Game则调用create())的时候将Game的默认屏幕变为这个传入的Screen。
2012-7-10 20:58 上传
下载附件(119.29 KB)
[align=left]这个类其实就算写完了,传入一个Screen,并在创建的时候将这个Screen设置为当前界面。[/align]
[align=left]然后是新建两个Screen, UiScreen和GameScreen,分别代表主界面和游戏界面。[/align]
2012-7-10 20:59 上传
下载附件(130.28 KB)
2012-7-10 20:59 上传
下载附件(130.6 KB)
目前这两个类也是空的,什么都没有。很简单,直接实现Screen接口就可以了,所以就不贴代码了。
[align=left]然后我们进行一个初始阶段比较重要的操作。修改UiActivity让其继承自AndroidApplication。[/align]
UiActivity.java:
public class UiActivity extends AndroidApplication {
TetrisGame tg;
UiScreen us;
GameScreen gs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
gs=new GameScreen();
us=new UiScreen();
tg=new TetrisGame(us);
initialize(tg, true);
}
}
复制代码
[align=left]然后我们运行一下,程序能正常启动,不过是是一个全黑的屏幕,这很正常,因为我们没有做任何操作。[/align]
然后我们修改UiScreen,画出基本图像,不过我们这里先不加入难度设置,并且游戏开始用一个按钮表示,最后我们会尝试将用SDK实现的滑动开始的效果和RatingBar的效果用自定义Libgdx实现。
还记得SDK版本的主界面是怎样的吗?我们回忆一下,哈哈,贴张图,然后好做对比。
当然现在我们要用Libgdx来实现它。
我们将需要的素材从SDK版本中拿过来…放心,这两个版本都是我自己写的所以没有版权问题哈=。=
将三张背景图片放在asset文件夹下,这里我们为了追求简单,只对320*240,480*320,800*480的分辨率进行适配。所以其他机型可以显示,但可能有显示的问题,比如图片拉伸的问题。
我们先修改UiScreen,这个界面修改好后将成为游戏的开始界面。
注意,这里有一个非常 非常 非常 非常 非常 非常 非常 非常 非常 非常重要的问题。 libgdx中的图片的边长只能是2的幂次,如2*4,32*64等等,但是图片不满足这个要求怎么办呢?我们可以用libgdx中的工具TextruePacker,具体使用方法可以看:
android游戏开发框架libgdx的使用(十六)
http://www.apkbus.com/android-44510-1-1.html
也可以使用将图片修改成2的幂次的边长(多余的部分可以是白色或者任意颜色)我们在绘制的时候用TextureRegion封装Textrue并且只将有用的部分绘制出来就可以了。下面我用的就是这种方法。
我们将图片做一些调整,让边长满足2的幂次的条件。多余的部分我们在绘制的时候不画出就可以了。修改后的图片如下,我们可以很清楚的看见有红色的部分,这都是不会被画出的。
这些图我改成了边长为2的幂次的:
2012-7-10 21:12 上传
下载附件(27.09 KB)
2012-7-10 21:12 上传
下载附件(71.77 KB)
2012-7-10 21:12 上传
下载附件(48.08 KB)
为了醒目,让大家明白多余的部分是不会被画出的,我用了醒目的红色。
UiScreen.java(接下来还会修改,一步步来嘛)
请大家务必看一下注释,很多问题就不便一一讲,但是又非常重要,所以我在注释中都写出来了。
public class UiScreen implements Screen {
Texture texture;
TextureRegion background;
boolean hasini;
SpriteBatch batch;
Stage stage;
Button start;
int width;
int height;
//边长的最大值和最小值
int max;
int min;
Texture tx1;
Texture tx2;
Texture tx3;
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void pause() {
// TODO Auto-generated method stub
}
@Override
public void render(float arg0) {
// TODO Auto-generated method stub
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.gl.glClearColor(0f,0f,0f,0f);
batch.begin();
batch.draw(background,0,0,min,max);
batch.end();
//舞台绘制要在背景绘制之后,不然背景会覆盖在按钮表面,我们就看不到按钮了
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}
@Override
public void resize(int arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void resume() {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
//做一个简单的适配。这里解释一下为什么不直接令max=height,原因在于有时候我们从锁屏回到游戏,
//从横屏切换到竖屏或者从竖屏切换到横屏的时候,libGdx有时候会来不及切换,也就是说我们可能
//getWidth得到的是实际的height值,getHeight得到的是实际的width值,所以这里增加一个长宽哪一个
//更大的语句,这样就不会出错了
width=Gdx.graphics.getWidth();
height=Gdx.graphics.getHeight();
max=width>height?width:height;
min=width>height?height:width;
//再做一个简单的适配
if(max>=320&&max<480)
max=320;
if(max>=480&&max<800)
max=480;
if(max>=800)
max=800;
if(!hasini){
batch=new SpriteBatch();
stage=new Stage(min,max,true);
texture=new Texture(Gdx.files.internal("background"+max+".jpg"));
//新建一个Button
tx2 = new Texture(Gdx.files.internal("button1.png"));
tx1 = new Texture(Gdx.files.internal("button2.png"));
tx3 = new Texture(Gdx.files.internal("button3.png"));
NinePatch n1 = new NinePatch(tx1, 14, 14, 18, 18);
NinePatch n2 = new NinePatch(tx2, 14, 14, 18, 18);
NinePatch n3 = new NinePatch(tx3, 14, 14, 18, 18);
start= new Button( new ButtonStyle(n1, n2, n3, 0f, 0f, 0f, 0f), "Start");
//让按钮的位置处在正中间
start.x=(min-tx2.getWidth())/2;
stage.addActor(start);
//重点在这条语句,我们只取了texture的一部分,红色的多余部分我们没有取
background=new TextureRegion(texture, 0, 0, min, max);
hasini=true;
}
//这句话是必须的,而且在if(hasini)之外,无论资源是否加载完成,每次显示的时候我们都养将当前屏幕
//设置能够接受用户输入
Gdx.input.setInputProcessor(stage);
}
}
复制代码
咩哈哈,老样子,我胆子比较小,学习Mars老师的,写一点就运行一下,一是可以看看小效果给自己一点信心,二是防止错误往下面积累,后面出错不好锁定错误的位置。运行一下,显示效果应该是这样的,按钮按下没有任何变化..
2012-7-10 21:17 上传
下载附件(138.64 KB)
然后我们就开始移植最重要的部分,游戏界面,GameScreen,我们将需要移植的工程的GameView里面的一些变量都复制过来,并做一些相应的修改,比如SDK中用来保存方块图片的Bitmap数组我们用libgdx中的Textrue来代替之类的。
这次的教程写的实在是太长了...我还是放在下一讲继续写...word文档摆了50页...伤不起啊
相关文章推荐
- libgdx游戏引擎教程实战篇(四)移植俄罗斯方块(附源码)
- libgdx游戏引擎教程实战篇(五)移植俄罗斯方块(附源码)
- libgdx游戏引擎教程实战篇(六)移植俄罗斯方块(附源码)
- libgdx游戏引擎教程(十三)演员类的用户交互功能详解(附源码)
- libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码)
- libgdx游戏引擎教程(十四)libgdx中常用的控件(附源码)
- libgdx游戏引擎教程(十一)演员类的复杂动画(二)(附源码)
- libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码
- libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码
- libgdx游戏引擎教程(九) libgdx中的用户手势识别(二)附源码
- 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用
- Android游戏引擎libgdx使用教程7:引擎框架总观
- 【Android LibGDX游戏引擎开发教程】第08期:中文字体的显示和绘制(下)
- Android开发_libgdx游戏引擎教程外篇 优美的自定义进度条 (八)
- libgdx游戏引擎教程(二) ApplicationListener,着手第一个程序!
- 发现一个牛人写的android游戏教程——libgdx引擎
- Android游戏引擎libgdx使用教程2:如何绘制图形
- 【Android LibGDX游戏引擎开发教程】第04期:各个模块的详细介绍
- Android游戏引擎libgdx使用教程5:常用UI类与舞台
- 【Android LibGDX游戏引擎开发教程】第09期:动画类的使用