Added the ability to sprint
When you double-tap the W key, the character starts moving faster
This commit is contained in:
		@@ -65,6 +65,11 @@ public class LayerTestGUI extends GUILayer {
 | 
				
			|||||||
				() -> String.format("Flying:         %5s (Space bar x2)", TestPlayerControls.getInstance().isFlying())
 | 
									() -> String.format("Flying:         %5s (Space bar x2)", TestPlayerControls.getInstance().isFlying())
 | 
				
			||||||
		));
 | 
							));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							panel.addChild(new Label(
 | 
				
			||||||
 | 
									"IsSprintDisplay", font,
 | 
				
			||||||
 | 
									() -> String.format("Sprint:         %5s (W x2)", TestPlayerControls.getInstance().isSprint())
 | 
				
			||||||
 | 
							));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		panel.addChild(new Label(
 | 
							panel.addChild(new Label(
 | 
				
			||||||
				"IsMouseCapturedDisplay", font,
 | 
									"IsMouseCapturedDisplay", font,
 | 
				
			||||||
				() -> String.format("Mouse captured: %5s (esc)", TestPlayerControls.getInstance().isMouseCaptured())
 | 
									() -> String.format("Mouse captured: %5s (esc)", TestPlayerControls.getInstance().isMouseCaptured())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,10 @@
 | 
				
			|||||||
package ru.windcorp.progressia.test;
 | 
					package ru.windcorp.progressia.test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.lwjgl.glfw.GLFW;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import glm.Glm;
 | 
					import glm.Glm;
 | 
				
			||||||
import glm.mat._3.Mat3;
 | 
					import glm.mat._3.Mat3;
 | 
				
			||||||
import glm.vec._2.Vec2;
 | 
					import glm.vec._2.Vec2;
 | 
				
			||||||
import glm.vec._3.Vec3;
 | 
					import glm.vec._3.Vec3;
 | 
				
			||||||
 | 
					import org.lwjgl.glfw.GLFW;
 | 
				
			||||||
import ru.windcorp.progressia.client.ClientState;
 | 
					import ru.windcorp.progressia.client.ClientState;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.backend.GraphicsBackend;
 | 
					import ru.windcorp.progressia.client.graphics.backend.GraphicsBackend;
 | 
				
			||||||
import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
 | 
					import ru.windcorp.progressia.client.graphics.backend.GraphicsInterface;
 | 
				
			||||||
@@ -31,9 +30,11 @@ public class TestPlayerControls {
 | 
				
			|||||||
        return INSTANCE;
 | 
					        return INSTANCE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private TestPlayerControls() {}
 | 
					    private TestPlayerControls() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final double MODE_SWITCH_MAX_DELAY = 300 * Units.MILLISECONDS;
 | 
					    private static final double MODE_SWITCH_MAX_DELAY = 300 * Units.MILLISECONDS;
 | 
				
			||||||
 | 
					    private static final double MODE_SPRINT_SWITCH_MAX_DELAY = 100 * Units.MILLISECONDS;
 | 
				
			||||||
    private static final double MIN_JUMP_DELAY = 300 * Units.MILLISECONDS;
 | 
					    private static final double MIN_JUMP_DELAY = 300 * Units.MILLISECONDS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Horizontal and vertical max control speed when flying
 | 
					    // Horizontal and vertical max control speed when flying
 | 
				
			||||||
@@ -45,6 +46,9 @@ public class TestPlayerControls {
 | 
				
			|||||||
    // Horizontal and vertical max control speed when walking
 | 
					    // Horizontal and vertical max control speed when walking
 | 
				
			||||||
    private static final float WALKING_SPEED = 4.0f * Units.METERS_PER_SECOND;
 | 
					    private static final float WALKING_SPEED = 4.0f * Units.METERS_PER_SECOND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Horizontal and vertical max control speed when run
 | 
				
			||||||
 | 
					    private static final float RUN_SPEED = 6.0f * Units.METERS_PER_SECOND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // (0; 1], 1 is instant change, 0 is no control authority
 | 
					    // (0; 1], 1 is instant change, 0 is no control authority
 | 
				
			||||||
    private static final float WALKING_CONTROL_AUTHORITY = Units.get("15 1/s");
 | 
					    private static final float WALKING_CONTROL_AUTHORITY = Units.get("15 1/s");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,12 +56,14 @@ public class TestPlayerControls {
 | 
				
			|||||||
    private static final float JUMP_VELOCITY = 5f * Units.METERS_PER_SECOND;
 | 
					    private static final float JUMP_VELOCITY = 5f * Units.METERS_PER_SECOND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean isFlying = true;
 | 
					    private boolean isFlying = true;
 | 
				
			||||||
 | 
					    private boolean isSprint = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private int movementForward = 0;
 | 
					    private int movementForward = 0;
 | 
				
			||||||
    private int movementRight = 0;
 | 
					    private int movementRight = 0;
 | 
				
			||||||
    private int movementUp = 0;
 | 
					    private int movementUp = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private double lastSpacePress = Double.NEGATIVE_INFINITY;
 | 
					    private double lastSpacePress = Double.NEGATIVE_INFINITY;
 | 
				
			||||||
 | 
					    private double lastSprintPress = Double.NEGATIVE_INFINITY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean captureMouse = true;
 | 
					    private boolean captureMouse = true;
 | 
				
			||||||
    private boolean useMinecraftGravity = false;
 | 
					    private boolean useMinecraftGravity = false;
 | 
				
			||||||
@@ -80,6 +86,9 @@ public class TestPlayerControls {
 | 
				
			|||||||
        if (isFlying) {
 | 
					        if (isFlying) {
 | 
				
			||||||
            speed = FLYING_SPEED;
 | 
					            speed = FLYING_SPEED;
 | 
				
			||||||
            authority = FLYING_CONTROL_AUTHORITY;
 | 
					            authority = FLYING_CONTROL_AUTHORITY;
 | 
				
			||||||
 | 
					        } else if (isSprint) {
 | 
				
			||||||
 | 
					            speed = RUN_SPEED;
 | 
				
			||||||
 | 
					            authority = WALKING_CONTROL_AUTHORITY;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            speed = WALKING_SPEED;
 | 
					            speed = WALKING_SPEED;
 | 
				
			||||||
            authority = WALKING_CONTROL_AUTHORITY;
 | 
					            authority = WALKING_CONTROL_AUTHORITY;
 | 
				
			||||||
@@ -132,12 +141,11 @@ public class TestPlayerControls {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private boolean onKeyEvent(KeyEvent event) {
 | 
					    private boolean onKeyEvent(KeyEvent event) {
 | 
				
			||||||
        if (event.isRepeat()) return false;
 | 
					        if (event.isRepeat()) return false;
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
        int multiplier = event.isPress() ? 1 : -1;
 | 
					        int multiplier = event.isPress() ? 1 : -1;
 | 
				
			||||||
		
 | 
					 | 
				
			||||||
        switch (event.getKey()) {
 | 
					        switch (event.getKey()) {
 | 
				
			||||||
            case GLFW.GLFW_KEY_W:
 | 
					            case GLFW.GLFW_KEY_W:
 | 
				
			||||||
                movementForward += +1 * multiplier;
 | 
					                movementForward += +1 * multiplier;
 | 
				
			||||||
 | 
					                handleSprint(event);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case GLFW.GLFW_KEY_S:
 | 
					            case GLFW.GLFW_KEY_S:
 | 
				
			||||||
                movementForward += -1 * multiplier;
 | 
					                movementForward += -1 * multiplier;
 | 
				
			||||||
@@ -154,7 +162,6 @@ public class TestPlayerControls {
 | 
				
			|||||||
            case GLFW.GLFW_KEY_LEFT_SHIFT:
 | 
					            case GLFW.GLFW_KEY_LEFT_SHIFT:
 | 
				
			||||||
                handleShift(multiplier);
 | 
					                handleShift(multiplier);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
			
 | 
					 | 
				
			||||||
            case GLFW.GLFW_KEY_ESCAPE:
 | 
					            case GLFW.GLFW_KEY_ESCAPE:
 | 
				
			||||||
                if (!event.isPress()) return false;
 | 
					                if (!event.isPress()) return false;
 | 
				
			||||||
                handleEscape();
 | 
					                handleEscape();
 | 
				
			||||||
@@ -188,6 +195,7 @@ public class TestPlayerControls {
 | 
				
			|||||||
        double timeSinceLastSpacePress = GraphicsInterface.getTime() - lastSpacePress;
 | 
					        double timeSinceLastSpacePress = GraphicsInterface.getTime() - lastSpacePress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (isPressed && timeSinceLastSpacePress < MODE_SWITCH_MAX_DELAY) {
 | 
					        if (isPressed && timeSinceLastSpacePress < MODE_SWITCH_MAX_DELAY) {
 | 
				
			||||||
 | 
					            isSprint = false;
 | 
				
			||||||
            isFlying = !isFlying;
 | 
					            isFlying = !isFlying;
 | 
				
			||||||
            updateGUI();
 | 
					            updateGUI();
 | 
				
			||||||
            movementUp = +1;
 | 
					            movementUp = +1;
 | 
				
			||||||
@@ -204,6 +212,23 @@ public class TestPlayerControls {
 | 
				
			|||||||
        lastSpacePress = GraphicsInterface.getTime();
 | 
					        lastSpacePress = GraphicsInterface.getTime();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void handleSprint(KeyEvent event) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        double timeSinceLastSpacePress = GraphicsInterface.getTime() - lastSprintPress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (event.isPress() && timeSinceLastSpacePress < MODE_SPRINT_SWITCH_MAX_DELAY && !isFlying) {
 | 
				
			||||||
 | 
					            isSprint = !isSprint;
 | 
				
			||||||
 | 
					            updateGUI();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lastSprintPress = GraphicsInterface.getTime();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isSprint && event.isRelease()) {
 | 
				
			||||||
 | 
					            isSprint = false;
 | 
				
			||||||
 | 
					            updateGUI();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void jump() {
 | 
					    private void jump() {
 | 
				
			||||||
        if (ClientState.getInstance() == null || !ClientState.getInstance().isReady()) {
 | 
					        if (ClientState.getInstance() == null || !ClientState.getInstance().isReady()) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -334,6 +359,10 @@ public class TestPlayerControls {
 | 
				
			|||||||
        return isFlying;
 | 
					        return isFlying;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public boolean isSprint() {
 | 
				
			||||||
 | 
					        return isSprint;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean isMouseCaptured() {
 | 
					    public boolean isMouseCaptured() {
 | 
				
			||||||
        return captureMouse;
 | 
					        return captureMouse;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user