Loading app/src/main/java/com/example/game2d/Joystick.java 0 → 100644 +115 −0 Original line number Diff line number Diff line package com.example.game2d; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class Joystick { private int outerCircleRadius; private int innerCircleRadius; private int outerCircleCenterPositionX; private int outerCircleCenterPositionY; private int innerCircleCenterPositionX; private int innerCircleCenterPositionY; private Paint innerCirclePaint; private Paint outerCirclePaint; private double joystickCenterToTouchDistance; private boolean isPressed; private double actuatorX; private double actuatorY; public Joystick(int centerPositionX, int centerPositionY, int outerCircleRadius, int innerCircleRadius) { // Outer and inner circle make up the joystick outerCircleCenterPositionX = centerPositionX; outerCircleCenterPositionY = centerPositionY; innerCircleCenterPositionX = centerPositionX; innerCircleCenterPositionY = centerPositionY; // Radii of circles this.outerCircleRadius = outerCircleRadius; this.innerCircleRadius = innerCircleRadius; // Paint of circles outerCirclePaint = new Paint(); outerCirclePaint.setColor(Color.GRAY); outerCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); innerCirclePaint = new Paint(); innerCirclePaint.setColor(Color.BLUE); innerCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); } public void draw(Canvas canvas) { // Draw outer circle canvas.drawCircle( outerCircleCenterPositionX, outerCircleCenterPositionY, outerCircleRadius, outerCirclePaint ); // Draw inner circle canvas.drawCircle( innerCircleCenterPositionX, innerCircleCenterPositionY, innerCircleRadius, innerCirclePaint ); } public void update() { updateInnerCirclePosition(); } private void updateInnerCirclePosition() { innerCircleCenterPositionX = (int) (outerCircleCenterPositionX + actuatorX*outerCircleRadius); innerCircleCenterPositionY = (int) (outerCircleCenterPositionY + actuatorY*outerCircleRadius); } public boolean isPressed(double touchPositionX, double touchPositionY) { // pythagorean theorem lol joystickCenterToTouchDistance = Math.sqrt( Math.pow(outerCircleCenterPositionX - touchPositionX, 2) + Math.pow(outerCircleCenterPositionY - touchPositionY, 2) ); return joystickCenterToTouchDistance < outerCircleRadius; } public void setIsPressed(boolean isPressed) { this.isPressed = isPressed; } public boolean getIsPressed() { return isPressed; } public void setActuator(double touchPositionX, double touchPositionY) { // distances from center of joystick to touch position double deltaX = touchPositionX - outerCircleCenterPositionX; double deltaY = touchPositionY - outerCircleCenterPositionY; // pythagorean theorem again lol (abstract away later) double deltaDistance = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); // actuator value is percentage in range 0-1 where 1 is furthest if(deltaDistance < outerCircleRadius) { actuatorX = deltaX / outerCircleRadius; actuatorY = deltaY / outerCircleRadius; } else { // I don't really know why this has to be this way ("vector normalization") actuatorX = deltaX / deltaDistance; actuatorY = deltaY / deltaDistance; } } public void resetActuator() { actuatorX = 0.0; actuatorY = 0.0; } public double getActuatorX() { return actuatorX; } public double getActuatorY() { return actuatorY; } } Loading
app/src/main/java/com/example/game2d/Joystick.java 0 → 100644 +115 −0 Original line number Diff line number Diff line package com.example.game2d; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class Joystick { private int outerCircleRadius; private int innerCircleRadius; private int outerCircleCenterPositionX; private int outerCircleCenterPositionY; private int innerCircleCenterPositionX; private int innerCircleCenterPositionY; private Paint innerCirclePaint; private Paint outerCirclePaint; private double joystickCenterToTouchDistance; private boolean isPressed; private double actuatorX; private double actuatorY; public Joystick(int centerPositionX, int centerPositionY, int outerCircleRadius, int innerCircleRadius) { // Outer and inner circle make up the joystick outerCircleCenterPositionX = centerPositionX; outerCircleCenterPositionY = centerPositionY; innerCircleCenterPositionX = centerPositionX; innerCircleCenterPositionY = centerPositionY; // Radii of circles this.outerCircleRadius = outerCircleRadius; this.innerCircleRadius = innerCircleRadius; // Paint of circles outerCirclePaint = new Paint(); outerCirclePaint.setColor(Color.GRAY); outerCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); innerCirclePaint = new Paint(); innerCirclePaint.setColor(Color.BLUE); innerCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); } public void draw(Canvas canvas) { // Draw outer circle canvas.drawCircle( outerCircleCenterPositionX, outerCircleCenterPositionY, outerCircleRadius, outerCirclePaint ); // Draw inner circle canvas.drawCircle( innerCircleCenterPositionX, innerCircleCenterPositionY, innerCircleRadius, innerCirclePaint ); } public void update() { updateInnerCirclePosition(); } private void updateInnerCirclePosition() { innerCircleCenterPositionX = (int) (outerCircleCenterPositionX + actuatorX*outerCircleRadius); innerCircleCenterPositionY = (int) (outerCircleCenterPositionY + actuatorY*outerCircleRadius); } public boolean isPressed(double touchPositionX, double touchPositionY) { // pythagorean theorem lol joystickCenterToTouchDistance = Math.sqrt( Math.pow(outerCircleCenterPositionX - touchPositionX, 2) + Math.pow(outerCircleCenterPositionY - touchPositionY, 2) ); return joystickCenterToTouchDistance < outerCircleRadius; } public void setIsPressed(boolean isPressed) { this.isPressed = isPressed; } public boolean getIsPressed() { return isPressed; } public void setActuator(double touchPositionX, double touchPositionY) { // distances from center of joystick to touch position double deltaX = touchPositionX - outerCircleCenterPositionX; double deltaY = touchPositionY - outerCircleCenterPositionY; // pythagorean theorem again lol (abstract away later) double deltaDistance = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); // actuator value is percentage in range 0-1 where 1 is furthest if(deltaDistance < outerCircleRadius) { actuatorX = deltaX / outerCircleRadius; actuatorY = deltaY / outerCircleRadius; } else { // I don't really know why this has to be this way ("vector normalization") actuatorX = deltaX / deltaDistance; actuatorY = deltaY / deltaDistance; } } public void resetActuator() { actuatorX = 0.0; actuatorY = 0.0; } public double getActuatorX() { return actuatorX; } public double getActuatorY() { return actuatorY; } }