2016-07-27 5 views
2

Ich habe gerade angefangen, mit LibGDX zu arbeiten und kann nicht herausfinden, wie man ein Bild ausblenden kann, wenn es mit einem Objekt kollidiert. In meinem Spiel kommen einige Punkte vom oberen Bildschirmrand und treffen auf den Punkt unten. Wenn sie sich treffen, sollten sich die Punkte verstecken, was nicht passiert.Kann Bild bei Kollision in libgdx nicht ausblenden?

Dies ist das wichtigste Spiel der Klasse

public class GameScreen implements Screen,InputProcessor { 
    final AmazingDot game; 

    //setting the height and width variables 
    private int height; 
    private int width; 
    private static int touchCounter; 

    //setting the two dots variables 
    private Texture playerDotImage; 
    private Texture gameDotImage; 
    private Texture gameDotImage1; 

    private Rectangle playerDotRectangle; 
    private Map<Rectangle,Texture> gameDotMap; 

    //storing the time of last dot in nano seconds 
    private long lastDotTime; 

    public GameScreen(final AmazingDot gam){ 
     this.game = gam; 
     Gdx.input.setInputProcessor(this); 

     //getting the height and width of the user's screen 
     height = Gdx.graphics.getHeight(); 
     width = Gdx.graphics.getWidth(); 
     touchCounter =0; 

     //loading the images in the variables 
     playerDotImage = new Texture(Gdx.files.internal("images/dot2.png")); 

     gameDotImage = new Texture(Gdx.files.internal("images/dot1.png")); 
     gameDotImage1 = new Texture(Gdx.files.internal("images/dot2.png")); 

     //placing the player dot in the middle of the screen 
     playerDotRectangle = new Rectangle(); 
     playerDotRectangle.x = width/ 2 - 64/2; 
     playerDotRectangle.y = 20; 
     playerDotRectangle.width = 64; 
     playerDotRectangle.height = 64; 

     gameDotMap = new ConcurrentHashMap<Rectangle, Texture>(); 

     populateDots(); 
    } 

    private void populateDots(){ 
     Rectangle dots = new Rectangle(); 
     dots.x = randomLocation(); 
     dots.y = height; 
     dots.width = 64; 
     dots.height = 64; 

     Random rand = new Random(); 
     int n = rand.nextInt(2) + 1; 
     if(n==1){ 
      gameDotMap.put(dots,gameDotImage1); 
     } 
     else{ 
      gameDotMap.put(dots,gameDotImage); 
     } 

     lastDotTime = TimeUtils.nanoTime(); 
    } 

    private int randomLocation(){ 
     int[] locations = new int[3]; 
     locations[0]=0; 
     locations[1]=width/2-64/2; 
     locations[2]=width-64; 

     Random generator = new Random(); 
     int randomIndex = generator.nextInt(locations.length); 
     return locations[randomIndex]; 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     game.batch.begin(); 

     game.batch.draw(playerDotImage,playerDotRectangle.x,playerDotRectangle.y,playerDotRectangle.width,playerDotRectangle.height); 

     for(Map.Entry<Rectangle,Texture> dots : gameDotMap.entrySet()){ 
      game.batch.draw(dots.getValue(),dots.getKey().x,dots.getKey().y); 
     } 

     game.batch.end(); 

     // check if we need to create a new dot 
     if(TimeUtils.nanoTime() - lastDotTime > 1000000000) populateDots(); 

     for(Rectangle dot : gameDotMap.keySet()){ 

      int gameSpeed = 400; 
      int xSpeed = calXSpeed(gameSpeed); 
      dot.y = dot.y - gameSpeed * Gdx.graphics.getDeltaTime(); 

      if(dot.x <width/2-64/2){ 
       dot.x = dot.x + xSpeed*Gdx.graphics.getDeltaTime(); 
      } 
      else if(dot.x>width/2-64/2){ 
       dot.x = dot.x - xSpeed*Gdx.graphics.getDeltaTime(); 
      } 
      if(dot.y + 64 < 0) gameDotMap.remove(dot); 
      if(dot.overlaps(playerDotRectangle)) { 
       //this is where I am trying to remove the map object on collision 
       gameDotMap.remove(dot); 
      } 
     } 
    } 

    private int calXSpeed(int gameSpeed){ 
     int seconds = height/gameSpeed; 
     int distance = width/2-64/2; 
     int speed = distance/seconds; 
     return speed; 
    } 

    @Override 
    public boolean touchDown(int screenX, int screenY, int pointer, int button) { 
     touchCounter++; 
     if(touchCounter % 2==0){ 
      playerDotImage = new Texture(Gdx.files.internal("images/dot2.png")); 
     } 
     else{ 
      playerDotImage = new Texture(Gdx.files.internal("images/dot1.png")); 
     } 
     return true; 
    } 

    @Override 
    public void dispose() { 
     playerDotImage.dispose(); 
     gameDotImage.dispose(); 
     gameDotImage1.dispose(); 
    } 
} 

EDIT

enter image description here

Wie Sie im obigen Bild sehen können, wenn der bewegliche Punkt, um den stationären Punkt erreicht ist, sollte sie verschwinden. Aber hier in meinem Code bewegt sich der Punkt einfach über den stationären Punkt hinaus. Ich verwende Rechtecke (LibGdx), um zu erkennen, ob sich die Punkte überlappen oder nicht.

+0

Willst du jetzt tatsächlich? Die Punkte kollidieren überhaupt nicht und fahren fort? Oder hören sie am Kollisionspunkt auf? Mehr Details bitte :) – munyul

+0

Es gibt einen stationären Punkt in der unteren Mitte des Bildschirms, ich erkenne, wenn der Punkt, der von oben kommt, den stationären Punkt überlappt. Wenn dies der Fall ist, entferne ich diesen Punkt von der Karte. –

+0

Sorry, ich bin verwirrt - was läuft falsch? Du sagst, dass du den Punkt entfernst, der klingt, als ob alles, was du brauchst, funktioniert !? In deiner ursprünglichen Frage, was ist dieses Bild, das du verstecken musst? – munyul

Antwort

2

definieren Sie Map als ArrayMap etwa so:

private ArrayMap<Rectangle, Texture> gameDotMap; 

Dann können Sie Sie render Methode wie folgt umschreiben:

@Override 
public void render(float delta) { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    game.batch.begin(); 

    game.batch.draw(playerDotImage, playerDotRectangle.x, playerDotRectangle.y, playerDotRectangle.width, playerDotRectangle.height); 

    for (int i = 0; i < gameDotMap.size; i++) { 
     game.batch.draw(gameDotMap.getValueAt(i), gameDotMap.getKeyAt(i).x, gameDotMap.getKeyAt(i).y); 
    } 

    game.batch.end(); 

    // check if we need to create a new dot 
    if (TimeUtils.nanoTime() - lastDotTime > 1000000000) { 
     populateDots(); 
    } 

    for (Iterator<ObjectMap.Entry<Rectangle, Texture>> iter = gameDotMap.iterator(); iter.hasNext();) { 
     ObjectMap.Entry<Rectangle, Texture> entry = iter.next(); 
     Rectangle dot = entry.key; 
     int gameSpeed = 400; 
     int xSpeed = calXSpeed(gameSpeed); 
     dot.y = dot.y - gameSpeed * Gdx.graphics.getDeltaTime(); 

     if (dot.x < width/2 - 64/2) { 
      dot.x = dot.x + xSpeed * Gdx.graphics.getDeltaTime(); 
     } else if (dot.x > width/2 - 64/2) { 
      dot.x = dot.x - xSpeed * Gdx.graphics.getDeltaTime(); 
     } 
     if (dot.y + 64 < 0) { 
      iter.remove(); 
     } 
     if (dot.overlaps(playerDotRectangle)) { 
      //this is where I am trying to remove the map object on collision 
      iter.remove(); 
     } 
    } 
} 

Libgdx bestimmte Arten für Sammlungen hat, werden sie über die JDK empfohlenen Sammlungen.

+0

Hey, vielen Dank, es hat funktioniert. Warum kann ich Java-Sammlungen nicht verwenden? –

+0

Der Hauptgrund für die Verwendung von LibGDX-Sammlungen ist die Leistung. Mit der ConcurrentHashMap scheint es zwar nicht zu der Entfernung zu kommen, wenn es in Ihrem Code und beim nächsten Aufruf zu rendern gilt, den Verweis auf den entfernten Punkt, daher der komische Effekt, den Sie bekommen haben. –