Anonymous
Игрок LibGDX не двигается
Сообщение
Anonymous » 09 ноя 2024, 06:35
Я разрабатываю простой прототип игры libgdx на основе 5-10-минутного руководства по плейлисту видеороликов. все работает, все рендерится, но когда дело доходит до гравитации игрока, прыжков и движений, все не так. В частности, две проблемы: гравитация, которую я установил, ничего не делает, и ввод просто не работает
Итак, здесь у вас есть все связанные с игроками, и если вы хотите больше, просто скажите мне
Игрок.java:
Код: Выделить всё
package objects.player;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import static helper.Constants.PPM;
public class Player extends GameEntity{
private int jumpCounter;
public Player(float width, float height, Body body) {
super(width, height, body);
this.speed = 10f;
this.jumpCounter = 0;
}
@Override
public void update() {
x = body.getPosition().x * PPM;
y = body.getPosition().y * PPM;
checkUserInput();
}
@Override
public void render(SpriteBatch batch) {
}
private void checkUserInput() {
velX = 0;
if(Gdx.input.isKeyPressed(Input.Keys.D)) {
velX = 1;
}
if(Gdx.input.isKeyPressed(Input.Keys.A)) {
velX = -1;
}
if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE) && jumpCounter < 2) {
float force = body.getMass()*18;
body.setLinearVelocity(body.getLinearVelocity().x, 0);
body.applyLinearImpulse(new Vector2(0, force), body.getPosition(), true);
jumpCounter++;
}
//reiniciar jumpcounter
if(body.getLinearVelocity().y == 0) {
jumpCounter = 0;
}
body.setLinearVelocity(velX * speed, body.getLinearVelocity().y < 25 ? body.getLinearVelocity().y : 25);
}
}
Здесь GameEntity.java:
Код: Выделить всё
package objects.player;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.physics.box2d.Body;
public abstract class GameEntity {
protected float x, y, velX, velY, speed;
protected float width, height;
protected Body body;
public GameEntity(float width, float height, Body body) {
this.x = body.getPosition().x;
this.y = body.getPosition().y;
this.width = width;
this.height = height;
this.body = body;
this.velX = 0;
this.velY = 0;
this.speed = 0;
}
public abstract void update();
public abstract void render(SpriteBatch batch);
public Body getBody() { return body; }
}
А вот и рендерер
Код: Выделить всё
package helper;
import com.badlogic.gdx.maps.MapObject;
import com.badlogic.gdx.maps.MapObjects;
import com.badlogic.gdx.maps.MapLayer;
import com.badlogic.gdx.maps.MapLayers;
import com.badlogic.gdx.maps.objects.PolygonMapObject;
import com.badlogic.gdx.maps.objects.RectangleMapObject;
import com.badlogic.gdx.maps.tiled.TiledMap;
import com.badlogic.gdx.maps.tiled.TmxMapLoader;
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.Shape;
import io.github.megamen2.lwjgl3.GameScreen;
import objects.player.Player;
import static helper.Constants.PPM;
public class TileMapHelper {
private TiledMap tiledMap;
private GameScreen gameScreen;
public TileMapHelper(GameScreen gameScreen) {
this.gameScreen = gameScreen;
}
public OrthogonalTiledMapRenderer setupMap() {
tiledMap = new TmxMapLoader().load("./maps/map0.tmx");
parseMapObjects(tiledMap.getLayers().get("objects").getObjects());
return new OrthogonalTiledMapRenderer(tiledMap);
}
private void parseMapObjects(MapObjects mapObjects) {
for(MapObject mapObject : mapObjects) {
if(mapObject instanceof PolygonMapObject) {
createStaticBody((PolygonMapObject) mapObject);
}
if(mapObject instanceof RectangleMapObject) {
Rectangle rectangle = ((RectangleMapObject) mapObject).getRectangle();
String rectangleName = mapObject.getName();
if(rectangleName.equals("player")) {
Body body = BodyHelperService.createBody(
rectangle.getX() + rectangle.getWidth()/2,
rectangle.getY() + rectangle.getHeight()/2,
rectangle.getWidth(),
rectangle.getHeight(),
false,
gameScreen.getWorld()
);
gameScreen.setPlayer(new Player(rectangle.getWidth(), rectangle.getHeight(), body));
}
}
}
}
private void createStaticBody(PolygonMapObject polygonMapObject) {
BodyDef bodydef = new BodyDef();
bodydef.type = BodyDef.BodyType.StaticBody;
Body body = gameScreen.getWorld().createBody(bodydef);
Shape shape = createPolygonShape(polygonMapObject);
body.createFixture(shape, 1000);
shape.dispose();
}
private Shape createPolygonShape(PolygonMapObject polygonMapObject) {
float [] vertices = polygonMapObject.getPolygon().getTransformedVertices();
Vector2[] worldVertices = new Vector2[vertices.length/2];
for(int i=0; i
Подробнее здесь: [url]https://stackoverflow.com/questions/79172064/libgdx-player-doesnt-moves[/url]
1731123354
Anonymous
Я разрабатываю простой прототип игры libgdx на основе 5-10-минутного руководства по плейлисту видеороликов. все работает, все рендерится, но когда дело доходит до гравитации игрока, прыжков и движений, все не так. В частности, две проблемы: гравитация, которую я установил, ничего не делает, и ввод просто не работает Итак, здесь у вас есть все связанные с игроками, и если вы хотите больше, просто скажите мне Игрок.java: [code]package objects.player; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import static helper.Constants.PPM; public class Player extends GameEntity{ private int jumpCounter; public Player(float width, float height, Body body) { super(width, height, body); this.speed = 10f; this.jumpCounter = 0; } @Override public void update() { x = body.getPosition().x * PPM; y = body.getPosition().y * PPM; checkUserInput(); } @Override public void render(SpriteBatch batch) { } private void checkUserInput() { velX = 0; if(Gdx.input.isKeyPressed(Input.Keys.D)) { velX = 1; } if(Gdx.input.isKeyPressed(Input.Keys.A)) { velX = -1; } if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE) && jumpCounter < 2) { float force = body.getMass()*18; body.setLinearVelocity(body.getLinearVelocity().x, 0); body.applyLinearImpulse(new Vector2(0, force), body.getPosition(), true); jumpCounter++; } //reiniciar jumpcounter if(body.getLinearVelocity().y == 0) { jumpCounter = 0; } body.setLinearVelocity(velX * speed, body.getLinearVelocity().y < 25 ? body.getLinearVelocity().y : 25); } } [/code] Здесь GameEntity.java: [code]package objects.player; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.physics.box2d.Body; public abstract class GameEntity { protected float x, y, velX, velY, speed; protected float width, height; protected Body body; public GameEntity(float width, float height, Body body) { this.x = body.getPosition().x; this.y = body.getPosition().y; this.width = width; this.height = height; this.body = body; this.velX = 0; this.velY = 0; this.speed = 0; } public abstract void update(); public abstract void render(SpriteBatch batch); public Body getBody() { return body; } } [/code] А вот и рендерер [code]package helper; import com.badlogic.gdx.maps.MapObject; import com.badlogic.gdx.maps.MapObjects; import com.badlogic.gdx.maps.MapLayer; import com.badlogic.gdx.maps.MapLayers; import com.badlogic.gdx.maps.objects.PolygonMapObject; import com.badlogic.gdx.maps.objects.RectangleMapObject; import com.badlogic.gdx.maps.tiled.TiledMap; import com.badlogic.gdx.maps.tiled.TmxMapLoader; import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.BodyDef; import com.badlogic.gdx.physics.box2d.PolygonShape; import com.badlogic.gdx.physics.box2d.Shape; import io.github.megamen2.lwjgl3.GameScreen; import objects.player.Player; import static helper.Constants.PPM; public class TileMapHelper { private TiledMap tiledMap; private GameScreen gameScreen; public TileMapHelper(GameScreen gameScreen) { this.gameScreen = gameScreen; } public OrthogonalTiledMapRenderer setupMap() { tiledMap = new TmxMapLoader().load("./maps/map0.tmx"); parseMapObjects(tiledMap.getLayers().get("objects").getObjects()); return new OrthogonalTiledMapRenderer(tiledMap); } private void parseMapObjects(MapObjects mapObjects) { for(MapObject mapObject : mapObjects) { if(mapObject instanceof PolygonMapObject) { createStaticBody((PolygonMapObject) mapObject); } if(mapObject instanceof RectangleMapObject) { Rectangle rectangle = ((RectangleMapObject) mapObject).getRectangle(); String rectangleName = mapObject.getName(); if(rectangleName.equals("player")) { Body body = BodyHelperService.createBody( rectangle.getX() + rectangle.getWidth()/2, rectangle.getY() + rectangle.getHeight()/2, rectangle.getWidth(), rectangle.getHeight(), false, gameScreen.getWorld() ); gameScreen.setPlayer(new Player(rectangle.getWidth(), rectangle.getHeight(), body)); } } } } private void createStaticBody(PolygonMapObject polygonMapObject) { BodyDef bodydef = new BodyDef(); bodydef.type = BodyDef.BodyType.StaticBody; Body body = gameScreen.getWorld().createBody(bodydef); Shape shape = createPolygonShape(polygonMapObject); body.createFixture(shape, 1000); shape.dispose(); } private Shape createPolygonShape(PolygonMapObject polygonMapObject) { float [] vertices = polygonMapObject.getPolygon().getTransformedVertices(); Vector2[] worldVertices = new Vector2[vertices.length/2]; for(int i=0; i Подробнее здесь: [url]https://stackoverflow.com/questions/79172064/libgdx-player-doesnt-moves[/url]