#Testin杯#Mkey libgdx游戏引擎教程实战篇(五)移植俄罗斯方块(附源码)

53
回复
865019
查看
  [复制链接]

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2012-7-10 22:28:46 | 显示全部楼层 |阅读模式
本帖最后由 耒佲請ぁ留埗 于 2012-8-3 11:30 编辑

   本文参与:Testin—安卓巴士Android开发原创教程大赛

以下系列教程按讲课顺序排列,也是推荐阅读的顺序

第一讲:libgdx游戏引擎教程(一)性能优良的游戏引擎—libgdx http://www.apkbus.com/android-57355-1-1.html

第二讲: libgdx游戏引擎教程(二) ApplicationListener,着手第一个程序http://www.apkbus.com/android-57372-1-1.html

第三讲:libgdx游戏引擎教程()libgdx粒子系统的使用 http://www.apkbus.com/android-57456-1-1.html

外篇一:libgdx游戏引擎教程外篇(一)优美的自定义进度条(附源码) http://www.apkbus.com/android-57523-1-1.html

第四讲:libgdx游戏引擎教程(四) 游戏正式开始,资源异步加载(附源码)http://www.apkbus.com/android-57716-1-1.html

第五讲 libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码 http://www.apkbus.com/android-57936-1-1.html

第六讲 libgdx游戏引擎教程(六)多游戏界面的实现(二)附源码 http://www.apkbus.com/android-57991-1-1.html  

第七讲 libgdx游戏引擎教程(七) 在libgdx中拦截Android按键事件 http://www.apkbus.com/android-58030-1-1.html  

外篇二: libgdx游戏引擎教程外篇(二)libgdx移植俄罗斯方块(附源码) http://www.apkbus.com/android-58102-1-1.html   

实战一:libgdx游戏引擎教程实战篇(一)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58404-1-1.html  

实战二:libgdx游戏引擎教程实战篇(二)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58408-1-1.html  

实战三:libgdx游戏引擎教程实战篇(三)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58414-1-1.html  

实战四:libgdx游戏引擎教程实战篇(四)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58418-1-1.html  

实战五:libgdx游戏引擎教程实战篇(五)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58419-1-1.html

实战六:libgdx游戏引擎教程实战篇(六)移植俄罗斯方块(附源码) http://www.apkbus.com/android-58760-1-1.html

第八讲 libgdx游戏引擎教程(八) libgdx中的用户手势识别(一)附源码 http://www.apkbus.com/android-58933-1-1.html

第九讲 libgdx游戏引擎教程(九) libgdx中的用户手势识别(二)附源码 http://www.apkbus.com/android-59152-1-1.html

外篇三: libgdx游戏引擎教程外篇(三) 优美的自定义对话框(附源码) http://www.apkbus.com/android-59654-1-1.html  

第十讲:  libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码) http://www.apkbus.com/android-59998-1-2.html

第十一讲:libgdx游戏引擎教程(十一)演员类的复杂动画(二)(附源码) http://www.apkbus.com/android-60053-1-1.html

第十二讲:libgdx游戏引擎教程(十二)演员类的复杂动画(三)(附源码) http://www.apkbus.com/android-60194-1-1.html   

第十三讲: libgdx游戏引擎教程(十三)演员类的用户交互功能详解(附源码)  http://www.apkbus.com/android-60457-1-1.html

第十四讲:libgdx游戏引擎教程(十四)libgdx中常用的控件(附源码) http://www.apkbus.com/android-60569-1-1.html

最新更新 第十五讲 :libgdx游戏引擎教程(十五)在Libgdx中仿微信帮助滑动效果(附源码) http://www.apkbus.com/android-60822-1-1.html



接着实战第四讲,我们做一个总结(手都要断了啊!!!TAT)。


SDK版俄罗斯方块源码下载(我们移植工作的素材)



实战一到五移植后的源码:



    初步的移植其实已经完成了。当然我们现在还有一些移植进来的函数没有用到,比如save(),read()函数等等,因为这些函数都是保存进度,读取进度的时候用的,我们先实现游戏功能,其他的我们一步步来。

我们来看看目前的代码。

   

有五个部分


1.     Bricks.java,这个类我们是直接从原来的工程中复制过来的,没有做任何的修改。


2.     TetrisGame.java,抽象类Game的实现,用于管理不同的Screen,里面的代码非常短:
  1. public class TetrisGame extends Game {
  2.         Screen screen;
  3.         @Override
  4.         public void create() {
  5.                 // TODO Auto-generated method stub
  6.                 setScreen(screen);
  7.         }
  8.         public TetrisGame(Screen screen) {
  9.                 super();
  10.                 // TODO Auto-generated constructor stub
  11.                 this.screen=screen;
  12.         }
  13.         

  14. }
复制代码
3.     GameScreen.java,这是游戏主界面,由一个TetrisGame管理,修改后的代码如下(里面有的方法暂时没有用到,是直接从原项目中拿过来的,比如存档功能我们将用到这些函数,而这些功能的实现我们将在后面慢慢加上)。注意,其中有大量的分辨率适配的代码,当然我们还是做一个简单的适配,只适配QVGA,HVGA,WVGA(其实FWVGA显示也没有什么问题)。
  1. public class GameScreen implements Screen {
  2.         
  3.         Texture texture;
  4.         TextureRegion background;
  5.         SpriteBatch batch;
  6.         Texture[] image;
  7.         UiActivity activity;
  8.         BitmapFont bf;
  9.         //用21*10的数组表示21*10的方格
  10.         //frame代表已经固定下来的所有方块
  11.         int[][] frame=new int [21][10];
  12.         
  13.         //temframe代表固定下来的方块和空中正在飞行的方块的数组,由于还有方块在空中,因此
  14.         //此数组一直在变化,我们用它来直接绘图。
  15.         int[][] temframe=new int[21][10];
  16.         
  17.         //我们很容易发现所有七中方块都可以画在一个4*4的小方格内
  18.         int[][] bricks=new int[4][4];
  19.         
  20.         //当前Brick
  21.         Bricks brick;
  22.         
  23.         //随机产生方块
  24.         protected Random rand=new Random(6);
  25.         
  26.         //位图数组,用来存储方块图形
  27.         boolean isplaying=true;
  28.         boolean isflying;
  29.         int x;
  30.         int y;
  31.         int score=0;
  32.         //调整难度,这是调整线程睡眠时间的量,值越小,速度越快
  33.         long speed=600;
  34.         //保存当前屏幕长宽高,用于适配,在我们这个游戏默认竖屏的情况下
  35.         int min;
  36.         int max;
  37.         //还是一样,判断这个Screen是不是第一次显示,只有在第一次显示的时候需要初始化资源
  38.         boolean hasini;
  39.         //适配触摸灵敏度
  40.         int left;
  41.         int right;
  42.         int roll;
  43.         int below;
  44.         @Override
  45.         public void dispose() {
  46.                 // TODO Auto-generated method stub
  47.                
  48.         }

  49.         @Override
  50.         public void hide() {
  51.                 // TODO Auto-generated method stub
  52.                 isplaying=false;
  53.         }
  54.         
  55.         public GameScreen(UiActivity activity) {
  56.                 super();
  57.                 this.activity=activity;
  58.                 // TODO Auto-generated constructor stub
  59.         }

  60.         @Override
  61.         public void pause() {
  62.                 // TODO Auto-generated method stub
  63.                 isplaying=false;
  64.         }

  65.         @Override
  66.         public void render(float arg0) {
  67.                 // TODO Auto-generated method stub
  68.                         // TODO Auto-generated method stub
  69.                         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  70.                         Gdx.gl.glClearColor(0f,0f,0f,0f);        
  71.                                 //绘图前要调用begin()方法
  72.                                 batch.begin();
  73.                                 batch.draw(background, 0,0);
  74.                                 for(int i=0;i<21;i++)
  75.                                         for(int j=0;j<10;j++)
  76.                                         //根据屏幕大小做了一个简单的适配,只适配了QVGA,HVGA,WVGA
  77.                                                 if(temframe[i][j]!=0){
  78.                                                         if(max>=320&&max<480){
  79.                                                                 batch.draw(image[temframe[i][j]-1], (float)(50+14*j), max-(float)(25+14*(i+1)),14,14);
  80.                                                                 bf.draw(batch,"得分"+score, 210f, 200f);
  81.                                                         }
  82.                                                         if(max>=480&&max<800){
  83.                                                                 batch.draw(image[temframe[i][j]-1], (float)(80+16*j), max- (float)(70+16*(i+1)),16,16);
  84.                                                                 bf.draw(batch, "得分"+score, 280, 320);
  85.                                                         }  
  86.                                                         if(max>=800){
  87.                                                                 batch.draw(image[temframe[i][j]-1], (float)(100+28*j),max-(float)(120+28*(i+1)),28,28);
  88.                                                                 bf.draw(batch, "得分"+score, 400, 540);
  89.                                                         }
  90.                                                 }
  91.                                 //结束时要调用end()方法
  92.                                 batch.end();
  93.                                 if(Gdx.input.isTouched()){
  94.                                         int x=Gdx.input.getX();
  95.                                         int y=Gdx.input.getY();
  96.                                         if(x<(min/2)&&((y/x)>(max/min))&&y<(max-max*x/min)){
  97.                                                 left++;
  98.                                                 if(left%3==0)
  99.                                                         toLeft();
  100.                                         }
  101.                                         if(x>(min/2)&&(y/x<(max/min))&&y>(max-max*x/min)){
  102.                                                 right++;
  103.                                                 if(right%3==0)
  104.                                                         toRight();
  105.                                         }
  106.                                         if(((y/x)<(max/min))&&y<(max-max*x/min)){
  107.                                                 roll++;
  108.                                                 if(roll%3==0)
  109.                                                         roll();
  110.                                         }
  111.                                         if(((y/x)>(max/min))&&y>(max-max*x/min)){
  112.                                                 below++;
  113.                                                 if(below%2==0)
  114.                                                         toBelow();               
  115.                                         }
  116.                                 }

  117.         }

  118.         @Override
  119.         public void resize(int arg0, int arg1) {
  120.                 // TODO Auto-generated method stub

  121.         }

  122.         @Override
  123.         public void resume() {
  124.                 // TODO Auto-generated method stub

  125.         }

  126.         @Override
  127.         public void show() {
  128.                 int width=Gdx.graphics.getWidth();
  129.                 int height=Gdx.graphics.getHeight();
  130.                 max=width>height?width:height;
  131.                 min=width>height?height:width;
  132.                 isplaying=true;
  133.                 //还是一样,做一个简单的适配
  134.                 if(max>=320&&max<480)
  135.                         max=320;
  136.                 if(max>=480&&max<800)
  137.                         max=480;
  138.                 if(max>=800)
  139.                         max=800;
  140.                 // TODO Auto-generated method stub
  141.                 new Thread(new Runnable() {
  142.                         
  143.                         @Override
  144.                         public void run() {
  145.                                 // TODO Auto-generated method stub
  146.                                 try{
  147.                                         while(isplaying==true){
  148.                                                 if(!isflying){
  149.                                                         switch((int) Math.round(Math.random() * 7)){
  150.                                                         case 0:brick=new COBrick((int) rand.nextInt(6));System.out.println("O!"+brick.color);break;
  151.                                                         case 1:brick=new CLBrick((int) rand.nextInt(6));System.out.println("L!"+brick.color);break;
  152.                                                         case 2:brick=new CLLBrick((int) rand.nextInt(6));System.out.println("LL!"+brick.color);break;
  153.                                                         case 3:brick=new CSBrick((int) rand.nextInt(6));System.out.println("S!"+brick.color);break;
  154.                                                         case 4:brick=new CSSBrick((int) rand.nextInt(6));System.out.println("SS!"+brick.color);break;
  155.                                                         case 5:brick=new CIBrick((int) rand.nextInt(6));System.out.println("I!"+brick.color);break;
  156.                                                         case 6:brick=new CCBrick((int) rand.nextInt(6));System.out.println("C!"+brick.color);break;
  157.                                                         }
  158.                                                 x=0;
  159.                                                 y=3;
  160.                                                 isflying=true;
  161.                                                 try{
  162.                                                         bricks=brick.checkori(brick.ori);
  163.                                                 }catch(NullPointerException e){
  164.                                                         brick=new CSSBrick((int) rand.nextInt(6));
  165.                                                         bricks=brick.checkori(brick.ori);
  166.                                                 }
  167.                                                 }
  168.                                                 toBelow();
  169.                                                 Thread.sleep(speed);
  170.                                         }
  171.                                         }catch (InterruptedException e){
  172.                                                 
  173.                                         }
  174.                         }
  175.                 }).start();
  176.                 if(!hasini){
  177.                         batch=new SpriteBatch();
  178.                         image=new Texture[6];
  179.                         bf=new BitmapFont();
  180.                         //初始化背景图片
  181.                      texture=new Texture(Gdx.files.internal("background2"+max+".png"));
  182.                      background=new TextureRegion(texture,0,0,min,max);
  183.                         //初始化方块图片
  184.                         for(int i=1;i<=6;i++){
  185.                                 image[i-1]=new Texture(Gdx.files.internal(i+".png"));
  186.                         hasini=true;
  187.                         }
  188.                 }
  189.         }
  190.         //向左移动
  191.         public void toLeft(){
  192.                 if(checkcollide(x,((int)(y-1)),bricks,frame)){
  193.                         System.out.print("Left");
  194.                         y-=1;
  195.                         copy();
  196.                 }        
  197.         }
  198.         //向右移动
  199.         public void toRight(){
  200.                 if(checkcollide(x,((int)(y+1)),bricks,frame)){
  201.                         y+=1;
  202.                         copy();
  203.                 }
  204.                
  205.         }
  206.         //向下移动
  207.         public void toBelow(){
  208.                 System.out.println("In below!");
  209.                 try{
  210.                 if(bricks!=null){
  211.                 if(checkcollide(((int)(x+1)),y,bricks,frame)){
  212.                         x+=1;
  213.                         copy();
  214.                 }
  215.                 else {
  216.                         if(checkfull()){
  217.                                 UiActivity.gameover=true;
  218.                         }
  219.                         for(int i=0;i<4;i++)
  220.                                 for(int j=0;j<4;j++){
  221.                                         if(bricks[i][j]!=0)
  222.                                         frame[x+i][y+j]=bricks[i][j];
  223.                                 }
  224.                         isflying=false;
  225.                         bricks=null;
  226.                         for(int i=0;i<21;i++){
  227.                                 int flag=1;
  228.                                 for(int j=0;j<10;j++){
  229.                                         if(frame[i][j]==0)
  230.                                                 flag=0;
  231.                                 }
  232.                                 if(flag==1){
  233.                                         for(int k=i;k>0;k--)
  234.                                                 frame[k]=frame[k-1].clone();
  235.                                         for(int p=0;p<10;p++)
  236.                                                 frame[0][p]=0;
  237.                                         score+=100;
  238.                                 }
  239.                         }
  240.                 }
  241.                 }
  242.                 }catch(NullPointerException e){
  243.                         e.printStackTrace();
  244.                 }
  245.         }
  246.         //旋转
  247.         public void roll(){
  248.                 if(checkcollide(x,y,brick.checkori((int)(brick.ori+1)),frame)){
  249.                         brick.ori+=1;
  250.                         bricks=brick.checkori(brick.ori);
  251.                         copy();
  252.                 }
  253.                
  254.         }
  255.         //更新temframe里的内容,用于实时绘图
  256.         public void copy(){
  257.                 for(int k=0;k<21;k++)
  258.                         temframe[k]=frame[k].clone();
  259.                 for(int i=0;i<4;i++)
  260.                         for(int j=0;j<4;j++)
  261.                                 if(bricks[i][j]!=0&&temframe[x+i][y+j]==0)
  262.                                 temframe[x+i][y+j]=bricks[i][j];
  263.         }
  264.         public boolean checkcollide(int x,int y,int[][]bricks,int[][]frame){
  265.                 if(bricks!=null)
  266.                 {
  267.                 int max_x=0,min_x=3,max_y=0,min_y=3;
  268.                 boolean collide=true;
  269.                 for(int i=0;i<4;i++)
  270.                         for(int j=0;j<4;j++)
  271.                                 if(bricks[i][j]!=0){
  272.                                         if(j<min_y)
  273.                                                 min_y=j;
  274.                                         if(j>max_y)
  275.                                                 max_y=j;
  276.                                         if(i>max_x)
  277.                                                 max_x=i;
  278.                                         if(i<min_x)
  279.                                                 min_x=i;
  280.                                 }
  281.                 if((max_x+x)>20||(max_y+y)>10||y+min_y<0)
  282.                         collide=false;
  283.                 try{
  284.                         int i;
  285.                         int j;
  286.                 for(i=0;i<=max_x;i++)
  287.                         for(j=min_y;j<=max_y;j++)
  288.                                 if(bricks[i][j]!=0&&frame[x+i][y+j]!=0){
  289.                                         collide=false;
  290.                                 }
  291.                 }catch(ArrayIndexOutOfBoundsException e){
  292.                         return false;
  293.                 }
  294.                 return collide;
  295.         }
  296.                 return false;
  297.         }
  298.         //判断是否方块到顶,游戏结束
  299.         public boolean checkfull(){
  300.                 for(int i=0;i<21;i++)
  301.                         for(int j=0;j<10;j++){
  302.                                 if(temframe[i][j]!=frame[i][j])
  303.                                         return false;
  304.                         }
  305.                 return true;
  306.         }

  307.     public void save(String fileName, String fileContent) throws Exception {
  308.         FileOutputStream fileOutputStream = activity.openFileOutput(
  309.                       fileName, Context.MODE_PRIVATE);
  310.         fileOutputStream.write(fileContent.getBytes());
  311. }
  312.          public String read(String fileName) throws Exception {
  313.                 FileInputStream fileInputStream = activity.openFileInput(fileName);
  314.                 ByteArrayOutputStream byteArray = new ByteArrayOutputStream();

  315.                 byte[] buffer = new byte[1024];
  316.                 int len = 0;
  317.                 while ((len = fileInputStream.read(buffer)) > 0) {
  318.                        byteArray.write(buffer, 0, len);
  319.                 };
  320.                 return byteArray.toString();
  321.          }
  322.          public void savedata(){
  323.                  String framedata="";
  324.                  for(int i=0;i<21;i++)
  325.                          for(int j=0;j<10;j++){
  326.                                  framedata+=Integer.toString(frame[i][j])+",";
  327.                          }
  328.                  framedata+=Integer.toString(score);
  329.                  try {
  330.                         save("Tetris_slide.txt",framedata);
  331.                 } catch (Exception e) {
  332.                         // TODO Auto-generated catch block
  333.                         e.printStackTrace();
  334.                 }
  335.          }
  336.          
  337. }
复制代码
      其中写了大量的注释,这里没有做过多的解释,至于其各个方法的意思,想来光是看这些方法的名字也就能知道,我们这几讲的主要目的是实现一个现成的SDK版本的俄罗斯方块的代码的移植工作,至于SDK版本是怎么实现的,大家可以看看两个版本的代码,并做一些比对,就很容易看出来了


4.     UiScreen.java,这就是主界面Screen,样式如下图,我们对按钮添加了监听器,设置按下去的时候切换到游戏界面。注意,其中有大量的分辨率适配的代码,当然我们还是做一个简单的适配,只适配QVGA,HVGA,WVGA(其实FWVGA显示也没有什么问题)
  1. public class UiScreen implements Screen {
  2.         Texture texture;
  3.         TextureRegion background;
  4.         boolean hasini;
  5.         SpriteBatch batch;
  6.         Stage stage;
  7.         Button start;
  8.         int width;
  9.         int height;
  10.         //边长的最大值和最小值
  11.         int max;
  12.         int min;
  13.         Texture tx1;
  14.         Texture tx2;
  15.         Texture tx3;
  16.         UiActivity activity;
  17.         
  18.         
  19.         public UiScreen(UiActivity activity){
  20.                 super();
  21.                 this.activity=activity;
  22.                 // TODO Auto-generated constructor stub
  23.         }

  24.         @Override
  25.         public void dispose() {
  26.                 // TODO Auto-generated method stub

  27.         }

  28.         @Override
  29.         public void hide() {
  30.                 // TODO Auto-generated method stub
  31.         }

  32.         @Override
  33.         public void pause() {
  34.                 // TODO Auto-generated method stub
  35.         }

  36.         @Override
  37.         public void render(float arg0) {
  38.                 // TODO Auto-generated method stub
  39.                 Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
  40.                 Gdx.gl.glClearColor(0f,0f,0f,0f);
  41.                
  42.                 batch.begin();
  43.                 batch.draw(background,0,0,min,max);
  44.                 batch.end();
  45.                
  46.                 //舞台绘制要在背景绘制之后,不然背景会覆盖在按钮表面,我们就看不到按钮了
  47.                 stage.act(Gdx.graphics.getDeltaTime());
  48.                 stage.draw();
  49.         }

  50.         @Override
  51.         public void resize(int arg0, int arg1) {
  52.                 // TODO Auto-generated method stub

  53.         }

  54.         @Override
  55.         public void resume() {
  56.                 // TODO Auto-generated method stub

  57.         }
  58.         

  59.         @Override
  60.         public void show() {
  61.                 // TODO Auto-generated method stub
  62.                
  63.                 //做一个简单的适配。这里解释一下为什么不直接令max=height,原因在于有时候我们从锁屏回到游戏,
  64.                 //从横屏切换到竖屏或者从竖屏切换到横屏的时候,libGdx有时候会来不及切换,也就是说我们可能
  65.                 //getWidth得到的是实际的height值,getHeight得到的是实际的width值,所以这里增加一个长宽哪一个
  66.                 //更大的语句,这样就不会出错了
  67.                 width=Gdx.graphics.getWidth();
  68.                 height=Gdx.graphics.getHeight();
  69.                 max=width>height?width:height;
  70.                 min=width>height?height:width;
  71.                 //再做一个简单的适配
  72.                 if(max>=320&&max<480)
  73.                         max=320;
  74.                 if(max>=480&&max<800)
  75.                         max=480;
  76.                 if(max>=800)
  77.                         max=800;
  78.                 if(!hasini){
  79.                 batch=new SpriteBatch();
  80.                 stage=new Stage(min,max,true);
  81.                 texture=new Texture(Gdx.files.internal("background"+max+".jpg"));
  82.                
  83.                 //新建一个Button
  84.                
  85.                 tx2 = new Texture(Gdx.files.internal("button1.png"));
  86.                 tx1 = new Texture(Gdx.files.internal("button2.png"));
  87.                 tx3 = new Texture(Gdx.files.internal("button3.png"));
  88.                 NinePatch n1 = new NinePatch(tx1, 14, 14, 18, 18);
  89.                 NinePatch n2 = new NinePatch(tx2, 14, 14, 18, 18);
  90.                 NinePatch n3 = new NinePatch(tx3, 14, 14, 18, 18);         
  91.                 start= new Button( new ButtonStyle(n1, n2, n3, 0f, 0f, 0f, 0f), "Start");
  92.                 start.setClickListener(new ClickListener() {
  93.                         
  94.                         @Override
  95.                         public void click(Actor arg0, float arg1, float arg2) {
  96.                                 // TODO Auto-generated method stub
  97.                                 activity.tg.setScreen(activity.gs);
  98.                         }
  99.                 });
  100.                 //让按钮的位置处在正中间
  101.                 start.x=(min-tx2.getWidth())/2;
  102.                 stage.addActor(start);
  103.                
  104.                 //重点在这条语句,我们只取了texture的一部分,红色的多余部分我们没有取
  105.                 background=new TextureRegion(texture, 0, 0, min, max);
  106.                 hasini=true;
  107.                 }
  108.                 //这句话是必须的,而且在if(hasini)之外,无论资源是否加载完成,每次显示的时候我们都养将当前屏幕
  109.                 //设置能够接受用户输入
  110.                 Gdx.input.setInputProcessor(stage);
  111.         }

  112. }
复制代码
5.UiActivity.java,这就是一个AndroidApplication了,代码也很简单,直接贴出来
  1. public class UiActivity extends AndroidApplication {
  2.         TetrisGame tg;
  3.         UiScreen us;
  4.         GameScreen gs;
  5.         static boolean gameover;
  6.     @Override
  7.     public void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         requestWindowFeature(Window.FEATURE_NO_TITLE);
  10.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  11.                         WindowManager.LayoutParams.FLAG_FULLSCREEN);
  12.         gs=new GameScreen(this);
  13.         us=new UiScreen(this);
  14.         tg=new TetrisGame(us);
  15.         initialize(tg, true);
  16.     }   
  17. }
复制代码


       初步的移植工作就算结束了这时候我们按退出键游戏就完全退出了,不像SDK
版本那样可以回到主界面并且有提示对话框,而且不能保存进度,由于初次移植,没有必要要求一步到位,因此我觉得先将游戏功能实现了就可以。剩下的一系列功能我们将一步步实现。敬请期待接下来的Testin 杯libgdx游戏引擎系列教程。

Testin ID:ilovemkey@gmail.com 总的而言这个平台真的非常好用!我正是用这个平台发现了现在写的这个应用的一些内存管理方面的问题。另外建议能够在测试报告中看到某一台机型在整个执行过程中的cpu和内存占用的变化情况,这样可以更快地锁定问题。感谢Itestin让测试变得轻松了太多太多!
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
君见一叶舟,出没风波里

2826

主题

7684

帖子

9601

安币

管理员

Rank: 9Rank: 9Rank: 9

QQ达人最佳新人活跃会员热心会员推广达人灌水之王突出贡献

QQ
发表于 2012-7-10 22:38:01 | 显示全部楼层
夜深了,我还在看帖啊!!屌丝的命!!!

30

主题

350

帖子

1089

安币

Android大神

Rank: 6Rank: 6

QQ达人

 楼主| 发表于 2012-7-10 22:40:33 | 显示全部楼层
chino 发表于 2012-7-10 22:38
夜深了,我还在看帖啊!!屌丝的命!!!

DS +1....{:4_137:}
君见一叶舟,出没风波里

0

主题

18

帖子

122

安币

程序猿

Rank: 2

QQ达人

发表于 2012-7-11 10:08:08 | 显示全部楼层
过来看看!

1

主题

32

帖子

12

安币

初级码农

Rank: 1

发表于 2012-7-11 11:13:38 | 显示全部楼层
不错,学习、学习。

主题

帖子

安币

游客

发表于 2012-7-11 11:47:30 | 显示全部楼层
共享下。

1

主题

66

帖子

222

安币

程序猿

Rank: 2

QQ达人

发表于 2012-7-11 12:03:40 | 显示全部楼层
刚好学到这块   这贴不错  

21

主题

393

帖子

2177

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2012-7-11 12:27:33 | 显示全部楼层
{:Skateboard:}{:Skateboard:}{:Skateboard:}{:Skateboard:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )