package com.peiandsky; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnTouchListener; /*开发游戏的时候必定有一个'画板',在上面不断的画图和更新,达到游戏场面 * 这里的'画板',我们采用了继承surfaceView,来实现*/ public class MenuView extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener { private DDZ ddz; SurfaceHolder holder; Canvas canvas; boolean threadFlag = true; Bitmap back; private int x = 270; private int y = 50; private Bitmap[] menuItems; /*提供一个构造函数,new的时候产生的实例就会具有参数列表的属性 * 参数:context 这里解释一下,这个参数表示context(上下文)调用MenuView的实例, * 比如我们常看到Toast(this)之类的。这里其实是用this(当前activity)代替了context * ddz这个参数是为了getResource()。貌似是因为activity下的次方法返回的才是资源 * */ public MenuView(Context context, DDZ ddz) { super(context); this.ddz = ddz; //new一个位图的数组 menuItems = new Bitmap[5]; holder = getHolder(); /*将图片分解成位图,这应该是计算机可识别的二进制数据吧 * 从descode的字面上看应该是反编码*/ back = BitmapFactory .decodeResource(ddz.getResources(), R.drawable.menu); menuItems[0] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu1); menuItems[1] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu2); menuItems[2] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu3); menuItems[3] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu4); menuItems[4] = BitmapFactory.decodeResource(ddz.getResources(), R.drawable.menu5); // for(int i=0;i<menuItems.length;i++) // { // menuItems[0]=BitmapFactory.decodeFile("menu"+(i+1)+".png"); // } /* *每个surfaceView当中都有一个surface,surfaceView提供精细绘制surface的方法,可以通过它来改变surface的大小,格式等 *surfaceHolder是为surfaceView提供的一个接口类, 方便实现对surface的控制 *给Holder加一个回调接口,这个'回调接口应该就是指SurfaceHolder.Callback' *依照我的理解,就是给holder实现了callback的以下三个方法*/ this.getHolder().addCallback(this); //监听触摸事件 this.setOnTouchListener(this); } /* * 因为存在主线程UI线程,又另起一个线程来实现绘画,所以势必会两个线程同时共享一块surface内存 * 为了避免UI线程在绘图期间对surface的操作,我们通过lockCanvas对绘图的画布来加锁,直到解锁之后 * 才让出线程*/ @SuppressLint("WrongCall") Thread menuThread = new Thread() { @Override public void run() { while (threadFlag) { try { //给画布加锁 canvas = holder.lockCanvas(); //给onDraw方法加锁,在解锁之前其它线程不能修改此处内存 synchronized (this) { onDraw(canvas); } // System.out.println("menuThread"); } finally { //给画布解锁 holder.unlockCanvasAndPost(canvas); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }; /*绘图方法,在这里实现画布上的图像 * 绘制*/ @Override protected void onDraw(Canvas canvas) { //画笔 Paint paint = new Paint(); //先画个背景 canvas.drawBitmap(back, 0, 0, paint); //利用循环递加的方式,绘制出其它按钮的图像 for (int i = 0; i < menuItems.length; i++) { canvas.drawBitmap(menuItems[i], x, y + i * 43, paint); } // paint.setColor(Color.WHITE); // paint.setTextSize(32); // canvas.drawText("开始游戏", 158, 91, paint); // canvas.drawText("游戏帮助", 158, 121, paint); // canvas.drawText("关于游戏", 158, 151, paint); } /*关于callBack中方法触发的时机 * surfaceChange在surface大小等的改变时触发*/ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override /*在surface创建时激发,一般在这里调用过绘图的线程 * 这里用到标志位threadFlag*/ public void surfaceCreated(SurfaceHolder holder) { threadFlag = true; menuThread.start(); System.out.println("surfaceCreated"); } /*销毁时激发,一般在这里对绘图线程停止,释放*/ @Override public void surfaceDestroyed(SurfaceHolder holder) { threadFlag = false; boolean retry = true; while (retry) {// 循环 try { menuThread.join();// 等待线程结束 retry = false;// 停止循环 } catch (InterruptedException e) { }// 不断地循环,直到刷帧线程结束 } } /*监听触摸事件*/ @Override public boolean onTouch(View v, MotionEvent event) { //获取触摸的坐标 int ex = (int) event.getX(); int ey = (int) event.getY(); System.out.println(event.getX() + "," + event.getY()); int selectIndex = -1; for (int i = 0; i < menuItems.length; i++) { System.out.println(x+" "+(y+i*43)); if (Poke.inRect(ex, ey, x, y + i * 43, 125, 33)) { selectIndex = i; break; } } System.out.println(selectIndex); switch (selectIndex) { case 0: ddz.handler.sendEmptyMessage(DDZ.GAME); break; case 1: break; case 2: break; case 3: break; case 4: ddz.finish(); break; } return super.onTouchEvent(event); } }
相关推荐
这份"Linux源代码完整注释"提供了对原始版本Linux内核的深入理解和学习的机会。对于任何想要探索操作系统底层运行方式,或者打算进行系统级编程和驱动开发的开发者来说,这都是一个宝贵的资源。 Linux的源代码包含...
matlab怎样注释一段代码Matlab代码分析器 MATLAB附带了非常重要的工具MLINT,它可以检查代码中的常见缺陷。 经验表明,这些提示对于清理MATLAB代码和防止简单错误非常有帮助。 至关重要的是,MLINT不是样式检查器。 ...
matlab怎样注释一段代码pet 新的python参数探索工具包: pypet管理python中任何数值模拟的参数空间的探索,从而为您将数据存储到HDF5文件中。 此外, pypet提供了一个新的数据容器,可让您从一个来源访问所有参数和...
这种方式可以用来注释一段代码块,例如: ```java /* 查找数组中的元素 折半法:前提是数组是按大小顺序排列好的, 用查找的值和中间值比较,大则和下一半中间值比依次,小则和上一半中间值比,找到则返回。 小...
3. 块注释符:%{ 和 %} 被用作块注释符,可以注释一段代码。 4. 多行注释:可以使用 %{ 和 %} 或者 if 0...end 技巧来注释多行代码。 二、调试技巧 1. 中断执行:Ctrl+C 可以中断正在执行的操作。 2. 查看当前 ...
6. **内联注释**:在代码行尾部添加简短的注释,例如快速说明某段代码的目的。 7. **文件头注释**:在每个源文件顶部插入的通用注释,通常包含版权信息、许可证声明等。 在`codetemplates.xml`中,这些模板以XML...
- **示例**:“]9 â$ &]9s+â$|É ” 这段代码可能涉及到了某种类型的锁机制或同步原语的实现。 ### 总结 通过对“Linux内核代码注释”的分析可以看出,注释不仅覆盖了内核的基本功能模块(如...
这个压缩包包含了小米便签应用的完整源代码,并且每段代码都有详细的注释,使得初学者能够更好地理解和学习代码的实现逻辑。 在Java编程中,源代码是程序员用人类可读的语言编写的程序文本,它描述了计算机应该如何...
* 这是一个多行注释示例,用于详细介绍某段代码的作用、算法思路等 */ ``` 3. Javadoc注释:以`/**`开始,`*/`结束,主要用于生成API文档,格式严谨,结构清晰: ```java /** * 这是一个Javadoc注释,用于描述类...
然而,在某些情况下,例如在进行代码混淆、版权保护或优化编译效率时,保留源代码中的注释可能会成为一种不必要的负担。为了适应这些情况,一种专门用于清除C、C++和Java源代码中注释的工具应运而生。本文将深入探讨...
例如,你可以选择一段代码,然后使用快捷键或菜单选项将其转换为注释或取消注释。 2. 版本控制工具: Git等版本控制工具在合并代码时,有时会遇到冲突,这时可以使用其内置的命令或第三方工具来帮助解决,这些工具...
这种注释方式非常适合用来描述一段较长的代码块或者复杂的逻辑。例如: ```sql /* 把对Student表和Course表的全部权限授予用户U2和U3 GRANT ALL PRIVILIGES www.jb51.net ON TABLE Student, Course TO U2...
需要编写一个简单的词法分析器,逐字符扫描代码,遇到`//`或`/*`时开启注释状态,直到遇到相应的结束符才关闭。这需要对编译原理有一定的理解。 在实际操作中,如果已经有现成的工具,比如`quzhushi.exe`和`...
通过`#define`关键字,我们可以定义一个标识符(宏名)来代表一个常量、表达式或者是一段代码。例如,定义一个简单的宏可以这样写: ```c #define PI 3.14159 ``` 在代码中,每次遇到`PI`时,编译器都会将其替换为...
通过这个插件,你可以轻松地选中需要注释的代码段,点击相应的按钮,即可批量添加或移除注释,提升了编程的流畅性。 该插件还支持鼠标中间滚轮滚动功能,这意味着当用户使用滚轮浏览代码时,代码窗口会随着滚轮的...
例如,很多团队使用“TODO”来表示一段需要额外工作的代码。 9. Comment code while writing it(写代码的同时,完成注释) 写代码的同时添加注释,因为此时你的思路最为清晰。如果你把注释的任务留到最后,那么你...
此外,即使对于单个开发者,过一段时间后重新查看自己的代码,有注释也会使理解过程更加顺畅。 其次,良好的注释有助于预防和定位错误。当程序出现异常或bug时,注释可以提供上下文信息,帮助开发者更快地定位问题...
在编程领域,注释是代码中不可或缺的一部分,它有助于提高代码的可读性和维护性。然而,在某些情况下,我们可能需要移除代码中的注释,比如为了混淆代码、减少编译时间或者创建精简版的库。这个"Qt编写移除C++代码...
matlab把一段代码全作为注释BestLeetCode 它是什么? 这是针对LeetCode.com中的问题集的非正式FAST(est)C ++解决方案。 我们希望该存储库可以帮助人们编写灵活的程序。 警告:此存储库以速度为目标。 有些解决方案...
标题中的“注释了段代码原本打印正常的画面打印错乱了”表明问题可能与程序的输出有关,可能是由于代码的某部分被注释掉后,导致了程序在显示或打印时出现了异常。这种情况通常涉及到输入/输出处理、字符编码、缓冲...