首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libgdx - PPM世界转换

Libgdx - PPM世界转换
EN

Stack Overflow用户
提问于 2017-11-07 17:52:40
回答 1查看 941关注 0票数 0

我的精灵动作太慢了。基本上,我想用更少的力量来移动我的球员。目前:

代码语言:javascript
复制
getBody().applyForceToCenter(new Vector2(-10000000f,0f), true);

是使它移动一点点所需的力。

我知道为什么我不能移动它是因为我还没有缩放雪碧(64x64)它的重量超过400公斤。正确的比例应该是多少?

这是我的游戏屏幕。

代码语言:javascript
复制
public class GameScreen implements Screen {
//Reference to our Game, used to set Screens
private Logang game;

//basic playscreen variables
private OrthographicCamera gamecam;
private Viewport gamePort;
//Box2d variables
private World world;
private Box2DDebugRenderer b2dr;

boolean drawn = true;
private Player p;
private int pX = 100, pY = 300;

public GameScreen(Logang game) {

    this.game = game;
    //create cam used to follow mario through cam world
    gamecam = new OrthographicCamera();
    gamePort = new ScalingViewport(Scaling.stretch, Logang.GWIDTH, Logang.GHEIGHT, gamecam);
    gamePort.apply();
    gamecam.position.set(gamecam.viewportWidth / 2, gamecam.viewportHeight / 2, 0);
    gamecam.update();
    Box2D.init();
    //create our Box2D world, setting no gravity in X, -10 gravity in Y, and allow bodies to sleep
    world = new World(new Vector2(0, Logang.GRAVITY), true);
    //allows for debug lines of our box2d world.
    b2dr = new Box2DDebugRenderer();

    //create a FitViewport to maintain virtual aspect ratio despite screen size

    p = new Player(new Sprite(new Texture("hud_p3.png")), world, pX, pY, 1);

    //initially set our gamcam to be centered correctly at the start of of map

    line();
}


@Override
public void show() {

}

public void update(float dt) {
    //handle user input first
    p.update(dt);
    //update our gamecam with correct coordinates after changes
}


@Override
public void render(float delta) {
    //separate our update logic from render
    update(delta);

    //Clear the game screen with Black
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    world.step(1f / 60f, 6, 2);

    gamecam.position.set(p.getSprite().getX(),Logang.GHEIGHT / 2, 0); // x and y could be changed by Keyboard input for example

    gamecam.update();

    game.getBatch().setProjectionMatrix(gamecam.combined);

    //renderer our Box2DDebugLines
    b2dr.render(world, gamecam.combined);

    System.out.println("Player x: " + p.getSprite().getX() + " Camera X: " + gamecam.position.x + " Body X: " + p.getBody().getPosition().x);
    //System.out.println("Player y: " + p.getSprite().getY() + " Camera Y: " + gamecam.position.y + " Body Y: " + p.getBody().getPosition().y);


    game.getBatch().begin();


    if (p.getBody() != null)
        p.render(game.getBatch());

    EntityManager.renderTerra(game.getBatch(), delta);


    game.getBatch().end();

}

public void line() {
    Texture tmp = new Texture("hud_p3.png");
    tmp.setWrap(Texture.TextureWrap.MirroredRepeat, Texture.TextureWrap.MirroredRepeat);
    for (int i = 0; i < 50; i++) {
        EntityManager.add(new Ground(new Sprite(tmp), world, (int)(i * Logang.TILE), 1, 2));
    }
   // EntityManager.changeSize(((Logang.TILE) * 5),Logang.TILE);
}

@Override
public void resize(int width, int height) {
    //updated our game viewport
    gamePort.update(width, height);
    gamecam.position.set(gamecam.viewportWidth / 2, gamecam.viewportHeight / 2, 0);
}

public World getWorld() {
    return world;
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    world.dispose();
    b2dr.dispose();
}

这是我的实体类

代码语言:javascript
复制
private World world;
private Sprite sprite;
private Body body;
private int tipo;

public Entity(Sprite sprite, World world, int x, int y, int tipo) {
this.sprite = sprite;
this.world = world;
getSprite().setPosition(x, y);
sprite.setSize(Logang.TILE, Logang.TILE);
sprite.setOriginCenter();
define(tipo);
this.tipo = tipo;
}

public void update(float dt){
if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
    getBody().applyForceToCenter(new Vector2(-10000000f,0f), true);
}
if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
    getBody().applyForceToCenter(new Vector2(10000000f,0f), true);
}
if(Gdx.input.isKeyPressed(Input.Keys.SPACE)){
    //getBody().applyLinearImpulse(0f,-Logang.GRAVITY, 
getBody().getPosition().x, getBody().getPosition().y, true);
     }
}

public void define(int tipo) {
BodyDef bdef = new BodyDef();
bdef.position.set((getSprite().getX() + getSprite().getWidth() / 2), 
(getSprite().getY() + getSprite().getHeight() / 2));
switch (tipo) {
    case 1: {
        bdef.type = BodyDef.BodyType.DynamicBody;
        break;
    }
    case 2: {
        bdef.type = BodyDef.BodyType.StaticBody;
        break;
    }
    case 3: {
        bdef.type = BodyDef.BodyType.DynamicBody;
        break;
    }

}

body = world.createBody(bdef);

FixtureDef fdef = new FixtureDef();
fdef.density=0.001f; // (weight: range 0.01 to 1 is good)
PolygonShape shape = new PolygonShape();
shape.setAsBox(getSprite().getWidth() / 2, getSprite().getHeight() / 2);

fdef.shape = shape;
body.createFixture(fdef);
body.setUserData(this);

shape.dispose();
}

public void render(SpriteBatch batch) {
if (tipo != 2) {
    float posX = getBody().getPosition().x;
    float posY = getBody().getPosition().y;

        getSprite().setPosition(posX - getSprite().getWidth() / 2, posY - 
getSprite().getHeight() / 2);

    }
    getSprite().draw(batch);
}

public Sprite getSprite() {
    return sprite;
}

public void setSprite(Sprite sprite) {
    this.sprite = sprite;
}

public Body getBody() {
    return body;
}

public void setBody(Body body) {
    this.body = body;
}

这是游戏变量

代码语言:javascript
复制
public static final int GWIDTH = 800;
public static final int GHEIGHT = (GWIDTH/16)*9;
public static final float PPM = 100f;
public static final float GRAVITY = -10f;
public static final float TILE = 64;

你能帮我修一下吗?我已经试过分割身体和伽美康的位置了,仍然没有效果。

EN

回答 1

Stack Overflow用户

发布于 2017-11-08 21:58:22

正确的比例应该是多少?

正确的尺度是现实生活中的1单位( LibGDX,Box2D)表示现实生活中的1米的尺度。我总是建议人们使用这个比例,并适当放大相机。

不过请注意,如果你使用的是非常大的物体和缩放相机所有的方式回来的物体似乎是缓慢下降。这显然是因为你的相机有一个更大的空间。它不仅会缓慢下降,而且如果这个项目被认为是较小的,它将无法与世界进行适当的互动。

让相机适应你的世界,而不是你的世界。

More detailed answer I gave

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47164432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档