2013-07-26 2 views
3

хорошего день панов,Libgdx: Керамические объекты слоя за столкновения

Я пытаюсь выяснить теперь, как выполнить обнаружение столкновений для плеера с помощью слоя объекта Плиточного, чтобы быть более конкретными, я хотел его для обнаружения полилинии, которую я нарисовал на мозаичной карте. Поскольку я исследовал в google о обнаружении столкновений для Tiled, я нашел этот простой пример superkoala sample for TiledmapLayer. В моем понимании кода (исправьте меня, если я ошибаюсь), Он приказывает обнаружить столкновение, которое игрок будет читать каждую плиту определенного слоя, например слой переднего плана, который содержит землю и другие объекты.

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

Может ли кто-нибудь дать мне образец кода о чтении объектов и использовании их для обнаружения столкновений? Или просто простой совет или идея о том, как я могу это решить? Любая помощь будет оценена.

ответ

1

То, что я рекомендую делать в вашем случае, - это не использовать слои объектов, а свойства для определенных плиток. Допустим, у вас есть одна плитка в «Tiled», и вы обязательно будете использовать ее только как стену. Нажмите на эту конкретную плитку и добавьте свойство «заблокировано». Затем в вашем коде вы можете проверить каждую ячейку рядом с игроком, и если она содержит свойство «заблокировано», не позволяйте игроку идти в этом направлении. Вот псевдо-код того, как я сделал это:

private boolean isCellBlocked(float x, float y) { 
    Cell cell = null; 
    boolean blocked = false; 

    try { 
     cell = collisionLayer.getCell((int) (x/collisionLayer.getTileWidth()), (int) (y/collisionLayer.getTileHeight())); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    if (cell != null && cell.getTile() != null) { 
     if (cell.getTile().getProperties().containsKey("blocked")) { 
      blocked = true; 
     } 
    } 
    return blocked; 
} 

и вы можете сделать игрок вызов isCellBlocked(x, y) каждый раз, когда он обновляет.

Я также сделал collidesSide(float x, float y) для каждой стороны (collidesTop(float x, float y) и т. Д.).

Я надеюсь, что это поможет вам, даже если он не использует систему, которую вы хотели. Для получения дополнительной помощи по этому вопросу я сильно использую libGDX для обнаружения конфликтов в большом проекте, поэтому не стесняйтесь обращаться ко мне!

+0

Мне интересно, почему вы посоветовали против слоев объекта. У него будет гораздо меньше прямоугольников для пересечения. Ваше решение, несмотря на то, что оно работает, скорее является примером того, как вы это сделали, а не изучаете использование слоев объектов, что значительно упрощает редактирование свойств. – RichieHH

+0

@RichieHH Мне всегда было легче в TileD использовать свойства вместо обработки слоя объекта. – Ferdz

+0

Почему? Если вы используете плитки, вам нужно добавить и проанализировать свойства для каждой плитки. Зачем это делать, когда у вас может быть один объект на объектном уровне с такими же свойствами и в результате в одном корпусе B2D? https://gist.github.com/anonymous/a2c61d04572455c75fcd – RichieHH

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

  • Нет связанных вопросов^_^