Java 我怎样才能阻止数组中的元素互相加载?
我正在用AndEngine为Android开发一款游戏,我有一系列汽车物体,它们在屏幕上以不同的车道从左到右移动。当汽车超过摄像头宽度(屏幕大小)时,我将其位置设置为0(屏幕左侧)-spriteWidth()(屏幕视口左侧)。我的问题是,由于返回的坐标是随机的,所以这些车一直顶着彼此装载。我尝试过很多事情,但总是发生 这是用于在游戏开始时设置汽车坐标的方法,也可以在屏幕右侧设置汽车坐标Java 我怎样才能阻止数组中的元素互相加载?,java,android,andengine,Java,Android,Andengine,我正在用AndEngine为Android开发一款游戏,我有一系列汽车物体,它们在屏幕上以不同的车道从左到右移动。当汽车超过摄像头宽度(屏幕大小)时,我将其位置设置为0(屏幕左侧)-spriteWidth()(屏幕视口左侧)。我的问题是,由于返回的坐标是随机的,所以这些车一直顶着彼此装载。我尝试过很多事情,但总是发生 这是用于在游戏开始时设置汽车坐标的方法,也可以在屏幕右侧设置汽车坐标 public Vector2 randomRoadCoord() { int Y; int X
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);
}
公共矢量2随机道路坐标()
{
int-Y;
int X;
int-arrayLength=rManager.getInstance().roadPosition.length;
int arrayFirstValue=1;
Random xR=新的Random();
int Low=(int)(5*(0-rmager.getInstance().car_region.getWidth());
int-High=(int)(0-rManager.getInstance().car_region.getWidth());
X=xR.nextInt(高-低)+低;
随机yR=新随机();
int LowY=数组第一个值;
int HighY=阵列长度;
Y=yR.nextInt(高-低)+LowY;;
如果(首次加载)
{
对于(int i=0;i/*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;
} */
/*如果(首次加载)
{
对于(int i=0;iX&&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);
}
}
}
for(int i=0;i
方法:
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;
}
boolean冲突与现有冲突(汽车pCar)
{
对于(int j=0;j
再次感谢。您的循环至少有一个问题: 当X值更改时,您检查的条件.CollizeSwith()不会更改。因此可能会发生其他误报 第二个问题是,如果发生了CollizeSwith()事件,则无法知道新x是否也会在循环中较早时在另一辆车上引发CollizeSwith()事件。想象一下,将第三辆车放置在两辆车之间,这两辆车之间太近,无法容纳两辆车。在单循环或双循环中无法解决这一问题 因此,这里有一个不同的策略:仅使一个轴完全随机。一次通过X轴(车辆行驶方向)一个车辆长度。随机确定该位置是否应有车辆。如果是,则沿Y轴随机定位该车辆。 没有太多的麻烦,你可以让它适应放置一个或多个汽车每一步 如果你不希望网格像obvoius一样,你可以将你的X环向前推进1/2车长。然后你只需要检查与前一辆车或前一辆车的碰撞
Car newCar = new Car();
newCar.setPosition(randomXPostion, randomYPosition);
while(testCarCollidesWithExisting(newCar)){
newCar.setPosition(randomXPostion, randomYPosition);
}
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.util.FPSLogger;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.bitmap.BitmapTexture;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.TextureRegionFactory;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.adt.io.in.IInputStreamOpener;
import org.andengine.util.debug.Debug;
import android.os.Bundle;
import android.view.Menu;
public class TestBed extends SimpleBaseGameActivity {
// ===========================================================
// Constants
// ===========================================================
private static final int CAMERA_WIDTH = 720;
private static final int CAMERA_HEIGHT = 480;
// ===========================================================
// Fields
// ===========================================================
private ITexture mTexture;
private ITextureRegion mFaceTextureRegion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_test_bed);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.test_bed, menu);
return true;
}
@Override
public EngineOptions onCreateEngineOptions() {
final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
return new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
}
@Override
public void onCreateResources() {
try {
this.mTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() {
@Override
public InputStream open() throws IOException {
return getAssets().open("tank.png");
}
});
this.mTexture.load();
this.mFaceTextureRegion = TextureRegionFactory.extractFromTexture(this.mTexture);
} catch (IOException e) {
Debug.e(e);
}
}
ArrayList<Sprite> placedSprites = new ArrayList<Sprite>();
@Override
protected Scene onCreateScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());
final Scene scene = new Scene();
scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));
/* Calculate the coordinates for the face, so its centered on the camera. */
final float centerX = (CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()) / 2;
final float centerY = (CAMERA_HEIGHT - this.mFaceTextureRegion.getHeight()) / 2;
/* Create the face and add it to the scene. */
for (int i = 0; i < 20; i++) {
final Sprite face = new Sprite(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager());
scene.attachChild(face);
face.setPosition((float)(Math.random()*CAMERA_WIDTH), (float)(Math.random()*CAMERA_HEIGHT));
while(faceDoesNotOverlap(face)){
face.setPosition((float)(Math.random()*CAMERA_WIDTH), (float)(Math.random()*CAMERA_HEIGHT));
}
placedSprites.add(face);
}
return scene;
}
private boolean faceDoesNotOverlap(Sprite face) {
for (int i = 0; i < placedSprites.size(); i++) {
if(face.collidesWith(placedSprites.get(i))){
return true;
}
}
return false;
}
}