Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 玩家角色移动错误LibGDX RPG_Java_Libgdx - Fatal编程技术网

Java 玩家角色移动错误LibGDX RPG

Java 玩家角色移动错误LibGDX RPG,java,libgdx,Java,Libgdx,我正在做一个RPG游戏,但是,我现在有一个错误。玩家的角色可以在所有四个基本方向上移动,但是如果你向右、向上或向下移动,玩家就会被卡住 此外,该错误似乎有一定的逻辑性: 如果向下移动,角色将卡在向下移动的循环中 除非按下向上箭头,否则玩家将开始一个新的向上无限循环 除非按下向右箭头,否则玩家将开始一个新的向右无限循环 所以权利似乎优先于向上,而向上优先于向下 奇怪的是,向左移动的效果非常好。即使角色卡在无限循环中,左箭头键也会使玩家以正确的方式向左移动 我不明白代码中的错误在哪里。我不知道为什么

我正在做一个RPG游戏,但是,我现在有一个错误。玩家的角色可以在所有四个基本方向上移动,但是如果你向右、向上或向下移动,玩家就会被卡住

此外,该错误似乎有一定的逻辑性:

如果向下移动,角色将卡在向下移动的循环中

除非按下向上箭头,否则玩家将开始一个新的向上无限循环

除非按下向右箭头,否则玩家将开始一个新的向右无限循环

所以权利似乎优先于向上,而向上优先于向下

奇怪的是,向左移动的效果非常好。即使角色卡在无限循环中,左箭头键也会使玩家以正确的方式向左移动

我不明白代码中的错误在哪里。我不知道为什么向左移动有效,而其他三个方向无效。我不明白为什么其他三个方向之间似乎也有某种优先顺序

我已经看过了整个程序,我认为我对待向左运动的方式和对待其他方向的方式没有什么不同。然而,考虑到这个错误,我可能是错的

由于30k字的限制,我没有足够的空间来包含这里的所有代码。因此,我包含了一个指向github的链接,因此您可以在那里看到代码

我认为这些课程可能是最重要的课程:

package com.bludbourne.game.desktop;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Application;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.bludbourne.game.BludBourne;

public class DesktopLauncher {
    public static void main (String[] arg) {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();



        config.title="BludBourne";
        config.useGL30=false;
        config.width =480;
        config.height=480;

        Application app = new LwjglApplication(new BludBourne(),config);

        Gdx.app=app;
        Gdx.app.setLogLevel(Application.LOG_DEBUG);


    }
}
/

/

package com.bludbourne.game;
导入java.util.HashMap;
导入java.util.Map;
导入com.badlogic.gdx.gdx;
导入com.badlogic.gdx.Input;
导入com.badlogic.gdx.InputProcessor;
导入com.badlogic.gdx.math.Vector3;
公共类PlayerController实现InputProcessor
{
private final static String TAG=PlayerController.class.getSimpleName();
枚举键{
左,右,上,下,退出
}
枚举鼠标{
选择、执行
}
私有静态映射键=new HashMap();
私有静态映射mouseButtons=newhashmap();
私人矢量3鼠标坐标;
静止的{
keys.put(keys.LEFT,false);
key.put(key.RIGHT,false);
keys.put(keys.UP,false);
钥匙。放下(钥匙。放下,错误);
keys.put(keys.QUIT,false);
}
静止的{
mouseButtons.put(Mouse.SELECT,false);
mouseButtons.put(Mouse.DOACTION,false);
}
私人实体(玩家),;
公共播放器控制器(实体播放器){
this.lastMouseCoordinates=newvector3();
这个._player=player;
}
@凌驾
公共布尔键关闭(int-keycode)
{
if(keycode==Input.Keys.LEFT | | keycode==Input.Keys.A){
这个。leftPressed();
}
if(keycode==Input.Keys.RIGHT | | keycode==Input.Keys.D){
这个;
}
if(keycode==Input.Keys.UP | | keycode==Input.Keys.W){
这个;
}
if(keycode==Input.Keys.DOWN | | keycode==Input.Keys.S){
这个。按下();
}
if(keycode==Input.Keys.Q){
这个;
}
返回true;
}
@凌驾
公共布尔键控(int-keycode)
{
if(keycode==Input.Keys.LEFT | | keycode==Input.Keys.A){
这个。leftReleased();
}
if(keycode==Input.Keys.RIGHT | | keycode==Input.Keys.D){
这个;
}
if(keycode==Input.Keys.UP | | keycode==Input.Keys.W){
这个。上调了();
}
if(keycode==Input.Keys.DOWN | | keycode==Input.Keys.S){
这个。向下释放();
}
if(keycode==Input.Keys.Q){
这个.quit()被释放了;
}
返回true;
}
@凌驾
公共布尔键类型(字符字符)
{
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔接地(整数屏幕X、整数屏幕Y、整数指针、整数按钮)
{
if(button==Input.Buttons.LEFT | | button==Input.Buttons.RIGHT){
此.setClickedMouseCompositions(screenX,screenY);
}
if(button==Input.Buttons.LEFT){
选择鼠标按钮按下(屏幕X、屏幕Y);
}
if(button==Input.Buttons.RIGHT){
此.doActionMouseButtonPressed(screenX,screenY);
}
返回true;
}
@凌驾
公共布尔补色(整数屏幕X、整数屏幕Y、整数指针、整数按钮)
{
if(button==Input.Buttons.LEFT){
选择鼠标按钮释放(屏幕X、屏幕Y);
}
if(button==Input.Buttons.RIGHT){
这个.doActionMouseButtonReleased(screenX,screenY);
}
返回true;
}
@凌驾
公共布尔值(int-screenX、int-screenY、int-pointer)
{
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔mouseMoved(int-screenX,int-screenY)
{
//TODO自动生成的方法存根
返回false;
}
@凌驾
公共布尔滚动(整数金额)
{
//TODO自动生成的方法存根
返回false;
}
公共空间处置(){
}
公共空间{
keys.put(keys.LEFT,true);
}
公营机构{
keys.put(keys.RIGHT,true);
}
公共空间被抑制(){
keys.put(keys.UP,true);
}
公共空间被压缩(){
按键。放下(按键。放下,正确);
}
公众假期{
keys.put(keys.QUIT,true);
}
公共无效设置ClickedMouseCordinations(整数x,整数y){
最后一组鼠标坐标(x,y,0);
}
public void selectMouseButtonPressed(整数x,整数y){
mouseButtons.put(Mouse.SELECT,true);
}
public void doActionMouseButtonPressed(整数x,整数y){
mouseButtons.put(Mouse.DOACTION,true);
}
公共空间已发布(){
keys.put(keys.LEFT,false);
}
公共空间
package com.bludbourne.game;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;


import com.bludbourne.game.screens.MainGameScreen;
import com.badlogic.gdx.Game;

public class BludBourne extends Game {

    public static final MainGameScreen _mainGameScreen = new MainGameScreen();


    @Override
    public void create () {
        setScreen(_mainGameScreen);
    }

    @Override
    public void dispose () {
        _mainGameScreen.dispose();
    }
}
package com.bludbourne.game;

import java.util.HashMap;
import java.util.Map;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.math.Vector3;


public class PlayerController implements InputProcessor
{

    private final static String TAG = PlayerController.class.getSimpleName();

    enum Keys{
        LEFT,RIGHT,UP,DOWN,QUIT
    }

    enum Mouse{

        SELECT,DOACTION
    }

    private static Map<Keys,Boolean> keys=new HashMap<PlayerController.Keys,Boolean>();
    private static Map<Mouse,Boolean> mouseButtons = new HashMap<PlayerController.Mouse,Boolean>();
    private Vector3 lastMouseCoordinates;

    static {
        keys.put(Keys.LEFT,false);
        keys.put(Keys.RIGHT,false);
        keys.put(Keys.UP,false);
        keys.put(Keys.DOWN, false);
        keys.put(Keys.QUIT, false);

    }


    static {

        mouseButtons.put(Mouse.SELECT, false);
        mouseButtons.put(Mouse.DOACTION, false);

    }


    private Entity _player;

    public PlayerController(Entity player) {

        this.lastMouseCoordinates=new Vector3();
        this._player=player;

    }



    @Override
    public boolean keyDown(int keycode)
    {
        if(keycode ==Input.Keys.LEFT||keycode==Input.Keys.A) {
            this.leftPressed();
        }
        if(keycode ==Input.Keys.RIGHT||keycode==Input.Keys.D) {
            this.rightPressed();
        }
        if(keycode ==Input.Keys.UP||keycode==Input.Keys.W) {
            this.upPressed();
        }
        if(keycode ==Input.Keys.DOWN||keycode==Input.Keys.S) {
            this.downPressed();
        }
        if(keycode==Input.Keys.Q) {
            this.quitPressed();
        }
        return true;
    }

    @Override
    public boolean keyUp(int keycode)
    {
        if(keycode ==Input.Keys.LEFT||keycode==Input.Keys.A) {
            this.leftReleased();
        }
        if(keycode ==Input.Keys.RIGHT||keycode==Input.Keys.D) {
            this.rightReleased();
        }
        if(keycode ==Input.Keys.UP||keycode==Input.Keys.W) {
            this.upReleased();
        }
        if(keycode ==Input.Keys.DOWN||keycode==Input.Keys.S) {
            this.downReleased();
        }
        if(keycode==Input.Keys.Q) {
            this.quitReleased();
        }
        return true;
    }

    @Override
    public boolean keyTyped(char character)
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button)
    {
        if(button==Input.Buttons.LEFT||button==Input.Buttons.RIGHT) {
            this.setClickedMouseCoordinates(screenX,screenY);
        }
        if(button==Input.Buttons.LEFT) {
            this.selectMouseButtonPressed(screenX,screenY);

        }

        if(button==Input.Buttons.RIGHT) {
            this.doActionMouseButtonPressed(screenX,screenY);
        }
        return true;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button)
    {
        if(button==Input.Buttons.LEFT) {
            this.selectMouseButtonReleased(screenX,screenY);
        }
        if(button==Input.Buttons.RIGHT) {
            this.doActionMouseButtonReleased(screenX,screenY);
        }
        return true;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer)
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY)
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean scrolled(int amount)
    {
        // TODO Auto-generated method stub
        return false;
    }

    public void dispose() {



    }

    public void leftPressed() {
        keys.put(Keys.LEFT,true);

    }

    public void rightPressed() {
        keys.put(Keys.RIGHT,true);

    }

    public void upPressed() {
        keys.put(Keys.UP,true);

    }

    public void downPressed() {
        keys.put(Keys.DOWN,true);

    }

    public void quitPressed() {

        keys.put(Keys.QUIT, true);
    }


    public void setClickedMouseCoordinates(int x,int y) {

        lastMouseCoordinates.set(x,y,0);

    }

    public void selectMouseButtonPressed(int x,int y) {

        mouseButtons.put(Mouse.SELECT,true);
    }

    public void doActionMouseButtonPressed(int x,int y) {

        mouseButtons.put(Mouse.DOACTION, true);
    }

    public void leftReleased() {
        keys.put(Keys.LEFT,false);

    }

    public void rightReleased() {
        keys.put(Keys.RIGHT,true);

    }

    public void upReleased() {
        keys.put(Keys.UP,true);

    }

    public void downReleased() {
        keys.put(Keys.DOWN,true);

    }

    public void quitReleased() {

        keys.put(Keys.QUIT, true);
    }


    public void selectMouseButtonReleased(int x,int y) {
        mouseButtons.put(Mouse.SELECT, false);
    }

    public void doActionMouseButtonReleased(int x ,int y) {

        mouseButtons.put(Mouse.DOACTION, false);
    }


    public void update(float delta) {

        processInput(delta);
    }

    public static void hide() {

        keys.put(Keys.LEFT, false);
        keys.put(Keys.RIGHT, false);
        keys.put(Keys.UP, false);
        keys.put(Keys.DOWN, false);
        keys.put(Keys.QUIT, false);

    }

    private void processInput(float delta) {

        if(keys.get(Keys.LEFT)) {
            _player.calculateNextPosition(Entity.Direction.LEFT,delta);
            _player.setState(Entity.State.WALKING);
            _player.setDirection(Entity.Direction.LEFT,delta);

        }

        else if(keys.get(Keys.RIGHT)) {
            _player.calculateNextPosition(Entity.Direction.RIGHT,delta);
            _player.setState(Entity.State.WALKING);
            _player.setDirection(Entity.Direction.RIGHT,delta);

        }

        else if(keys.get(Keys.UP)) {
            _player.calculateNextPosition(Entity.Direction.UP,delta);
            _player.setState(Entity.State.WALKING);
            _player.setDirection(Entity.Direction.UP,delta);

        }

        else if(keys.get(Keys.DOWN)) {
            _player.calculateNextPosition(Entity.Direction.DOWN,delta);
            _player.setState(Entity.State.WALKING);
            _player.setDirection(Entity.Direction.DOWN,delta);

        }
        else if(keys.get(Keys.QUIT)) {
            Gdx.app.exit();


        }

        else {

            _player.setState(Entity.State.IDLE);
        }


        if(mouseButtons.get(Mouse.SELECT)) {

            mouseButtons.put(Mouse.SELECT, false);
        }
    }
}
package com.bludbourne.game;

import java.util.UUID;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;

public class Entity
{

    private static final String     TAG                 = Entity.class.getSimpleName();
    private static final String _defaultSpritePath = "sprites/characters/Warrior.png";

    private Vector2                 _velocity;
    private String                  _entityID;

    private Direction               _currentDirection   = Direction.LEFT;
    private Direction               _previousDirection  = Direction.UP;

    private Animation               _walkLeftAnimation;
    private Animation               _walkRightAnimation;
    private Animation               _walkUpAnimation;
    private Animation               _walkDownAnimation;

    private Array<TextureRegion>    _walkLeftFrames;
    private Array<TextureRegion>    _walkRightFrames;
    private Array<TextureRegion>    _walkUpFrames;
    private Array<TextureRegion>    _walkDownFrames;

    protected Vector2               _nextPlayerPosition;
    protected Vector2               _currentPlayerPosition;
    protected State                 _state              = State.IDLE;
    protected float                 _frameTime          = 0f;
    protected Sprite                _frameSprite        = null;
    protected TextureRegion         _currentFrame       = null;

    public final int                FRAME_WIDTH         = 16;
    public final int                FRAME_HEIGHT        = 16;
    public static Rectangle         boundingBox;

    public enum State
    {

        IDLE, WALKING
    }

    public enum Direction
    {
        UP, RIGHT, DOWN, LEFT
    }

    public Entity() {

        initEntity();
    }

    public void initEntity()
    {
        this._entityID = UUID.randomUUID().toString();
        this._nextPlayerPosition = new Vector2();
        this._currentPlayerPosition = new Vector2();
        this.boundingBox = new Rectangle();
        this._velocity = new Vector2(2f, 2f);
        Utility.loadTextureAsset(_defaultSpritePath);
        loadDefaultSprite();
        loadAllAnimations();

    }

    public void update(float delta)
    {

        _frameTime = (_frameTime + delta) % 5;

        setBoundingBoxSize(0f, 0.5f);

    }

    public void init(float startX, float startY)
    {

        this._currentPlayerPosition.x = startX;
        this._currentPlayerPosition.y = startY;
        this._nextPlayerPosition.x = startX;
        this._nextPlayerPosition.y = startY;

    }

    public void setBoundingBoxSize(float percentageWidthReduced, float percentageHeightReduced)
    {

        float width;
        float height;

        float widthReductionAmount = 1.0f - percentageWidthReduced;
        float heightReductionAmount = 1.0f - percentageHeightReduced;

        if (widthReductionAmount > 0 && widthReductionAmount < 1)
        {
            width = FRAME_WIDTH * widthReductionAmount;
        }
        else
        {
            width = FRAME_WIDTH;
        }

        if (heightReductionAmount > 0 && heightReductionAmount < 1)
        {
            height = FRAME_HEIGHT * heightReductionAmount;
        }
        else
        {
            height = FRAME_HEIGHT;
        }

        if (width == 0 || height == 0)
        {
            Gdx.app.debug(TAG, "Width and Height are 0!! " + width + ":" + height);
        }

        float minX;
        float minY;

        if (MapManager.UNIT_SCALE > 0)
        {

            minX = _nextPlayerPosition.x / MapManager.UNIT_SCALE;
            minY = _nextPlayerPosition.y / MapManager.UNIT_SCALE;

        }

        else
        {

            minX = _nextPlayerPosition.x;
            minY = _nextPlayerPosition.y;
        }

        boundingBox.set(minX, minY, width, height);

    }

    private void loadDefaultSprite()
    {

        Texture texture = Utility.getTextureAsset(_defaultSpritePath);
        TextureRegion[][] textureFrames = TextureRegion.split(texture, FRAME_WIDTH, FRAME_HEIGHT);
        _frameSprite = new Sprite(textureFrames[0][0].getTexture(), 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
        _currentFrame = textureFrames[0][0];

    }

    public void loadAllAnimations()
    {

        Texture texture = Utility.getTextureAsset(_defaultSpritePath);
        TextureRegion[][] textureFrames = TextureRegion.split(texture, FRAME_WIDTH, FRAME_HEIGHT);

        _walkDownFrames = new Array<TextureRegion>(4);
        _walkLeftFrames = new Array<TextureRegion>(4);
        _walkRightFrames = new Array<TextureRegion>(4);
        _walkUpFrames = new Array<TextureRegion>(4);

        for (int i = 0; i < 4; i++)
        {

            for (int j = 0; j < 4; j++)
            {
                TextureRegion region=textureFrames[i][j];

                if(region==null) {
                    Gdx.app.debug(TAG, "Got null animation frame "+i+","+j);
                }

                switch(i) {


                case 0:
                    _walkDownFrames.insert(j,region);
                    break;
                case 1:
                    _walkLeftFrames.insert(j,region);
                    break;
                case 2:
                    _walkRightFrames.insert(j,region);
                    break;
                case 3:
                    _walkUpFrames.insert(j,region);
                    break;

                }


            }

        }

        _walkDownAnimation = new Animation(0.25f,_walkDownFrames,Animation.PlayMode.LOOP);
        _walkLeftAnimation = new Animation(0.25f,_walkLeftFrames,Animation.PlayMode.LOOP);
        _walkRightAnimation = new Animation(0.25f,_walkRightFrames,Animation.PlayMode.LOOP);
        _walkUpAnimation = new Animation(0.25f,_walkUpFrames,Animation.PlayMode.LOOP);



    }


    public void dispose() {

        Utility.unloadAsset(_defaultSpritePath);

    }

    public void setState(State state) {

        this._state = state;
    }

    public Sprite getFrameSprite() {

        return _frameSprite;
    }

    public TextureRegion getFrame() {

        return _currentFrame;
    }

    public Vector2 getCurrentPosition() {
        return _currentPlayerPosition;
    }

    public void setCurrentPosition(float currentPositionX,float currentPositionY) {

        _frameSprite.setX(currentPositionX);
        _frameSprite.setY(currentPositionY);
        this._currentPlayerPosition.x=currentPositionX;
        this._currentPlayerPosition.y=currentPositionY;
    }

    public void setDirection(Direction direction,float deltaTime) {


        this._previousDirection=this._currentDirection;
        this._currentDirection=direction;

        switch(_currentDirection) {
        //not sure about this
        case DOWN:
            _currentFrame=(TextureRegion) _walkDownAnimation.getKeyFrame(_frameTime);
            break;
        case LEFT:
            _currentFrame=(TextureRegion) _walkLeftAnimation.getKeyFrame(_frameTime);
            break;
        case RIGHT:
            _currentFrame=(TextureRegion) _walkRightAnimation.getKeyFrame(_frameTime);
            break;
        case UP:
            _currentFrame=(TextureRegion) _walkUpAnimation.getKeyFrame(_frameTime);
            break;

        default:
            break;



        }

    }

    public void setNextPositionToCurrent() {

        setCurrentPosition(_nextPlayerPosition.x,_nextPlayerPosition.y);

    }

    public void calculateNextPosition(Direction currentDirection,float deltaTime) {

        float testX=_currentPlayerPosition.x;
        float testY=_currentPlayerPosition.y;

        _velocity.scl(deltaTime);

        switch(currentDirection) {

        case LEFT:
            testX-=_velocity.x;
            break;
        case RIGHT:
            testX+=_velocity.x;
            break;
        case UP:
            testY+=_velocity.y;
            break;
        case DOWN:
            testY-=_velocity.y;
            break;
        default:
            break;


        }

        _nextPlayerPosition.x=testX;
        _nextPlayerPosition.y=testY;

        _velocity.scl(1/deltaTime);


    }
}
    public void leftReleased() {
        keys.put(Keys.LEFT,false);

    }

    public void rightReleased() {
        keys.put(Keys.RIGHT,true);

    }

    public void upReleased() {
        keys.put(Keys.UP,true);

    }

    public void downReleased() {
        keys.put(Keys.DOWN,true);

    }