Проблемы со скриптом. - Помогите, не получается! - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Проблемы со скриптом. (Хелп!)
Проблемы со скриптом.
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, он перестает работать. Можно решить проблему перенеся этот кусок в событие, но хотелось бы, что бы всё было в скрипте. Вопрос, почему так происходит? Сколько не думал - не должно такого быть же... dry


Сообщение отредактировал 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)
Думаю, пояснять не требуется. biggrin

Попробовал твой способ, да, действительно помогло, единственное, что возврат нужно поставить в конец, после отрисовки, иначе его клинило - выходит бесконечный цикл, по-этому не идет отрисовка, на сколько я понял. Спасибо, с макс-мином, вышло даже лучше, кстати, по-моему в ГМ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, Ну да, в гм по умолчанию они уже есть, но код работает = ошибок нет. biggrin
Что бы не засорять форум, спрошу здесь.
Такой еще вопрос оператор 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
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Помогите, не получается! » Проблемы со скриптом. (Хелп!)
Страница 1 из 212»
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход