[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Вопросы по скриптингу Sanny Builder
wmysterio
Администраторы
Скриптер
22.11.11 21:52
Offline
Если у вас возник вопрос по скриптингу Sanny Builder, обращайтесь! Мы постараемся решить вашу проблему wink Это ещё не значит, что все прям бросятся решать во чтобы то не стало, но ответ вы сможете вы получить как вариант решения или как невозможность или сложность решения.
УВАЖАЕМЫЕ ПОЛЬЗОВАТЕЛИ! ПРОСЬБА КОД СКРИПТОВ ПОМЕЩАТЬ В КОНСТРУКЦИЮ КОДА:

или

Также указывайте полный код скрипта, иначе причина ошибок может быть и не выявлена.
Прикрепления: 0248203.png(0.9 Kb) · 9085525.png(0.2 Kb)

BoPoH
Друзья
07.04.14 16:58
Offline
Цитата Slivkin-Sergey ()
Кстати, когда я подставил туда обыкновенные имена записей, всё сработало, но всё же интересно, разве нельзя заполнять таблицу подстановкой хэндлов строк?
Можно. Вопрос в том, есть ли в этих переменных те самые записи?

Цитата SanKing ()
По-моему, глобальные стринговые переменные начинаются с s$, а не с v$.
Цитата Slivkin-Sergey ()
s$ - это char'овые 'STRING', а v$ - непосредственно стринговые "STRING".
Спасибо, посмеялся. Как локальные, так и глобальные переменные могут быть s и v. Разница между ними в том, что s-переменная рассчитана на 7 символов (8 байт с учётом завершающего нуля в конце), а v - на 15 символов (16 байт, с учётом завершающего нуля).
Отредактировал BoPoH - Понедельник, 07.04.14, 16:58

Slivkin-Sergey
Модераторы
07.04.14 17:22
Offline
Цитата BoPoH ()
Разница между ними в том, что s-переменная рассчитана на 7 символов (8 байт с учётом завершающего нуля в конце), а v - на 15 символов

Какой ужас. Я подбирал префикс именно по этим признакам, а прилагательного, более подходящего в данном случае, чем "char'овая", я не нашёл. И да, почему все считают меня за дурачка?
Цитата BoPoH ()
Можно. Вопрос в том, есть ли в этих переменных те самые записи?

Код
0ADF: add_dynamic_GXT_entry '1DAY' text "1 љe®©"
0ADF: add_dynamic_GXT_entry '2DAY' text "2 љ®¬"
0ADF: add_dynamic_GXT_entry '3DAY' text "3 љ®¬"
0ADF: add_dynamic_GXT_entry '4DAY' text "4 љ®¬"
0ADF: add_dynamic_GXT_entry '5DAY' text "5 љ®eќ"
0ADF: add_dynamic_GXT_entry '6DAY' text "6 љ®eќ"
0ADF: add_dynamic_GXT_entry '7DAY' text "7 љ®eќ"
0ADF: add_dynamic_GXT_entry 'HEADER' text "Koћ-ўo љ®eќ"
0ADF: add_dynamic_GXT_entry 'HEADER2' text '‰e®a'

Только вместо названий были элементы массива.

wmysterio
Администраторы
Скриптер
07.04.14 18:55
Offline
Цитата Slivkin-Sergey ()
Только вместо названий были элементы массива.
Да-да. Столкнулся тоже с этой проблемой, опкод 0ADF не воспринимает любые строковые массивы.

BoPoH
Друзья
08.04.14 08:45
Offline
Цитата Slivkin-Sergey ()
Только вместо названий были элементы массива.
Я так и не смог понять, была ли запись в строковый массив или нет? Ну, т.е. содержит ли строковый массив нужные тебе имена GXT-записей?

Цитата Slivkin-Sergey ()
И да, почему все считают меня за дурачка?
Почему ты так решил? Если я тебя поправил, это не значит, что я считаю тебя дураком. Все когда-то учились, и ты научишься.
Отредактировал BoPoH - Вторник, 08.04.14, 08:45

Slivkin-Sergey
Модераторы
08.04.14 11:30
Offline
Цитата BoPoH ()
Все когда-то учились, и ты научишься.

Что из того, что ты мне объяснил, я не знаю? Нет, я не пытаюсь казаться профи, я многого не понимаю, но банальную и основную информацию хотя бы об особенностях переменных-строк и размеров, занимаемых в памяти переменными определённого типа (sizeof) я всё же закрепил.
Цитата BoPoH ()
Я так и не смог понять, была ли запись в строковый массив или нет? Ну, т.е. содержит ли строковый массив нужные тебе имена GXT-записей?

Вместо названий, например, '1DAY', был v$ИМЯ_ЯМАССИВА[индекс].
Отредактировал Slivkin-Sergey - Вторник, 08.04.14, 11:31

BoPoH
Друзья
08.04.14 16:49
Offline
Цитата Slivkin-Sergey ()
Вместо названий, например, '1DAY', был v$ИМЯ_ЯМАССИВА[индекс].
Ну вот, ты опять меня не понял. В твоём массиве должны быть имена GXT записей. Т.е. где-то в твоём скрипте (или же в main.scm) этот массив нужно заполнить необходимыми строками - именами GXT записей. Я и спрашиваю, к тому моменту, когда ты используешь свой массив, в нём уже записаны строки с именами GXT записей?

Slivkin-Sergey
Модераторы
08.04.14 18:54
Offline
Цитата BoPoH ()
Я и спрашиваю, к тому моменту, когда ты используешь свой массив, в нём уже записаны строки с именами GXT записей?

Эм-м, да ладно, это не важно уже, хотя их названиями были хэндлы (я потому и написал v$, чтобы хранить сами записи). Тут новая проблема:
Код
for 17@ = 0 to 13@ step 1
wait 1440000
end
0ACE: show_formatted_text_box "‹peЇ¬ љeќc¦ўњ¬ ‹aҐeќ ўџ¬¦kњ ®a¤aћ©®њky Јoћњ њњ њc¦ekћo!"

После окончания задержки ничего не происходит, а если "измельчить" задержку при помощи вложенного в этот фор ещё одного фор и выводить счётчик на экран (он должен достигнуть 10000, за одну итерацию ожидание - 144), то после этого вылетает с ошибкой когда счётчик достигает ~2148.
Отредактировал Slivkin-Sergey - Вторник, 08.04.14, 18:55

wmysterio
Администраторы
Скриптер
08.04.14 19:16
Offline
Цитата Slivkin-Sergey ()
то после этого вылетает с ошибкой когда счётчик достигает ~2148.
Диапазон значений выходит за диапазон типа integer. Вот, посмотри первую часть этой статьи. Эффект действует и на переменные gta-скриптинга. Скорее всего цикл становится бесконечным, так как условие выполняется всегда. Если значение переменной больше 2147483647, то это будет уже не integer, так как размер будет больше 4-й байт.

Slivkin-Sergey
Модераторы
08.04.14 20:27
Offline
Цитата wmysterio ()
2147483647

У меня в разы меньше: 1 440 000
Цитата wmysterio ()
Скорее всего цикл становится бесконечным, так как условие выполняется всегда

Выполняется 10 000 раз, в каждой итерации ждёт 144 секунды.

BoPoH
Друзья
09.04.14 00:24
Offline
Цитата Slivkin-Sergey ()
Эм-м, да ладно, это не важно уже, хотя их названиями были хэндлы (я потому и написал v$, чтобы хранить сами записи).
Сами записи хранить в массиве строк не имеет смысла, если ты собираешься их применять для создания панелей. Там принимается имя GXT записи, а не сама запись.
Цитата Slivkin-Sergey ()
После окончания задержки ничего не происходит
Как ты определяешь, что задержка уже окончилась?

Slivkin-Sergey
Модераторы
13.04.14 21:27
Offline
Цитата BoPoH ()
Там принимается имя GXT записи, а не сама запись.

Хм-м... Здесь мне не очень ясно. С одной стороны, это и есть имя строки, а с другой, в переменной строка и хранится.
Цитата BoPoH ()
Как ты определяешь, что задержка уже окончилась?

Жду 1 игровые сутки (с ускорением времени х10, разумеется).

Добавлено (13.04.14, 19:27)
---------------------------------------------
Иными словами: равен ли этот код
Код
0ADF: add_dynamic_GXT_entry v$STRING text "Test string"
00BC: show_text_highpriority GXT v$STRING time 1000 flag 1

этому
Код
0ADF: add_dynamic_GXT_entry 'STR' text "Test string"
v$STRING = 'STR'
00BC: show_text_highpriority GXT v$STRING time 1000 flag 1

?
Отредактировал Slivkin-Sergey - Воскресенье, 13.04.14, 21:30

BoPoH
Друзья
14.04.14 18:53
Offline
Цитата Slivkin-Sergey ()
Иными словами: равен ли этот код
Если в первый код добавить в начало строку

Код
v$STRING = 'STR'
 тогда будет эквивалентен. И, да, переменной v$var можно присвоить только строки с двойными кавычками. А переменным вида s$var - только с одинарными кавычками. По сути, разницы никакой, но SB их различает - для присваивания s-переменным и v-переменным используются разные опкоды.
Цитата Slivkin-Sergey ()
Хм-м... Здесь мне не очень ясно. С одной стороны, это и есть имя строки, а с другой, в переменной строка и хранится.
Про строки у меня ничего не было написано. Я объяснил, что есть GXT-записи, у каждой из них есть своё имя (обычно длиной 7 символов). Так вот, в переменную ты должен записать имя GXT-записи (а не саму запись, т.е. текст), чтобы потом её использовать в опкодах, где идёт работа с GXT.

Если ты до сих пор не понял, то давай разберём пример, который ты приводил выше.
Код
08D4: 8@ = create_panel_with_title 'HEADER' position 29.0 170.0 width 180.0 columns 2 interactive 1 background 1 alignment 0   
08DB: set_panel 8@ column 0 header 'HEADER' data v$array[0] v$array[1] v$array[2] v$array[3] v$array[4] v$array[5] v$array[6] 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'
08DB: set_panel 8@ column 1 header 'HEADER2' data v$arrayPrices[0] v$arrayPrices[1] v$arrayPrices[2] v$arrayPrices[3] v$arrayPrices[4] v$arrayPrices[5] v$arrayPrices[6] 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'
 Я изменил названия глобальных переменных, чтобы код не выглядел столь громоздким. Первая ошибка, которую ты допустил - это использование простых строк вместо GXT-записей (по крайней мере, я так тебя понял).
Во-первых, тут можно было обойтись вообще без использования строковых переменных (тем более глобальных, если, конечно, речь не идёт о main.scm).
Во-вторых, если уж приспичило использовать переменные, то ты сперва должен их заполнить соответствующими значениями - именами GXT-записей. Сами GXT-записи должны быть добавлены заранее, и массив строк тоже должен быть инициализирован заранее.

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

Вообще, по работе с панелями, о создании подобных панелей со списком товаров есть парочка статей в справке к SB. В итоге, у тебя должен был получиться примерно следующий код:

Код
0ADF: add_dynamic_GXT_entry "MYTOV0" text "Tovar0"
0ADF: add_dynamic_GXT_entry "MYTOV1" text "Tovar1"
0ADF: add_dynamic_GXT_entry "MYTOV2" text "Tovar2"
0ADF: add_dynamic_GXT_entry "MYTOV3" text "Tovar3"
0ADF: add_dynamic_GXT_entry "MYTOV4" text "Tovar4"
0ADF: add_dynamic_GXT_entry "MYTOV5" text "Tovar5"
0ADF: add_dynamic_GXT_entry "MYTOV6" text "Tovar6"
v$array[0] = "MYTOV0" // Записываем в массив имена GXT-записей
v$array[1] = "MYTOV1" // Если не использовать переменные, то
v$array[2] = "MYTOV2" // при создании панели указываем сразу имена GXT-записей
v$array[3] = "MYTOV3" // вместо переменных
v$array[4] = "MYTOV4"
v$array[5] = "MYTOV5"
v$array[6] = "MYTOV6"
$arrayPrices[0] = 100 // Записываем в массив стоимость товаров
$arrayPrices[1] = 200
$arrayPrices[2] = 300
$arrayPrices[3] = 400
$arrayPrices[4] = 500
$arrayPrices[5] = 600
$arrayPrices[6] = 700
08D4: 8@ = create_panel_with_title 'HEADER' position 29.0 170.0 width 180.0 columns 2 interactive 1 background 1 alignment 0   
08DB: set_panel 8@ column 0 header 'HEADER' data v$array[0] v$array[1] v$array[2] v$array[3] v$array[4] v$array[5] v$array[6] 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY'
08EE: set_panel 8@ column 1 row 0 text_1number GXT 'DOLLAR' number $arrayPrices[0]
08EE: set_panel 8@ column 1 row 1 text_1number GXT 'DOLLAR' number $arrayPrices[1]
08EE: set_panel 8@ column 1 row 2 text_1number GXT 'DOLLAR' number $arrayPrices[2]
08EE: set_panel 8@ column 1 row 3 text_1number GXT 'DOLLAR' number $arrayPrices[3]
08EE: set_panel 8@ column 1 row 4 text_1number GXT 'DOLLAR' number $arrayPrices[4]
08EE: set_panel 8@ column 1 row 5 text_1number GXT 'DOLLAR' number $arrayPrices[5]
08EE: set_panel 8@ column 1 row 6 text_1number GXT 'DOLLAR' number $arrayPrices[6]

Slivkin-Sergey
Модераторы
14.04.14 19:09
Offline
Да-да, я уже понял свою ошибку после того, как нашёл пресловутый 'DOLLAR' в оригинальном майне.

А вот что насчёт задержки?

BoPoH
Друзья
14.04.14 20:30
Offline
Цитата Slivkin-Sergey ()
А вот что насчёт задержки?
Почему бы тебе не попробовать использовать таймер (32@ или 33@) вместо wait?

Slivkin-Sergey
Модераторы
15.04.14 05:31
Offline
Цитата BoPoH ()
Почему бы тебе не попробовать использовать таймер (32@ или 33@) вместо wait?

В общем, задача такая: игрок указывает количество дней Н, и нужно, чтобы Н раз прошло по 24 игровых часа.

А о работе 32@ и 33@ я ничего не знаю, обычные переменные (хотя всё же их не использую из-за особенности).

BoPoH
Друзья
15.04.14 08:36
Offline
Цитата Slivkin-Sergey ()
В общем, задача такая: игрок указывает количество дней Н, и нужно, чтобы Н раз прошло по 24 игровых часа.
Записываешь в какую-нибудь переменную нужное количество милисекунд, обнуляешь 32@ (или 33@) и ждёшь, пока она не достигнет нужного значения. Эти переменные являются своеобразными таймерами - их значение увеличивается с течением времени. Проще говоря, если ты обнулишь такую переменную, потом подождёшь 1000 мс, то в этой переменной будет 1000.

Slivkin-Sergey
Модераторы
15.04.14 14:50
Offline
Вот так вот:
Код
for 17@ = 0 to 13@ step 1 // для счёта количества дней
33@ = 0
repeat
wait 0
until 33@ >= 1440000
end

Всё равно ничего не происходит

d13m1
Пользователи
15.04.14 20:49
Offline
Цитата Slivkin-Sergey ()
игрок указывает количество дней Н, и нужно, чтобы Н раз прошло по 24 игровых часа.
почему бы просто не вычислить необходимую дату?
0835: get_month_day_to 0@ get_month_to 1@
00BF: 0@ = current_time_hours, 1@ = current_time_minutes

BoPoH
Друзья
15.04.14 23:30
Offline
Цитата Slivkin-Sergey ()
Всё равно ничего не происходит
1) Уверен, что присвоил переменной 13@ нужное тебе значение?
2) Как ты определяешь, что "ничего не происходит"? Что должно произойти?
Лично у меня этот код полностью работает, в чём я, собственно говоря, и не сомневался.

Slivkin-Sergey
Модераторы
16.04.14 14:43
Offline
Цитата d13m1 ()
почему бы просто не вычислить необходимую дату?

Если бы всё было так просто... Попробуй учесть возможность инициализации в конце игрового месяца.
Цитата BoPoH ()
1) Уверен, что присвоил переменной 13@ нужное тебе значение?

Код
13@ = 1
0085: 13@ = 9@ // (int)

13@ = 1 я написал в процессе поиска ошибки, так-то там всё по-другому.

Добавлено (16.04.14, 12:43)
---------------------------------------------
Хм-м, после определённых манипуляций стало ясно, что даже при 13@ = 1 цикл имеет больше одной итерации (переменная сбрасывается и идёт отсчёт заново).


Форум » Игры серии GTA » GTA San Andreas » Вопросы по скриптингу Sanny Builder (Вы можете получить ответы на вопросы по SB)
Поиск: