Форум » » Всякие полезные механики » Ответить

Всякие полезные механики

Ajenta: Пришло мне тут в голову, что у нас давно никто не делился опытом грабленаступания. Поэтому создаю тему, где все могут рассказать какими извратами и хитростями пользуются при написании игр. Начну вот с чего: Конечно, всегда хочется, чтобы игра была сложной, интересной и отвечала на все твои реакции. А для этого у одной и то й же локации должно быть много описаний. Сейчас как раз делаю игру, где у меня минимум пять описаний одного и того же места. Дабы не плодить сущности, можно делать так - :озеро if были_озеро = 1 then goto озеро_грязное if были_озеро = 2 then goto озеро_замёрзло if были_озеро = 3 then goto озеро_высохло if были_озеро = 4 then goto озеро_больше_не_озеро pln Описание end Удобно то, что всё это одна и та же локация, и курлок будет всегда одинаковым. Так же я не плодю безмерно условия в самой локации, а делю её, это очень помогает, потому что ифы это слабая сторона урки.

Ответов - 39, стр: 1 2 All

Saint: frodo пишет: пользователю приходится ждать больше 3 секунд, возьмите на вооружение, т.к. тех, кто будет проходить квест второй раз, ожидание будет раздражать. а можно использовать оператор anykey z, - с тем же эффектом

frodo: Разница - в деталях. В этом случае пользователю нужно трижды нажать на кнопку, чтобы не ждать, пока напечатается "1 2 3 4": [pre2] p 1 anykey z, 1000 p 2 anykey z, 1000 p 3 anykey z, 1000 p 4[/pre2] В этом случае пользователю достаточно нажать на кнопку один раз: [pre2] z = 0 p 1 if not z then anykey z, 1000 p 2 if not z then anykey z, 1000 p 3 if not z then anykey z, 1000 p 4[/pre2]

vito: Как известно, в Фурке можно выводить ссылки, но нет возможности отключить их вывод. В следующем примере удаление ссылок из исходной строки реализовано в процедуре str_delink. Исходной строке соответствует переменная p_1, "обезссыленной" - dest_str. Процедура p_smb осуществляет посимвольный вывод строки dest_str; такой режим вывода позволяет "обмануть" фурочную систему форматирования ссылок. Тестовый пример выводит после цифры 1 - исходную строку, после 2 - строку, из которой удалены ссылки, после 3 - ее же, но посимвольно. [pre2] instr p_1=У [[Юрасоффа-Павловски]] [[]] [[|]] [[ ]] рябило в глазах от [[квадратных скобок||скобок]], [[в том числе[[ вложенных]].]] pln 1: #%p_1$ pln proc str_delink pln 2: #%dest_str$ p #/$ 3: proc p_smb end :str_delink ; Процедура удаления ссылок из строки mark_link_start=0 ; Флаг начала ссылки mark_long_opening=0 ; Флаг длинной (больше 2-х) последовательности открывающих скобок mark_link_end=0; Флаг конца ссылки dest_str="" ; Результирующая строка link_start_pos=0 ; Начальная позиция ссылки skip_start_pos=0 ; Начальная позиция неотображаемой части ссылки string_flushed=0 ; Флаг того, что строка уже выгружена i_str=1 ; Счетчик символов в строке ; Разбивка исходной строки на символы, перебор tokens_delim="char" tokens p_1 nr_tok0=tokens_num :str_cyc ; Начало цикла instr cur_symb=#%token#i_str$$ if cur_symb=="[" then proc parse_start_link & goto str_cyc_end ; Начало ссылки? if cur_symb=="|" then proc parse_skip_link & goto str_cyc_end ; Неотображаемая часть ссылки? if cur_symb=="]" then proc parse_end_link & goto str_cyc_end ; Конец ссылки? ; Все прочие символы if mark_link_start=1 or mark_link_end=1 then proc flush_string & goto str_cyc_end ; До этого была одиночная правая или левая квадратная скобка - в любом случае она "терминирует" ссылку (особенность Фурки) :str_cyc_smb ; Обработчик текущего символа в зависимости от установленных флагов начала и конца ссылки if mark_link_start=0 then dest_str=dest_str+token#i_str$ ; Ссылки нет - просто копируем очередной символ в результиирующую строку if mark_link_end=2 then proc flush_string & goto str_cyc_end; Ссылка окончилась - копирование "буфера" в результирующую строку с учетом неотображаемых символов ; Все остальные варианты означают, что идет обработка ссылки, и пока неизвестно, что именно будем копировать :str_cyc_end ; Замыкаем цикл i_str=i_str+1 if i_str<=nr_tok0 then goto str_cyc i_str=nr_tok0 if mark_link_start<>0 and string_flushed=0 then proc flush_string; Если мы здесь, это означает, что строка кончилась внутри предполагаемой ссылки - просто копируем "буфер" токенов в результирующую строку end :parse_start_link ; Отработка символа начала ссылки (левой квадратной скобки): устанавливаем необходимые флаги if mark_link_start=0 then mark_link_start=1 & link_start_pos=i_str & end ; Потенциальное начало ссылки if mark_link_start=1 then mark_link_start=2 & end; Двойная квадратная скобка - начало ссылки ; Все остальные случаи - мы внутри ссылки; "терминируем" ее и копируем пропущенные символы (до собственно скобки) в результирующую строку if i_str-link_start_pos<=2 then i_str=i_str-2 & mark_long_opening=1 else i_str=i_str-1 proc flush_string ; Возвращаемся на текущий символ i_str=i_str+1 if mark_long_opening=1 then i_str=i_str+1 ; Если была длинная последовательность, то мы сдвигались на два символа - вводим поправку if mark_long_opening=1 then mark_link_start=2 else mark_link_start=1 ; Устанавливаем значение флага начала ссылки - вдруг она сейчас и последует (с учетом наличия нескольких открывающих скобок подряд) if mark_long_opening=1 then link_start_pos=i_str-1 & mark_long_opening=0 else link_start_pos=i_str end :parse_skip_link ; Отработка символа, начинающего неотображаемую часть ссылки if mark_link_start=0 then dest_str=dest_str+token#i_str$ & end ; Мы вне ссылки - копируем очередной символ в результирующую строку if mark_link_start=1 or mark_link_end=1 then proc flush_string & end; До этого была одиночная правая или левая квадратная скобка - "терминируем" ссылку ; Если мы здесь, значит, мы внутри ссылки if skip_start_pos=0 then skip_start_pos=i_str ; С этого момента начинается неотображаемая часть ссылки ; Если уже началась неотображаемая часть ссылки, просто игнорируем данный символ end :parse_end_link ; Отработка символа окончания ссылки (правой квадратной скобки): устанавливаем необходимые флаги if mark_link_start=1 then proc flush_string & end ; До этого была одинарная левая квадратная скобка if mark_link_start=0 then dest_str=dest_str+token#i_str$ & end ; Мы не внутри ссылки - просто копируем очередной символ if mark_link_start=2 and (i_str-link_start_pos)<=2 then proc flush_string & end ; Сразу за двойной левой скобкой - правая, это не воспринимается как ссылка if mark_link_end=1 then mark_link_end=2 & proc flush_string & end ; Корректно завершенная ссылка if mark_link_end=0 then mark_link_end=1 ; Первая правая скобка, встретившаяся при обработке ссылки end :flush_string ; Процедура копирования "задним числом" ссылки в результирующую строку с последующим сбросом всех соответствующих флагов и переменных ; Имеется три режима копирования: (1) без учета ссылочного форматирования (когда предполагаемая ссылка не оказалась таковой); (2) копирование простой ссылки (сводится к пропуску обрамляющих ссылку двойных квадратных скобок); (3) копирование ссылки с невидимой частью if mark_link_end=2 then i_copy=link_start_pos+2 else i_copy=link_start_pos & skip_start_pos=0 & link_start_pos=0 ; Если нормальное завершение ссылки, устанавливаем позицию начала копирования строки с учетом пропуска двух открывающих скобок, в противном случае - без учета скобок и еще сбрасываем переменные, соответствующие позициям начала и окончания копирования if skip_start_pos=0 and link_start_pos=0 then i_copy_end=i_str ; Режим 1: ссылки нет - копируем до текущей позиции исходной строки включительно if skip_start_pos=0 and link_start_pos<>0 then i_copy_end=i_str-2; Режим 2: ссылка без невидимой части - копируем с учетом пропуска завершающих скобок if skip_start_pos<>0 then i_copy_end=skip_start_pos-1 ; Режим 3: ссылка с невидимой частью if i_copy>i_copy_end then goto fsl_fin ; Сразу после открывающих скобок начинается неотображаемая часть ссылки - просто пропускаем ее ; Собственно копирование :fsl_copy dest_str=dest_str+token#i_copy$ ; Перенос очередного символа в конечную строку i_copy=i_copy+1 if i_copy<=i_copy_end then goto fsl_copy ; Финальная часть: сброс всех флагов и переменных :fsl_fin mark_link_start=0 mark_link_end=0 link_start_pos=i_copy_end skip_start_pos=0 end :p_smb ; Процедура посимвольного вывода целевой строки - позволяет избежать преобразования в ссылки возможных оставшихся "вложенных" квадратных скобок tokens_delim="char" tokens dest_str nr_tok0=tokens_num i_str=1 :p_smb_cyc p #%token#i_str$$ i_str=i_str+1 if i_str<=nr_tok0 then goto p_smb_cyc pln end[/pre2]


Ajenta: Вот такой драгндроп возможен в урке :nachalo x = 100 y = 100 ;decoradd text (160,160) TEXT "zzz" ;decor_rec_XX = 50 ;decor_rec_YY = 20 decoradd rec (x, y, -1) RECT 50, 20, 0xffffffff decoradd rec_clic (x, y, -2) CLICKAREA 50, 20, "!dragndrop" decoradd rec1 (600, 500, -1) RECT 50, 20, 0xff777777 end :dragndrop anykey z, 1 mouse_xx=mouse_x mouse_yy=mouse_y xx=decor_rec_x-mouse_xx yy=decor_rec_y-mouse_yy :drag anykey z, 25 ;decor_text_text ="z=#z$ is_syskey = #is_syskey$ x= #mouse_x$ X=#decor_rec_x$ xx=#xx$ y=#mouse_y$ Y=#decor_rec_y$ yy=#yy$" if mouse_xx<>mouse_x or mouse_yy<>mouse_y then decormov rec mouse_x+xx, mouse_y+yy, 10 & mouse_xx=mouse_x & mouse_yy=mouse_y if z<>256 then goto drag :drop decormov rec_clic mouse_x+xx, mouse_y+yy end Если кликнуть на белый квадратик, то он потащится за мышкой, ещё раз кликнуть - отпустится.

Ajenta: Как известно, в урке нет абсолютного перехода. То есть и при goto и при proc каррент лок не поменяется и коммон не выполнится. Что же делать, если нам всё же нужен абсолютный назначаемый переход. Решение такое. ;создаём свою локацию перехода :mygoto ;вызываем коммон proc common ;присваиваем свой карент лок current_loc = mygoto_1 ; делаем переход goto #%mygoto_1$ end В игре же пишем ;где используем :локация ; вместо простого гоуту вызываем наш гоуту с названием локации на которую нужно перейти, ; то есть заменяем действие (goto название_локации) на то, которое написано ниже goto mygoto("название_локации") end

Ajenta: Ещё одна интересная фишка, которая будет полезна новичкам и тем, кто делает масштабные рпг игры. Дело в том, что фурка, при загрузке сохранения в игре, выполняет локацию, на которой вы сохранились. Соответственно, если вы брали там какой-то предмет или у вас динамический текст, то всё это поедет: предметов может оказаться больше одного, а текст может вывестись совсем не тот, который вы ожидали. Как с этим бороться: Не давать сохраняться в любом месте игры. Выделить под сохранения специальные локации, при загрузке на которых вы точно знаете, что ничего не поломается. Простая локация с описанием и парой кнопок вполне подойдёт. А уж как сюжетно обыграть такое "местечковое" сохранение - придумаете.

Ajenta: Отредактировала стандартный скин для разрешений 1024х768 и 1024х600 Вдруг кому-то пригодится. Просто положите файлы из соответствующих архивов рядом с игрой и наслаждайтесь. https://yadi.sk/d/SktTS4SadxqbL

qwerty: *PRIVAT*

qwerty: какой такой приват? я писал следующее: --- qwerty (в соседней теме) пишет: Я порылся в документации и не понял- как на фурке организовать целочисленное деление? Допустим, имеется x монет, которые по команде "накупить барахла", тратятся по 5 монет на 1шт барахла. На самом деле ситуация чуть сложнее, НО в данный момент интересует как можно проще получить целочисленное деление, которое будет очень востребовано в моей игре. то моё сообщение попало в закрытую тему, сюдасюда. там я писать ничего не могу, поэтому пишу здесь, в этой замечательной теме, созданной, как будто, специально для того, чтобы отпугивать новичков, демонстрируя недостаки urql . ну и правильно- остаться с нами должны самые смелые и несгибаемые ))) по этому моему вопросу нашёл(меня любезно ткнула носом Ajenta в) описалово Корвина, в котором, оказывается, всё было расписано уже почти 10 лет назад. да, на urql есть таки и целочисленное деление и даже можно задавать точность- например, деление с одним знаком после запятой. или с двумя. или тыпы. пока не знаю, как это можно применить, но возможность потенциально интересная. НО, как это в urql часто бывает, эта возможность реализована не через то место. так, при целочисленном делении результат округляется не вниз, а вверх! то есть, чтобы получить именно целую часть, нужно проводить доп проверки и вычисления. так сказать, "лёгким движением руки брюки превращаются... брюки превращаются..."... а теперь, очередная полезная механика, которая бы непонадобилось, если бы urql был продуман чуть лучше: как я сделал целочисленное деление: :div if divx >= divy then divx = divx-divy & divz = divz+1 else end goto div end как вы можете видеть, это процедура, использующая следующие переменные: divx - делимое. после вычислений в divx остаётся остаток от деления divy - делитель. в ходе вычислений не изменяется. divz - после вычислений к divz прибавляется целая часть результата деления. то есть, если divz изначально выставим в 0, то в итоге получим в нём результат целочисленного деления divx/divy

Iunel: Скажите, кто нибудь разобрался с переменной TIME? А именно, когда она обнуляется? По теории она хранит время после полуночи, то есть сразу после 00:00 переменная хранит ровно 00,000,000. Таким образом максимальное число в TIME - 86,400,000, т.к. в сутках 86400 секунд. А может быть она обнуляется после 99,999,999? Тогда обновление происходит каждые 27 часов, 42 минуты. Я решил сделать игру, которая будет якобы работать, даже когда программа выключена (и даже когда выключен компьютер) на основе переменной TIME. Все просто, когда ты в первый раз начинаешь игру, компьютер сохраняет значение TIME на тот момент. В следующий раз при запуске игры, снова создается значение уже на тот момент времени. Ну и вычитая одно из другого мы получаем время между этими двумя запусками. К сожалению, это будет работать только в пределах одного дня, но все равно можно придумать много интересных вещей, основываясь на этом. Осталось только узнать время обновления.

vito: Решила опубликовать давние наработки - так называемые уроки FireURQ, посвященные новым функциям-возможностям Фурки, которых не было в "классическом" URQ. Надеюсь, ссылка скоро будет доступна: http://urq.plut.info/node/1209 Если интересно - пишите, принимаются заявки на темы для продолжения (только, пожалуйста, декораторы и скины не предлагать).

Серый Волк: Ссылка доступна, vito, огромное спасибо за труды!

Ajenta: Запостила шрифты для фурки. Можно полистать, посмотреть, выбрать подходящий. http://urq.plut.info/node/1519

Серый Волк: Ajenta, спасибо, здорово. Теперь ждём пак скинов :)

Ajenta: Серый Волк, скины, это всё-таки слишком индивидуально. Сложно придумать какие-то общие.

qwerty: На текущий момент FireURQ поддерживает потрясающие возможности оформления: Может быть, ст0ит открыть обучающую тему по созданию интерфейсов и всяческому оформлению квестов?

Korwin: qwerty - поддерживаю!!!

Ajenta: Сделала библиотечку функций для работы с одномерными массивами. Надеюсь, это упростит авторам жизнь. Мне так точно. http://urq.plut.info/node/2281

Ajenta: Добавила удаление элемента массива по номеру и интерактивный пример использования функций. Можно перекачать. http://urq.plut.info/node/2281



полная версия страницы