You are not logged in.
Здравствуйте! Скажите, пожалуйста, можно ли создать актёра, и хранить его данные в массиве под определённым ключём, по которому можно в дальнейшем обращаться, например, для проверки чего-либо?
Допустим, вот так:
...объявление переменной для ведения подсчёта var $count : float end
...объявление переменной как массива var $actor : array 10 of string end
...тело цикла while $count < 10
$count += 1
009A: $actor[$count] = create_actor_pedtype 7 model #WMYBU at $X $Y $Z
...end
В дальнейшем необходимо использовать эти данные, и обращаться к ним по числовым ключам.
Это возможно?
---
Дело в том, что я хочу сократить более длинную имеющуюся у меня в коде запись генерации актёров.
P.S: Пример выше неработоспособен, и приведён в качестве примера, чтобы как можно лучше выразить мысли.
Last edited by Ammy (16-11-2009 13:51)
Offline
Благодарю Вас! И ещё один вопрос для более полного понимания: где можно посмотреть полный список имеющихся типов (кроме общедоступных) под разные, скажем так, задачи? Честно, не знала, и даже представить не могла, что есть тип, именуемый как actor.. Спасибо ещё раз!
Last edited by Ammy (16-11-2009 13:59)
Offline
В скриптинге СБ всего 4 типа данных: float, integer и строка (2 типа строк, кажется).
Запись
var $actor : array 10 of actor end
Эквивалентна
var $actor : array 10 of integer end
Но на самом деле можно писать и
var $actor : array 10 of float end
Жесткого контроля типа не существует, лишь бы размер совпадал (4 байта).
Про массивы обсуждалось вот тут немножко.
Offline
Возникли проблемы с проверкой и удалением мёртвых актёров из памяти. Кто-нибудь поможет проанализировать код? В ряду своего малого опыта работы в SCM скриптинге, мне пришлось отказаться от CLEO, и разделить один поток на два, а затем перенести в main.scm. Очень жаль..
Вот скрипт сам скрипт (два потока):
:ZOMBIES thread 'ZOMBIES' 0001: wait 30 ms var $main : int = 0 $cnt : int = 0 $count : int = 0 $DEAD : array 30 of actor end :ZOMBIES_START wait 50 ms while $count < 10 $count += 1 0208: $RAND = random_float_in_ranges -5.0 5.0 04C4: store_coords_to $X $Y $Z from_actor $PLAYER_ACTOR with_offset $RAND 60.0 0.0 02CE: $Z = ground_z_at $X $Y 50.0 009A: $DEAD[$count] = create_actor_pedtype 7 model #WMYBU at $X $Y $Z 0223: set_actor $DEAD[$count] health_to 1000000 02AB: set_actor $DEAD[$count] immunities BP 0 FP 1 EP 0 CP 0 MP 0 0446: set_actor $DEAD[$count] immune_to_headshots 1 07DD: set_actor $DEAD[$count] temper_to 100 // see pedstats.dat 0332: set_actor $DEAD[$count] bleeding 1 0489: set_actor $DEAD[$count] muted 1 0245: set_actor $DEAD[$count] walk_style_to "DRUNKMAN" 04D8: set_actor $DEAD[$count] drowns_in_water 0 0946: set_actor $DEAD[$count] actions_uninterupted_by_weapon_fire 1 0619: enable_actor $DEAD[$count] collision_detection 1 02E0: actor $DEAD[$count] aggressive 05E2: AS_actor $DEAD[$count] kill_actor $PLAYER_ACTOR wait 1000 ms end $main = 1 :ZOMBIES_END wait 250 ms if $count < 10 then jump @ZOMBIES_START end jump @ZOMBIES_END end_thread // -------------- :CONDITION thread 'CONDITION' wait 30 ms if $main == 1 then jump @CONDITION_2 end jump @CONDITION :CONDITION_2 wait 50 ms if $cnt == 10 then $cnt = 0 end $cnt += 1 if 0118: actor $DEAD[$cnt] dead then wait 200 ms 034F: destroy_actor_with_fade $DEAD[$cnt] $count -= 1 end jump @CONDITION_2 end_thread
Проблема: создаются актёры, переваливающие за установленную плотность в 10 человек. Они должны появляться, они должны умирать, и удаляться из памяти, когда актёр их уничтожает. Сейчас же, если использовать в данном слое :ZOMBIES_END проверку и прыжок на слой, в котором создаются зомби, они (актёры / зомби) начинают беспорядочно сыпаться. Если же эту проверку с переходом убрать, то всё будет нормально, зомби будут исчезать, когда ГГ их убивает, однако новые на замену старым появляться не будут.
Вопросы:
1. Можно ли упростить код :CONDITION части, или вовсе вывести всё в единый поток, чтобы в дальнейшем использовать один *.cs файл?
2. Опкодов для работы с массивами (на замену высокоуровневым функциям), полагаю, совcем нету?
P.S: Глаза уже сломала, запутавшись в собственном коде. Прошу помощи.
Last edited by Ammy (17-11-2009 11:07)
Offline
Смотри:
Во втором потоке ты проверяешь, что умер актер, но он то помечен определенным индексом
т.е, например, умер у тебя $DEAD[1] и что? а в первом потоке будет создан $DEAD[10], потому что ты $count просто вычел 1 = 9, это пойдет в первый поток и будет 10. Далее, у тебя там снова во втором потоке проверится что $DEAD[1] умер и еще раз в первом потоке создатся $DEAD[10] и т.д.
Надеюсь объяснил.
:ZOMBIES thread 'ZOMBIES' wait 250 var $main : int = 0 $cnt : int = 0 $count : int = 0 $DEAD : array 10 of actor end :ZOMBIES_START while $count < 10 if Actor.Dead($DEAD[$count]) then 034F: destroy_actor_with_fade $DEAD[$count] wait 1000 0208: $RAND = random_float_in_ranges -5.0 5.0 04C4: store_coords_to $X $Y $Z from_actor $PLAYER_ACTOR with_offset $RAND 60.0 0.0 02CE: $Z = ground_z_at $X $Y 50.0 009A: $DEAD[$count] = create_actor_pedtype 7 model #WMYBU at $X $Y $Z 0223: set_actor $DEAD[$count] health_to 1000000 02AB: set_actor $DEAD[$count] immunities BP 0 FP 1 EP 0 CP 0 MP 0 0446: set_actor $DEAD[$count] immune_to_headshots 1 07DD: set_actor $DEAD[$count] temper_to 100 // see pedstats.dat 0332: set_actor $DEAD[$count] bleeding 1 0489: set_actor $DEAD[$count] muted 1 0245: set_actor $DEAD[$count] walk_style_to "DRUNKMAN" 04D8: set_actor $DEAD[$count] drowns_in_water 0 0946: set_actor $DEAD[$count] actions_uninterupted_by_weapon_fire 1 0619: enable_actor $DEAD[$count] collision_detection 1 05E2: AS_actor $DEAD[$count] kill_actor $PLAYER_ACTOR end $count += 1 end $count = 0 jump @ZOMBIES_START
Last edited by mfisto (17-11-2009 12:38)
I know everything and nothing...
Offline
А если так?
thread 'ZOMBIES' wait 30 while true wait 250 //в этом цикле будут перебираться актеры for $count = 0 to 9 //если актера с текущим индексом не существует, создать его if $DEAD($count,10i) == 0 then 0208: 0@ = random_float_in_ranges -5.0 5.0 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0@ 60.0 0.0 02CE: 3@ = ground_z_at 1@ 2@ 50.0 009A: $DEAD[$count] = create_actor_pedtype 7 model #WMYBU at 1@ 2@ 3@ 0223: set_actor $DEAD($count,10i) health_to 1000000 02AB: set_actor $DEAD($count,10i) immunities BP 0 FP 1 EP 0 CP 0 MP 0 0446: set_actor $DEAD($count,10i) immune_to_headshots 1 07DD: set_actor $DEAD($count,10i) temper_to 100 // see pedstats.dat 0332: set_actor $DEAD($count,10i) bleeding 1 0489: set_actor $DEAD($count,10i) muted 1 0245: set_actor $DEAD($count,10i) walk_style_to "DRUNKMAN" 04D8: set_actor $DEAD($count,10i) drowns_in_water 0 0946: set_actor $DEAD($count,10i) actions_uninterupted_by_weapon_fire 1 05E2: AS_actor $DEAD($count,10i) kill_actor $PLAYER_ACTOR end //если актер умер, удалить его и обнулить переменную if actor.Dead($DEAD($count,10i)) then actor.DestroyWithFade($DEAD($count,10i)) $DEAD($count,10i) = 0 end end end_thread
И не забывай, что индексация массива всегда начинается с 0, а не с 1.
Offline
Alien, несколько вопросов:
1. Почему цикл FOR в Вашем примере не имеет заключения (END)?
2. Пробовала пример в действии, и заметила, что если перед циклом не поставить произвольной метки, на которую уже после цикла установить прыжок, то зомби исчезать не будут. Я имею ввиду:
thread 'ZOMBIES'
wait 30 ms:ZOMBIES
while true
....
.........
....end
jump @ZOMBIES
end_thread
3. Помимо проверки 'смерти' и высвобождения памяти, можно ли корректно в этом же цикле использовать другие проверки, но уже перед/после имеющейся?
//если актер умер, удалить его и обнулить переменную
if
actor.Dead($DEAD($count,10i))
then
actor.DestroyWithFade($DEAD($count,10i))
$DEAD($count,10i) = 0
end// если зомби вне радиуса, уничтожить его (пример)
if
80F2: not actor $PLAYER_ACTOR near_actor $DEAD($count,10i) radius 40.0 80.0 0
then
actor.DestroyWithFade($DEAD($count,10i))
$DEAD($count,10i) = 0
end
----------
И не забывай, что индексация массива всегда начинается с 0, а не с 1.
Да, моя ошибка. Дело в том, что в других языках привыкла не использовать нулевой ключ.
потому что ты $count просто вычел 1 = 9
:wow:
Надеюсь объяснил.
Да, поняла свои ошибки. Всё никак синтаксис написания не уложится, и путаюсь постоянно..
Last edited by Ammy (17-11-2009 14:57)
Offline
Alien, несколько вопросов:
1. Почему цикл FOR в Вашем примере не имеет заключения (END)?
2. Пробовала пример в действии, и заметила, что если перед циклом не поставить произвольной метки, на которую уже после цикла установить прыжок, то зомби исчезать не будут.
Ага, моя ошибка. Надо так:
thread 'ZOMBIES' wait 30 while true wait 250 //в этом цикле будут перебираться актеры for $count = 0 to 9 //если актера с текущим индексом не существует, создать его if $DEAD($count,10i) == 0 then 0208: 0@ = random_float_in_ranges -5.0 5.0 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0@ 60.0 0.0 02CE: 3@ = ground_z_at 1@ 2@ 50.0 009A: $DEAD[$count] = create_actor_pedtype 7 model #WMYBU at 1@ 2@ 3@ 0223: set_actor $DEAD($count,10i) health_to 1000000 02AB: set_actor $DEAD($count,10i) immunities BP 0 FP 1 EP 0 CP 0 MP 0 0446: set_actor $DEAD($count,10i) immune_to_headshots 1 07DD: set_actor $DEAD($count,10i) temper_to 100 // see pedstats.dat 0332: set_actor $DEAD($count,10i) bleeding 1 0489: set_actor $DEAD($count,10i) muted 1 0245: set_actor $DEAD($count,10i) walk_style_to "DRUNKMAN" 04D8: set_actor $DEAD($count,10i) drowns_in_water 0 0946: set_actor $DEAD($count,10i) actions_uninterupted_by_weapon_fire 1 05E2: AS_actor $DEAD($count,10i) kill_actor $PLAYER_ACTOR end end //если актер умер, удалить его и обнулить переменную if actor.Dead($DEAD($count,10i)) then actor.DestroyWithFade($DEAD($count,10i)) $DEAD($count,10i) = 0 end end end_thread
Второй вопрос решается автоматически.:cool:
3. Помимо проверки 'смерти' и высвобождения памяти, можно ли корректно в этом же цикле использовать другие проверки, но уже перед/после имеющейся?
А почему нет?;-)
Last edited by Alien (17-11-2009 15:08)
Offline
Чуть-чуть ошиблись, а правильнее будет у Вас вот так:
Ведь проверка тоже требует перебора, а без него (перебора) никуда бы они (актёры) не выгрузились, соответственно и не появились бы новые
Спасибо Вам огромное!
Last edited by Ammy (17-11-2009 15:49)
Offline
Первый вопрос:
Возникла одна маленькая проблема с глобальной областью видимости переменных взаимодействия с CLEO скриптами. Так как нельзя использовать переменные вида $VAR, был предложен (в оф. мануале) иной выход - использование новых CLEO опкодов.
Существует у меня два (CLEO) скрипта, один из которых устанавливает значение одной глобальной переменной методом:
0AB3: var 0 = 10
Второй CLEO скрипт взаимодействует с этой переменной в существующем цикле, записывая постоянно её значение вот так:
0AB4: 0@= var 0
При применении данного метода игра отказывается работать.
Вопрос: какие могут быть причины?
Второй вопрос:
Позволяется ли использовать модели существующего в игре оружия в качестве объектов, которые можно attach'ить к моделям автотранспорта, при этом сохраняя их работоспособность в качестве оружия? Пробовала цеплять к машине автомат - игра вылетает, как только доходит до места, где я указываю модель оружия как объект, т. е. :
Естественно, что если бы даже и не вылетело, свойства оружия бы были уже утрачены, потому что игра бы инициализировала это (пушку) как объект, без надлежащих свойств, а сами свойства нужно было бы описывать.
Last edited by Ammy (20-11-2009 08:42)
Offline
сначала надо загрузить модель и поставить проверку на загруженность...
да, модели оружия можно использовать как обычные объекты, но работать как оружие они не будут)) придётся выстрельно-визуальную часть самому писать
Last edited by 3Doomer (20-11-2009 12:39)
GIMS developer
Offline
Вчера кстати написал небольшой код, цепляющий миниган к платформе поезда.
{$CLEO} wait 0 model.Load(537) model.Load(569) model.Load(362) repeat wait 0 until model.Available(537) repeat wait 0 until model.Available(569) repeat wait 0 until model.Available(362) 06D8: 0@ = create_train_at 2225.5078 -1621.9421 15.8675 type 10 direction 0 model.Destroy(537) model.Destroy(569) object.Create(3@ 362 0.0 0.0 0.0) model.Destroy(362) 078A: 4@ = get_train 0@ carriage 1 handle 0681: attach_object 3@ to_car 4@ with_offset 0.0 -8.0 -0.7 rotation 0.0 30.0 270.0 while true repeat wait 0 until 00E1: player 0 pressed_key 11 while 056E: car 4@ defined wait 0 if 00E1: player 0 pressed_key 10 then break end 0174: 5@ = car 4@ Z_angle 02F6: 6@ = cosine 5@ // (float) 02F7: 7@ = sine 5@ // (float) object.StorePos(3@ 8@ 9@ 1@) car.StorePos(4@ 8@ 9@ 5@) 0087: 10@ = 8@ // (float) 0087: 11@ = 9@ // (float) 0087: 12@ = 8@ // (float) 0087: 2@ = 9@ // (float) 1@ += -0.25 6@ *= 9.2 7@ *= -9.2 005B: 10@ += 6@ // (float) 005B: 11@ += 7@ // (float) 6@ *= 100.0 7@ *= 100.0 005B: 12@ += 6@ // (float) 005B: 2@ += 7@ // (float) 058A: create_gun_flash_from 10@ 11@ 1@ to 12@ 2@ 1@ 06BC: create_M4_shoot_from 10@ 11@ 1@ target 12@ 2@ 1@ energy 1000 end end
При желании можно модифицировать - так, чтобы миниган поворачивался или даже сделать самонаводку по супостатам.
Last edited by Den_spb (20-11-2009 14:26)
Offline
Первый вопрос:
Возникла одна маленькая проблема с глобальной областью видимости переменных взаимодействия с CLEO скриптами. Так как нельзя использовать переменные вида $VAR, был предложен (в оф. мануале) иной выход - использование новых CLEO опкодов.
Существует у меня два (CLEO) скрипта, один из которых устанавливает значение одной глобальной переменной методом:
0AB3: var 0 = 10
Второй CLEO скрипт взаимодействует с этой переменной в существующем цикле, записывая постоянно её значение вот так:
0AB4: 0@= var 0
При применении данного метода игра отказывается работать.
Вопрос: какие могут быть причины?
Offline
Первый скрипт - это доработанный вариант того, в котором вы мне помогали понять ошибку ранее. Там в цикле при определённом условии, что актёр был создан, и дефайнед, у меня записывается значение в глобальную переменную var 0, которая равна единице.
Второй скрипт - это по сути аудио плеер, который должен воспроизводить музыку (получая нужное значение глобальной переменной), поэтому лежит отдельно, в отдельном потоке, потому что если бы он использовался в первом, то это бы проигрование музыки тормозило весь цикл, так как на ожидание между стартом и концом нужно отводить время командой wait. Итак, второй скрипт в цикле записывает, и проверяет значение var 0, вот так:
thread 'SOUNDS'
wait 30 ms:SOUNDS
0000: FKKENEMPTY:SOUNDS2
0AB4: 0@= var 0
if
0@ == 1
then
0AAC: 0@ = load_mp3 "CLEO\AUDIO\01.mp3"
0AAD: set_mp3 0@ perform_action 1
wait 100000 ms
0AAD: set_mp3 0@ perform_action 0
0AAE: release_mp3 0@
endjump @SOUNDS2
И опять же, это всё CLEO скрипты, находящиеся в отдельных *.cs файлах. Мне нужно как-то настроить плотное взаимодействие между ними.
Например, мне раньше (как, впрочем, и сейчас) было нужно засунуть в глобальную переменную весь массив $DEAD($count, 10i), но так ничего и не вышло, кроме как реакция на одно актёра из этого массива. То есть записывался (удачно) только один актёр: var 0 = $DEAD($count, 10i), и это при взаимодействии *.cs и *.scm скриптов. При тех же *.cs на *.cs никакого даже в этом случае взаимодействия не было, а при попытке засунуть весь массив, и в дальнейшем с ним работать, игра просто не пускала за границы экрана загрузки, а то и вовсе вылетала, ну а записывалось вот так: var 0 = $DEAD
В целом мне нужна помощь по части глобальной области видимости. Имея работающую структуру, я могла бы решить проблемы, описанные выше. Вот, Вы, например, как налаживаете взаимодействия между скриптами?
И ещё вопрос: видела скрипты, где CLEO опкоды используются в обычном мэйне. Это правильно? Получается, что я могу запросто решить все эти проблемы, используя эти два потока в одном файле, наладив взаимодействие при помощи глобальных переменных ($var), и не мучаясь с CLEO?
Зачем мне всё это:
Делаю мод, налаживаю модель поведения зомби, различные взаимодействия, многое сделано, но такие вот тонкие моменты, как эти, просто необходимы, иначе я так никогда и не дойду до создания миссий, cutscene, и прочего, а так уже хочется, с ума сойти
Last edited by Ammy (25-11-2009 12:36)
Offline
Вот, Вы, например, как налаживаете взаимодействия между скриптами?
Вопрос адресован не мне, но отвечу - я, например, записываю значения в неиспользуемые общедоступные ячейки памяти. Такое решение возможно не самое верное, но поскольку вероятность того, что кто-то тоже решит использовать конкретно эти адреса, мала, то конфликтов своих скриптов с чужими я не опасаюсь.
И ещё вопрос: видела скрипты, где CLEO опкоды используются в обычном мэйне. Это правильно? Получается, что я могу запросто решить все эти проблемы, используя эти два потока в одном файле, наладив взаимодействие при помощи глобальных переменных ($var), и не мучаясь с CLEO?
Насколько я понимаю, использовать КЛЕО опкоды в мэйне можно, но при этом должна быть установлена КЛЕО.
Last edited by Den_spb (25-11-2009 13:56)
Offline
Вопрос адресован не мне, но отвечу - я, например, записываю значения в неиспользуемые общедоступные ячейки памяти. Такое решение возможно не самое верное, но поскольку вероятность того, что кто-то тоже решит использовать конкретно эти адреса, мала, то конфликтов своих скриптов с чужими я не опасаюсь.
Глобальные переменные типа $30, $56?
Насколько я понимаю, использовать КЛЕО опкоды в мэйне можно, но при этом должна быть установлена КЛЕО.
{$CLEO} ?
опкоды использовать можно в мейне ПОЧТИ без ограничений
Клео опкоды, да?
я делал обмен данными между скриптами через запись-чтение в файл, но это ацки нагружает жёсткий диск)))
Да, подобные методы действительно осуществляют вовсе не нужную нагрузку, однако как выход можно использовать в подобного рода случаях (числа, строки передавать). Но ведь динамически данные массива туда не запишешь, это не мой выход из положения..
после метки :SOUNDS2
поставь wait 0
иначе будет или зависать или вылетать
Возможно, стоит попробовать. Сейчас поэкспериментирую, спасибо!
Last edited by Ammy (25-11-2009 15:47)
Offline
Да, подобные методы действительно осуществляют вовсе не нужную нагрузку, однако как выход можно использовать в подобного рода случаях (числа, строки передавать). Но ведь динамически данные массива туда не запишешь, это не мой выход из положения...
запишешь:cool:
но нагрузка будет ппц, особенно, если обращаться чаще, чем раз в секунду...:rolleyes:
так что лучше писать в мейн))
GIMS developer
Offline