在停止后获得移动速度以继续有用

时间:2013-07-21 03:21:09

标签: java lwjgl

提出这个问题的标题真的很难。所以我正在制作一个游戏,我有一个方法用于处理名为handleVelocity()的移动。它的工作方式是,在我的游戏中,它会更新每个刻度,寻找角色的移动。如果角色移动低于1或-1,则它会阻止角色移动。因此,我会将角色的动作设置为0.但是,角色再也无法移动了,我也不知道如何让他继续前进。如何处理此速度,以便它可以继续移动,即使它先前已停止。我将在下面发布两个课程。

玩家类:

import java.io.IOException;

import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class Player {

    public Texture playerTexture;

    // Positions & speed
    public float xPos = 20.0f; // This is initial
    public float yPos = 0.0f; // Same as above.
    public float acceleration = 15;

    public static int gravityForce = 6;
    public static int jumpVelocity = 100;
    private float moveSpeed = 4f;
    private static int MAX_MOVE_SPEED = 9;

    public boolean isSupported = true; // Once again, initial value.
    public boolean goingRight, goingLeft, canJump;

    // movement methods & constants

    public void update() {
        handleVelocity();
        applyGravity();
        checkForSupport();
    }

    public void handleVelocity() {
        float minMoveSpeed = 1;
        if (this.moveSpeed < minMoveSpeed && this.moveSpeed > -minMoveSpeed) {
            this.moveSpeed = 0;
        } else {
            float dampening = 0.00002f;
            double sign = -(int) Math.signum(moveSpeed);
            this.moveSpeed += (float) (dampening * sign);
        }
        xPos += this.moveSpeed;
    }

    public Texture grabTexture() {
        try {
            playerTexture = TextureLoader.getTexture("PNG",
                    ResourceLoader.getResourceAsStream("res/test_char.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return playerTexture;
    }

    private void checkForSupport() {
        if (yPos == 0) {
            isSupported = true;
        } else if (yPos > 0 /* and is not on a platform */) {
            isSupported = false;
        }
    }

    private void applyGravity() {
        if (!isSupported) {
            yPos -= gravityForce;
        }
    }

    public void printPos(String moveMethod) {
        System.out.println(moveMethod + " X: " + xPos + " Y: " + yPos
                + " Going Right: " + goingRight + " Going Left: " + goingLeft
                + " Speed: " + moveSpeed);
    }

    // movement methods

    private void accelerateX(float speed) {
        moveSpeed += (float) (speed * 0.0096);
        if (moveSpeed >= MAX_MOVE_SPEED) {
            moveSpeed = MAX_MOVE_SPEED;
        } else if (moveSpeed <= -MAX_MOVE_SPEED) {
            moveSpeed = -MAX_MOVE_SPEED;
        }
    }

    @SuppressWarnings("unused")
    private void accelerateY() {

    }

    public void moveRight() {
        printPos("Moving Right!");
        accelerateX(acceleration);
    }

    public void moveLeft() {
        printPos("Moving Left!");
        accelerateX(-acceleration);
    }

    public void jump() {
        printPos("Jumping!");
    }

}

主要课程:

import com.hasherr.platformer.entity.Player;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import static org.lwjgl.opengl.GL11.*;

public class Main {

    private void display() {
        try {
            Display.setDisplayMode(new DisplayMode(1000, 550));
            Display.setTitle("Unnamed Platformer Game");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        // OpenGL

        while (!Display.isCloseRequested()) {
            Display.update();
            Display.sync(60); // sync to 60 fps
            initGL();

            player.update();
            handleKeyboardInput();
        }

        Display.destroy();
    }

    private boolean keyboardInUse() {
        boolean keyboardInUse;
        if (!(Keyboard.isKeyDown(Keyboard.KEY_A)
                || Keyboard.isKeyDown(Keyboard.KEY_D) || Keyboard
                    .isKeyDown(Keyboard.KEY_SPACE))) {
            keyboardInUse = false;
        } else {
            keyboardInUse = true;
        }

        return keyboardInUse;
    }

    private void handleKeyboardInput() {
        if (!keyboardInUse()) {
            player.goingLeft = false;
            player.goingRight = false;
        }

        if (Keyboard.isKeyDown(Keyboard.KEY_D)) {   
            player.goingLeft = false;
            player.goingRight = true;
            player.moveRight();
        } else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
            player.goingLeft = true;
            player.goingRight = false;
            player.moveLeft();
        } else if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
            player.jump();
        }

    }

    private void initGL() {
        // initial OpenGL items for 2D rendering
        glClear(GL_COLOR_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glOrtho(0, 1000, 0, 550, 1, -1);

        // start rendering player image
        player.grabTexture().bind();
        glBegin(GL_QUADS);

        glTexCoord2f(0, 0);
        glVertex2f(player.xPos, player.yPos);

        glTexCoord2f(1, 0);
        glVertex2f(player.xPos + 150, player.yPos);

        glTexCoord2f(1, 1);
        glVertex2f(player.xPos + 150, player.yPos + 150);

        glTexCoord2f(0, 1);
        glVertex2f(player.xPos, player.yPos + 150);
        glEnd(); // stop rendering this image
    }

    Player player = new Player();

    public static void main(String[] args) {
        Main main = new Main();
        main.display();
    }
}

2 个答案:

答案 0 :(得分:2)

是什么触发了这一运动?假设当按下右箭头键并且当前玩家处于站立状态时玩家应该移动,在这种情况下将moveSpeed设置回默认值4f。

答案 1 :(得分:1)

我知道你已经接受了答案,所提供的答案确实可以胜任,但我认为这需要更好的解决方案和更全面的解释。

代码无法正常工作,因为在您调用moveLeft的{​​{1}}和moveRight方法中。 accelerateX(acceleration)值为15.让我们看一下acceleration方法。

accelerateX

它将提供的速度乘以.0096。 15 * .0096 = .144。所以我们在这里添加.144到private void accelerateX(float speed) { moveSpeed += (float) (speed * 0.0096); if (moveSpeed >= MAX_MOVE_SPEED) { moveSpeed = MAX_MOVE_SPEED; } else if (moveSpeed <= -MAX_MOVE_SPEED) { moveSpeed = -MAX_MOVE_SPEED; } } 。现在我们转到moveSpeed

handleVelocity

如果public void handleVelocity() { float minMoveSpeed = 1; if (this.moveSpeed < minMoveSpeed && this.moveSpeed > -minMoveSpeed) { this.moveSpeed = 0; } else { float dampening = 0.00002f; double sign = -(int) Math.signum(moveSpeed); this.moveSpeed += (float) (dampening * sign); } xPos += this.moveSpeed; } 小于1且大于-1,则此代码将moveSpeed设置为零,以强制播放器停止移动。

这可以通过多种方式修复,并保持我们漂亮的伪物理。您接受的答案通过强制移动速度达到某个值来打破物理系统。也许这就是你想要的平台游戏,也许不是。你的选择。

我建议你将minMoveSpeed缩小到更小的值,例如.01。