Android游戏编程——View游戏框架

android游戏开发中常用的三种视图是:view、SurfaceView和GLSurfaceView。

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;

SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;

GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图。

在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。

View游戏框架:

Activity:在Activity中首先设置全屏显示,分为两点:隐去状态栏和隐去应用程序的名字(这些代码必须写在显示view之前,否则会报错);随后是设置view。

另一种设置全屏的方法:在Mainfest文件中相应的Activity中写入如下代码:

  1. android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  

代码如下 :

  1. public void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.        /* this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
  4.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  5.                 WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  6.         */  
  7.         setContentView(new viewTest(this));  
  8.     }  


view类中的代码:

  1. package com.he;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.view.KeyEvent;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10.   
  11. public class viewTest extends View {  
  12.     float pX=20;  
  13.     float pY=20;  
  14.       
  15.     public viewTest(Context context) {  
  16.         super(context);  
  17.         // TODO Auto-generated constructor stub   
  18.         setFocusable(true);  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void onDraw(Canvas canvas) {  
  23.         // TODO Auto-generated method stub   
  24.         Paint paint=new Paint();  
  25.         paint.setColor(Color.WHITE);  
  26.         canvas.drawText("MYGAME", pX, pY, paint);  
  27.         super.onDraw(canvas);  
  28.     }  
  29.       
  30.     @Override  
  31.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  32.         // TODO Auto-generated method stub   
  33.         if(keyCode==KeyEvent.KEYCODE_DPAD_UP){  
  34.             pY-=10;  
  35.             invalidate();  
  36.         }  
  37.         else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){  
  38.             pY+=10;  
  39.             invalidate();  
  40.         }  
  41.         else if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT){  
  42.             pX-=10;  
  43.             invalidate();  
  44.         }  
  45.         else if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){  
  46.             pX+=10;  
  47.             invalidate();  
  48.         }  
  49.         return super.onKeyDown(keyCode, event);  
  50.     }  
  51.       
  52.     /*@Override 
  53.     public boolean onTouchEvent(MotionEvent event) { 
  54.         // TODO Auto-generated method stub 
  55.         float x=event.getX(); 
  56.         float y=event.getY(); 
  57.         //玩家手指点击屏幕的动作 
  58.         if(event.getAction()==MotionEvent.ACTION_DOWN){ 
  59.             this.pX=x; 
  60.             this.pY=y; 
  61.         } 
  62.         //玩家手指抬起离开时的动作 
  63.         else if(event.getAction()==MotionEvent.ACTION_MOVE){ 
  64.             this.pX=x; 
  65.             this.pY=y; 
  66.         } 
  67.         //玩家手指在屏幕上移动的动作 
  68.         else if(event.getAction()==MotionEvent.ACTION_UP){ 
  69.             this.pX=x; 
  70.             this.pY=y; 
  71.         } 
  72.         invalidate(); 
  73.         return super.onTouchEvent(event); 
  74.     }*/  
  75.       
  76.       
  77.     public boolean onTouchEvent(MotionEvent event) {  
  78.         // TODO Auto-generated method stub   
  79.         float x=event.getX();  
  80.         float y=event.getY();  
  81.         this.pX=x;  
  82.         this.pY=y;  
  83.         invalidate();  
  84.         return super.onTouchEvent(event);  
  85.     }  
  86.       
  87. }  

此类中包括:构造方法、onDraw()、按键事件方法和触屏事件方法;

注意的是:

1.在构造方法中要为当前的View设置焦点,其实就是告诉系统,现在的这个视图要和用户交互,让系统来监听 此视图,因为一个界面中可以显示多个View视图,      andriod

为了避免出现多个view焦点混乱的问题,View类有了焦点属性,以及对应的设置焦点的方法:

setFocusable(true);

true表示当前视图不需要焦点,false表示当前的视图不需要焦点。
2.重新绘制画布的方法,有两个函数,这两个函数都会再次调用onDraw方法

invalidate()、postInvalidate();

这两个方法的区别是:invalidate()方法不能在当前线程中循环调用执行,这里说的线程不是系统 的主UI线程,而是指的子线程(自己创建的线程);而postInvalidate()方法可以 在子线程中循环调用执行,如果当前View创建线程循环重绘画布的话,这两种方法就没有什么区别了,都可以使用。

当画布中任何一个元素发生改变后都要调用这个重绘方法。

posted on 2011-10-18 23:28  Android开发历程  阅读(1216)  评论(0编辑  收藏  举报

导航