簡體   English   中英

為什么我必須在Resize()方法中初始化球? -Libgdx

[英]Why do i have to initialize the ball in Resize() method? - Libgdx

我正在制作一個簡單的Bouncing Ball游戲,即使我通過BallScreen類的Show()方法中的BouncingBall類構造函數調用init()方法,也不會創建球。 因此,要創建一個球,我應該在Resize()方法中調用BouncingBall的init()方法。 為什么? 它不是應該在Show()方法中創建的嗎?

這是彈跳球的代碼

public class BouncingBall {

public static final float RADIUS_RATIO = 0.04f;
public static final float START_KICK = 500.0f;
private static final float KICK_INTERVAL = 3f;
private static final float DRAG = 1f;


private Vector2 position;
private Vector2 velocity;
float radius;
float lastKick;

public BouncingBall(Viewport viewport) {
    init(viewport);
}

public void init(Viewport viewport) {
    position = new Vector2();
    position.x = viewport.getWorldWidth() / 2;
    position.y = viewport.getWorldHeight() / 2;

    velocity = new Vector2(0,0);

    radius = RADIUS_RATIO * Math.min(viewport.getScreenWidth(), viewport.getScreenHeight());
    startKick();
}

public void update(float delta, Viewport viewport) {

    float elapsedSeconds = MathUtils.nanoToSec * (TimeUtils.nanoTime() - lastKick);

    if (elapsedSeconds > KICK_INTERVAL) {
        lastKick = TimeUtils.nanoTime();
        startKick();
    }

    velocity.x -= delta * DRAG * velocity.x;
    velocity.y -= delta * DRAG * velocity.y;

    position.x += velocity.x * delta;
    position.y += velocity.y * delta;
    collision(radius,viewport);
}


public void collision(float radius, Viewport viewport) {
    if (position.x + radius > viewport.getWorldWidth()) {
        position.x = viewport.getWorldWidth() - radius;
        velocity.x = -velocity.x;
    }

    if (position.x - radius < 0) {
        position.x = radius;
        velocity.x = -velocity.x;
    }

    if (position.y + radius > viewport.getScreenHeight()) {
        position.y = viewport.getWorldHeight() - radius;
        velocity.y = -velocity.y;
    }

    if (position.y - radius < 0) {
        position.y = radius;
        velocity.y = -velocity.y;
    }
}

public void startKick() {
    Random random = new Random();
    float angle = random.nextFloat() * MathUtils.PI2;
    velocity.x = START_KICK * MathUtils.cos(angle);
    velocity.y = START_KICK * MathUtils.sin(angle);
}

public void render(ShapeRenderer renderer) {
    renderer.setColor(Color.RED);
    renderer.circle(position.x, position.y, radius);
}
}

這是彈跳球的屏幕類

public class BallScreen extends ScreenAdapter {


private static final float WORLD_SIZE = 480f;
private static final String TAG = BallScreen.class.getSimpleName();

private BouncingBall ball;
private Viewport viewport;
private ShapeRenderer renderer;


@Override
public void show() {
    Gdx.app.log(TAG, "Show");
    viewport = new FitViewport(WORLD_SIZE, WORLD_SIZE);
    renderer = new ShapeRenderer();
    ball = new BouncingBall(viewport);
}

@Override
public void resize(int width, int height) {
    Gdx.app.log(TAG, "resize" + width + " " + height);
    viewport.update(width,height,true);
    ball.init(viewport);
}

@Override
public void dispose() {
    Gdx.app.log(TAG, "dispose");
    renderer.dispose();
}

@Override
public void render(float delta) {
    viewport.apply();
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);

    renderer.setProjectionMatrix(viewport.getCamera().combined);
    renderer.begin(ShapeType.Filled);

    ball.update(delta, viewport);
    ball.render(renderer);

    renderer.end();

}
}

問題在這一行:

radius = RADIUS_RATIO * Math.min(viewport.getScreenWidth(), viewport.getScreenHeight());

當您創建FitViewPort並傳遞給BouncingBall時,此時的視口僅具有您設置的480的worldWidth和worldHeight。那時,視口的screenwidth和screenheight為零,因此您的半徑初始化為零值。

但是在update()方法之后,如果我調用init()方法:

viewport.update(width,height,true);  // this method set value to screenwidth/height

當您在視口的屏幕寬度和屏幕高度之后視視口調用更新方法時,根據您所使用的視口類型,視口的屏幕寬度和屏幕高度具有一定的值。

update()如果我調用ball.init(viewport); 則半徑不是零值,以便在屏幕上可見球。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM