实体在到达屏幕边缘时减速

Entity slowing down when reaching the edge of the screen

这是我的核心项目:

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 中,敌人不断随机生成,并以恒定速度(最终整数 300)从屏幕右侧移动到左侧。但是当它们到达屏幕的左边缘时(当 posX <= 0 时),它们会减速,原因不明。问题是,当敌人到达屏幕边缘时,我没有编写任何程序。(我编写了当他们完全在屏幕之外时消失的程序,当 posX + width <= 0,但这与我的问题无关,因为即使我删除它,它们在到达屏幕边缘时也会继续减速)。

它发生在桌面和 android 项目中,所以这肯定来自核心项目。

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

这里有几张图片向您展示了发生的事情。

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

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

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

你可以把PlayScreen.speed设置成100而不是300,会更明显。 如果你把它设置得足够低,比如20,敌人不仅会减速,他们基本上会停止移动

我迷路了,不知道如何解决这个问题。如果你有,欢迎分享。

我不太确定,但我猜你在 Enemy class 中涉及 delta 的计算会四舍五入(因为 PlayScreen.Speed 是整数)。

具有足够低的 PlayScreen.Speed 或足够低的 delta 将导致 delta * PlayScreen.Speed 成为 0.something,在转换为整数时将截断为 0,导致 posX 永远不会改变。

我通常在所有涉及位置的计算中使用浮点数(例如 posXposY 等等...),以便在屏幕上绘制某些内容之前不会发生这种切断(因为像素总是整数)。这会产生更准确的结果,并解决了屏幕上移动的许多问题。

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