当前位置:操作系统 > 安卓/Android >>

android游戏开发(一)简单的图形渲染

android游戏开发一般都是用view或su易做图ceView 这一章我们来学习学习 view或su易做图ceView 的用法 如果渲染出图片
 
我们先看看View
   view类是android的一个超类, 这个类包含了所有的屏幕类型,每一个View都有一个用于绘图的画布,这个画布可以任意扩展. 任何一个view类只需重写onDrae()方法来实现界面显示。
   游戏的核心就是不断的绘图和刷新界面,图片我们通过onDraw方法来绘制,那如何来刷新界面呢, android中提供了ivalidate方法来实现界面刷新,注意 invalidate不能直接在线程中调用(就是不可以再子线程中调用 这个位置各位童鞋要注意喔) 因为它违背了android单线程模型, android ui操作并不是线程安全的,并且这些操作必须在ui线程中执行, 在平时使用中最常见的方式就是 通过 handler来实现ui线程的更新.
下面我们来看看示例 一张图片上下移动的 效果
 这个示例有两个类 
一个gameView 类该类需要继承View类作为游戏界面输出和控制类.
一个是 MainActivity类 该类需要继承Activity 作为程序的入口和刷新我们的视图.
我们先看看gameView类的内容
 
package yxqz.com;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
 
/**
 * android view简单的图片绘制 该类需要继承view 基类
 * @author mahaile
 *
 */
public class GameView extends View {
 Bitmap bitmap_role;
 float width,height;
 float x,y;  //图片渲染所在的屏幕的位置
 int direction=0;  //图片运行方向 控制图片向上 或向下运动
 /**
 * 构造方法
 * @param context
 * @param width 屏幕宽度
 * @param height 屏幕高度
 */
 public GameView(Context context,float width,float height) {
  super(context);
  this.width=width;
  this.height=height;
  //通过BitmapFactory.decodeResource 方法可以自动加载 res/drawable目录下的图片 R.drawable.role参数为android自动生成的图片id
  bitmap_role=BitmapFactory.decodeResource(context.getResources(), R.drawable.role);
  x=width/2-bitmap_role.getWidth()/2;
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  Log.d("GameView","GameView onDraw x is:"+x +"y is:"+y);  //Log类方法用于日志输出
  canvas.drawBitmap(bitmap_role, x, y, null);
  super.onDraw(canvas);
 }
}
 
下面是 MainActivity 类
 
package yxqz.com;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
 
public class MainActivity extends Activity {
    /** Called when the activity is first created. */
 GameView gameView;
 GameSu易做图ceView gameSu易做图ceView;
 
 boolean flag; //线程标示位 当为false时停止刷新界面
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
       
        //通过displayMetrics获取屏幕的宽高
        DisplayMetrics dm = new DisplayMetrics();
  this.getWindowManager().getDefaultDisplay().getMetrics(dm);
  int width = dm.widthPixels;
  int height = dm.heightPixels;
  gameView=new GameView(this,width,height);
        setContentView(gameView);
        flag=true;
        new Thread(new GameThread()).start();
    }
   
    class GameThread implements Runnable{
 
  public void run() {
   while(flag){
    if(gameView.direction==0){
     gameView.y+=0.2;
     if(gameView.y>=gameView.height){
      gameView.direction=1;
     }
    }else{
     gameView.y-=0.2;
     if(gameView.y<=0){
      gameView.direction=0;
     }
    }
    //通知UI线程重绘, gameView的主线程会自动调用onDraw的方法 这点要注意了 喔
    gameView.postInvalidate();
    
    //如果使用 gameView.invalidate(); 方法的话 需要需要把gameView.invalidate()写到 handler 里面  因为它只支持ui主线程中使用   }
  }
  }
    }
}
 
 
上面的实例 简单的讲解了 android View 的使用 下面我们在看看Su易做图ceView 是怎么使用的
Su易做图ceView的特性是:可以在主线程之外的线程向屏幕中绘图,这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高程序的反应速度
有一点需要注意下su易做图ceView 没有OnDraw方法重新 需要自己实现并调用
使用Su易做图ceView 首先需要继承Su易做图ceView 并实现Su易做图ceHolder.Callback接口
实现 Su易做图ceHolder.Callback接口需要实现下面几个接口
 
//在su易做图ce的大小改变时调用  即横竖屏切换的时候调用
public void su易做图ceChanged(Su易做图ceHolder su易做图ceHolder, int format, int width, int height) {}
//在su易做图ce创建的时候调用  这里一般是 启动绘制屏幕线程
public void su易做图ceCreated(Su易做图ceHolder su易做图ceHolder) {}
//在su易做图ce销毁时调用  这里一般做资源销毁等操作
public void su易做图ceDestroyed(Su易做图ceHolder su易做图ceHolder) {}
 
Su易做图ceHolder是su易做图ce的控制器,用来控制su易做图ce。 处理Cavas上面的效果,动画,控制表面,大小,像素等 
这里需要注意几个方法
//给Su易做图ceView当前持有者一个回调对象
(1) abstract void addCallback(Su易做图ceHolder.Callback callback);
//锁定画布,一般在锁定后可以返回画布对象Canvas ,在其上面画图操作
(2) abstract Canvas lockCanvas();
//锁定画布的某个区域进行画图等,因为画完图后,会调用下面的unlockCanvasAndPost来改变显示的内容  针对游戏内存要求高的游戏,可以不用重画rect外区域的像素 可以提高速度
(3) abstract Canvas lockCanvas(Rect rect);
//结束锁定画布,并提交改变
(4) abstract void unlockCanvasAndPost(Canvas canvas);
 使用 su易做图ceView的整个过程 
继承Su易做图ceView并实现Su易做图ceHolder.Callback接口 --> Su易做图ceView.getHolder()获得su易做图ceHolder对象--> Su易做图ceHolder.addCallback(callback)添加回调函数 --> Su易做图ceHolder.lockCanvas()获得Canvas对象并锁定画布 -->
Canvas绘画-->
Su易做图ceHolder.unlockCanvasAndPost(Canvas canvas)--> 结束锁定画图 并提交改变,将图形显示
 
下面我们看看 示例代码 GameSufaceView
 
package yxqz.com;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.Su易做图ceHolder;
import android.view.Su易做图ceView;
import android.view.Su易做图ceHolder.Callback;

/**
 * android su易做图ceview简单的图片绘制
 * @author mahaile
 *
 */
public class GameSu易做图ceView extends Su易做图ceView implements Callback {
 
 boolean flag; //线程标示位 当为

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,