游戏开发基础part5--剪切区域
剪切区域在游戏开发中也是画布很常用的一个函数,是游戏开发需要重点掌握的知识点。
自己在学习第5章的时候,就体会到剪切的用处。剪切区域呢,也称可视区域,是由画布进行设置的;它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域以外,绘制的任何内容都将看不到;这是很有趣的事情,哈哈,哪里有趣,白痴。
新建项目:ClipCanvasProject,还是在SurfaceView游戏框架下进行开发。
剪切区域内容不多,就是一个函数:
clipRect(int left, int top, int right, int bottom)
作用:为画布设置矩形可视区域,(当然还有绘制圆形的函数)
第一、二个参数:可视区域的左上角坐标
第三、四个参数:可视区域的右下角坐标
因为设置可视区域是对整个画布进行操作,所以应该在绘制之前save一下,绘制完后再restore一下。
就是这样:
canvas,save();
canvas.clipRect(0,0,20,20);
canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);
canvas.restore();
当然设置可视区域不仅仅只有设置矩形可视区域,画布还提供了其他两种设置可视区域的方法:
1.利用Path来设置可视区域的形状。
clipPath(Path path)
作用:为画布设置可视区域
参数:Path实例
2.利用Region来对画布设置可视区域。
clipRegion(Region region)
作用:为画布设置可视区域
参数:Region实例
Region这个类:表示区域的集合
常用函数:
op(Rect rect,Op op)
作用:设置区域块
第一个参数:Rect实例
第二个参数:Region.Op静态值,表示区域块的显示方式。
显示方式:
Region.Op.UNION:区域全部显示
Region.Op.INTERSECT:区域的交集显示;
Region.Op.XOR:不显示交集区域
实例代码:
==>MySurfaceView.java
package com.clipCanvas;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements Callback,Runnable {
//用于控制SurfaceView
private SurfaceHolder sfh;
//声明一个画笔
private Paint paint;
//声明一个线程
private Thread th;
//线程消亡的标志位
private boolean flag;
//声明一个画布
private Canvas canvas;
//声明屏幕的宽高
private int screenW,screenH;
//声明一个位图
private Bitmap bmp;
/**
* SurfaceView
*
*/
public MySurfaceView(Context context){
super(context);
//实例SurfaceHolder
sfh = this.getHolder();
//为SurfaceView添加状态监听
sfh.addCallback(this);
//实例一个画笔
paint = new Paint();
//设置画笔颜色为白色
paint.setColor(Color.WHITE);
//设置焦点
setFocusable(true);
//生成一张位图
bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.image);
}
/**
* Surfaceview 视图创建,响应此寒素
*
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
screenW = this.getWidth();
screenH = this.getHeight();
flag = true;
//实例线程
th = new Thread(this);
//启动线程
th.start();
}
/**
* 游戏绘图
*/
public void myDraw(){
try{
canvas = sfh.lockCanvas();
if(canvas != null){
//刷屏
canvas.drawColor(Color.BLACK);
canvas.save();
/*canvas.clipRect(0,0,20,20);
canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), paint);
canvas.drawBitmap(bmp, 0, 0, paint);
*/
/*----利用Path来设置可视区域的形状
Path path = new Path();
path.addCircle(30, 30, 30, Direction.CCW);
canvas.clipPath(path);
canvas.drawBitmap(bmp, 30, 30, paint);
*/
//-----利用Regin来对画布设置可视区域
Region region = new Region();
region.op(new Rect(20,20,100,100), Region.Op.UNION);
region.op(new Rect(40,20,80,150), Region.Op.XOR);
canvas.clipRegion(region);
canvas.drawBitmap(bmp, 0, 0, paint);
canvas.restore();
}
} catch(Exception e){
}finally{
if(canvas != null)
sfh.unlockCanvasAndPost(canvas);
}
}
/**
* 触屏事件的监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return true;
}
/**
* 按键事件的监听
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
return super.onKeyDown(keyCode, event);
}
/**
* 游戏逻辑
*/
private void logic(){
}
@Override
public void run() {
// TODO Auto-generated method stub
while(flag){
long start = System.currentTimeMillis();
myDraw();
logic();
long end = System.currentTimeMillis();
try{
if(end - start < 50){
Thread.sleep(50 - (end - start));
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
/**
* SurfaceView视图状态发生改变,响应此函数
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
/**
* SurfaceView视图消亡时,响应此函数
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
flag = false;
}
}