仿别踩白块demo
来源:互联网 发布:淘宝的二手电脑怎么样 编辑:程序博客网 时间:2024/06/08 07:55
别踩白块新鲜出炉,使用的还是SurfaceView。
package com.example.administrator.whitegrid;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.TypedValue;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import java.util.ArrayList;import java.util.List;import java.util.Random;/** * Created by Administrator on 2017/6/8. */public class GridGameView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private boolean isDrawing; private Paint mPaint; /** * 被点击 */ private boolean isTouch; /** * surface持有者 */ private SurfaceHolder mHolder; /** * 当前画布 */ private Canvas mCanvas; /** * view的宽度 */ private int mWidth; /** * View的高度 */ private int mHeight; /** * 每格宽度 */ private int gridWidth; /** * 每格高度 */ private int gridHeight; /** * 每行格子个数 */ private int gridNumX = 5; /** * 每列格子个数 */ private int gridNumY = 5; /** * 偏移量 */ private int mOffSet; /** * 格子集合 */ private List<Integer> grids; /** * 生成随机位置的格子 */ private Random random; /** * 点击位置横坐标 */ private float pointX; /** * 点击位置纵坐标 */ private float pointY; /** * 被点击方块的下标 */ private int touchPosition; /** * 默认宽度设置为300dp */ private static final int DEFAULT_WIDTH = 300; /** * 默认高度设置为400dp */ private static final int DEFAULT_HEIGHT = 400; public GridGameView(Context context) { this(context, null); } public GridGameView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public GridGameView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mHolder = getHolder(); mHolder.addCallback(this); // 设置可以获取焦点 setFocusable(true); // 进入触摸输入模式后,该控件是否还有获得焦点的能力 setFocusableInTouchMode(true); // 是否保持屏幕常亮 setKeepScreenOn(true); random = new Random(); grids = new ArrayList<>(); //初始化一组方块,屏幕外的上方下方个加一个方块 for (int i = 0; i < gridNumY + 2; i++) { grids.add(random.nextInt(gridNumX)); } mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); } /** * 设置一些变量的尺寸 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.AT_MOST) { mWidth = dp2px(DEFAULT_WIDTH); } else { mWidth = Math.max(widthSize, dp2px(DEFAULT_WIDTH)); } if (heightMode == MeasureSpec.AT_MOST) { mHeight = dp2px(DEFAULT_HEIGHT); } else { mHeight = Math.max(heightSize, dp2px(DEFAULT_HEIGHT)); } gridWidth = mWidth / gridNumX; gridHeight = mHeight / gridNumY; setMeasuredDimension(mWidth, mHeight); } @Override public void surfaceCreated(SurfaceHolder holder) { // 开始绘画 isDrawing = true; // 启动绘画线程 new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { isDrawing = false; } @Override public void run() { while (isDrawing) { try { mOffSet++; Thread.sleep(10); draw(); if (mOffSet == gridHeight) { if (grids.get(0) == gridNumX) { //移出屏幕外的黑块到达最大偏移量,游戏继续 mOffSet = 0; grids.remove(0); grids.add(random.nextInt(gridNumX)); } else { //屏幕内的黑块到达最大偏移量,游戏结束 isDrawing = false; } } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 绘图 */ private void draw() { mCanvas = mHolder.lockCanvas(); if (mCanvas != null) { // 设置画布背景为白色 mCanvas.drawColor(0xffffffff); //绘制竖线 drawLineY(); //绘制横线 drawLineX(); //点击事件 eventTouchDown(); //画黑白块 drawGrid(); // 保证每次都将绘制的内容提交到服务器 mHolder.unlockCanvasAndPost(mCanvas); } } /** * 绘制纵向线 */ private void drawLineY() { mCanvas.save(); for (int i = 0; i < gridNumX + 1; i++) { mCanvas.drawLine(gridWidth * i, 0, gridWidth * i, mHeight, mPaint); } } /** * 绘制横向线 */ private void drawLineX() { mCanvas.save(); for (int i = 0; i < gridNumY + 1; i++) { mCanvas.drawLine(0, gridHeight * i + mOffSet, mWidth, gridHeight * i + mOffSet, mPaint); } } /** * 绘制格子 */ private void drawGrid() { mCanvas.save(); mPaint.setColor(Color.BLACK); for (int i = 0; i < grids.size(); i++) { mCanvas.drawRect(grids.get(i) * gridWidth, mHeight - gridHeight * (i + 1) + mOffSet, grids.get(i) * gridWidth + gridWidth, mHeight - gridHeight * i + mOffSet, mPaint); } } /** * 处理点击事件 */ private void eventTouchDown() { if (isTouch) { touchPosition = (int) (mHeight + mOffSet - pointY) / gridHeight; if (pointX - grids.get(touchPosition) * gridWidth > 0 && pointX - grids.get(touchPosition) * gridWidth < gridWidth) { //被点击的方块移出屏幕外 grids.set(touchPosition, gridNumX); } else { //点击白块游戏结束 isDrawing = false; } isTouch = false; } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: pointX = event.getX(); pointY = event.getY(); isTouch = true; break; } return true; } /** * dp转化为px工具 */ private int dp2px(int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics()); }}Activity中,和布局文件直接引用自定义的view,跟上一篇小鸟过柱子的游戏一样,就不贴代码了。
view中的属性都可以通过get、set方法在activity中设置游戏的开始,暂停,方块移动速度,横向纵向方块的数量等。
另外可以加回调接口,监测游戏结束
阅读全文
0 0
- 仿别踩白块demo
- Demo
- demo
- demo
- demo
- demo
- demo
- DEMO
- Demo
- DEMO
- demo
- Demo
- demo
- demo
- Demo
- demo
- demo
- Demo
- spring-boot注解整理
- Android中可以做的两件坏事——破解锁屏密码和获取Wifi密码
- mysql远程连接
- 读白刃underscore疑惑分析--underscore源码学习二
- java中paint()的具体用法(说具体点 一起重写之后的问题 还有有关调用问题)
- 仿别踩白块demo
- 集成zxing二维码,预览变形问题。
- HashMap与HashTable原理及数据结构
- 工欲利其器: sqlyog 数据架构同步
- CSS font-size: em&rem
- CMake问题:The CXX compiler identification is unknown
- can't start git:usr/bin/git
- 怎样根据单列内容新建工作表
- WINDOWS 配置HADOOP遇到的几个问题