aa小游戏,旋转的小球

surfaceView使用,制作小游戏

自定义View,游戏界面

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
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;

/**
 * Created by Administrator on 2017/6/13.
 */

public class aaGameBackGround extends SurfaceView implements SurfaceHolder.Callback, Runnable {

    private int screenW;        //屏幕宽度
    private int screenH;        //屏幕高度
    private Paint paint;        //定义画笔
    private float cx;
    private float cy;
    private List<a> balls;
    private Paint backPaint;
    private TextPaint textPaint;
    private int radius = 10;      //小球半径
    private float centerR;          //中心圆半径
    private int speed = 0;
    private boolean isGo = false;
    private boolean isOver = false;
    //定义颜色数组
    private int colorArray[] = {Color.BLACK, Color.BLACK, Color.GREEN, Color.YELLOW, Color.RED};
    private int paintColor = colorArray[0]; //定义画笔默认颜色
    private Canvas canvas = null; //定义画布
    private Thread th = null;     //定义线程
    private SurfaceHolder sfh = null;

    public aaGameBackGround(Context context) {
        this(context, null);
    }

    public aaGameBackGround(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public aaGameBackGround(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        /**备注1:在此处获取屏幕高、宽值为0,以为此时view还未被创建,
         * 在接口Callback的surfaceCreated方法中view才被创建
         */
            /*screenW = getWidth();
            screenH = getHeight();*/

        //初始化画笔
        initPaint();
        sfh = getHolder();
        sfh.addCallback(this);
        th = new Thread(this);
        balls = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            balls.add(new a(i + 1, i * (360 / 3)));
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //获取屏幕宽度
        screenW = getWidth();
        //获取屏幕高度
        screenH = getHeight();
        //获取圆环半径
        centerR = (screenW - 6 * radius) / 2;
        //启动绘图线程
        th.start();
    }

    private void initPaint() {
        paint = new Paint();
        backPaint = new Paint();
        textPaint = new TextPaint();
        //设置消除锯齿
        paint.setAntiAlias(true);
        backPaint.setAntiAlias(true);
        textPaint.setAntiAlias(true);
        //设置画笔颜色
        paint.setColor(paintColor);
        backPaint.setColor(paintColor);
        textPaint.setColor(0xffffffff);
        textPaint.setTextSize(25);
    }

    @Override
    public void run() {
        while (!isOver) {
            try {
                myDraw();
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 备注2:切记,在自定SurfaceView中定义的myDraw方法,自定义View(继承自View的子类)中的onDraw方法
     * 完全是两码事:
     * 1)自定义View(继承自View的子类)中的onDraw方法是重写父类的onDraw方法,在调用postInvalidate后会自动回调该onDraw()方法。
     * 2)此处的myDraw方法需要手动调用,所以此处故意将方法命名为myDraw,突出为该方法是自己写的,非重写父类的方法 。
     */
    //重写onDraw方法实现绘图操作
    protected void myDraw() {

        //获取canvas实例
        canvas = sfh.lockCanvas();
        if (canvas != null) {
            //将屏幕设置为白色
            canvas.drawColor(Color.WHITE);
            QUA();
            //绘制中心大圆
            canvas.drawCircle(screenW / 2, screenH / 2, dp2px(getContext(), 30), paint);

            if (isGo) {
                canvas.drawCircle(screenW / 2, screenH / 5 * 3 + centerR - (speed++ * 4), dp2px(getContext(), 10), paint);
                if (screenH / 5 * 3 + centerR - (speed++ * 4) <= screenH / 2 + centerR) {
                    isGameOver();
                    balls.add(new a(balls.size() + 1, 270));
                    isGo = false;
                    speed = 0;
                }
            } else {
                canvas.drawCircle(screenW / 2, screenH / 5 * 3 + centerR, dp2px(getContext(), 10), paint);
            }

            //将画好的画布提交
            sfh.unlockCanvasAndPost(canvas);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                goBall();
                break;
            case MotionEvent.ACTION_UP:
                break;
        }

        return true;
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    //发射小球
    public void goBall() {
        if ((centerR * 3) - (speed++ * 5) > centerR) {
            isGo = true;
        }
    }

    /**
     * 碰撞判断
     */
    public void isGameOver() {
        for (int i = 0; i < balls.size(); i++) {
            cx = screenW / 2 - balls.get(i).getX();
            cy = screenH / 2 + centerR - balls.get(i).getY();
            if (Math.sqrt(cx * cx + cy * cy) <= 2 * radius) {
                isOver = true;
                canvas.drawColor(0x88ff0000);
            }
        }
    }

    public float getSin(int angle) {
        return (float) Math.sin(angle * Math.PI / 180);
    }

    public float getCos(int angle) {
        return (float) Math.cos(angle * Math.PI / 180);
    }

    //绘制图形
    public void QUA() {

        for (int i = 0; i < balls.size(); i++) {
            balls.get(i).setAngle(balls.get(i).getAngle() + 1);
            balls.get(i).setY(screenH / 2 - centerR * getSin(balls.get(i).getAngle()));
            balls.get(i).setX(screenW / 2 - centerR * getCos(balls.get(i).getAngle()));
            //绘制小球连线
            canvas.drawLine(balls.get(i).getX(), balls.get(i).getY(), screenW / 2, screenH / 2, backPaint);
            //绘制小圆作为小球
            canvas.drawCircle(balls.get(i).getX(), balls.get(i).getY(), dp2px(getContext(), radius), paint);
            //绘制小球数字
            canvas.drawText(balls.get(i).getId() + "", balls.get(i).getX() - textPaint.measureText(balls.get(i).getId() + "") * 0.5f, balls.get(i).getY() + textPaint.getFontMetrics().bottom * 1.5f, textPaint);
        }
    }

    /**
     * dp转化为px工具
     */
    private int dp2px(Context context, int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                context.getResources().getDisplayMetrics());
    }

    /**
     * 内部类,小球实体类
     */
    class a {
        private int id;//小球id
        private int angle;//角度
        private float x;//x座标
        private float y;//y座标

        public a(int id, int angle) {
            this.id = id;
            this.angle = angle;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getAngle() {
            return angle;
        }

        public void setAngle(int angle) {
            this.angle = angle;
        }

        public float getX() {
            return x;
        }

        public void setX(float x) {
            this.x = x;
        }

        public float getY() {
            return y;
        }

        public void setY(float y) {
            this.y = y;
        }
    }

}
Activity中直接调用游戏界面,设置禁止横屏。ok,又一个火及一时的小游戏诞生。微笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章