Spritekit: Как ограничить движение игрока только определенными тайлами - PullRequest
2 голосов
/ 27 января 2020

Предыстория проблемы: как показано на скриншоте, у меня есть карта тайлов 24 * 24 и узел спрайта игрока. Текущая проблема, которую я пытаюсь решить, заключается в том, что я надеюсь ограничить движение игрока внутри красной плитки в форме буквы А. enter image description here

Решение, которое я попробовал: я использовал метод пересечений для обнаружения столкновения между плиткой и узлом спрайта плеера по кадрам. Однако я надеюсь сравнить спрайтовый узел игрока только с рамкой из красных плиток в форме буквы А вместо всей карты тайлов.

func detectMapCollision(){
    if player.frame.intersects(self.mainTileMap.frame){
        print("you are on the map! yay! ")
    }
}

Итак, как я могу отделить красные плитки в форме буквы А от весь файл тайла, затем сравните его кадры с игроком, чтобы я мог ограничить движение игрока только областью букв?

1 Ответ

3 голосов
/ 27 января 2020

Способ сделать это - определить группу плиток и соответствующие определения плиток для плиток вашей игры. Это позволяет вам определять определенные c идентификаторы в информации userData каждой из ваших групп плиток, чтобы вы могли различать их в коде.

https://developer.apple.com/documentation/spritekit/sktiledefinition/1645813-userdata

Например, в вашей игре вы можете создать группу плиток, которая соответствует всем тем красным плиткам, которые составляют букву A. Затем вы можете установить пользовательский ключ в словаре userData для этого типа плиток, чтобы идентифицировать его. Затем проверяйте ключ или значение ключа в коде всякий раз, когда игрок хочет перейти на новую плитку. Вы можете напрямую установить словарь userData плитки в Инспекторе Атрибутов в определении плитки варианта.

Код для проверки будет выглядеть примерно так (при условии, что для логического ключа 'letterA' установлено значение true в словаре userData:

let letterTile = myTileMap.tileDefinition(atColumn: column, row: row)

if letterTile.userData?.value(forKey: "letterA") == true {
    // Allow the player to move to this tile as it's one of the letter A tiles.
}

Редактировать:

В ответ на ваш запрос вам не нужно заполнять свою игровую карту / сетку в коде. Для этого я предполагаю, что вы создали игровой проект с GameScene.sks уже заполнен. В этом файле вы можете удалить «Узел карты плиток» из библиотеки объектов, и там вы будете использовать редактор для добавления ваших плиток.

Теперь плитки с их пользователем Данные поступят из файла ресурсов SpriteKit TileSet, который также должен был быть добавлен в ваш проект.На текущий XCode (v11.3.1) набор плиток по умолчанию поставляется с предварительно собранными плитками, но ничто не мешает вам добавить свои собственные пользовательские настройки. плитки (красные плитки для вашего маршрута буквы A). Затем, когда вы создали свои группы плиток и определения плиток, вы можно изменить свой словарь пользовательских данных, выбрав конкретные варианты и добавив ключи / значения в окне инспектора.

Если вы не уверены в том, как выполнить процесс, который я описал в предыдущих 2 абзацах, в настоящий момент существует несколько SpriteKit. TileMap учебники, которые свободно доступны в Интернете. Я полагаю, что они могут помочь вам в этом.

Однако, что должно быть закодировано, так это фактический лог c для проверки информации о пользовательских данных в определенных c тайлах, чтобы вы могли ограничить движение игрока как Вы sh - пример, который я привел в своем первоначальном ответе.

...