gpt4 book ai didi

java - 逐一检查球的四个边是否与墙壁相撞的方法

转载 作者:行者123 更新时间:2023-12-01 22:19:59 25 4
gpt4 key购买 nike

在代码中添加一个方法,逐一检查球的四个边缘,检查该边缘是否与窗口边缘发生碰撞。如果是这样,它应该相应地改变方向。例如,如果球向东北 (↗) 移动并且顶部边缘撞击屏幕顶部,它会将方向更改为东南 (↘),以便球看起来从边缘反弹。 (请记住,如果球沿对角线方向直接进入角落,则两个边缘可能会同时击中,使其沿相反的对角线方向直接弹回。)

我不知道如何获得椭圆形的四个边。我已经完成了其他 4 个方向(上、下、左、右),但不知道如何处理窗口的角落。

public void move()
{
//direction right
if(dir == 1)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x + 1,y);
if(x>425)
{
dir = 2;
}
}
//direction left
if(dir == 2)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x - 1,y);
if(x<0)
{
dir = 1;
}
}
//direction down
if(dir == 3)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x,y + 1);
if(y>425)
{
dir = 4;
}
}
//direction up
if(dir == 4)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x ,y - 1);
if(y<0)
{
dir = 3;
}
}
//direction bottom right corner
if(dir == 5)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x + 1,y + 1);
}
//direction upper right corner
if(dir == 6)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x + 1,y - 1);
}

//direction bottom left corner
if(dir == 7)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x - 1,y + 1);
}
//direction upper left corner
if(dir == 8)
{
int x = ball.getX();
int y = ball.getY();
ball.setLocation(x - 1,y - 1);
}
}

最后,请确保每次移动球时都调用此方法。这样,当您将球沿当前方向移动 1 个像素后,您可以运行该方法来检查它是否击中了任何边缘,并更改方向。此时,您的球应该在屏幕上移动并弹跳。

最佳答案

不要想太多它是椭圆形。就本作业而言,它可能只是一个盒子。角点的情况与边缘的情况相比,唯一的区别是您需要区分 4 个结果:

  1. 您撞到了水平和垂直的墙壁:更改为对角线移动的相反方向。
  2. 您撞到了水平墙壁:保持垂直方向并将水平方向切换到相反方向。
  3. 您撞到了垂直的墙壁:保持水平方向并将垂直方向切换到相反方向。
  4. 你根本没有碰壁:什么也不做。

此外,说明特别建议您将运动逻辑与改变方向的逻辑分开。在您最初的方法中,您同时执行这两项操作。

在我的示例中,我引入了一个方法 changeDirection(),该方法仅检查是否触及任何边界,然后让您掉头,但没有发生实际移动。您仍然需要实现 move() 并处理它,但您可以调用此方法并假设球随后朝着正确的方向前进。

此外,一旦引入命名常量来引用说明,代码就会变得更容易理解:

  private static final int RIGHT = 1;
private static final int LEFT = 2;
private static final int DOWN = 3;
private static final int UP = 4;
private static final int DOWN_RIGHT = 5;
private static final int UP_RIGHT = 6;
private static final int DOWN_LEFT = 7;
private static final int UP_LEFT = 8;

private static final int WIDTH = 425;
private static final int HEIGHT = 425;

public void changeDirection()
{
int x = ball.getX();
int y = ball.getY();

switch ( dir )
{
case RIGHT:
if ( x >= WIDTH )
{
dir = LEFT;
}
break;
case LEFT:
if ( x <= 0 )
{
dir = RIGHT;
}
break;
case DOWN:
if ( y >= HEIGHT )
{
dir = UP;
}
break;
case UP:
if ( y <= 0 )
{
dir = DOWN;
}
break;
case DOWN_RIGHT:
if ( y >= HEIGHT )
{
if ( x >= WIDTH )
{
dir = UP_LEFT;
}
else
{
dir = UP_RIGHT;
}
}
else if ( x >= WIDTH )
{
dir = DOWN_LEFT;
}
break;
case UP_RIGHT:
if ( y <= 0 )
{
if ( x >= WIDTH )
{
dir = DOWN_LEFT;
}
else
{
dir = DOWN_RIGHT;
}
}
else if ( x >= WIDTH )
{
dir = UP_LEFT;
}
break;
case DOWN_LEFT:
if ( y >= HEIGHT )
{
if ( x <= 0 )
{
dir = UP_RIGHT;
}
else
{
dir = UP_LEFT;
}
}
else if ( x <= 0 )
{
dir = DOWN_RIGHT;
}
break;
case UP_LEFT:
if ( y <= 0 )
{
if ( x <= 0 )
{
dir = DOWN_RIGHT;
}
else
{
dir = UP_LEFT;
}
}
else if ( x <= 0 )
{
dir = UP_RIGHT;
}
break;
}
}

关于java - 逐一检查球的四个边是否与墙壁相撞的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58598156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com