Java 我如何链接这两个类,使我的球员移动时,操纵杆从另一个角度是在位置上

Java 我如何链接这两个类,使我的球员移动时,操纵杆从另一个角度是在位置上,java,android,Java,Android,我有一个操纵杆类和一个gameview类。它们都有自己的曲面视图,我使用了一个约束布局,在将活动主视图设置为内容视图时显示了这两个视图 当操纵杆移动时,如何更改gameview类中的变量 我尝试将操纵杆类放在gameview类中,但当位置改变时,我无法重新绘制操纵杆 我尝试过使用回调,但我得到一个空指针,因为gameview不在操纵杆的上下文中 public class MainActivity extends Activity implements Controller.ControllerL

我有一个操纵杆类和一个gameview类。它们都有自己的曲面视图,我使用了一个约束布局,在将活动主视图设置为内容视图时显示了这两个视图

当操纵杆移动时,如何更改gameview类中的变量

我尝试将操纵杆类放在gameview类中,但当位置改变时,我无法重新绘制操纵杆

我尝试过使用回调,但我得到一个空指针,因为gameview不在操纵杆的上下文中

public class MainActivity extends Activity implements Controller.ControllerListener {

GameView gameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);

       Controller controller = new Controller(this);

       setContentView(R.layout.activity_main);




    }


    @Override
    public void onControllerMoved(float xPercent, float yPercent, int id) {

    }
}

  public void setupDimensions()
    {
        centerX = getWidth() / 2;
        centerY = getHeight() / 2;
        baseRadius = Math.min(getWidth(), getHeight()) / 3;
        hatRadius = Math.min(getWidth(), getHeight()) / 5;
    }

    public Controller(Context context)
    {
        super(context);
        getHolder().addCallback(this);
        setOnTouchListener(this);
       if(context instanceof ControllerListener)
            ControllerCallback = (ControllerListener) context;
    }


    public void drawController(float newX, float newY)
    {

        if(getHolder().getSurface().isValid())
        {

            myCanvas = this.getHolder().lockCanvas(); //Stuff to draw
            Paint colors = new Paint();

             myCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // Clear the BG
             myCanvas.drawColor(Color.WHITE);
            //First determine the sin and cos of the angle that the touched point is at relative to the center of the Controller
            float hypotenuse = (float) Math.sqrt(Math.pow(newX - centerX, 2) + Math.pow(newY - centerY, 2));
            float sin = (newY - centerY) / hypotenuse; //sin = o/h
            float cos = (newX - centerX) / hypotenuse; //cos = a/h

            //Draw the base first before shading
            colors.setARGB(255, 100, 100, 100);
            myCanvas.drawCircle(centerX, centerY, baseRadius, colors);
            for(int i = 1; i <= (int) (baseRadius / ratio); i++)
            {
                colors.setARGB(150/i, 255, 0, 0); //Gradually decrease the shade of black drawn to create a nice shading effect
                myCanvas.drawCircle(newX - cos * hypotenuse * (ratio/baseRadius) * i,
                        newY - sin * hypotenuse * (ratio/baseRadius) * i, i * (hatRadius * ratio / baseRadius), colors); //Gradually increase the size of the shading effect
            }

            //Drawing the Controller hat
            for(int i = 0; i <= (int) (hatRadius / ratio); i++)
            {
                colors.setARGB(255, (int) (i * (255 * ratio / hatRadius)), (int) (i * (255 * ratio / hatRadius)), 255); //Change the Controller color for shading purposes
                myCanvas.drawCircle(newX, newY, hatRadius - (float) i * (ratio) / 2 , colors); //Draw the shading for the hat
            }

            getHolder().unlockCanvasAndPost(myCanvas); //Write the new drawing to the SurfaceView
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        setupDimensions();
        drawController(centerX, centerY);
    }

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

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    public boolean onTouch(View v, MotionEvent e)
    {
        if(v.equals(this))
        {
            if(e.getAction() != e.ACTION_UP)
            {
                float displacement = (float) Math.sqrt((Math.pow(e.getX() - centerX, 2)) + Math.pow(e.getY() - centerY, 2));
                if(displacement < baseRadius)
                {
                    drawController(e.getX(), e.getY());
                    ControllerCallback.onControllerMoved((e.getX() - centerX)/baseRadius, (e.getY() - centerY)/baseRadius, getId());
                }
                else
                {
                    float ratio = baseRadius / displacement;
                    float constrainedX = centerX + (e.getX() - centerX) * ratio;
                    float constrainedY = centerY + (e.getY() - centerY) * ratio;
                    drawController(constrainedX, constrainedY);
                    ControllerCallback.onControllerMoved((constrainedX-centerX)/baseRadius, (constrainedY-centerY)/baseRadius, getId());
                }
            }
            else
                drawController(centerX, centerY);
            ControllerCallback.onControllerMoved(0,0,getId());
        }
        return true;
    }

    public interface ControllerListener
    {
        void onControllerMoved(float xPercent, float yPercent, int id);


    }




}

public class GameView extends SurfaceView implements SurfaceHolder.Callback {

    private MainThread thread;


    private Bitmap playerBMP = BitmapFactory.decodeResource(getResources(),R.drawable.stickman2);


    public Player player;



    public GameView(Context context){
        super(context);


        getHolder().addCallback(this);

        thread = new MainThread(getHolder(), this);


        player = new Player(playerBMP,50,50,0,0,0,0);


        setFocusable(true);
    }



    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {


        thread.setRunning(true);
        thread.start();



    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        boolean retry = true;
        while (retry){
            try{
                thread.setRunning(false);
                thread.join();
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            retry = false;
        }

    }





    @Override
    public boolean onTouchEvent(MotionEvent e) {



        return true;
    }





    public void update(){



        player.move();

    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawColor(Color.WHITE);

        player.draw(canvas);



    }







}
public类MainActivity扩展活动实现Controller.ControllerListener{
GameView GameView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,WindowManager.LayoutParams.FLAG_全屏);
this.requestWindowFeature(Window.FEATURE\u NO\u TITLE);
控制器=新控制器(此);
setContentView(R.layout.activity_main);
}
@凌驾
控件已移动的公共void(float xPercent、float yPercent、int id){
}
}
公共空间设置维度()
{
centerX=getWidth()/2;
centerY=getHeight()/2;
baseRadius=Math.min(getWidth(),getHeight())/3;
hatRadius=Math.min(getWidth(),getHeight())/5;
}
公共控制器(上下文)
{
超级(上下文);
getHolder().addCallback(此);
setOnTouchListener(这个);
if(ControllerListener的上下文实例)
ControllerCallback=(ControllerListener)上下文;
}
公共void drawController(float newX、float newY)
{
如果(getHolder().getSurface().isValid())
{
myCanvas=this.getHolder().lockCanvas();//要绘制的内容
油漆颜色=新油漆();
myCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);//清除背景
myCanvas.drawColor(颜色:白色);
//首先确定接触点相对于控制器中心的角度的正弦和余弦
float斜边=(float)Math.sqrt(Math.pow(newX-centerX,2)+Math.pow(newY-centerY,2));
浮点数sin=(newY-centerY)/斜边;//sin=o/h
浮点cos=(newX-centerX)/斜边;//cos=a/h
//在着色之前先绘制基础
颜色。setARGB(255、100、100、100);
myCanvas.drawCircle(centerX、centerY、baseRadius、颜色);
对于(int i=1;i