slick2d - не удается заставить событие щелчка мыши работать правильно

Эй!. Я пытаюсь сделать небольшую игру для хобби на Java, используя Slick2d, JBox2d и Tiled, но столкнулся с неприятной проблемой. Моя игра в настоящее время состоит из космического корабля, летящего на небольшой сцене. Мне удалось точно передать движение и даже прикрепить небольшую пушку, которая вращается, следуя за курсором. Камера сфокусирована так, что корабль всегда находится в центре. Моя проблема в том, что я не могу получить ни один из методов, которые говорят мне, была ли нажата кнопка мыши для работы. Они прекрасно работают, когда корабль стоит на месте, но когда он набирает скорость, он перестает работать.. А когда корабль достигает максимальной скорости, он снова работает! Значит, события кнопок мыши не срабатывают, пока корабль ускоряется!? Пожалуйста, помогите мне, если у вас есть представление о том, что может произойти :D :D

корабль находится в центре, пушка следует за мышью. когда корабль ускоряется события нажатия мыши не работают?? почему?

Состояние игры:

package code;

import java.util.ArrayList;

import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.World;
import org.lwjgl.input.Mouse;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import org.newdawn.slick.tiled.TiledMap;

public class Play extends BasicGameState {
    public final int ID;
    public final int PPM = 20;

    public World world;
    public Player player;
    public ArrayList<BasicObject> pool = new ArrayList<BasicObject>();
    public TiledMap map;
    public Camera camera;

    public Play(int ID) {
        this.ID = ID;
    }

    @Override
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
        world = new World(new Vec2(0, 0));
        map = new TiledMap("res/map0.tmx");
        camera = new Camera(0, 0, gc.getWidth(), gc.getHeight());
        gc.getGraphics().setBackground(Color.white);

        spawn();
    }

    @Override
    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
        g.translate(camera.x, camera.y);
        map.render(0, 0);
        for (BasicObject bo : pool) {
            bo.draw(g, PPM);
        }

        player.setAlpha((float) Math.toDegrees(Math.atan2(
                (((gc.getHeight() - Mouse.getY()) - camera.y) - player.getCenterY()*PPM),
                ((Mouse.getX() - camera.x) - player.getCenterX()*PPM)
                )));

        player.draw(g, PPM);

        //g.drawLine(player.getCenterX()*PPM, player.getCenterY()*PPM, Mouse.getX()-(camera.x), (gc.getHeight() - Mouse.getY())-(camera.y));
    }

    @Override
    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException { 
        Input input = gc.getInput();
        player.update(delta);
        for (BasicObject bo : pool) {
            bo.update(delta);
        }

        if (input.isKeyDown(input.KEY_A)) {player.move("left", delta);}
        if (input.isKeyDown(input.KEY_D)) {player.move("right", delta);}
        if (input.isKeyDown(input.KEY_W)) {player.move("up", delta);}
        if (input.isKeyDown(input.KEY_S)) {player.move("down", delta);}
        if (Mouse.isButtonDown(0)) {
            System.out.println("mousepressed");
        }


        //player.getBody().applyForceToCenter(new Vec2((Mouse.getX()-(camera.x))/PPM, ((gc.getHeight() - Mouse.getY())-(camera.y))/PPM).sub(player.getBody().getPosition()));

        float deltaF = (float) delta/1000;
        world.step(deltaF, 6, 2);

        camera.x = player.getBody().getPosition().mul(PPM).mul(-1).x + gc.getWidth()/2;
        camera.y = player.getBody().getPosition().mul(PPM).mul(-1).y + gc.getHeight()/2;
    }

    public void spawn() {
        for(int i=0;i<map.getObjectCount(0);i++) {
            float theX = map.getObjectX(0, i);
            float theY = map.getObjectY(0, i);
            float theWidth = map.getObjectWidth(0, i);
            float theHeight = map.getObjectHeight(0, i);

            addWall(theX, theY, theWidth, theHeight);
        }

        for(int i=0;i<map.getObjectCount(1);i++) {
            if (map.getObjectType(1, i).equals("Player")) {
                float theX = map.getObjectX(1, i);
                float theY = map.getObjectY(1, i);
                float theWidth = 40;
                float theHeight = 60;

                player = new Player((theX + theWidth/2)/PPM, (theY + theHeight)/PPM, theWidth/PPM, theHeight/PPM, world);
            }
        }
    }

    public void addWall(float x, float y, float width, float height) {
        pool.add(new Wall((x + width/2)/PPM, (y + height/2)/PPM, width/PPM, height/PPM, world));
    }

    @Override
    public int getID() {
        // TODO Auto-generated method stub
        return ID;
    }
}

Вот в чем проблема. Mouse.isButtonDown(0) не работает, когда корабль ускоряется. Я тестирую его, нажимая кнопку во время движения корабля и проверяя вывод консоли.

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException { 
    Input input = gc.getInput();
    player.update(delta);
    for (BasicObject bo : pool) {
        bo.update(delta);
    }

    if (input.isKeyDown(input.KEY_A)) {player.move("left", delta);}
    if (input.isKeyDown(input.KEY_D)) {player.move("right", delta);}
    if (input.isKeyDown(input.KEY_W)) {player.move("up", delta);}
    if (input.isKeyDown(input.KEY_S)) {player.move("down", delta);}
    if (Mouse.isButtonDown(0)) {
        System.out.println("mousepressed");
    }


    //player.getBody().applyForceToCenter(new Vec2((Mouse.getX()-(camera.x))/PPM, ((gc.getHeight() - Mouse.getY())-(camera.y))/PPM).sub(player.getBody().getPosition()));

    float deltaF = (float) delta/1000;
    world.step(deltaF, 6, 2);

    camera.x = player.getBody().getPosition().mul(PPM).mul(-1).x + gc.getWidth()/2;
    camera.y = player.getBody().getPosition().mul(PPM).mul(-1).y + gc.getHeight()/2;
}

Дайте мне знать, если вам нужно увидеть код из других классов, так как я не знаю, в чем проблема, и поэтому не знаю, какой код опубликовать: p


person Tholok    schedule 11.10.2015    source источник
comment
Пожалуйста, рассмотрите возможность публикации кода. Мы не сможем вам помочь, если вы не предоставите более подробную информацию.   -  person RPresle    schedule 12.10.2015
comment
Вы правы, я просто разместил код. Пожалуйста, дайте мне знать, если мне нужно показать вам, ребята, код из других классов, так как я даже не знаю, в чем проблема: p   -  person Tholok    schedule 12.10.2015
comment
Каков полный путь вашего класса Mouse? Не могу найти в Slick2D. Рассматривали ли вы возможность использования унаследованного прослушивателя мыши?   -  person RPresle    schedule 12.10.2015
comment
Вот путь к классу Mouse: org.lwjgl.input.Mouse; Я попытался переопределить методы ввода мыши из BasicGameState, но у меня возникла та же проблема. Это то, что вы подразумеваете под прослушивателем мыши? Или есть другой способ получить ввод с помощью мыши, о котором я не знаю? большое спасибо за попытку помочь мне! :D   -  person Tholok    schedule 12.10.2015


Ответы (2)


Ok. Ответ на мою проблему немного смущает... :p Оказывается, проблема была в моем ноутбуке. По какой-то причине невозможно использовать кнопки на коврике для мыши во время набора текста xD Я думаю, это какая-то функция безопасности, чтобы вы не нажимали случайные вещи ладонью, пытаясь печатать :)

Подключил usb мышь и программа работает отлично! Большое спасибо RPresle за попытку помочь ;)

person Tholok    schedule 12.10.2015
comment
Рад, что ты узнаешь. =) не забудьте принять свой собственный ответ;) - person RPresle; 12.10.2015

Я мало что знаю о соответствии между классом LWJGL и классом Slick. В любом случае, я думаю, вы могли бы использовать то, что дает вам MouseListener. Вы можете переопределить метод mouseClicked(int button, int x, int y, int clickCount) или mousePressed.

@Override
public void mouseClicked(int button, int x, int y, int clickCount) {
    if(button == Input.MOUSE_LEFT_BUTTON){
        System.out.println("LeftMouseClicked");
    }else{
        System.out.println("Else button clicked");}
}

Это обеспечивается тем, что BasicGameState наследуется от MouseListener.

Это определенно должно сработать. Затем вы можете настроить флаг, чтобы знать, когда он нажат из метода update

person RPresle    schedule 12.10.2015
comment
У меня такая же проблема. Но я думаю, что изолировал проблему. Проблема не в том, что корабль ускоряется, а в том, что нажимаются другие кнопки. Когда я нажимаю одну из кнопок перемещения w, a, s, d, возникает задержка, прежде чем я могу заставить работать любой из методов мыши. Я попытаюсь переопределить ключевые методы прослушивания и использовать их вместо этого и посмотреть, исправит ли это проблему. 2 секунды - person Tholok; 12.10.2015
comment
Это действительно проблема... Использование только Slick' Listener должно работать. Мне удалось сделать такие вещи... Надеюсь, это сработает - person RPresle; 12.10.2015
comment
Это не сработало :( Итак, проблема в том, что не удается запустить событие щелчка мышью, пока нажимаются клавиши клавиатуры... каждый раз, когда я нажимаю клавишу на клавиатуре, возникает временная задержка около 2 секунд, когда методы мыши не срабатывают. Не имеет значения, запускают ли клавиши какие-либо методы в программе, любая клавиша на клавиатуре разрушает методы мыши :'( !! - person Tholok; 12.10.2015
comment
Вы тоже используете прослушиватель клавиатуры? - person RPresle; 12.10.2015
comment
Пробовал добавить это. Но я думаю, что это не имеет к этому никакого отношения, потому что я удалил весь код, относящийся к какому-либо ключевому вводу, и он все еще не работает. Я начинаю подозревать, что это как-то связано с моей клавиатурой и мышью, но у меня никогда не было таких проблем в других играх. - person Tholok; 12.10.2015