我正在使用 AndEngine 开发一款适用于 Android 的游戏,并且我有一系列汽车对象,它们在屏幕上的不同车道上从左到右移动。当汽车超过相机宽度(屏幕尺寸)时,我将其位置设置为 0(屏幕左侧)- spriteWidth()(就在屏幕视口的左侧)。我的问题是,由于返回的随机坐标,这些汽车一直在彼此重叠。我尝试了很多事情,但它一直在发生。
这是用于在游戏开始时设置汽车坐标的方法,以及向右离开屏幕的方法。
public Vector2 randomRoadCoord()
{
int Y;
int X;
int arrayLength = rManager.getInstance().roadPosition.length;
int arrayFirstValue = 1;
Random xR = new Random();
int Low = (int) (5 *(0 - rManager.getInstance().car_region.getWidth()));
int High = (int) (0 - rManager.getInstance().car_region.getWidth());
X = xR.nextInt(High-Low) + Low;
Random yR = new Random();
int LowY = arrayFirstValue;
int HighY = arrayLength;
Y = yR.nextInt(HighY-LowY) + LowY;;
if (firstLoad)
{
for(int i = 0; i < rManager.getInstance().carArray.length; i++)
{
for(int j = 0; j < rManager.getInstance().carArray.length; j++)
{
while(rManager.getInstance().carArray[i].getCarSprite().collidesWith(rManager.getInstance().carArray[j].getCarSprite()))
X-= 150;
}
}
}
lastX = X;
lastY = Y;
return new Vector2(X, Y);
}
如您所见,在某些区域之间返回随机 x 和 y 值;具体来说,相机的顶部和底部(静态相机,所以基本上是视口),以及屏幕外的 -50 到 -450 之间(类似的东西)。我的问题是我需要他们停止加载,因为如果发生碰撞,用户就会输掉游戏。我尝试检查每辆汽车的精灵,看看它在加载时是否已经与另一辆汽车发生碰撞(尽管这肯定会产生减速,如果确实如此,请将 X 坐标进一步向左移动,但它似乎没有做任何事情。
/*if (firstLoad)
{
for(int i = 0; i < rManager.getInstance().carArray.length; i++)
{
while(rManager.getInstance().carArray[i].getCarX() + 100 > X && X > rManager.getInstance().carArray[i].getCarX() - 100)
X-= 150;
}
firstLoad = true;
} */
我也试过检查这辆车是否在其他车的 x + 150 和 x - 150 之间,但这也无济于事。不是所有的车都装在彼此的顶部,但肯定不止1辆,这太多了。
谢谢。请随时提出任何问题。
- - - - - - - - - - - - - - - - - 更新:
我尝试使用整形外科医生的建议,但同样的问题仍然存在。尽管将汽车装载在另一辆汽车上的可能性要小得多,但仍然偶尔会发生。这次我把代码注释了,应该更容易理解。
for (int i = 0; i < rManager.getInstance().carArray.length; i++)
{
if(rManager.getInstance().carArray[i].getCarSprite().getX() < (rManager.camera.getWidth() + rManager.getInstance().carArray[i].getCarSprite().getWidth()))
{
// moves car from left to right
rManager.getInstance().carArray[i].getCarSprite().setPosition(rManager.getInstance().carArray[i].getCarSprite().getX() + (rManager.getInstance().carArray[i].getSpeed() * 4), rManager.getInstance().carArray[i].getCarSprite().getY());
}
else //if out of the screen
{
//set the position to the left of the screen
rManager.getInstance().carArray[i].getCarSprite().setPosition(randomRoadCoord().x, rManager.getInstance().roadPosition[(int) randomRoadCoord().y].y);
//if colliding with another car
while(collidesWithExisting(rManager.getInstance().carArray[i]))
{ //set a new random pos
rManager.getInstance().carArray[i].getCarSprite().setPosition(randomRoadCoord().x, rManager.getInstance().roadPosition[(int) randomRoadCoord().y].y);
}
}
}
方法:
boolean collidesWithExisting(Car pCar)
{
for(int j = 0; j < rManager.getInstance().carArray.length; j++)
{
if (rManager.getInstance().carArray[j] == pCar)
return false;
if(rManager.getInstance().carArray[j].getCarSprite().collidesWith(pCar.getCarSprite()))
return true;
}
return false;
}
再次感谢。