Итак, я пытаюсь создать игру, и это мой первый раз. Моя игра является 2D-скроллером и относится к игроку в космосе, избегая входящих метеоров. Мне удалось добиться того, чтобы метеоры нерестились случайно на оси x и y с экрана и после того, как он прошел через экран.LibGDX - Как создавать объекты на определенном расстоянии друг от друга?
Но проблема, с которой я сталкиваюсь сейчас, - это иногда, что инерт метеоров будет сжиматься вместе, что я не хочу. Как мне заставить метеоры появляться на определенном расстоянии друг от друга, чтобы они не сжимались вместе. Я не мог найти никаких хороших уроков, или кто-нибудь может указать мне в правильном направлении. Ниже приведены мои коды.
Метеор Класс
public class Meteors {
private Texture bigMeteor;
private Vector2 posBigMeteor;
private Random yrand;
//Constructor
public Meteors(float x){
bigMeteor = new Texture("meteor.png");
yrand = new Random();
//Spawn location of meteor
posBigMeteor = new Vector2(x, yrand.nextInt(AstroDemo.HEIGHT/2 - bigMeteor.getHeight()));
}
public Texture getBigMeteor() {
return bigMeteor;
}
public Vector2 getPosBigMeteor() {
return posBigMeteor;
}
//Reposition the meteors
public void reposition(float x){
posBigMeteor.set(x, yrand.nextInt(AstroDemo.HEIGHT/2 - bigMeteor.getHeight()));
}
}
PlayState Класс
public class PlayState extends State {
//Total meteor count on screen
private static final int METEOR_COUNT = 8;
private Naught naught;
private Texture bg;
private Random xrand;
private Array <Meteors> meteors;
public PlayState(GameStateManager gsm) {
super(gsm);
//Starting co-ordinates of main character (Naught)
naught = new Naught(50, 100);
//Setting viewport of the camera
cam.setToOrtho(false, AstroDemo.WIDTH/2, AstroDemo.HEIGHT/2);
bg = new Texture("bg.png");
xrand = new Random();
meteors = new Array <Meteors>();
//Spawn meteors randomly off screen
for (int i = 1; i <= METEOR_COUNT; i++){
meteors.add(new Meteors(AstroDemo.WIDTH/2 + (xrand.nextInt(300))));
}
}
@Override
protected void handleInput() {
//If screen/mouse is held
if(Gdx.input.isTouched()){
//Main Character jumps/flys
naught.jump();
}
}
@Override
public void update(float dt) {
handleInput();
naught.update(dt);
//If meteors are left side of the screen, re-position to the right side of the screen
for(Meteors meteor : meteors){
if (cam.position.x - (cam.viewportWidth/2) > meteor.getPosBigMeteor().x + meteor.getBigMeteor().getWidth()){
meteor.reposition(meteor.getPosBigMeteor().x + (AstroDemo.WIDTH/2 + 20 + (xrand.nextInt(300))));
}
}
cam.position.x = naught.getPosition().x + 80;
cam.update();
}
@Override
public void render(SpriteBatch sb) {
//Adjust the spritebatch for co-ordinate system in relation to camera
sb.setProjectionMatrix(cam.combined);
sb.begin();
//Draw background where the camera is
sb.draw(bg, cam.position.x - (cam.viewportWidth/2), 0);
sb.draw(naught.getTexture(), naught.getPosition().x, naught.getPosition().y);
for (Meteors meteor : meteors) {
sb.draw(meteor.getBigMeteor(), meteor.getPosBigMeteor().x, meteor.getPosBigMeteor().y);
}
sb.end();
}
@Override
public void dispose() {
}
}
Вы хотите, чтобы при вычислении расстояния или просто оси х учитывались как оси x, так и y? Этот [post] (http://stackoverflow.com/questions/929773/calculating-the-distance-between-two-points) объясняет, как рассчитать, вы можете использовать эту информацию для решения своей проблемы. – Squiddie
@Squiddie Yh Я все еще хочу рассмотреть ось x и y, поэтому я хочу, чтобы они возникали случайным образом, но не поверх друг друга. Отчитав сообщение, я думаю, что понимаю, что делать, но в сообщениях упоминаются две точки, а не два объекта, и я полагаю, что радиус задействован, и я борюсь с математикой этого и помещаю эту математику в язык java/libgdx , – user218130
Я верю, что ваши два объекта содержат координаты справа? Это точки. Я предполагаю, что у вашего объекта есть 'x' и' width', чтобы получить координату в середине вашего объекта, просто сделайте 'x + width/2', то же самое с y и высотой. Используйте эти пункты. – Squiddie