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