仿别踩白块demo

别踩白块新鲜出炉,使用的还是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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值