首页 > 解决方案 > Java 对象转义窗口框架

问题描述

所以我做了一个游戏,我希望敌人以随机的 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);
        }

标签: java

解决方案


问题:

  • 不要重新创建 Random,因为它很浪费,有时还很危险。最好创建一个 Random 对象并将其分配给类的实例字段,并在整个过程中使用它。
  • 避免“幻数”。所以代替y >= Game.HEIGHT - 48, do 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)我尝试交换,他们刚刚从屏幕上射出。

我不知道你的意思是什么,或者你可能做了哪些具体的代码更改。

如果仍然卡住,请考虑创建并发布一个有效的Minimal Reproducible Example


推荐阅读