360°平滑游戏摇杆 Rocker
来源:互联网 发布:js数字正则表达式 编辑:程序博客网 时间:2024/05/01 13:05
public class Rocker extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(new RockerView(this));}private class RockerView extends SurfaceView implements SurfaceHolder.Callback,Runnable{private SurfaceHolder mSurfaceHolder;private Thread mThread;private Canvas mCanvas;private Paint mPaint;private boolean mIsFlag;private float mCircleX=100;private float mCircleY=100;private float mCircleR=50;private float mRockerCircleX=100;private float mRockerCircleY=100;private float mRockerCircleR=20;public RockerView(Context context) {super(context);mSurfaceHolder=this.getHolder();mSurfaceHolder.addCallback(this);mPaint=new Paint();mPaint.setAntiAlias(true);setFocusable(true);setFocusableInTouchMode(true);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mIsFlag=true;mThread=new Thread(this);mThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mIsFlag=false;}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction()==MotionEvent.ACTION_DOWN||event.getAction()==MotionEvent.ACTION_MOVE) {if (Math.sqrt((Math.pow(mCircleX-event.getX(), 2)+Math.pow(mCircleY-event.getY(), 2)))>mCircleR) {double angle=getAngle(mCircleX,mCircleY,event.getX(),event.getY());setRockerXYInCircle(angle);}else {mRockerCircleX=event.getX();mRockerCircleY=event.getY();}return true;}else if (event.getAction()==MotionEvent.ACTION_UP) {mRockerCircleX=mCircleX;mRockerCircleY=mCircleY;return true;}return super.onTouchEvent(event);}private void setRockerXYInCircle(double angle) {mRockerCircleX=(float)(mCircleR*Math.cos(angle))+mCircleX;mRockerCircleY=(float)(mCircleR*Math.sin(angle))+mCircleY;}private double getAngle(float circleX, float circleY, float targetX, float targetY) {float disX=targetX-circleX;float disY=targetY-circleY;float hypotenuse=(float)Math.sqrt(Math.pow(disX, 2)+Math.pow(disY, 2));float cosAngle=disX/hypotenuse;float angle=(float)Math.acos(cosAngle);if (targetY<circleY) {angle=-angle;}return angle;}@Overridepublic void run() {while (mIsFlag) {doDraw();try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private void doDraw() {try {mCanvas=mSurfaceHolder.lockCanvas();if (mCanvas!=null) {mCanvas.drawColor(Color.WHITE);mPaint.setColor(0x70000000);mCanvas.drawCircle(mCircleX, mCircleY, mCircleR, mPaint);mPaint.setColor(0x70ff0000);mCanvas.drawCircle(mRockerCircleX, mRockerCircleY, mRockerCircleR, mPaint);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if (mCanvas!=null) {mSurfaceHolder.unlockCanvasAndPost(mCanvas);}}}}}
问题一:
@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction()==MotionEvent.ACTION_DOWN||event.getAction()==MotionEvent.ACTION_MOVE) {if (Math.sqrt((Math.pow(mCircleX-event.getX(), 2)+Math.pow(mCircleY-event.getY(), 2)))>mCircleR) {double angle=getAngle(mCircleX,mCircleY,event.getX(),event.getY());setRockerXYInCircle(angle);}else {mRockerCircleX=event.getX();mRockerCircleY=event.getY();}return true;}else if (event.getAction()==MotionEvent.ACTION_UP) {mRockerCircleX=mCircleX;mRockerCircleY=mCircleY;return true;}return super.onTouchEvent(event);}这个是当if (event.getAction()==MotionEvent.ACTION_DOWN||event.getAction()==MotionEvent.ACTION_MOVE) 当手指按下和移动的时候,计算摇杆的x和y坐标,当手指抬起的时候恢复和大圆相同的x和y坐标,再进行绘制的时候就会画在中间
问题二:
private void setRockerXYInCircle(double angle) {mRockerCircleX=(float)(mCircleR*Math.cos(angle))+mCircleX;mRockerCircleY=(float)(mCircleR*Math.sin(angle))+mCircleY;}当手指移动的距离大于大圆的半径的时候,要重新计算摇杆的x和y坐标,使其仍然在大圆的圆周上,也就是是大圆圆心和手指所在点的直线与圆周相交的点。
问题三:
private double getAngle(float circleX, float circleY, float targetX, float targetY) {float disX=targetX-circleX;float disY=targetY-circleY;float hypotenuse=(float)Math.sqrt(Math.pow(disX, 2)+Math.pow(disY, 2));float cosAngle=disX/hypotenuse;float angle=(float)Math.acos(cosAngle);if (targetY<circleY) {angle=-angle;}return angle;}这个还不是太理解,看来数学退化了。。。
- 360°平滑游戏摇杆 Rocker
- 360°平滑游戏摇杆(触屏方向导航)
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- (转)【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【Android游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 【ANDROID游戏开发二十四】360°平滑游戏摇杆(触屏方向导航)
- 24—360°平滑游戏摇杆(触屏方向导航)
- Android 360°平滑游戏摇杆(触屏方向导航)
- GameRocker: 360°游戏摇杆
- 360度游戏摇杆
- Android游戏开发之360°半透明摇杆。。。。
- Unity3D 游戏引擎之IOS自定义游戏摇杆与飞机平滑的移动(十一)
- (libgdx小结)游戏摇杆
- libgdx 游戏摇杆
- liggdx 游戏摇杆类
- Android手机游戏摇杆
- 手机游戏的摇杆
- const成员函数内部如何改变成员变量
- 一种测试多线程的类:CountDownLatch
- LPI - Exam 102: Detailed Objectives
- android 各版本源码
- 指针数组和数组指针
- 360°平滑游戏摇杆 Rocker
- nodeJS 中文API node.js 中文文档
- JSP 中文显示乱码解决方案
- 《30天精通iPhone手机编程》-Day14-图片浏览器
- Unicode字符集和多字节字符集关系
- Qt 出现“undefined reference to `vtable for”原因总结 (ZZ)
- 数字图像处理理论课件(清华大学计算机科学与技术系)
- 浅谈c语言中的字符串
- 软工系列之---详细设计