博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[安卓] 8、VIEW和SURFACEVIEW游戏框架
阅读量:6515 次
发布时间:2019-06-24

本文共 6965 字,大约阅读时间需要 23 分钟。

 

 


这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制。这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第10行设置显示的VIEW.

1 public class MainActivity extends Activity { 2     @Override 3     public void onCreate(Bundle savedInstanceState) { 4         super.onCreate(savedInstanceState); 5         //隐去标题栏(应用程序的名字)   6         this.requestWindowFeature(Window.FEATURE_NO_TITLE); 7         //隐去状态栏部分(电池等图标和一切修饰部分) 8         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 9         //设置显示View实例10         setContentView(new MyView(this));11     }12 }

 

在MyView中主要是集成View,里面有构造函数、onDraw、onKeyDown、onKeyUp、onTouchEvent等,其中最主要的就是canvas的应用,这里可以吧canvas看做是一张白纸,你可以在上面按照你的意图进行绘制。

1 public class MyView extends View { 2     private int textX = 20, textY = 20; 3  4     /** 5      * 重写父类构造函数 6      * @param context 7      */ 8     public MyView(Context context) { 9         super(context);10         setFocusable(true);11 //        setFocusableInTouchMode(true);12     }13 14     /**15      * 重写父类绘图函数16      */17     @Override18     protected void onDraw(Canvas canvas) {19         //创建一个画笔的实例20         Paint paint = new Paint();21         //设置画笔的颜色22         paint.setColor(Color.WHITE);23         //绘制文本24         canvas.drawText("Game", textX, textY, paint);25         super.onDraw(canvas);26     }27 28     /**29      * 重写按键按下事件函数30      */31     @Override32     public boolean onKeyDown(int keyCode, KeyEvent event) {33         //判定用户按下的键值是否为方向键的“上下左右”键34         if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {35             //“上”按键被点击,应该让文本的Y坐标变小36             textY -= 2;37         } else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {38             //“下”按键被点击,应该让文本的Y坐标变大39             textY += 2;40         } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {41             //“左”按键被点击,应该让文本的X坐标变小42             textX -= 2;43         } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {44             //“右”按键被点击,应该让文本的X坐标变大45             textX += 2;46         }47         //重绘画布48         invalidate();49         //postInvalidate();50         return super.onKeyDown(keyCode, event);51     }52 53     /**54      * 重写按键抬起事件函数55      */56     @Override57     public boolean onKeyUp(int keyCode, KeyEvent event) {58         return super.onKeyUp(keyCode, event);59     }60 61 //    /**62 //     * 重写触屏事件函数63 //     */64 //    @Override65 //    public boolean onTouchEvent(MotionEvent event) {66 //        int x = (int)event.getX();67 //        int y = (int)event.getY();68 //        //玩家手指点击屏幕的动作69 //        if (event.getAction() == MotionEvent.ACTION_DOWN) {70 //            textX = x;71 //            textY = y;72 //            //玩家手指抬起离开屏幕的动作73 //        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {74 //            textX = x;75 //            textY = y;76 //            //玩家手指在屏幕上移动的动作77 //        } else if (event.getAction() == MotionEvent.ACTION_UP) {78 //            textX = x;79 //            textY = y;80 //        }81 //        //重绘画布82 //        invalidate();83 //        //postInvalidate();84 //        return true;85 //    }86     @Override87     public boolean onTouchEvent(MotionEvent event) {88         //获取用户手指触屏的X坐标赋值与文本的X坐标89         textX = (int)event.getX();90         //获取用户手指触屏的Y坐标赋值与文本的Y坐标91         textY = (int)event.getY();92         //重绘画布93         invalidate();94         //postInvalidate();95         return true;96     }97 }

 

surfaceView框架和View框架类似,仍然需要一个MainActivity做相应的设置,然后剩下的任务就交给SurfaceView了:MySurfaceView为构造函数,surfaceCreated视图创建响应该函数,onTouch和onKey都是类似的用户操作响应函数,最重要的是run函数,该函数是线程的run函数,该函数将一直执行不断处理屏幕绘制和逻辑变化,来实现动画与交互的效果。

1 public class MySurfaceView extends SurfaceView implements Callback, Runnable {  2     //用于控制SurfaceView  3     private SurfaceHolder sfh;  4     //声明一个画笔  5     private Paint paint;  6     //文本的坐标  7     private int textX = 10, textY = 10;  8     //声明一条线程  9     private Thread th; 10     //线程消亡的标识位 11     private boolean flag; 12     //声明一个画布 13     private Canvas canvas; 14     //声明屏幕的宽高 15     private int screenW, screenH; 16     /** 17      * SurfaceView初始化函数 18      */ 19     public MySurfaceView(Context context) { 20         super(context); 21         //实例SurfaceHolder 22         sfh = this.getHolder(); 23         //为SurfaceView添加状态监听 24         sfh.addCallback(this); 25         //实例一个画笔 26         paint = new Paint(); 27         //设置画笔颜色为白色 28         paint.setColor(Color.WHITE); 29         //设置焦点 30         setFocusable(true); 31     } 32     /** 33      * SurfaceView视图创建,响应此函数 34      */ 35     @Override 36     public void surfaceCreated(SurfaceHolder holder) { 37         screenW = this.getWidth(); 38         screenH = this.getHeight(); 39         flag = true; 40         //实例线程 41         th = new Thread(this); 42         //启动线程 43         th.start(); 44     } 45     /** 46      * 游戏绘图 47      */ 48     public void myDraw() { 49         try { 50             canvas = sfh.lockCanvas(); 51             if (canvas != null) { 52                 //-----------利用填充矩形的方式,刷屏 53                 绘制矩形 54                 //canvas.drawRect(0,0,this.getWidth(), 55                 //this.getHeight(), paint); 56                 //-----------利用填充画布,刷屏 57                 //        canvas.drawColor(Color.BLACK); 58                 //-----------利用填充画布指定的颜色分量,刷屏 59                 canvas.drawRGB(0, 0, 0); 60                 canvas.drawText("Game", textX, textY, paint); 61             } 62         } catch (Exception e) { 63             // TODO: handle exception 64         } finally { 65             if (canvas != null) 66                 sfh.unlockCanvasAndPost(canvas); 67         } 68     } 69     /** 70      * 触屏事件监听 71      */ 72     @Override 73     public boolean onTouchEvent(MotionEvent event) { 74         textX = (int) event.getX(); 75         textY = (int) event.getY(); 76         return true; 77     } 78     /** 79      * 按键事件监听 80      */ 81     @Override 82     public boolean onKeyDown(int keyCode, KeyEvent event) { 83         return super.onKeyDown(keyCode, event); 84     } 85     /** 86      * 游戏逻辑 87      */ 88     private void logic() { 89     } 90     @Override 91     public void run() { 92         while (flag) { 93             long start = System.currentTimeMillis(); 94             myDraw(); 95             logic(); 96             long end = System.currentTimeMillis(); 97             try { 98                 if (end - start < 50) { 99                     Thread.sleep(50 - (end - start));100                 }101             } catch (InterruptedException e) {102                 e.printStackTrace();103             }104         }105     }106     /**107      * SurfaceView视图状态发生改变,响应此函数108      */109     @Override110     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {111     }112     /**113      * SurfaceView视图消亡时,响应此函数114      */115     @Override116     public void surfaceDestroyed(SurfaceHolder holder) {117         flag = false;118     }119 }

 

 

 

 

本文链接:

更多精彩:

 

转载地址:http://ieafo.baihongyu.com/

你可能感兴趣的文章
dom4j解析XML
查看>>
Oracle DBA课程系列笔记(12_1)
查看>>
mysql5.5源码编译安装详细步骤
查看>>
Oracle RAC Study之--Cache Fusion
查看>>
解决centos 6.6 更换yum 163源报错
查看>>
LNMP组件分离
查看>>
java代码在线生成工具
查看>>
python设计模式(三)--装饰器模式
查看>>
修改nginx的banner信息
查看>>
以写代学: python for循环 range函数 xrange函数
查看>>
linux grep详解
查看>>
tengine配置支持http2
查看>>
Xmanager连接linux服务器图形界面
查看>>
html 打开摄像头操作_转
查看>>
iSCSI之基于用户的认证及基于配置文件创建iSCSI
查看>>
ELK6.5 Nginx 日志搜集-03 kibana 安装
查看>>
Java的new内存机制
查看>>
OneAPM大讲堂 | 谁更快?JavaScript 框架性能评测
查看>>
懒惰、急躁和傲慢(Laziness, Impatience and hubris)
查看>>
解决Handler发送消息时:this message is already in use
查看>>