package com.imps.tabletennis.tranning; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.util.Log; public class Cue { float x; float y; float rotateX; float rotateY; private float angdeg=0; float width; float height; float disWithBall=Constant.DIS_WITH_BALL; Bitmap bitmap; Ball mainBall; private boolean showCueFlag=true; private final float angleSpanSlow=0.2f; private final float angleSpanFast=1f; private boolean aimFlag=true; private final float lineLength=Table.tableAreaWidth; private final float backSpan=3; private final float forwardSpan=10; private final float maxDis=50; private float span=backSpan; private boolean showingAnimFlag=false; private boolean PrintTrace = false; public Cue(Bitmap bitmap,Ball mainBall) { this.bitmap=bitmap; this.mainBall=mainBall; this.width=bitmap.getWidth(); this.height=bitmap.getHeight(); } public void drawSelf(Canvas canvas,Paint paint) { if(!showCueFlag){ return; } this.rotateX=this.width+this.disWithBall+Ball.r; this.rotateY=this.height/2; float startX=(float) (mainBall.getX()+Constant.X_OFFSET+Ball.r); float startY=(float) (mainBall.getY()+Constant.Y_OFFSET+Ball.r); float angle = 0.0f; if(mx!=startX) { angle =(float) (180.0/3.1415926* Math.atan((my-startY)/(mx-startX))); if(mx-startX<0) { angle += 180.0; } } x=mainBall.getX()-width-disWithBall; y=mainBall.getY()+Ball.r-height/2; Matrix m1=new Matrix(); m1.setTranslate(x+Constant.X_OFFSET,y+Constant.Y_OFFSET); Matrix m2=new Matrix(); m2.setRotate(angle, rotateX, rotateY); Matrix mz=new Matrix(); mz.setConcat(m1, m2); canvas.drawBitmap(bitmap, mz,paint); canvas.save(); canvas.clipRect(Table.lkx+Constant.X_OFFSET, Table.ady+Constant.Y_OFFSET, Table.efx+Constant.X_OFFSET, Table.jgy+Constant.Y_OFFSET); // float angrad=(float)(3.1415926*180/angdeg);//(float) Math.toRadians(angdeg); float angrad=(float)(3.1415926*angdeg/180.0); //float startX=(float) (mainBall.getX()+Constant.X_OFFSET+Ball.r+Ball.r*Math.cos(angrad)); //float startY=(float) (mainBall.getY()+Constant.Y_OFFSET+Ball.r+Ball.r*Math.sin(angrad)); float stopX=startX+(float)(lineLength*Math.cos(angrad)); float stopY=startY+(float)(lineLength*Math.sin(angrad)); //float stopX = paint.setColor(Color.YELLOW); paint.setAlpha(240); //canvas.drawLine(startX, startY, stopX, stopY, paint); canvas.drawLine(startX, startY, mx, my, paint); if(PrintTrace)System.out.println("Cur line position("+startX+","+startY+")"+"to("+stopX+","+stopY+")"); canvas.restore(); paint.setAlpha(255); angdeg = angle; PrintTrace = false; } private float mx=Table.AllBallsPos[1][0]+Constant.X_OFFSET+Constant.BALL_SIZE/2; private float my=Table.AllBallsPos[1][1]+Constant.Y_OFFSET+Constant.BALL_SIZE/2; public void calcuAngle(float pressX,float pressY) { float dirX=pressX-(mainBall.getX()+Ball.r+Constant.X_OFFSET); float dirY=pressY-(mainBall.getY()+Ball.r+Constant.Y_OFFSET); if(!aimFlag){ dirX = -dirX; dirY = -dirY; } mx = pressX;my = pressY; if(dirY>=0) { angdeg=(float)((Math.atan(-dirX/dirY)+Math.PI/2)*180/3.1415926);//(float) Math.toDegrees((Math.atan(-dirX/dirY)+Math.PI/2)); } else if(dirY<0) { angdeg=(float)((Math.atan(-dirX/dirY)+Math.PI*3/2)*180/3.1415926);//(float) Math.toDegrees((Math.atan(-dirX/dirY)+Math.PI*3/2)); } PrintTrace = true; } public void rotateLeftSlowly(){ angdeg+=angleSpanSlow; } public void rotateRightSlowly(){ angdeg-=angleSpanSlow; } public void rotateLeftFast(){ angdeg+=angleSpanFast; } public void rotateRightFast(){ angdeg-=angleSpanFast; } public float changeDisWithBall() { if(disWithBall>=maxDis){ span=-forwardSpan; } disWithBall+=span; return disWithBall; } public void resetAnimValues(){ disWithBall=Constant.DIS_WITH_BALL; span=backSpan; } public float getAngle() { return angdeg; } public boolean isShowCueFlag() { return showCueFlag; } public void setShowCueFlag(boolean showCueFlag) { this.showCueFlag = showCueFlag; } public boolean isAimFlag() { return aimFlag; } public void setAimFlag(boolean aimFlag) { this.aimFlag = aimFlag; } public boolean isShowingAnimFlag() { return showingAnimFlag; } public void setShowingAnimFlag(boolean showingAnimFlag) { this.showingAnimFlag = showingAnimFlag; } }