360度游戏摇杆

来源:互联网 发布:吸尘器 除螨仪 知乎 编辑:程序博客网 时间:2024/05/01 20:04

360度 摇杆

public class MySurfaceView extends SurfaceView implements Callback, Runnable {    // 用于控制SurfaceView    private SurfaceHolder sfh;    // 声明一个画笔    private Paint paint;    // 文本的坐标    private int textX = 10, textY = 10;    // 声明一条线程    private Thread th;    // 线程消亡的标识位    private boolean flag;    // 声明一个画布    private Canvas canvas;    // 声明屏幕的宽高    private int screenW, screenH;    // 定义两个圆形的中心点坐标与半径    private float smallCenterX = 120, smallCenterY = 120, smallCenterR = 20;// 小圆半径    private float BigCenterX = 120, BigCenterY = 120, BigCenterR = 40;// 大圆半径    /**     * SurfaceView初始化函数     */    public MySurfaceView(Context context) {        super(context);        // 实例SurfaceHolder        sfh = this.getHolder();        // 为SurfaceView添加状态监听        sfh.addCallback(this);        // 实例一个画笔        paint = new Paint();        // 设置画笔颜色为红        paint.setColor(Color.RED);        // 设置焦点        setFocusable(true);    }    /**     * SurfaceView视图创建,响应此函数     */    @Override    public void surfaceCreated(SurfaceHolder holder) {        screenW = this.getWidth();        screenH = this.getHeight();        flag = true;        // 实例线程        th = new Thread(this);        // 启动线程        th.start();    }    /**     * 游戏绘图     */    public void myDraw() {        try {            canvas = sfh.lockCanvas();            if (canvas != null) {                // -----------利用填充矩形的方式,刷屏                // //绘制矩形                // canvas.drawRect(0,0,this.getWidth(),                // this.getHeight(), paint);                // -----------利用填充画布,刷屏                // canvas.drawColor(Color.BLACK);                // -----------利用填充画布指定的颜色分量,刷屏                // canvas.drawRGB(0, 0, 0);                // canvas.drawText("Game", textX, textY, paint);                // 绘制大圆                canvas.drawColor(Color.WHITE);                //绘制大圆                paint.setAlpha(0x77);                canvas.drawCircle(BigCenterX, BigCenterY, BigCenterR, paint);                //绘制小圆                canvas.drawCircle(smallCenterX, smallCenterY, smallCenterR, paint);            }        } catch (Exception e) {            // TODO: handle exception        } finally {            if (canvas != null)                sfh.unlockCanvasAndPost(canvas);        }    }    /**      * 小圆针对于大圆做圆周运动时,设置小圆中心点的坐标位置     * @param centerX      *            围绕的圆形(大圆)中心点X坐标     * @param centerY      *            围绕的圆形(大圆)中心点Y坐标     * @param R     *               围绕的圆形(大圆)半径     * @param rad      *            旋转的弧度      */    public void setSmallCircleXY(float centerX, float centerY, float R, double rad) {        //获取圆周运动的X坐标           smallCenterX = (float) (R * Math.cos(rad)) + centerX;        //获取圆周运动的Y坐标          smallCenterY = (float) (R * Math.sin(rad)) + centerY;    }    /**     * 触屏事件监听     */    @Override    public boolean onTouchEvent(MotionEvent event) {        //当用户手指抬起,应该恢复小圆到初始位置        if (event.getAction() == MotionEvent.ACTION_UP) {            smallCenterX = BigCenterX;            smallCenterY = BigCenterY;        } else {            int pointX = (int) event.getX();            int pointY = (int) event.getY();            //判断用户点击的位置是否在大圆内   Math.pow(底数,几次方)  根据三角公式 算的   Math.sqrt 开方            if (Math.sqrt(Math.pow((BigCenterX - (int) event.getX()), 2) + Math.pow((BigCenterY - (int) event.getY()), 2)) <= BigCenterR) {                //在圆内                //让小圆跟随用户触点位置移动                smallCenterX = pointX;                smallCenterY = pointY;            } else {                //                setSmallCircleXY(BigCenterX, BigCenterY, BigCenterR, getRad(BigCenterX, BigCenterY, pointX, pointY));            }        }        return true;    }    /**     * 按键事件监听     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        return super.onKeyDown(keyCode, event);    }    /**     * 游戏逻辑     */    private void logic() {    }    @Override    public void run() {        while (flag) {            long start = System.currentTimeMillis();            myDraw();            logic();            long end = System.currentTimeMillis();            try {                if (end - start < 50) {                    Thread.sleep(50 - (end - start));                }            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    /**     * 得到两点之间的弧度     * @param px1    第一个点的X坐标     * @param py1    第一个点的Y坐标     * @param px2    第二个点的X坐标     * @param py2    第二个点的Y坐标     * @return     */    public double getRad(float px1, float py1, float px2, float py2) {        //得到两点X的距离          float x = px2 - px1;        //得到两点Y的距离          float y = py1 - py2;        //算出斜边长          float Hypotenuse = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));        //得到这个角度的余弦值(通过三角函数中的定理 :邻边/斜边=角度余弦值)          float cosAngle = x / Hypotenuse;        //通过反余弦定理获取到其角度的弧度          float rad = (float) Math.acos(cosAngle);        //当触屏的位置Y坐标<摇杆的Y坐标我们要取反值-0~-180          if (py2 < py1) {            rad = -rad;        }        return rad;    }    /**     * SurfaceView视图状态发生改变,响应此函数     */    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width,            int height) {    }    /**     * SurfaceView视图消亡时,响应此函数     */    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        flag = false;    }}
0 0
原创粉丝点击