0

我正在为一个学校项目制作一个安卓游戏。我熟悉java,但没有制作游戏的经验。在我的比赛中,球是由球员控制的。这个球需要反弹的墙壁。

我已经尝试了两种方法,但都没有成功。第一次尝试:我能够检测到重叠,但无法检测到球击中的一侧。

c = 球,r = 墙

    float closestX = c.center.x;
    float closestY = c.center.y;

    if(c.center.x < r.topLeft.x) {
        closestX = r.topLeft.x; 
    } 
    else if(c.center.x > r.topLeft.x + r.width) {
        closestX = r.topLeft.x + r.width;
    }

    if(c.center.y < r.topLeft.y) {
        closestY = r.topLeft.y;
    } 
    else if(c.center.y > r.topLeft.y + r.height) {
        closestY = r.topLeft.y + r.height;
    }

    return c.center.distSquared(closestX, closestY) < c.radius * c.radius;  

所以我尝试了一种新方法。但是这种方法是不稳定的,并且将球视为正方形。

cNew = 下一个位置的球,cOld = 当前位置的球,r = 墙

    if (cNew.center.x + cNew.radius >= r.topLeft.x && cNew.center.x - cNew.radius <= r.topLeft.x + r.width)
    {
        if (cOld.center.y + cOld.radius <  r.topLeft.y && cNew.center.y + cNew.radius >=  r.topLeft.y)
        {
            return Side.TOP;
        }
        else if (cOld.center.y - cOld.radius >  r.topLeft.y + r.height && cNew.center.y - cNew.radius <=  r.topLeft.y + r.height)
        {
            return Side.BOTTOM;
        }
    }
    if (cNew.center.y + cNew.radius >= r.topLeft.y && cNew.center.y - cNew.radius <= r.topLeft.y + r.height)
    {
        if (cOld.center.x + cOld.radius <  r.topLeft.x && cNew.center.x + cNew.radius >=  r.topLeft.x)
        {
            return Side.LEFT;
        }
        else if (cOld.center.x - cOld.radius >  r.topLeft.x + r.width && cNew.center.x - cNew.radius <=  r.topLeft.x + r.width)
        {
            return Side.RIGHT;
        }
    }
    return null;

我需要以某种方式将这两者结合起来,但我一直无法找出如何。

非常感谢您的帮助。

4

2 回答 2

0

没有非常仔细地处理代码(考虑到这是你的学校项目,可能我不应该做你的作业),但我相信将球视为正方形不会有任何负面影响,如果它只是从墙壁反弹。你还有什么想做的吗?

您的第一个代码错过了球的表面将在其中心之前与墙壁碰撞的事实。您可能需要考虑到这一点。你的第二个代码在什么意义上不稳定?

更多细节在这里会很有用。

于 2013-09-28T16:47:30.347 回答
0

我将在这里告诉你我是怎么做的:对于你需要的玩家(以及每个敌人):

  • X
  • 是的
  • w
  • H

和 :

  • x 速度
  • y速度

和以下点数组(列表):

大纲 :

  • 上侧
  • 下侧
  • 左边
  • 右边
  • 全部一起

- 球中的所有点,每个 alpha=0 的像素,用于检查与墙壁的碰撞

墙壁:

  • 墙以点数组(列表)的形式给出。例如,分析水平图像,每个黑色像素都添加

现在,执行以下操作:

  • 在你的课堂上,有一个移动的方法

你需要以下逻辑:

int miny=Integer.MAX_VALUE;
for (Point p:walls) { //For every point in the walls
     if (p.x >= (int)x && p.x <= (int)x+w && (int)p.x-(int)x < lower_side.length) {
         try {
              Point p2=lower_side[(int)p.x-(int)x]; //Get the point that is on the same height as the walls point
              if (p.y >= (int)(y+p2.y) && (int)(y+p2.y+yvel) >= p.y && p.y-p2.y-1 < miny) { //Check if you are going to hit the wall, and if it is earlier as the earliest point determined.
                  miny=p.y-p2.y-1d; //Where is the earliest point where this can happen
              }
          } catch (Exception bug) {
              System.out.println(bug);
          }
     }
}

将此应用于所有方向和尺寸。

if (miny != Integer.MAX_VALUE) {
    y=miny; //Set position over the wall
    yvel=-(yvel*0.75); //Bounce off
}

如果您有任何问题,请随时发表评论。

于 2017-04-26T07:40:35.093 回答