转义窗口框架的Java对象

转义窗口框架的Java对象,java,Java,所以我做了一个游戏,我想让敌人在以随机的x和y速度击中时从墙上弹起。然而,不知怎的,这些小家伙还是从窗口逃走了。大多数时候它都能工作,但每过10次它就会偷偷溜出边境,我不知道怎么做 @Override public void tick() { x += speedX; y += speedY; Random r = new Random(); //BUGS if(y <= 0 || y >

所以我做了一个游戏,我想让敌人在以随机的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);
        }
@覆盖
公共空白勾号()
{
x+=速度x;
y+=快速;
随机r=新随机();
//虫子
if(y=Game.HEIGHT-48)//这是窗口边缘的正确大小
{
如果(快速问题:

  • 不要重新创建Random,因为它是浪费的,有时是危险的。最好创建一个Random对象并将其分配给类的实例字段,并在整个过程中使用它
  • 避免使用“神奇数字”。因此,不要使用
    y>=Game.HEIGHT-48
    ,而是使用
    y>=Game.HEIGHT-WINDOW\u-EDGES
    (或类似方法)
  • 不要在你做的时候交换速度,而是分别检查
    y=Game.HEIGHT-一些常数,并根据这一发现调整结果,以避免陷入速度“陷阱”。事实上,这是你的主要问题
e、 g

if(y=Game.HEIGHT-SOME_常量){
斯皮蒂=-(r.nextInt(8)+1);
}
同样适用于x和speedX

关于:

2) 我想这样做,但由于我有多个对象大小,我必须更改边

然后每个对象都应该有一个返回其边大小(或任何需要的属性)的方法,并且您应该再次使用这个方法,而不是使用幻数

3) 我试着交换,结果他们就从屏幕上消失了

我不知道你这是什么意思,也不知道你可能对代码做了哪些具体的修改

如果仍然存在,请考虑创建并发布一个有效的

问题:

  • 不要重新创建Random,因为它是浪费的,有时是危险的。最好创建一个Random对象并将其分配给类的实例字段,并在整个过程中使用它
  • 避免使用“神奇数字”。因此,不要使用
    y>=Game.HEIGHT-48
    ,而是使用
    y>=Game.HEIGHT-WINDOW\u-EDGES
    (或类似方法)
  • 不要在你做的时候交换速度,而是分别检查
    y=Game.HEIGHT-一些常数,并根据这一发现调整结果,以避免陷入速度“陷阱”。事实上,这是你的主要问题
e、 g

if(y=Game.HEIGHT-SOME_常量){
斯皮蒂=-(r.nextInt(8)+1);
}
同样适用于x和speedX

关于:

2) 我想这样做,但由于我有多个对象大小,我必须更改边

然后每个对象都应该有一个返回其边大小(或任何需要的属性)的方法,并且您应该再次使用这个方法,而不是使用幻数

3) 我试着交换,结果他们就从屏幕上消失了

我不知道你这是什么意思,也不知道你可能对代码做了哪些具体的修改


如果仍然被卡住,考虑创建和发布一个有效的

,我会想象如果一个bug是“太远”的屏幕,那么它就不能“返回”。在一个滴答声中,只需不断切换方向。解决问题的一种可能性是,仅当错误以负y速度越过负y边界或以正y速度越过正y边界时,才切换方向。我可以想象,如果错误离屏幕“太远”,那么它就无法“返回”在一个滴答声中不断切换方向。解决问题的一种可能性是,只有当错误以负y速度越过负y边界或以正y速度越过正y边界时,才切换方向。好的,两件事。1)这是我在类中唯一的方法,所以我把它放在那里,但我在ca中移到了类的顶部se稍后我添加了更多,谢谢。2)我很想这样做,但由于我有多个对象大小,我必须更改边缘。3)我尝试交换,但它们刚从屏幕上消失。好的,我找到了。最后一个问题,速度“陷阱”是什么你指的是什么?对不起,我是一个新的程序员,你可以这么说tell@AndrewWilken:您的代码交换方向,但这样做时不考虑被击中的边界。如果精灵击中边界的方式导致方向代码被多次调用,它将来回交换方向。好的,两件事。1)这是我唯一遇到的问题hod在课堂上,所以我只是把它放在那里,但我移到了班上的第一位,以防以后我添加更多。谢谢。2)我想这样做,但由于我有多个对象大小,我必须更改边缘。3)我尝试交换,但它们刚刚从屏幕上消失。好的,我找到了。最后一个问题,速度“陷阱”是什么你指的是什么?对不起,我是一个新的程序员,你可以这么说tell@AndrewWilken:您的代码交换方向,但这样做时不考虑被击中的边界。如果精灵击中边界的方式导致方向代码被多次调用,它将前后交换方向。
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);
}