2017-01-11 4 views
0

Итак, я пытаюсь создать игру, и это мой первый раз. Моя игра является 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() { 

    } 
} 
+0

Вы хотите, чтобы при вычислении расстояния или просто оси х учитывались как оси x, так и y? Этот [post] (http://stackoverflow.com/questions/929773/calculating-the-distance-between-two-points) объясняет, как рассчитать, вы можете использовать эту информацию для решения своей проблемы. – Squiddie

+0

@Squiddie Yh Я все еще хочу рассмотреть ось x и y, поэтому я хочу, чтобы они возникали случайным образом, но не поверх друг друга. Отчитав сообщение, я думаю, что понимаю, что делать, но в сообщениях упоминаются две точки, а не два объекта, и я полагаю, что радиус задействован, и я борюсь с математикой этого и помещаю эту математику в язык java/libgdx , – user218130

+0

Я верю, что ваши два объекта содержат координаты справа? Это точки. Я предполагаю, что у вашего объекта есть 'x' и' width', чтобы получить координату в середине вашего объекта, просто сделайте 'x + width/2', то же самое с y и высотой. Используйте эти пункты. – Squiddie

ответ

0

создать массив заданного значения для у позиции, а затем получить значение случайным образом из этого массива.

или

высота Деления на часть к югу затем получить случайное значение от той части так, что каждая случайная величина не столкнется с другим значением.

Смежные вопросы