2015-11-12 2 views
0

В настоящее время я работаю над предварительно построенным движком java, но я переписал систему столкновений, чтобы использовать как положение игрока относительно плиток, так и прямоугольников для столкновения. Мне нужно убедиться, что игрок не сталкивается ни с чем, чтобы позволить игроку двигаться снова, но в моем методе я могу проверить только, сталкивается ли игрок.Как проверить, не сталкивается ли игрок с объектом? (JAVA)

 protected void tileCollision() 
    {  
     int calledNumTimes = 0; 
     AnimatedSprite player = findPlayer(); 
     Tile lastCollided; 



     for(int i = 0; i < _sprites.size(); i++) 
     { 
      calledNumTimes++; 
      AnimatedSprite spr = _sprites.get(i); 
      for(int j = 0; j < tileWithinRange.length; j++) 
      { 
       Tile tile = tileWithinRange[j]; 

       if(tile != null && spr.collidesWith(tile.getBounds())) 
       {  
         lastCollided = tile; 
         player.setCollided(true); 
         calledNumTimes++; 
         if(!spr.hasMultBounds() && !tile.hasMultBounds()) 
         { //tile and spr have only one bound 
          //spr.setBounds(16, spr.getBounds().x + 5, spr.getBounds().y); 
          if(tile.getTileBounds().intersects(player.getBounds())) 
          { 
           tileCollision(spr, tile, -1, -1); 
           System.out.println("colliding"); 
          } else { 
           System.out.println("nope"); 
          } 
          // spr.setBounds(16, spr.getBounds().x - 5, spr.getBounds().y); 
         } 
       } else if(tile != null && !spr.collidesWith(tile.getBounds())) 

        player.setCollided(false); 
       } 
      } //end _tiles for loop 
     } //end _sprites for loop 

Как прямо сейчас,

      System.out.println("nope"); 

никогда не печатается, так что я могу проверить только если игрок сталкиваясь, не будучи в состоянии проверить, если он не является.

+0

Тогда найдется что-то не так с вашим кодом. Когда theres нет пересечения, если (tile.getTileBounds(). Пересекает (player.getBounds())) «else» вызывается с System.out.println («nope»); – XxGoliathusxX

ответ

0

Extract «til Вы drop и problem will be apparent:

protected void tileCollision() 
{  
    int calledNumTimes = 0; 
    AnimatedSprite player = findPlayer(); 
    Tile lastCollided; 



    for(int i = 0; i < _sprites.size(); i++) 
    { 
     calledNumTimes++; 
     AnimatedSprite spr = _sprites.get(i); 
     for(int j = 0; j < tileWithinRange.length; j++) 
     { 
      Tile tile = tileWithinRange[j]; 

      if(tile != null && spr.collidesWith(tile.getBounds())) 
      {  
        lastCollided = tile; 
        player.setCollided(true); 
        calledNumTimes++; 
        if(!spr.hasMultBounds() && !tile.hasMultBounds()) 
        { //tile and spr have only one bound 
         //spr.setBounds(16, spr.getBounds().x + 5, spr.getBounds().y); 
         computeTilePlayerCollision(spr, tile, player); 
         // spr.setBounds(16, spr.getBounds().x - 5, spr.getBounds().y); 
        } 
      } else if(tile != null && !spr.collidesWith(tile.getBounds())) 

       player.setCollided(false); 
      } 
     } //end _tiles for loop 
    } //end _sprites for loop 

private void computeTilePlayerCollision(AnimatedSpr spr, Tile tile, AnimatedSprite player) { 
    if(tileCollidesWithPlayer(tile, player)) { 
     reportCollision(); 
    } else { 
     reportNonCollision(); 
    } 
} 

private boolean tileCollidesWithPlayer(Tile tile, AnimateSprite player) { 
    tile.getTileBounds().intersects(player.getBounds()) 
} 

private void reportCollision(AnimatedSprite spr, Tile tile) { 
    tileCollision(spr, tile, -1, -1); 
    System.out.println("colliding"); 
} 

private void reportNonCollision(AnimatedSprite spr, Tile tile) { 
    System.out.println("nope"); 
} 

Continue это ad-absurdum until bug is obvious также не имеет, где в spaghetti скрыть;)

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