实体在到达屏幕边缘时放慢速度

时间:2015-03-25 11:40:37

标签: java scroll libgdx entity

这是我的核心项目:

public class GameClass extends Game {

    public static int screenWidth, screenHeight;

    public static CustomScreen currentScreen;
    public static PlayScreen playScreen;

    @Override
    public void create () {
        screenWidth = Gdx.graphics.getWidth();
        screenHeight = Gdx.graphics.getHeight();
        CustomScreen.initialize();

        playScreen = new PlayScreen(this);

        SetScreen(playScreen);
    }

    public void SetScreen(CustomScreen screen) {
        currentScreen = screen;
        setScreen(currentScreen);
    }
}

public abstract class CustomScreen implements Screen {

    GameClass game;

    static BitmapFont font;
    static SpriteBatch batcher;
    static OrthographicCamera cam;

    public CustomScreen(GameClass game) {
        this.game = game;
    }

    public static void initialize() {
        cam = new OrthographicCamera();
        cam.setToOrtho(true, GameClass.screenWidth, GameClass.screenHeight);
        batcher = new SpriteBatch();
        batcher.setProjectionMatrix(cam.combined);
        font = new BitmapFont();
        font.setScale(4f, -4f);
    }

    public void Clear() {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    }

    @Override
    public abstract void render(float delta);
}

public class PlayScreen extends CustomScreen {

    public static final int speed = 300;

    public ArrayList<Entity> entityList;

    Random rand = new Random();
    float timer = rand.nextInt(2) + rand.nextFloat();

    public PlayScreen(GameClass game) {
        super(game);

        entityList = new ArrayList<Entity>();
    }

    void update(float delta) {
        timer -= delta;
        if (timer <= 0) {
            entityList.add(new Enemy(GameClass.screenWidth, rand.nextInt(GameClass.screenHeight - Enemy.Height)));
            timer += rand.nextInt(2) + rand.nextFloat() + 1/2;
        }

        for (int i = entityList.size(); i > 0; --i)
            entityList.get(i-1).update(delta);
    }

    @Override
    public void render(float delta) {
        Clear();
        update(delta);

        batcher.begin();

        for (int i = 0; i < entityList.size(); ++i) {
            entityList.get(i).Display(batcher);
        }

        if (entityList.size() > 1)
            System.out.println(entityList.get(1).posX - entityList.get(0).posX);

        batcher.end();
    }
}

public abstract class Entity {

    protected Sprite sprite;
    public int posX, posY, width, height;

    public Entity(int posX, int posY, int width, int height) {
        this.posX = posX;
        this.posY = posY;
        this.width = width;
        this.height = height;
    }

    public abstract void update(float delta);

    public void Display(SpriteBatch batcher) {
        batcher.draw(sprite, posX, posY, width, height);
    }
}

public class Enemy extends Entity {

    static Sprite texture = new Sprite(new Texture(Gdx.files.internal("enemy.png")));
    public static int Width = 300, Height = 200;

    public Enemy(int posX, int posY) {
        super(posX, posY, Width, Height);
        this.sprite = Enemy.texture;
    }

    @Override
    public void update(float delta, int i) {
        posX -= delta * PlayScreen.speed;

        if (posX + width < 0) {
            GameClass.playScreen.entityList.remove(this);
        }
    }

}

在PlayScreen中,敌人会随机生成,并以恒定速度(最终int 300)从屏幕右侧移动到左侧。但当它们到达屏幕的左边缘时(当posX <= 0时),它们会减速,原因不明。事情是,当敌人到达屏幕边缘时,我没有对任何事情进行编程。(当他们完全在屏幕之外时,我将它们编程为消失,当posX +宽度时&lt; = 0,但它与我的问题无关,因为即使我删除它,它们在到达屏幕边缘时也会继续减速。)

它发生在桌面和Android项目中,所以这绝对来自Core项目。

我不知道为什么会这样,这真的很尴尬。

这是一张图片,向您展示会发生什么。

http://i.stack.imgur.com/DrOSH.png

http://i.stack.imgur.com/Zjtju.png

我们可以看到第二张图片上的两个敌人比第一张图片上的两个敌人更接近。

您可以将PlayScreen.speed设置为100而不是300,它会更加明显。 并且如果你把它设置为足够低的值,比如20,敌人不会放慢速度,他们基本上会停止移动

我迷路了,不知道如何解决这个问题。如果您有,请随时分享。

2 个答案:

答案 0 :(得分:0)

我不太确定,但我猜你在涉及delta的Enemy类中的计算得到了舍入(因为PlayScreen.Speed是一个整数)。

具有足够低的PlayScreen.Speed或足够低的delta将导致delta * PlayScreen.Speed为0.something在转换为整数时将被切断为0,从而导致{{ 1}}永远不会改变。

我通常使用花车进行涉及位置的所有计算(例如posXposX等等......)这样切断不会发生,直到在屏幕上绘制了某些内容(因为像素总是整数)。这样可以产生更准确的结果,并解决了屏幕上移动的许多问题。

答案 1 :(得分:0)

我修好了。问题是Enemy.posX是一个int而不是浮点数。