Пара вопросов по Lua
|
|
AltSk0P | Дата: Четверг, 30.04.2015, 06:51 | Сообщение # 1 |
Краб
Группа: Проверенные
Сообщений: 19
Награды: 0 +
Статус: Offline
| Всем привет. Суть: при выстреле из определенного вида оружия создаю эмиттер и присваиваю ему переменную, ссылающубся на выстрелившего актора. Код function Create(self) self.curdist = 20 for i = 1,MovableMan:GetMOIDCount()-1 do self.gun = MovableMan:GetMOFromID(i); if self.gun.PresetName == "Centipede Mk2" and self.gun.ClassName == "HDFirearm" and (self.gun.Pos-self.Pos).Magnitude < self.curdist then self.actor = MovableMan:GetMOFromID(self.gun.RootID); if MovableMan:IsActor(self.actor) then self.parent = ToActor(self.actor); self.parentgun = ToHDFirearm(self.gun); self.parentgun.ToDelete = true; self.parent:FlashWhite(760); local sparticle = CreateAEmitter("Centipede Sound","Medical Supplies.rte"); sparticle.Pos = self.parent.Pos; MovableMan:AddParticle(sparticle); local cparticle = CreateAEmitter("CentipedeController","Medical Supplies.rte"); cparticle.Pos = self.parent.Pos; cparticle.parent = self.parent; MovableMan:AddParticle(cparticle); end end end self.ToDelete = true; end Строка cparticle.parent = self.parent . Проблема в том, что скрипт созданного эмиттера переменную parent не читает ни под каким видом - т.е. не происходит никаких действий, с ним связанных. Вопрос: как присвоить переменную правильно, чтобы потом ее можно было использовать в отдельном скрипте? Запускать ту же проверку в другом скрипте не предлагать, не работает.
Вопрос №2. Есть код таймера: Код function Create(self) health2add = 2 CF_HealTimer = Timer(); CF_HealTimer:Reset(); CF_HealThisTime = false; end
function Update(self)
if CF_HealTimer:IsPastSimMS(1500) then CF_HealThisTime = true; CF_HealTimer:Reset(); end
if CF_HealThisTime = true then --actions end
if CF_HealThisTime = true then CF_HealThisTime = false; end
end Проблема: то ли не сбрасывается таймер, то ли не снимается переменная CF_HealThisTime, понять я так и не смог.
Буду благодарен за помощь/советы.
|
|
| |
Blump | Дата: Четверг, 30.04.2015, 16:51 | Сообщение # 2 |
Краб
Группа: Проверенные
Сообщений: 736
Награды: 0 +
Статус: Offline
| AltSk0P, чёрт возьми! Этож тот самый код, из которого я сделал своё первое зелье лечения! Думаю, у AEmitter'а cparticle нет такого заранее заданного параметра parent). Ты ссылаешься на параметр самого объекта. К таким параметрам также можно отнести массу, скорость, остроту и т.п. Как я понял, ты хочешь прикрепить как-то этот эмиттер к актору? Тут нужно создавать отдельный скрипт для этого эмиттера. Надо просто присвоить какому-нибудь неиспользуемому/ненужному параметру эмиттера значение, равное ID парента (в твоём случае, это будет self.parent). Типо, cparticle.Sharpness = self.Parent.ID. Затем, в скрипте этого эмиттера использовать остроту (Sharpness) для поиска этого parent'a.
|
|
| |
puksus | Дата: Четверг, 30.04.2015, 16:52 | Сообщение # 3 |
Краб
Группа: Модераторы
Сообщений: 900
Награды: 0 +
Статус: Offline
| ну, в луа оператор сравнения на равенство ==, а не = , поэтому, в проверке условия ты сначала присваиваешь переменной CF_HealThisTime значение true, а затем выполняется логическое условие, состоящее из одной переменной CF_HealThisTime, а она уже тру. Естественно, всегда заходишь в этот иф. Ну, по крайней мере, так бы произошло в сишке.
Сообщение отредактировал puksus - Четверг, 30.04.2015, 16:56 |
|
| |
Blump | Дата: Четверг, 30.04.2015, 17:05 | Сообщение # 4 |
Краб
Группа: Проверенные
Сообщений: 736
Награды: 0 +
Статус: Offline
| AltSk0P, таак, второй код. Тут непонятно немного. Ты хочешь, чтобы действие выполнялось повторно через определённый промежуток времени? Или чтобы оно начало выполняться просто через определённое время (с момента создания, так скажем)? -Если первое, то никаких лишних переменных (CF_HealThisTime в твоём случае) не надо. Просто, переместить команду, которая должна выполняться с определнным интервалом, в блок с таймером (например: вместо ненужного CF_HealThisTime). -Если второе, то сбрасывать таймер не надо. А, да и в начале (в function Create()) не нужно лишний раз сбрасывать таймер - он здесь существует для конктретного объета, и его не могут использовать другие аналогичные объекты. Тем более, даже если его могли бы использовать все аналогичные объекты, то прикинь, какая штука получится, если у одного объекта ещё тамймер не отсчитал положенное время, а его уже обнуляет другой объект).
|
|
| |
Blump | Дата: Четверг, 30.04.2015, 17:06 | Сообщение # 5 |
Краб
Группа: Проверенные
Сообщений: 736
Награды: 0 +
Статус: Offline
| puksus, точно же! В условие же другой знак равенства (точнее, проверки равенства). А я тут сижу, думаю... AltSk0P, короче, просто поменя в строке "if CF_HealThisTime = true", знак "=" на "==".
Сообщение отредактировал Blump - Четверг, 30.04.2015, 17:07 |
|
| |
AltSk0P | Дата: Четверг, 30.04.2015, 21:33 | Сообщение # 6 |
Краб
Группа: Проверенные
Сообщений: 19
Награды: 0 +
Статус: Offline
| Огромное спасибо, работает, как часы.
Цитата AltSk0P, чёрт возьми! Этож тот самый код, из которого я сделал своё первое зелье лечения! Беспардонно и нагло стырил его из кода Unmapped Lands, там, где элитных солдат ранг лечит
|
|
| |
Blump | Дата: Пятница, 01.05.2015, 10:28 | Сообщение # 7 |
Краб
Группа: Проверенные
Сообщений: 736
Награды: 0 +
Статус: Offline
| AltSk0P, а я спёр из мода Xenobiology) Кстати, если ты будешь проверять код, то советую поглядывать в консоль КК. Он там пишет об ошибке в коде с точностью до строки.
Сообщение отредактировал Blump - Пятница, 01.05.2015, 10:43 |
|
| |
Sfabrikan | Дата: Пятница, 01.05.2015, 12:15 | Сообщение # 8 |
Краб
Группа: Половина модератора
Сообщений: 1330
Награды: 0 +
Статус: Offline
| puksus, открою тебе секрет, когда переменная Boolearn (Я не помню), то при проверке условия можно вообще не писать ==, достаточно после иф написать названия этой самой переменой и все (Естественно условие сработает когда перменая труе, если фалс то условие пропускается). Ну можно для удобства писать, никто не запрещает.
|
|
| |
puksus | Дата: Пятница, 01.05.2015, 12:42 | Сообщение # 9 |
Краб
Группа: Модераторы
Сообщений: 900
Награды: 0 +
Статус: Offline
| Sfabrikan, открою тебе секрет, я знаю. Более того, можно даже инты и флоты в условие вместо булевской переменной пихать. Всё, что не ноль - то тру. Можно даже числовые константы использовать. while(1); //бесконечный цикл if(true){} //всегда зайдём if(-0.5){} //всегда зайдём
Сообщение отредактировал puksus - Пятница, 01.05.2015, 12:51 |
|
| |
Sfabrikan | Дата: Понедельник, 04.05.2015, 10:13 | Сообщение # 10 |
Краб
Группа: Половина модератора
Сообщений: 1330
Награды: 0 +
Статус: Offline
| Цитата puksus ( ) Sfabrikan, открою тебе секрет, я знаю. Более того, можно даже инты и флоты в условие вместо булевской переменной пихать. Всё, что не ноль - то тру. Можно даже числовые константы использовать. while(1); //бесконечный цикл if(true){} //всегда зайдём if(-0.5){} //всегда зайдём Открою тебе секрет, я знаю. Можно даже функции писать
|
|
| |
puksus | Дата: Понедельник, 04.05.2015, 10:34 | Сообщение # 11 |
Краб
Группа: Модераторы
Сообщений: 900
Награды: 0 +
Статус: Offline
| Открою тебе секрет, я знаю. Функции, помимо написания, можно ещё и даже перегружать. Возможно, не во всех языках.
Сообщение отредактировал puksus - Понедельник, 04.05.2015, 10:40 |
|
| |