仿别踩白块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中设置游戏的开始,暂停,方块移动速度,横向纵向方块的数量等。

另外可以加回调接口,监测游戏结束

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中山三院诊疗卡怎么办 工厂办不了环评怎么办 小区移动4g差怎么办 梵妮印台干了怎么办 贴了膏药后过敏怎么办 贴药膏后皮肤痒怎么办 贴完膏药过敏了怎么办 骨折后骨密度低怎么办 食品经营许可证过期了怎么办 40年的产权满后怎么办 五证合一后税务怎么办 互联业务登录页怎么办 vivo音量键坏了怎么办 琴岛通学生卡怎么办 云卡会员删除了怎么办 办健康证没空腹怎么办 办健康证吃饭了怎么办 发票盖了财务章怎么办 发票盖成公章了怎么办 发票上盖了公章怎么办 进京证怎么办在哪里办 去北京没进京证怎么办 单位的车怎么办进京证 房贷合同丢了怎么办 农合医疗卡丢失怎么办 手指断了怎么办能好吗? 被劳务派遣公司骗了怎么办 餐饮服务许可证过期了怎么办 中行u盾证书过期怎么办 84消毒液吸多了怎么办 八四消毒液烧手怎么办 怀孕了下身痒怎么办啊 4s店态度差怎么办 小区的卡丢了怎么办 开老板的车撞了怎么办 车后保险杠撞裂怎么办 车到期了忘了审怎么办 改过气的车费油怎么办 车内容易进灰尘怎么办 东风天龙油耗高怎么办 国六出来了国五怎么办