Cómo la altura máxima y el cuerpo se mueven en el movimiento del proyectil (en el canvas)

enter image description here

** Realmente. ¿Alguien sabe la respuesta de esta pregunta? **

Hice esta pregunta antes, pero creo que la networkingacté mal y no obtuve ninguna respuesta. Estoy tratando de usar un movimiento de proyectil en mi juego. Funciona. Pero el sistema de coorderadas del canvas en la esquina superior izquierda para calcular. Entonces el punto del proyectil se invierte. No sé cómo mover la altura máxima y el cuerpo en el punto. por favor, ayúdame. ¡Gracias!

Aquí está mi código:

public class strak extends View { public float x; public float y; private Controller controller; private ProjectileEquation projectileEquation; public int trajectoryPointCount = 20; public float timeSeparation = 1/3f; float x1, x2, y1, y2; private Bitmap bmp; public static class ProjectileEquation { public float gravity; public Vector2 startVelocity = new Vector2(); public Vector2 startPoint = new Vector2(); public float getX(float t) { return startPoint.x + t * startVelocity.x; } public float getY(float t) { return 0.5f * gravity * t * t + startVelocity.y * t + startPoint.y; } } public static class Controller { public float power = 10f; public float angle = 0f; } public strak(Context context) { super(context); this.controller = new Controller(); this.projectileEquation = new ProjectileEquation(); this.projectileEquation.gravity = 10f; Log.i("BitmapFactory", "Create!"); bmp = BitmapFactory.decodeResource(getResources(),R.drawable.boll); yyyyyy(); } private void yyyyyy() { projectileEquation.startVelocity.set( controller.power,0f); projectileEquation.startVelocity.rotate(controller.angle); } @Override public boolean onTouchEvent(MotionEvent ev) { x2 = ev.getX(); y2 = ev.getY(); invalidate(); long startTime = System.nanoTime(); float deltaTime = (System.nanoTime() - startTime) / 1000.000f; startTime = System.nanoTime(); if((y1 < y2 )&& (x1 < x2)){ controller.angle-= .2* deltaTime; controller.power-= .2* deltaTime; Log.i("LOG_TAG,", "Right to Down Cros"); } if((y1 > y2 )&& (x1 > x2)){ controller.angle+= .2* deltaTime; controller.power+= .2* deltaTime; Log.i("LOG_TAG,", "Down to Right Cros"); } if((y1 > y2 )&& (x1 < x2)){ controller.angle+= .2* deltaTime; controller.power+= .2* deltaTime; Log.i("LOG_TAG,", "Down to Left Cros"); } if((y1 < y2 )&& (x1 > x2)){ controller.angle-= .2* deltaTime; controller.power-= .2* deltaTime; Log.i("LOG_TAG,", "Left to Down Cros"); } switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: Log.i("LOG_TAG,", "ACTION_MOVE:"); x1 = ev.getX(); y1 = ev.getY(); } return true; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); yyyyyy(); float t = 0f; x = getWidth() / 2; y = getHeight()/2; float timeSeparation = this.timeSeparation; for (int i = 0; i < trajectoryPointCount; i++) { float x = this.x + projectileEquation.getX(t); float y = this.y + projectileEquation.getY(t); canvas.drawBitmap(bmp, x, y, null); t += timeSeparation; } } } 

Podría tratar de hacer una simetría con respecto al eje x, así:

 float y = -(this.y + projectileEquation.getY(t));