Raseri | Дата: Понедельник, 04.11.2013, 16:06 | Сообщение # 1 |
Краб
Группа: Добрый Модератор
Награды: 18 +
Статус: Offline
| Всем привет В этой статье я покажу, как заспавнить тот самый ящик с подкреплением и как получше оформить расстановку войск перед сражением Начну, пожалуй, с последнего
Если вы читали предыдущий урок, то вы видели, что для каждого из акторов был свой кусок кода, который задавал ему все нужные параметры. Это работает, но выглядит очень громоздко, и если бы мне пришлось добавить, скажем, десяток солдат, то я бы просто захлебнулся в коде Сейчас я покажу, как это сделать по-другому, через таблицы и цикл.
Начнём с того, что создадим переменную и присвоим ей пустую таблицу: self.StartingTroopsPlayer = {}; Да, вот так вот просто. В луа переменные могут создаваться в любом месте кода, их не нужно как-то специально заранее задавать или описывать их тип. Тип переменных в луа изменяется динамически, в зависимости от того, какое значение этой переменной присвоено.
Теперь, мы поместим в таблицу несколько текстовых значений. self.StartingTroopsPlayer = {"PosX", "PosY", "HFlipped"}; Это самая простенькая, одномерная таблица, у неё один ряд и три столбца (3 значения, 3 ячейки).
$IMAGE1$
Чтобы, например, вывести в консоли содержимое 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", в новые таблицы, а две из них сразу заполнили значениями. Первую - числами, третью - логическими значениями.
То, что мы натворили, соответствует такой вот картинке:
$IMAGE2$
Важное замечание: Только что мы сделали не более и не менее, чем заменили старые текстовые значения на новые значения, которые являются таблицами. Текстовые значения "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); -- спавним ящик Результат всех наших действий:
$IMAGE3$
С самого начала игры трое стоящих наверху вайтботов провоцируют шквальный огонь со стороны войск коалиции, демонстрируя, что просто так пробраться поверху не получится Как же сладко они разлетаются на куски, хе-хе-хе
Думаю, в этой статье было дано достаточно много материала для изучения и освоения, так что на этом я, пожалуй, пока что ограничусь. В прикреплении к посту вы традиционно сможете найти мод с миссией - смотрите, задавайте вопросы, вам на всё ответят и со всем помогут Также, если вы хотите побольше узнать о языке программирования Луа, добро пожаловать вот в эту темку: http://cortexcommandru.3dn.ru/forum/67-801-1 Самые основы там можно почерпнуть просто наотличненько :3
Ах да, кстати, кроме того кода, что я привёл в статье, я также дописал спавн двух турелей для коалиции и одного дрона в подвале, для защиты того, что в будущем станет командиром этого поста. Это чтоб вы не удивлялись
|
|
| |