簡體   English   中英

轉義窗口框架的Java對象

[英]Java objects escaping window frame

所以我做了一個游戲,我希望敵人以隨機的 x 和 y 速度擊中時從牆上反彈。 然而,不知怎的,這些小家伙們仍然逃出了窗外。 大多數情況下它都有效,但每隔 10 次它就會偷偷溜出邊界,我不知道怎么做。

@Override
    public void tick()
    {
        x += speedX;
        y += speedY;
        Random r = new Random();

        //BUGS
        if(y <= 0 || y >= Game.HEIGHT - 48) //This is correct size of the window edges
        {
            if(speedY <= 0)
                speedY = (r.nextInt(8) + 1);
            else
                speedY = -(r.nextInt(8) + 1);
        }
        if(x <= 0 || x >= Game.WIDTH - 32) //This is correct size of the window edges
        {
            if(speedX <= 0)
                speedX = (r.nextInt(8) + 1);
            else
                speedX = -(r.nextInt(8) + 1);
        }

問題:

  • 不要重新創建 Random,因為它很浪費而且有時很危險。 最好創建一個 Random 對象並將其分配給類的一個實例字段,並在整個過程中使用它。
  • 避免“幻數”。 所以,而不是y >= Game.HEIGHT - 48 ,做y >= Game.HEIGHT - WINDOW_EDGES (或類似的東西)
  • 不要在執行時交換速度,而是分別檢查y <= 0y >= Game.HEIGHT -SOME_CONSTANT ,並根據此發現調整結果以避免陷入速度“陷阱”。 這實際上是你的主要問題。

例如,

if (y <= 0) {
    speedY = r.nextInt(8) + 1; // change 8 to a constant
} else if (y >= Game.HEIGHT - SOME_CONSTANT) {
    speedY = -(r.nextInt(8) + 1);
}

x 和 speedX 相同

關於:

2)我想這樣做,但由於我有多個對象大小,我必須改變邊緣。

然后每個對象都應該有一個方法來返回它的邊緣大小(或任何需要的屬性),你應該再次使用這個,而不是幻數

3)我嘗試交換,他們只是從屏幕上開槍。

我不知道您的意思是什么,或者您可能進行了哪些特定的代碼更改。

如果仍然卡住,請考慮創建並發布有效的最小可重現示例

暫無
暫無

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

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