360度游戏摇杆
来源:互联网 发布:吸尘器 除螨仪 知乎 编辑:程序博客网 时间:2024/05/01 20:04
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
- 360度游戏摇杆
- GameRocker: 360°游戏摇杆
- AS3.0做游戏的360度摇杆
- 360°平滑游戏摇杆 Rocker
- (libgdx小结)游戏摇杆
- libgdx 游戏摇杆
- liggdx 游戏摇杆类
- Android手机游戏摇杆
- 手机游戏的摇杆
- 360°平滑游戏摇杆(触屏方向导航)
- Android游戏开发之360°半透明摇杆。。。。
- cocos2d-x游戏摇杆开发
- Arduino使用游戏摇杆joystick
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- (转)【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【ANDROID游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 自定义View之圆环进度条
- Android 内存笔记及如何高效加载大分辨率图片
- php的内存限制值
- HDU 2058 等差数列求和
- 地方
- 360度游戏摇杆
- java类
- #168 – 类的继承关系
- [乐意黎原创] 使用Selenium webdriver+Firefox浏览器来登录新浪微博
- 喷水装置(一)
- Ubuntu14.04系统中配置Opencv 3.0
- 多GPU运行Deep Learning 和 并行Deep Learning(待续)
- Maven学习笔记(1)
- 走进码农新时代