转自:http://www.apkbus.com/android-58760-1-1.html
移植素材SDK版本俄罗斯方块源码下载:
Tetris_slide.rar(537.04 KB, 下载次数: 72)
本讲移植后的源码:
libgdxTetris.rar(3.97 MB, 下载次数: 605)
粒子效果出来了。我们继续下一步的工作。我们接下来需要原SDK版下方滑动开始的效果,首先对照一下,下方是原SDK版本的开始界面,注意看到下方有一个可以滑动用于开始游戏的滑块。
然后我们这里教大家使用Libgdx里面一个很方便的控件,模拟SDK版本中的滑块效果,这是一个封装好的类,Slider。我们先来看看libgdx 0.9.4中的官方文档中是怎么说的。
java.lang.Object
我们将修改好的UiScreen里关于
- Button start;
- Slider slider;
android游戏开发框架libgdx的使用(五)--舞台和常用UI类
http://www.apkbus.com/android-19751-1-1.html
其实我们这里只是简单构造一个NinePatch,所以NinePatch如何使用其实也不用深究了。

第一个NinePatch中的图片是底座的图片,而我前面做好的底座的图片其实是一张背景为透明的空图片,所以参数可以随便设定没有任何影响,而第二个参数TextrureRegion是滑块的图片。由此我们可以构造以下语句:
- NinePatch n1 = new NinePatch(new Texture(Gdx.files.internal("pla.png")), 14, 14, 18, 18);
- bar=new Texture(Gdx.files.internal("btn_blue.png"));
- slider=new Slider(0,min,1f,new SliderStyle(n1, new TextureRegion(new Texture(Gdx.files.internal("btn_blue.png")), 0, 0, 100, 96)));
这里再顺便解释一下
- stage.addActor(slider);
- //把滑块的长度设为宽度。
- slider.width=min;
再运行一下看看效果:
- slider.setValueChangedListener(new ValueChangedListener() {
- @Override
- public void changed(Slider arg0, float arg1) {
- // TODO Auto-generated method stub
- if(!sliderFinished&&(int)arg1==arg0.width){
- sliderFinished=true;
- activity.tg.setScreen(activity.gs);
- }
- }
- });
- if(!slider.isDragging()&&slider.getValue()>10){
- slider.setValue(slider.getValue()-10);
- }
修改后的UiScreen.java完整代码:
- public class UiScreen implements Screen {
- Texture texture;
- TextureRegion background;
- boolean hasini;
- SpriteBatch batch;
- Stage stage;
- Slider slider;
- int width;
- int height;
- //边长的最大值和最小值
- int max;
- int min;
- Texture tx1;
- Texture tx2;
- Texture tx3;
- Texture bar;
- UiActivity activity;
- ParticleEffect particle;
- ParticleEffect tem;
- ParticleEffectPool particlepool;
- ArrayList<ParticleEffect> particlelist;
- boolean sliderFinished;
- public UiScreen(UiActivity activity){
- super();
- this.activity=activity;
- // TODO Auto-generated constructor stub
- }
- @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();
- if(!slider.isDragging()&&slider.getValue()>10){
- slider.setValue(slider.getValue()-10);
- }
- if(Gdx.input.isTouched()){
- //当此触摸点与上一触摸点距离大于一定值的时候触发新的粒子系统,由此减小系统负担
- tem=particlepool.obtain();
- tem.setPosition(Gdx.input.getX(),Gdx.graphics.getHeight()-Gdx.input.getY());
- particlelist.add(tem);
- }
- batch.begin();
- for(int i=0;i<particlelist.size();i++){
- particlelist.get(i).draw(batch, Gdx.graphics.getDeltaTime());
- }
- batch.end();
- //清除已经播放完成的粒子系统
- ParticleEffect temparticle;
- for(int i=0;i<particlelist.size();i++){
- temparticle=particlelist.get(i);
- if(temparticle.isComplete()){
- particlelist.remove(i);
- }
- }
- //舞台绘制要在背景绘制之后,不然背景会覆盖在按钮表面,我们就看不到按钮了
- 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;
- //将滑块标记重新初始化
- sliderFinished=false;
- if(!hasini){
- batch=new SpriteBatch();
- stage=new Stage(min,max,true);
- particle = new ParticleEffect();
- particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal(""));
- particlepool=new ParticleEffectPool(particle, 5, 10);
- particlelist=new ArrayList<ParticleEffect>();
- texture=new Texture(Gdx.files.internal("background"+max+".jpg"));
- //重点在这条语句,我们只取了texture的一部分,红色的多余部分我们没有取
- background=new TextureRegion(texture, 0, 0, min, max);
- NinePatch n1 = new NinePatch(new Texture(Gdx.files.internal("pla.png")), 14, 14, 18, 18);
- bar=new Texture(Gdx.files.internal("btn_blue.png"));
- slider=new Slider(0,min,1f,new SliderStyle(n1, new TextureRegion(new Texture(Gdx.files.internal("btn_blue.png")), 0, 0, 100, 96)));
- slider.setValueChangedListener(new ValueChangedListener() {
- @Override
- public void changed(Slider arg0, float arg1) {
- // TODO Auto-generated method stub
- if(!sliderFinished&&(int)arg1==arg0.width){
- sliderFinished=true;
- activity.tg.setScreen(activity.gs);
- }
- }
- });
- //把滑块的长度设为宽度。
- slider.width=min;
- stage.addActor(slider);
- hasini=true;
- }
- //这句话是必须的,而且在if(hasini)之外,无论资源是否加载完成,每次显示的时候我们将当前屏幕
- //设置能够接受用户输入
- Gdx.input.setInputProcessor(stage);
- }
- }