Приветствую Вас Гость | RSSГлавная | Миссия моей мечты, часть 3 - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Статьи » Создание миссий » Миссия моей мечты, часть 3 (Доработка спавна, таблицы и циклы в луа)
Миссия моей мечты, часть 3
RaseriДата: Понедельник, 04.11.2013, 16:06 | Сообщение # 1
Темный Клинок
Группа: Добрый Модератор
Сообщений: 756
Награды: 23  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Всем привет smile
В этой статье я покажу, как заспавнить тот самый ящик с подкреплением и как получше оформить расстановку войск перед сражением smile
Начну, пожалуй, с последнего smile

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

Начнём с того, что создадим переменную и присвоим ей пустую таблицу:
self.StartingTroopsPlayer = {};
Да, вот так вот просто.
В луа переменные могут создаваться в любом месте кода, их не нужно как-то специально заранее задавать или описывать их тип.
Тип переменных в луа изменяется динамически, в зависимости от того, какое значение этой переменной присвоено.

Теперь, мы поместим в таблицу несколько текстовых значений.
self.StartingTroopsPlayer = {"PosX", "PosY", "HFlipped"};
Это самая простенькая, одномерная таблица, у неё один ряд и три столбца (3 значения, 3 ячейки).



Чтобы, например, вывести в консоли содержимое 2-й ячейки, мы должны написать:
print(self.StartingTroopsPlayer[2]);
В консоли будет красоваться - PosY.
Без кавычек.
Кавычки здесь... нужны просто для того, чтобы компьютер понимал, что перед ним текстовые значения.
Если мы будем заносить в таблицу какие-то числа или логические переменные, то кавычки нам не понадобятся.

    Важное замечание:
Цифра [2], в этих самых квадратных скобочках - это индекс, или номер позиции в таблице.
Когда мы хотим получить из таблицы какое-то значение, мы его ищем по индексу.
Передаём таблице индекс - получаем хранящееся по нему значение.
Так все крутые программисты говорят, так что запомните biggrin


Теперь мы создадим двухмерную таблицу.
Чтобы это сделать, мы напишем следующее:
self.StartingTroopsPlayer[1] = {324, 529, 440}; -- позиция X
self.StartingTroopsPlayer[2] = {}; -- позиция Y
self.StartingTroopsPlayer[3] = {true, false, false}; -- обращён направо или налево

То есть мы превратили все три значения, хранящиеся в "self.StartingTroopsPlayer", в новые таблицы, а две из них сразу заполнили значениями.
Первую - числами, третью - логическими значениями.

То, что мы натворили, соответствует такой вот картинке:



    Важное замечание:
Только что мы сделали не более и не менее, чем заменили старые текстовые значения на новые значения, которые являются таблицами.
Текстовые значения "PosX", "PosY" и "HFlipped" пропали, в этой таблице их больше нет.
Добавил я их исключительно с целью постепенно раскрыть перед читателем суть таблиц, от простого к сложному smile


Если мы захотим вывести в консоль, например, позицию Х третьего по счёту актора, то мы должны написать:
print(self.StartingTroops[1][3]);
Первый числовой индекс указывает на таблицу со всеми записанными координатами Х, а второй индекс указывает на уже конкретное значение.

Надеюсь, это всё приблизило вас к пониманию устройства таблиц в луа и поможет вам с ними работать smile
Вот как, быстренько и кратенько, оформил таблицы я:
Код
-- задаём данные для войск игрока
          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};


Здесь, как вы видите, есть данные и для войск игрока, и для вражеских войск.
И сейчас я займусь спавном и того, и другого smile
Код
-- спавн войск игрока
          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


Если этот код вызывает затруднения с пониманием, то просто сравните его с тем, что давался в прошлой статье smile

Теперь давайте заспавним ящик с подкреплением.
Для этого мы должны:
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); -- спавним ящик

Результат всех наших действий:



С самого начала игры трое стоящих наверху вайтботов провоцируют шквальный огонь со стороны войск коалиции, демонстрируя, что просто так пробраться поверху не получится smile
Как же сладко они разлетаются на куски, хе-хе-хе biggrin

Думаю, в этой статье было дано достаточно много материала для изучения и освоения, так что на этом я, пожалуй, пока что ограничусь.
В прикреплении к посту вы традиционно сможете найти мод с миссией - смотрите, задавайте вопросы, вам на всё ответят и со всем помогут smile
Также, если вы хотите побольше узнать о языке программирования Луа, добро пожаловать вот в эту темку:
http://cortexcommandru.3dn.ru/forum/67-801-1
Самые основы там можно почерпнуть просто наотличненько :3

Ах да, кстати, кроме того кода, что я привёл в статье, я также дописал спавн двух турелей для коалиции и одного дрона в подвале, для защиты того, что в будущем станет командиром этого поста.
Это чтоб вы не удивлялись smile
Прикрепления: 7590834.png (4.2 Kb) · 3845843.png (6.7 Kb) · 1151927.png (140.6 Kb) · Breakthrough.rt.rar (16.9 Kb)
 
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
Пожалуйста, не добавляй много сообщений подряд, для этого существует кнопка "редактировать" smile

Объявлять переменные заранее да, можно, и можно их приводить к определённому типу.
Но это зачастую бессмысленно.

Программирование в луа построено на том, что мы в любой момент времени можем создать переменную, произвести с ней какие-то действия и после этого забыть про неё.
А ещё лучше - присвоить ей значение nil, чтобы её удалил из памяти автоматический сборщик мусора.

Можно заранее описать какие-то параметры, которые будут часто использоваться в программе или просто имеют большое (важное) значение.
Вон, как я с координатами чухов сделал, с таблицей.
Хотя таблицу после спавна тоже следовало бы удалить.

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

А читаемость... ну тут от программиста зависит.
От его кода и от его желания писать комментарии smile
Как человек, перешедший на луа с пасквиля, могу сказать, что да, поначалу это кажется непривычно.
Но зато когда распробуешь на вкус... wink

Цитата
А отсчёт, разве, не с нуля? Обычно второй элемент имеет индекс 1, или в луа не так?
В плюсах, знаю, так, а вот в луа такой принцип не прижился ))
Язык в первую очередь создавался для математиков, так что с них спрос ))
Не, в отсчёте участвуют только натуральные числа: 1,2,3... smile
Хотя, насколько я помню, ничто не мешает делать и с нуля. Просто так не принято.

Цитата
может, стоит написать про таблицы и другие чисто языковые моменты в отдельной статье и дать ссылку на неё?

о_0 у нас же целый раздел этому посвящён о_0
"Учебник Луа", если я правильно помню о_0

А вот в статье возможность дополнительного изучения материала обговорю, спасибо за совет smile
 
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
 
Форум » Статьи » Создание миссий » Миссия моей мечты, часть 3 (Доработка спавна, таблицы и циклы в луа)
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Последние темы Читаемые темы Последние зарегистрированные пользователи
Флудильня! [yksys147keti3626]

АнтиБК/Бойцовский клуб/Сombats [greendayone82]

The Sims 3 [greendayone82]

ЯДЕРНЫЙ ТРОН!!! [greendayone82]

Очень интересная игра [greendayone82]

Проблема с Loadouts [mekkievbk]

Русификатор Cortex Command Build 32 [puksus]

CC теперь в Open Source и B33 с мультиплеером !!! [gjrfytn]

игра обломи предыдущего [puksus]

Smarter AI Mod v1 [TerrariMan]

[1]>Флудильня! [4729]

[2]>Свалка арта. [843]

[3]>игра обломи предыдущего [360]

[4]>Фан-арт по Cortex Command [349]

[5]>Песенки или музыка. [268]

[6]>Russian Combat Small Arms {B24-B27} [246]

[7]>[UNITED TERRAN FORCES] [240]

[8]>Elzirs [229]

[9]>Выход 24 билда. [214]

[10]>Cortex Command - Online Deathmatch [208]

ghost4559 [28.03.2024|12:29]

rostislavpoarkov55 [21.03.2024|10:44]

dawidponomaryow [08.03.2024|21:16]

nekoplay18 [31.01.2024|20:10]

Provv [19.10.2023|20:58]

ranatolevnko200 [01.10.2023|17:56]

Silencer18 [24.07.2023|21:52]

yksys147keti3626 [30.01.2023|23:11]

islambabaev1100 [22.12.2022|01:14]

Ded_Babay [03.12.2022|07:55]


Вверх
Русский Фан Сайт Cortex Command © 2024.