一个接一个地检查球的四个边,看看它是否与墙碰撞的方法



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

我不知道如何得到椭圆的四边。我已经完成了其他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;
}
}

相关内容

最新更新