| Проблемы со скриптом. |
|
Nik
| Дата: Вторник, 03.08.2010, 09:08 | Сообщение # 1 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
if (o_actor.heals > value_max) o_actor.heals=value_max if (o_actor.heals < 0) o_actor.heals=0 Создаю скрипт для хелсбаров, как видно, данный кусок, ограничивает минимальное и максимальное рисуемое число жизни. Когда, вместо o_actor.heals пишу argument0, а далее в скрипте арг0 присваиваю значение o_actor.heals, он перестает работать. Можно решить проблему перенеся этот кусок в событие, но хотелось бы, что бы всё было в скрипте. Вопрос, почему так происходит? Сколько не думал - не должно такого быть же...
Сообщение отредактировал Nik - Вторник, 03.08.2010, 09:09 |
| |
| | |
|
Фил
| Дата: Вторник, 03.08.2010, 09:27 | Сообщение # 2 |
Всех уже задолбал
Группа: Проверенные
Сообщений: 1007
Статус: Offline
|
как ты вызываешь скрипт?
Храм нулей и единиц
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 09:34 | Сообщение # 3 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
Фил, script_execute, есть другой способ?
|
| |
| | |
|
WertyXBOCT
| Дата: Вторник, 03.08.2010, 10:01 | Сообщение # 4 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Может быть, имя_скрипта(аргумент0,аргумент1,...) ? а в скрипте if (argument0 > value_max) argument0=value_max if (argument0 < 0) argument0=0 return argument0 и тогда нужно вызывать скрипт так(например скрипт назвали mHealth) o_actor.heals = mHealth(o_actor.heals); А вообще, конкретно, твой скрипт можно написать так o_actor.heals = max(0,min(o_actor.heals,value_max)); Поясню как это работает, сперва выполняется скрипт min(o_actor.heals,value_max) , если o_actor.heals>value_max, то минимальным значением из низ будет value_max, если o_actor.heals отрицательно или меньше value_max то берется o_actor.heals. Затем выполняется скрипт max(0,предыдущее вычисление). Если предыдущее значение неотрицательно, то берется оно, если предыдущее значение меньше нуля, то берется 0, т.к. он в этом случае будет максимальным из этих двух значений.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
Сообщение отредактировал WertyXBOCT - Вторник, 03.08.2010, 10:04 |
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 10:19 | Сообщение # 5 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
WertyXBOCT, Да, действительно, раньше использовал script_execute. Не понял, зачем нужен return argument0. Теперь, по поводу твоих способов, про макс., мин. интересно, попробую. Но, в скрипте o_actor.heals быть не должно, так как скрипт вызывается из другого объекта, и вместо o_actor.heals может быть o_op.gop, для того-то и нужен argument0. Quote (WertyXBOCT) if (argument0 > value_max) argument0=value_max if (argument0 < 0) argument0=0 return argument0 Попробовал, результат тот же. Проблема, я так понимаю в том, что скрипт должен вызываться не из объекта o_actor, а из другого... o_actor.heals = mHealth(o_actor.heals); Попробовал, ограничение работает, но теперь почему-то, не хочет отрисовываться полоска. Рисую через draw_rectangle. До этого, все работало... Я не совсем понимаю, мы вызываем скрипт из под актера этим присвоением?
Сообщение отредактировал Nik - Вторник, 03.08.2010, 10:32 |
| |
| | |
|
SRes
| Дата: Вторник, 03.08.2010, 11:10 | Сообщение # 6 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Ты же не указатель на переменную передаешь ! Ты передаешь значение ! Фатальная ошибка. Тебе надо делать через execute_string, иначе никак.
Velociped Inc.
|
| |
| | |
|
WertyXBOCT
| Дата: Вторник, 03.08.2010, 11:26 | Сообщение # 7 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Видимо я где то не до рассказал. Раз меня два человека не поняли. Скрипт mHealth: Code if (argument0 > value_max) argument0=value_max if (argument0 < 0) argument0=0 return argument0 Работает он так: HEAL = mHealth(HEAL); Как видишь, переменной HEAL мы присваиваем значение, которое вернет(результат работы) нам функция. Без этого, функция не будет работать. Если разбирать пошагово, то получается так (возмем в качестве переменной HEAL число 20): Береться значение HEAL, подставляется в функцию mHealth() и она выполняется // mHealth(20) при вызове функции, переменной argument0 присваивается переданное значение(20) // argument0 = 20 if (20 > value_max) // допустим, value_max =100 , а значит условие не выполняется if (20 < 0) //условие не выполняется, т.к. значение аргумента0 больше нуля return 20 //значение аргумента не изменилось, возвращаем результат. Выходим из функции, вместо mHealth(HEAL); у нас теперь число 20., а значит: HEAL = 20; // Присваиваем HEAL результат работы функции. Добавлено (03.08.2010, 11:26) --------------------------------------------- По поводу отрисовки полоски. Напиши код, который используешь, мы не телепаты.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 11:30 | Сообщение # 8 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
SRes, А как передать указатель? Функция, execute_string, что-то в справке не нашел, конечно догадываюсь, но как ей пользоваться? Не совсем понимаю, что она делает.
|
| |
| | |
|
SRes
| Дата: Вторник, 03.08.2010, 11:32 | Сообщение # 9 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Указатель передать, увы, нельзя. Это в более низкоуровневых языках есть... А вообще делай так как Хвост сказал, или через min+max.
Velociped Inc.
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 11:53 | Сообщение # 10 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
WertyXBOCT, Если выкинуть всё "лишнее", то: ww = bar_wight / value_max * o_actor.heals draw_set_color(5000) draw_rectangle(bar_x, bar_y, bar_x+ww, bar_y + bar_hight, false) Думаю, пояснять не требуется. Попробовал твой способ, да, действительно помогло, единственное, что возврат нужно поставить в конец, после отрисовки, иначе его клинило - выходит бесконечный цикл, по-этому не идет отрисовка, на сколько я понял. Спасибо, с макс-мином, вышло даже лучше, кстати, по-моему в ГМ7, этого не было. SRes, Хотелось бы узнать про функцию...
Сообщение отредактировал Nik - Вторник, 03.08.2010, 12:38 |
| |
| | |
|
SRes
| Дата: Вторник, 03.08.2010, 11:57 | Сообщение # 11 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Quote execute_string(str,arg0,arg1,...) Execute the piece of code in the string str with the indicated arguments. Плохо в справке читал.
Velociped Inc.
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 12:03 | Сообщение # 12 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
SRes, Дык, инглишь -капут. У меня от 7 справка русская. А там что-то не нашел, какой раздел? Перевел промтом, яснее не стало.
Сообщение отредактировал Nik - Вторник, 03.08.2010, 12:04 |
| |
| | |
|
SRes
| Дата: Вторник, 03.08.2010, 12:07 | Сообщение # 13 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Функция просто исполняет кусок кода, который передан как строка, т.е. можно делать такие конструкции : Quote execute_string( argument0 + " = 0;");
Velociped Inc.
|
| |
| | |
|
WertyXBOCT
| Дата: Вторник, 03.08.2010, 12:28 | Сообщение # 14 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Собственно в том коде, который ты привел, ошибок, кроме орфографических, я не обнаружил.
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 12:37 | Сообщение # 15 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
WertyXBOCT, Ну, в коде их быть не может, а если ты про heals, то правильная переменная занята. Ежели про пост, всё возможно. Ошибка в том, что возврат должен быть после отрисовки. SRes, А в чем разница, вроде бы присваиваем аргументу 0 значение "0".
|
| |
| | |
|
SRes
| Дата: Вторник, 03.08.2010, 12:49 | Сообщение # 16 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2512
Статус: Offline
|
Аргументу, т.е. переменной, а потом возвращаете это значение и присваиваете его уже другой переменной. Через екзекут_стринг можно просто сразу присваивать, но разницы в принципе нет.
Velociped Inc.
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 13:05 | Сообщение # 17 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
Собственно, зачемп мне это было нужно, встроенный в гм хелсбар, ограничен значением 0..100. Велосипед не изобрел, но что-то вроде получилось, кому-нибудь да пригодиться, возможно. Основу взял из какого-то примера. Code //arg0 - теущее значение, арг1 - макс.значение, арг2 - длинна, арг3 - высота. //арг4-положение по x (верхняя левая точка), арг5 - положение по Y (верхняя левая точка) //полоска - арг6-первый цвет, арг7-второй, арг8-третий, рамка-арг9 //фон - арг10 argument0 = max(0,min(argument0,argument1))
ww = argument2 / argument1 * argument0
// цвет отображения шкалы жизней if ((argument0/argument1)>=0.5) ss=argument6 else //первый цвет {if ((argument0/argument1)>0.2) ss=argument7 //второй цвет else ss=argument8 //третий } // прорисовываем рамку draw_set_color(ss) draw_rectangle (argument4, argument5, argument4 + argument2, argument5 + argument3, true) // прорисовываем фон draw_set_color(argument10) draw_rectangle(argument4 + 1, argument5 + 1, argument4 + argument2-1, argument5 + argument3-1, false)
draw_set_color(ss)//цвет шкалы жизни // рисуем прямоугольник равный кол-ву жизней draw_rectangle( argument4, argument5, argument4+ww, argument5 + argument3, false) // прорисовываем рамку draw_set_color(argument9) draw_rectangle(argument4, argument5, argument4+ww, argument5 + argument3, true)
return argument0 Например o_actor.heals=sc_oh_draw(o_actor.heals,o_actor.max_heals,100,20,5,50,500,2000,4000,c_black,c_dkgray); Еще бы смешивание цветов, как в оригинале, но тут даже не представляю как, может есть функции отвечающие за смешивание...
Сообщение отредактировал Nik - Вторник, 03.08.2010, 13:07 |
| |
| | |
|
WertyXBOCT
| Дата: Вторник, 03.08.2010, 14:24 | Сообщение # 18 |
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
|
Quote (Nik) в коде их быть не может Health, Width, Height ))
Blog:www.WeslomPo.ru mailto: i@weslompo.ru
|
| |
| | |
|
Nik
| Дата: Вторник, 03.08.2010, 14:38 | Сообщение # 19 |
|
Болтун
Группа: Проверенные
Сообщений: 211
Статус: Offline
|
WertyXBOCT, Ну да, в гм по умолчанию они уже есть, но код работает = ошибок нет. Что бы не засорять форум, спрошу здесь. Такой еще вопрос оператор if. if (<выражение>) <инструкция> else <инструкция> Как написать несколько инструкций вроде раньше на ГМ7 делал так <инструкция>&&<инструкция>, а сейчас не работает. Вопрос, как?
|
| |
| | |
|
DragonSkiN
| Дата: Вторник, 03.08.2010, 15:01 | Сообщение # 20 |
Всех уже задолбал
Группа: Страж
Сообщений: 1180
Статус: Offline
|
Quote (Nik) раньше на ГМ7 делал так <инструкция>&&<инструкция> оно бы и раньше не работало делается так Code if ((<условие_1>) && (<условие_2>)) { <инструкция>; <инструкция>; } else { <инструкция>; <инструкция>; } читается так: если выполняется <условие_1> и <условие_2> то <инструкция>; <инструкция>; иначе <инструкция>; <инструкция>; точку с запятой в принципе можно не ставить, это моя привычка из С++ и паскаля, но лучше ставь.
http://gamegraphycs.do.am/ - сайт о 2D графике http://dragonskin.ath.cx:777/- доступ по хттп к сборнику ресурсов для игр
Сообщение отредактировал DragonSkiN - Вторник, 03.08.2010, 15:06 |
| |
| |
|
|