Миссия моей мечты, часть 3
|
|
Raseri | Дата: Понедельник, 04.11.2013, 16:06 | Сообщение # 1 |
Темный Клинок
Группа: Добрый Модератор
Сообщений: 756
Награды: 23 +
Статус: Offline
| Всем привет В этой статье я покажу, как заспавнить тот самый ящик с подкреплением и как получше оформить расстановку войск перед сражением Начну, пожалуй, с последнего
Если вы читали предыдущий урок, то вы видели, что для каждого из акторов был свой кусок кода, который задавал ему все нужные параметры. Это работает, но выглядит очень громоздко, и если бы мне пришлось добавить, скажем, десяток солдат, то я бы просто захлебнулся в коде Сейчас я покажу, как это сделать по-другому, через таблицы и цикл.
Начнём с того, что создадим переменную и присвоим ей пустую таблицу: self.StartingTroopsPlayer = {}; Да, вот так вот просто. В луа переменные могут создаваться в любом месте кода, их не нужно как-то специально заранее задавать или описывать их тип. Тип переменных в луа изменяется динамически, в зависимости от того, какое значение этой переменной присвоено.
Теперь, мы поместим в таблицу несколько текстовых значений. self.StartingTroopsPlayer = {"PosX", "PosY", "HFlipped"}; Это самая простенькая, одномерная таблица, у неё один ряд и три столбца (3 значения, 3 ячейки).
Чтобы, например, вывести в консоли содержимое 2-й ячейки, мы должны написать: print(self.StartingTroopsPlayer[2]); В консоли будет красоваться - PosY. Без кавычек. Кавычки здесь... нужны просто для того, чтобы компьютер понимал, что перед ним текстовые значения. Если мы будем заносить в таблицу какие-то числа или логические переменные, то кавычки нам не понадобятся.
Важное замечание: Цифра [2], в этих самых квадратных скобочках - это индекс, или номер позиции в таблице. Когда мы хотим получить из таблицы какое-то значение, мы его ищем по индексу. Передаём таблице индекс - получаем хранящееся по нему значение. Так все крутые программисты говорят, так что запомните |
Теперь мы создадим двухмерную таблицу. Чтобы это сделать, мы напишем следующее: self.StartingTroopsPlayer[1] = {324, 529, 440}; -- позиция X self.StartingTroopsPlayer[2] = {}; -- позиция Y self.StartingTroopsPlayer[3] = {true, false, false}; -- обращён направо или налево
То есть мы превратили все три значения, хранящиеся в "self.StartingTroopsPlayer", в новые таблицы, а две из них сразу заполнили значениями. Первую - числами, третью - логическими значениями.
То, что мы натворили, соответствует такой вот картинке:
Важное замечание: Только что мы сделали не более и не менее, чем заменили старые текстовые значения на новые значения, которые являются таблицами. Текстовые значения "PosX", "PosY" и "HFlipped" пропали, в этой таблице их больше нет. Добавил я их исключительно с целью постепенно раскрыть перед читателем суть таблиц, от простого к сложному |
Если мы захотим вывести в консоль, например, позицию Х третьего по счёту актора, то мы должны написать: print(self.StartingTroops[1][3]); Первый числовой индекс указывает на таблицу со всеми записанными координатами Х, а второй индекс указывает на уже конкретное значение.
Надеюсь, это всё приблизило вас к пониманию устройства таблиц в луа и поможет вам с ними работать Вот как, быстренько и кратенько, оформил таблицы я: Код -- задаём данные для войск игрока self.StartingTroopsPlayer = {}; self.StartingTroopsPlayer[1] = {324, 529, 440, 400, 408, 384, 356, 450, 48, 72, 208, 54}; -- коорд. X self.StartingTroopsPlayer[2] = {804, 529, 540, 566, 651, 648, 648, 670, 876, 900, 857, 712}; -- коорд. Y self.StartingTroopsPlayer[3] = {true, false, false, false, true, true, false, true, false, false, true, false}; -- направление взгляда -- для вражеских войск self.StartingTroopsAI = {}; self.StartingTroopsAI[1] = {761, 761, 768, 708, 718, 780, 764, 1121, 960, 1130, 712, 752, 702}; self.StartingTroopsAI[2] = {379, 379, 379, 504, 504, 504, 308, 329, 588, 657, 704, 704, 437}; self.StartingTroopsAI[3] = {true, true, true, true, true, true, true, false, true, false, false, true, true};
Здесь, как вы видите, есть данные и для войск игрока, и для вражеских войск. И сейчас я займусь спавном и того, и другого Код -- спавн войск игрока for i = 1,12 do -- цикл выполнится 12 раз (по количеству солдат и значений в таблице) self.soldier = CreateAHuman("Whitebot","Techion.rte"); self.soldier.Team = 0; self.soldier.Pos = Vector(self.StartingTroopsPlayer[1][i], self.StartingTroopsPlayer[2][i]); self.soldier.HFlipped = self.StartingTroopsPlayer[3][i]; self.soldier:AddInventoryItem(CreateHDFirearm("Micro Pulsar","Techion.rte")); self.soldier.AIMode = Actor.AIMODE_SENTRY; MovableMan:AddActor(self.soldier); end -- спавн войск противника for i = 1,13 do self.soldier = CreateAHuman("Soldier Light","Coalition.rte"); self.soldier.Team = 1; self.soldier.Pos = Vector(self.StartingTroopsAI[1][i], self.StartingTroopsAI[2][i]); self.soldier.HFlipped = self.StartingTroopsAI[3][i]; self.soldier:AddInventoryItem(CreateHDFirearm("Compact Assault Rifle","Coalition.rte")); self.soldier.AIMode = Actor.AIMODE_SENTRY; MovableMan:AddActor(self.soldier); end
Если этот код вызывает затруднения с пониманием, то просто сравните его с тем, что давался в прошлой статье
Теперь давайте заспавним ящик с подкреплением. Для этого мы должны: 1) Создать ящик и задать ему необходимые параметры 2) Создать актора, задать режим ИИ и команду, а также дать ему оружие 3) Добавить актора в "инвентарь" ящика 3) Заспавнить ящик
Вот как это делается: Код -- спавн ящика с подкреплением local dropcrate = CreateACRocket("Drop Crate","Dummy.rte"); dropcrate:SetControllerMode(Controller.CIM_AI, -1); -- даём команду на "доставку" содержимого dropcrate.Team = 0; dropcrate.Pos = Vector(165, -20); -- координата Y отрицательная, для того чтобы ящик появился из-за границы экрана local soldier = CreateAHuman("Whitebot","Techion.rte"); soldier:AddInventoryItem(CreateHDFirearm("CA-01 Firestorm","Browncoats.rte")); soldier:AddInventoryItem(CreateHDFirearm("Heavy Digger","Base.rte")); soldier:AddInventoryItem(CreateHDFirearm("Heavy Digger","Base.rte")); soldier.Team = 0; soldier.AIMode = Actor.AIMODE_SENTRY; dropcrate:AddInventoryItem(soldier); -- загружаем в ящик солдата MovableMan:AddActor(dropcrate); -- спавним ящик Результат всех наших действий:
С самого начала игры трое стоящих наверху вайтботов провоцируют шквальный огонь со стороны войск коалиции, демонстрируя, что просто так пробраться поверху не получится Как же сладко они разлетаются на куски, хе-хе-хе
Думаю, в этой статье было дано достаточно много материала для изучения и освоения, так что на этом я, пожалуй, пока что ограничусь. В прикреплении к посту вы традиционно сможете найти мод с миссией - смотрите, задавайте вопросы, вам на всё ответят и со всем помогут Также, если вы хотите побольше узнать о языке программирования Луа, добро пожаловать вот в эту темку: http://cortexcommandru.3dn.ru/forum/67-801-1 Самые основы там можно почерпнуть просто наотличненько :3
Ах да, кстати, кроме того кода, что я привёл в статье, я также дописал спавн двух турелей для коалиции и одного дрона в подвале, для защиты того, что в будущем станет командиром этого поста. Это чтоб вы не удивлялись
|
|
| |
puksus | Дата: Понедельник, 04.11.2013, 20:42 | Сообщение # 2 |
Пукс
Группа: Модераторы
Сообщений: 987
Награды: 0 +
Статус: Offline
| Цитата В луа переменные могут создаваться в любом месте кода, их не нужно как-то специально заранее задавать или описывать их тип. А есть ли способ специально задать тип переменной? а то меня бесит такая "возможность" не объявлять переменные. Снижает читаемость и понятность кода.
Цитата Чтобы, например, вывести в консоли содержимое 2-й ячейки, мы должны написать: print(self.StartingTroopsPlayer[2]); А отсчёт, разве, не с нуля? Обычно второй элемент имеет индекс 1, или в луа не так?
А так, статья отличная, разве что, может, стоит написать про таблицы и другие чисто языковые моменты в отдельной статье и дать ссылку на неё?
https://vk.com/beezoya
Сообщение отредактировал puksus - Понедельник, 04.11.2013, 20:53 |
|
| |
Raseri | Дата: Понедельник, 04.11.2013, 22:33 | Сообщение # 3 |
Темный Клинок
Группа: Добрый Модератор
Сообщений: 756
Награды: 23 +
Статус: Offline
| Пожалуйста, не добавляй много сообщений подряд, для этого существует кнопка "редактировать"
Объявлять переменные заранее да, можно, и можно их приводить к определённому типу. Но это зачастую бессмысленно.
Программирование в луа построено на том, что мы в любой момент времени можем создать переменную, произвести с ней какие-то действия и после этого забыть про неё. А ещё лучше - присвоить ей значение nil, чтобы её удалил из памяти автоматический сборщик мусора.
Можно заранее описать какие-то параметры, которые будут часто использоваться в программе или просто имеют большое (важное) значение. Вон, как я с координатами чухов сделал, с таблицей. Хотя таблицу после спавна тоже следовало бы удалить.
Но зачем, зачем нам загружать память всякой сранью, зачем тащить через всю программу какие-то переменные, которые будут использоваться единожды, или в какой-то одной функции? Создали - отработали - удалили, такой вот проповедуется подход. Если ему следовать, то код как раз таки меньше захламляется, из него проще выудить именно то, что нужно.
А читаемость... ну тут от программиста зависит. От его кода и от его желания писать комментарии Как человек, перешедший на луа с пасквиля, могу сказать, что да, поначалу это кажется непривычно. Но зато когда распробуешь на вкус...
Цитата А отсчёт, разве, не с нуля? Обычно второй элемент имеет индекс 1, или в луа не так? В плюсах, знаю, так, а вот в луа такой принцип не прижился )) Язык в первую очередь создавался для математиков, так что с них спрос )) Не, в отсчёте участвуют только натуральные числа: 1,2,3... Хотя, насколько я помню, ничто не мешает делать и с нуля. Просто так не принято.
Цитата может, стоит написать про таблицы и другие чисто языковые моменты в отдельной статье и дать ссылку на неё? о_0 у нас же целый раздел этому посвящён о_0 "Учебник Луа", если я правильно помню о_0
А вот в статье возможность дополнительного изучения материала обговорю, спасибо за совет
|
|
| |
puksus | Дата: Понедельник, 04.11.2013, 22:42 | Сообщение # 4 |
Пукс
Группа: Модераторы
Сообщений: 987
Награды: 0 +
Статус: Offline
| Цитата Raseri ( ) Пожалуйста, не добавляй много сообщений подряд, для этого существует кнопка "редактировать" Прошу прощения, ступил.
https://vk.com/beezoya
|
|
| |
Raseri | Дата: Понедельник, 04.11.2013, 22:47 | Сообщение # 5 |
Темный Клинок
Группа: Добрый Модератор
Сообщений: 756
Награды: 23 +
Статус: Offline
| Да ничего ^_-- Меня надо было переносить не в группу "Главный Модератор", а в группу "Добрый Модератор" :3
|
|
| |
Статистика Форума |
Последние темы |
Читаемые темы |
Последние зарегистрированные пользователи |
|
|
|
|