Моя проблема в следующем, когда я не двигаю свою камеру, мой спрайт хорошо следует моему телу box2d.Но когда я реализую прокрутку, иначе я использую cam.translate, спрайт поднимается каждый кадр до высокого, пока не исчезнет.Странно то, что если я проверяю, что координаты точно совпадают между моим телом b2 и моим спрайтом.
ОБНОВЛЕНИЕ: Я попытался использовать cam.position.set (cam.position.x, cam.position.y* 1.001f, 0) чтобы переставить cam.translate, но у меня была та же проблема.
Переменные:
private GalaxyFighter jeu;
//render variables
private OrthographicCamera cam;
private Viewport gamePort;
private Hud hud;
private float maxScrolling;
//tilded map variables
private TmxMapLoader maploader;
private TiledMap map;
private OrthogonalTiledMapRenderer renderer;
//box2d variables
private World world;
private Box2DDebugRenderer b2dr;
private SpaceShip player;
private Sprite spriteSpaceShip;
Конструктор:
public EcranJeu(GalaxyFighter jeu, float maxScrolling){
this.jeu = jeu;
cam = new OrthographicCamera();
gamePort = new FitViewport(GalaxyFighter.V_WIDTH / GalaxyFighter.PPM, GalaxyFighter.V_HEIGHT / GalaxyFighter.PPM, cam);
hud = new Hud(jeu.batch);
this.maxScrolling = maxScrolling;
maploader = new TmxMapLoader();
map = maploader.load("level1.tmx");
renderer = new OrthogonalTiledMapRenderer(map, 1 / GalaxyFighter.PPM);
cam.position.set(gamePort.getWorldWidth() / 2, gamePort.getWorldHeight() / 2, 0);
world = new World(new Vector2(0,0), true);
b2dr = new Box2DDebugRenderer();
player = new SpaceShip(world);
spriteSpaceShip = new Sprite(new Texture("redship1.png"));
player.b2body.setUserData(spriteSpaceShip);
new B2WorldCreator(world, map);
world.setContactListener(new WorldContactListener());
}
Здесьмой метод обновления вызывается в render:
public void update(float dt){
handleInput(dt);
world.step(1/60f, 6, 2);
if(cam.position.y < (maxScrolling / GalaxyFighter.PPM))
cam.translate(0, 0.5f / GalaxyFighter.PPM);
limitPlayer();
spriteSpaceShip.setPosition(player.b2body.getPosition().x * GalaxyFighter.PPM - 8, player.b2body.getPosition().y * GalaxyFighter.PPM - 8);
System.out.println("Pos player x = " + (player.b2body.getPosition().x * GalaxyFighter.PPM - 8) + " y = " + (player.b2body.getPosition().y * GalaxyFighter.PPM - 8));
System.out.println("Pos sprite x = " + spriteSpaceShip.getX() + " y = " + spriteSpaceShip.getY());
cam.update();
renderer.setView(cam);
}
Вот мой метод визуализации:
public void render(float delta) {
update(delta);
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
renderer.render();
b2dr.render(world, cam.combined);
jeu.batch.setProjectionMatrix(hud.stage.getCamera().combined);
hud.stage.draw();
jeu.batch.begin();
spriteSpaceShip.draw(jeu.batch);
jeu.batch.end();
}
Я не вижу, где моя ошибка, поэтому я надеюсь, что кто-то найдет ее!Спасибо за ваше время.
РЕДАКТИРОВАТЬ: Вот другой класс, который я использую, и я заканчиваю класс gameScreen
HUD
public class Hud implements Disposable {
public Stage stage;
private Viewport viewport;
private Integer life;
private static Integer score;
private Integer niveau;
Label lifeLabel;
private static Label scoreLabel;
Label niveauLabel;
Label lifeStrLabel;
Label scoreStrLabel;
Label niveauStrLabel;
public Hud(SpriteBatch sb){
life = 3;
score = 0;
niveau = 1;
viewport = new FitViewport(GalaxyFighter.V_WIDTH, GalaxyFighter.V_HEIGHT, new OrthographicCamera());
stage = new Stage(viewport, sb);
Table table = new Table();
table.top();
table.setFillParent(true);
lifeLabel = new Label(String.format("%02d", life), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
scoreLabel = new Label(String.format("%04d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
niveauStrLabel = new Label("NIVEAU", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
lifeStrLabel = new Label("VIE", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
scoreStrLabel = new Label("SCORE", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
niveauLabel = new Label(String.format("%02d", niveau), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
table.add(lifeStrLabel).expandX().padTop(10);
table.add(niveauStrLabel).expandX().padTop(10);
table.add(scoreStrLabel).expandX().padTop(10);
table.row();
table.add(lifeLabel).expandX();
table.add(niveauLabel).expandX();
table.add(scoreLabel).expandX();
stage.addActor(table);
}
И космический корабль, которыйигрок:
public class SpaceShip extends Sprite {
public World world;
public Body b2body;
public SpaceShip(World world){
this.world = world;
defineSpaceShip();
}
public void defineSpaceShip(){
BodyDef bdef = new BodyDef();
bdef.position.set(GalaxyFighter.V_WIDTH / 2 / GalaxyFighter.PPM, 3 / GalaxyFighter.PPM);
bdef.type = BodyDef.BodyType.DynamicBody;
b2body = world.createBody(bdef);
FixtureDef fdef = new FixtureDef();
CircleShape shape = new CircleShape();
shape.setRadius(5 / GalaxyFighter.PPM);
fdef.filter.categoryBits = GalaxyFighter.SPACESHIP_BIT;
fdef.filter.maskBits = GalaxyFighter.DEFAULT_BIT | GalaxyFighter.ASTEROIDE_BIT |GalaxyFighter.BONUS1_BIT|GalaxyFighter.BONUS2_BIT|GalaxyFighter.BONUS3_BIT|GalaxyFighter.PISTE_BIT|GalaxyFighter.BORDSMAP_BIT;
fdef.shape = shape;
b2body.createFixture(fdef);
EdgeShape head_spaceship = new EdgeShape();
head_spaceship.set(new Vector2(-4 / GalaxyFighter.PPM, 0), new Vector2(4 / GalaxyFighter.PPM, 0));
fdef.shape = head_spaceship;
fdef.isSensor = true;
b2body.createFixture(fdef).setUserData("head_spaceship");
EdgeShape head_spaceship2 = new EdgeShape();
head_spaceship2.set(new Vector2(0, -4 / GalaxyFighter.PPM), new Vector2(0, 4 / GalaxyFighter.PPM));
fdef.shape = head_spaceship2;
fdef.isSensor = true;
b2body.createFixture(fdef).setUserData("head_spaceship2");
}