Эй!. Я пытаюсь сделать небольшую игру для хобби на 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