2017-04-06 77 views
0

即使我通過BallScreen類的Show()方法中的BouncingBall類構造函數調用init()方法,我也正在製作一個簡單的Bouncing Ball遊戲,但並未創建球。所以要創建一個球,我應該在Resize()方法中調用BouncingBall的init()方法。爲什麼?它不是應該在Show()方法中創建的嗎?爲什麼我必須在Resize()方法中初始化球? --Libgdx

這裏是一個彈跳球

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); 
} 
} 

下面的代碼爲彈跳球Screen類

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(); 

} 
} 
+0

你是什麼意思是由球沒有創建或不顯示在屏幕上? – Aryan

+0

@AbhishekAryan是的,它在視口上不可見。 –

回答

0

問題是在這一行:

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

當您創建FitViewPort並傳遞給BouncingBall,那時視口只有wo rldWidth和worldHeight就是你設置的480.那時候視口的screenwidth和screenheight是零,所以你的半徑初始化爲零值。

但經過update()方法如果我叫init()方法:

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

,當你調用視口更新方法屏幕寬度,並根據你使用什麼類型的視口有一些價值視窗的screenheight後。

update()之後如果我打電話ball.init(viewport);那麼半徑不是零值,以便球在屏幕上可見。

+0

非常感謝!我想我錯過了screenWidth和worldWidth之間的區別... –

相關問題