【发布时间】:2013-04-17 13:57:41
【问题描述】:
我正在使用 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;
}
再次感谢。
【问题讨论】:
-
啊,我以为我做到了。全部完成:D
-
好的,这还没有解决。该评论是针对删除评论的人 D:
-
好吧,我的理解是正确的:你在摄像机外装载汽车(在 x=-car.width 和 -infinity 之间随机),它们应该在随机车道 (y) 上,对?他们什么时候开始移动,你是否继续装载新车,什么时候他们已经移动了(移动后的汽车什么时候回到屏幕的左侧)?顺便说一句:抱歉删除评论:D
-
你好!这都是正确的..除了x和无穷大之间。低场是高场的 5 倍(我认为它最终为 -450)。所有汽车都在开始时装载,当到达屏幕右侧时,重新定位到上述位置之一。它们在加载后立即开始移动,方法是在 onupdate 方法中添加它们的 x 坐标(更新为 60fps)。我已经尝试了一种使用生成点的新方法,但是如果您在此方法中看到我的错误,请继续。不要抱歉:3