推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动

先看一下效果图。

推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动_第1张图片推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动_第2张图片推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动_第3张图片推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动_第4张图片

        我们的目标是:通过键盘按键,控制人物在屏幕上自由移动。要实现这个目标,只要完成下面三件事就行:1. 监听键盘,获取按键值 2. 根据按键值,修改人物在屏幕上的坐标 3. 在新的坐标位置显示人物

下面是程序的基本框图。

推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动_第5张图片

        如上图所示:主Activity依次:创建人物、创建键盘监听线程、启动键盘监听线程、显示游戏界面。在游戏界面启动后,游戏界面绘图线程随之启动。绘图线程每隔固定时间对屏幕进行一次刷新。键盘监听线程启动后,会捕获按键值,然后根据按键值来修改人物显示坐标。人物显示坐标改变后,下次绘图线程就可以新的地方把人物画出来。

[java] view plain copy print ?
  1. package com.mapAndSprit; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.KeyEvent; 
  6.  
  7. public class MapAndSpritActivity extends Activity { 
  8.  
  9.     //游戏界面 
  10.     GameView gameView; 
  11.     //人物 
  12.     MySprite mySprite; 
  13.     //键盘监听线程 
  14.     KeyThread kt; 
  15.      
  16.     //键盘动作 
  17.     int action = 0
  18.      
  19.     @Override 
  20.     protected void onCreate(Bundle savedInstanceState) { 
  21.         // TODO Auto-generated method stub 
  22.         super.onCreate(savedInstanceState); 
  23.          
  24.         gameView = new GameView( this ); 
  25.         mySprite = new MySprite( this ); 
  26.         kt = new KeyThread( this ); 
  27.         kt.start(); 
  28.          
  29.         //显示游戏界面 
  30.         setContentView( gameView );      
  31.     } 
  32.      
  33.     //按键按下 
  34.     @Override 
  35.     public boolean onKeyDown(int keyCode, KeyEvent event) 
  36.     { 
  37.         // TODO Auto-generated method stub 
  38.         if(keyCode == 19){//上 
  39.             action = action | 0x08
  40.         } 
  41.         if(keyCode == 20){//下 
  42.             action = action | 0x04
  43.         }        
  44.         if(keyCode == 21){//左 
  45.             action = action | 0x02
  46.         }        
  47.         if(keyCode == 22){//右 
  48.             action = action | 0x01
  49.         } 
  50.         return false;        
  51.     } 
  52.  
  53.     //按键抬起 
  54.     @Override 
  55.     public boolean onKeyUp(int keyCode, KeyEvent event) 
  56.     { 
  57.         // TODO Auto-generated method stub 
  58.         if(keyCode == 19){//上 
  59.             action = action & 0x37
  60.         } 
  61.         if(keyCode == 20){//下 
  62.             action = action & 0x3B
  63.         }        
  64.         if(keyCode == 21){//左 
  65.             action = action & 0x3D
  66.         }        
  67.         if(keyCode == 22){//右 
  68.             action = action & 0x3E
  69.         } 
  70.         return false
  71.     } 


[java] view plain copy print ?
  1. package com.mapAndSprit; 
  2.  
  3. public class KeyThread extends Thread { 
  4.  
  5.     MapAndSpritActivity mapAndSpritActivity; 
  6.     boolean flag = true;     
  7.     int sleepSpan = 50
  8.     int action; 
  9.      
  10.     boolean KEY_UP = false
  11.     boolean KEY_DOWN = false
  12.     boolean KEY_LEFT = false
  13.     boolean KEY_RIGHT = false
  14.      
  15.     public KeyThread( MapAndSpritActivity mapAndSpritActivity ) 
  16.     { 
  17.         this.mapAndSpritActivity = mapAndSpritActivity;      
  18.     } 
  19.      
  20.     public void run() 
  21.     { 
  22.         while( flag ) 
  23.         { 
  24.             action = mapAndSpritActivity.action; 
  25.             if((action & 0x08) != 0){//上 
  26.                 KEY_UP = true
  27.             } 
  28.             else
  29.                 KEY_UP = false
  30.             } 
  31.             if((action & 0x04) != 0){//下 
  32.                 KEY_DOWN = true
  33.             } 
  34.             else
  35.                 KEY_DOWN = false
  36.             } 
  37.             if((action & 0x02) != 0){//左 
  38.                 KEY_LEFT = true
  39.             } 
  40.             else
  41.                 KEY_LEFT = false
  42.             } 
  43.             if((action & 0x01) != 0){//右 
  44.                 KEY_RIGHT = true
  45.             } 
  46.             else
  47.                 KEY_RIGHT = false
  48.             }  
  49.              
  50.             if( KEY_UP ) 
  51.             { 
  52.                 if( !( mapAndSpritActivity.mySprite.curJ < 1 ) ) 
  53.                 {                    
  54.                     mapAndSpritActivity.mySprite.curJ -= 1
  55.                 }                
  56.             } 
  57.             if( KEY_DOWN ) 
  58.             { 
  59.                 if( !( mapAndSpritActivity.mySprite.curJ >15 ) ) 
  60.                 {                    
  61.                     mapAndSpritActivity.mySprite.curJ += 1
  62.                 }                
  63.             } 
  64.             if( KEY_LEFT ) 
  65.             { 
  66.                 if( !( mapAndSpritActivity.mySprite.curI < 1 ) ) 
  67.                 {                    
  68.                     mapAndSpritActivity.mySprite.curI -= 1
  69.                 }                
  70.             } 
  71.             if( KEY_RIGHT ) 
  72.             { 
  73.                 if( !( mapAndSpritActivity.mySprite.curI > 10 ) ) 
  74.                 {                    
  75.                     mapAndSpritActivity.mySprite.curI += 1
  76.                 }                
  77.             } 
  78.              
  79.             try
  80.                 //睡眠sleepSpan毫秒 
  81.                 Thread.sleep( sleepSpan ); 
  82.             } 
  83.             catch(Exception e){ 
  84.                 e.printStackTrace(); 
  85.             } 
  86.         } 
  87.     } 


[java] view plain copy print ?
  1. package com.mapAndSprit; 
  2.  
  3. import android.graphics.Bitmap; 
  4. import android.graphics.BitmapFactory; 
  5. import android.graphics.Canvas; 
  6. import android.graphics.Paint; 
  7.  
  8. public class MySprite { 
  9.      
  10.     MapAndSpritActivity mapAndSpritActivity; 
  11.     Bitmap man; 
  12.      
  13.     //人物在地图显示的位置 
  14.     int curI = 0
  15.     int curJ = 0
  16.     int curX = 0
  17.     int curY = 0
  18.      
  19.     public MySprite( MapAndSpritActivity mapAndSpritActivity ) 
  20.     { 
  21.         this.mapAndSpritActivity = mapAndSpritActivity;      
  22.         man = BitmapFactory.decodeResource( mapAndSpritActivity.getResources(), R.drawable.a1 ); 
  23.     } 
  24.      
  25.     public void drawSelf( Canvas c, Paint paint ) 
  26.     { 
  27.         //把屏幕分成虚拟的10 * 15的网格,每个格子大小 20 * 20 
  28.         //每次走动一个格子 
  29.         curX = this.mapAndSpritActivity.gameView.initX + curI * 20
  30.         curY = this.mapAndSpritActivity.gameView.initX + curJ * 20
  31.         c.drawBitmap( man, curX, curY, paint ); 
  32.     }    


[java] view plain copy print ?
  1. package com.mapAndSprit; 
  2.  
  3. import android.graphics.Canvas; 
  4. import android.graphics.Color; 
  5. import android.view.SurfaceHolder; 
  6. import android.view.SurfaceView; 
  7.  
  8. public class GameView extends SurfaceView implements SurfaceHolder.Callback 
  9.     MapAndSpritActivity mapAndSpritActivity; 
  10.     GameViewDrawThread gameViewDrawThread; 
  11.     SurfaceHolder holder;    
  12.      
  13.     //人物能在屏幕上显示的最左上角的位置 
  14.     int initX = 20
  15.     int initY = 20
  16.      
  17.     public GameView( MapAndSpritActivity mapAndSpritActivity ) 
  18.     { 
  19.         super( mapAndSpritActivity ); 
  20.         this.mapAndSpritActivity = mapAndSpritActivity; 
  21.         holder = getHolder(); 
  22.         holder.addCallback( this ); 
  23.          
  24.         gameViewDrawThread = new GameViewDrawThread( this, holder ); 
  25.     } 
  26.  
  27.     public void onDraw( Canvas c ) 
  28.     { 
  29.         c.drawColor( Color.BLUE ); 
  30.         mapAndSpritActivity.mySprite.drawSelf( c, null ); 
  31.     } 
  32.      
  33.     @Override 
  34.     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
  35.         // TODO Auto-generated method stub 
  36.          
  37.     } 
  38.  
  39.     @Override 
  40.     public void surfaceCreated(SurfaceHolder arg0) { 
  41.         // TODO Auto-generated method stub 
  42.         gameViewDrawThread.setFlag( true ); 
  43.         gameViewDrawThread.start(); 
  44.     } 
  45.  
  46.     @Override 
  47.     public void surfaceDestroyed(SurfaceHolder arg0) { 
  48.         // TODO Auto-generated method stub 
  49.         boolean retry = true
  50.         //停止刷帧线程 
  51.         gameViewDrawThread.setFlag(false); 
  52.         //不断地循环,直到等待的线程结束 
  53.         while (retry) { 
  54.             try
  55.                 //等待刷帧线程结束 
  56.                 gameViewDrawThread.join(); 
  57.                 retry = false
  58.             }  
  59.             catch (InterruptedException e) { 
  60.             } 
  61.         } 
  62.     } 
  63.      


[java] view plain copy print ?
  1. package com.mapAndSprit; 
  2.  
  3. import android.graphics.Canvas; 
  4. import android.view.SurfaceHolder; 
  5.  
  6. public class GameViewDrawThread extends Thread { 
  7.     private GameView gameView; 
  8.     private SurfaceHolder holder; 
  9.     boolean isRun;   
  10.     int sleepSpan = 200
  11.      
  12.     public GameViewDrawThread( GameView gameView, SurfaceHolder holder ) 
  13.     { 
  14.         this.gameView = gameView; 
  15.         this.holder = holder; 
  16.         isRun = true
  17.     } 
  18.      
  19.     public void setFlag( boolean flag ) 
  20.     { 
  21.         isRun = flag; 
  22.     } 
  23.      
  24.     @Override 
  25.     public void run() { 
  26.         // TODO Auto-generated method stub 
  27.         while( isRun ) 
  28.         { 
  29.             Canvas c = null
  30.             try 
  31.             { 
  32.                 c = holder.lockCanvas(); 
  33.                 synchronized( holder ) 
  34.                 { 
  35.                     //调用绘图函数 
  36.                     gameView.onDraw( c );                        
  37.                 } 
  38.             }finally 
  39.             { 
  40.                 if( c != null
  41.                 { 
  42.                     holder.unlockCanvasAndPost( c ); 
  43.                 } 
  44.             } 
  45.              
  46.             try
  47.                 //睡眠200毫秒 
  48.                 Thread.sleep( sleepSpan ); 
  49.             } 
  50.             catch(Exception e){ 
  51.                 e.printStackTrace(); 
  52.             } 
  53.         } 
  54.     } 

你可能感兴趣的:(推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动)