Приветствую всех в этой теме.Я хочу вас научить редактировать и создавать свои скрипты для gfxboot формата inc.
Вам известно, что inc скрипты отвечают за многие вещи в вашей теме, так давайте разберём некоторые из них.
Quote (BEGFRAET)
Правила этой темы включают:
1.Разрешается Давать inc код в bbcod [code] [\code]
2. Запрещается создавать ответ с такими словами как спасибо, пожалуйста, и. т. Д. Но комментировать статьи и задавать вопросы – разрешено ! 3. Также чтоб дать ответ или задать вопрос надо выполнить д. з. из урока Я снимаю это правило (Оно глупое)!
Для создателей уроков
4. Надо создавать грамотный материал (т. Е. без ошибок) и в конце каждого урока создавать своё домашнее задание по вашей теме. 5. Запрещается создавать материал не по теме: “Редактирования и создание inc скриптов”.
Описание языка, используемого в скриптах для gfxboot
hosco, Ваша версия сильно отличается от тех, которые есть у меня. Поэтому я не могу провести эксперимент, чтобы убедиться, что ничего не упустил. А на Вашей задаче я бы хотел построить "урок". Давайте сделаем так: Сначала я выложу свои соображения без пространных объяснений, потом Вы проверите и если все получится, то приступим к написанию урока. Итак, мои предложения: 1. Файл main.inc - строка 80 currentfont exch font.large setfont show setfont - нас интересует команда show Это команда языка. Для отображения текста с выравниваем по правому краю или по центру необходимы свои скрипты, но чаще всего, они уже есть готовые в system.inc и называются /showright и /showcenter Проверяем. В вашем system.inc есть только первый из них. 2. Ладно, дописываем в system.inc следующий скрипт:
3. Возвращаемся к 80 строке main.inc и меняем ее на следующую currentfont exch font.large setfont menu.bar.width 1 shr 0 rmoveto showcenter setfont 4. Теперь 133 строка main.inc такая же как 80-я currentfont exch font.large setfont show setfont ее меняем ее на такую же currentfont exch font.large setfont menu.bar.width 1 shr 0 rmoveto showcenter setfont 5. Компилируем и проверяем. Если что-то не так, то заархивируйте всю папку со скриптами и выкладывайте сюда. Будем искать @DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
Сообщение отредактировал ded2007 - Среда, 16.02.2011, 20:03
Там еще в алгоритме изменения (?) длины полоски бара. У Вас постоянная длина или на длинных/коротких текстах меняется?
Ну по скриншоту видно, что постоянная, а где алгоритм я не в курсе. Что касается 409 строки - всё работает, курсор отцентрованый и постоянной длины (длины самой длинной строки).
Может быть это поднимет "посещаемость" занятий , а то "преподы" грустят
Примечание: В связи ограничениями движка форума, не всегда есть возможность редактировать и удалять устаревшие сообщения, поэтому при чтении делайте поправки на "лирические отступления", т.е. вклинивающиеся диалоги посетителей форума.
Оператор IF
Думаю, что большинство читающих этот топик уже давно привыкли к обычной схеме оператора условного перехода, или, как его еще называют, оператора ветвления.
Code
ЕСЛИ (IF) вычисляемое_условие ТО (THEN) блок действий при ИСТИННОСТИ условия ИНАЧЕ (ELSE) блок действий при ЛОЖНОСТИ условия ВСЕ (IF END )
вычисляемое_условие - это чаще всего результат операций сравнения "равно", "не равно", "меньше", "больше" и т.д. Результатом таких сравнений может быть либо ИСТИНА (true), если написано верное условие, например,
Code
(3+2)*7 < ширина_экрана
либо ЛОЖЬ (false), когда условие сравнения неверно, например,
Code
символов_в_словe "абракадабра" < 5
ИСТИНА и ЛОЖЬ называются логическими величинами или, Булевыми (в честь основоположника математической логики Джорджа Буля). Понятное дело, что от условий сравнения с очевидным результатом толку мало, но в программировании сравниваются, например, текущие значения параметров с их граничными значениями, чтобы убедиться, что границы не нарушены.
Вспомним, что наш скриптовый язык, ориентирован на работу со стеком и рассмотрим
eq - "Равно". Берет из стека две величины, сравнивает их на предмет эквивалентности, а результат помещается обратно в стек (одно значение 0 или 1). ne - "НЕ РАВНО" gt - "БОЛЬШЕ" ge - "БОЛЬШЕ или РАВНО" lt - "МЕНЬШЕ" le - "МЕНЬШЕ или РАВНО"
Об "эквивалентности". Сравнивать можно не только числа, но и строковые переменные и константы. В этом контексте "эквивалентность" означает полную идентичность строк, т.е. варианты "слово"; "Слово" и "СЛОВО" суть НЕ ЭКВИВАЛЕНТНЫ. Если Вас интересуют тонкости сравнения нечисловых переменных, то стало быть Вы уже достаточно далеко продвинулись самостоятельно, и в этих минилекциях почерпнете мало полезного, т.к. они ориентированы все таки на стартовый уровень.
[-] Часть 3. Формат команды if (ifelse) Полный формат записи команды IF в нашем языке таков:
Code
условие { % действия при ИСТИННОСТИ условия } { % действия при ЛОЖНОСТИ условия } ifelse % продолжение скрипта
или короткая форма, если не требуется специальных действий по ветке ELSE
Code
условие { % действия при ИСТИННОСТИ условия } if % продолжение скрипта
Еще раз напомню, что - фигурные скобки выделяют целый блок команд, которые необходимо выполнить единовременно; - фигурные скобки в обязательном порядке должны быть парными (Очень удобно если Ваш текстовый редактор подсвечивает парную скобку. Тогда видно и начало, и конец блока команд.) - скобки обязательно с двух сторон обрамлять пробелами или "Enter"-ами. Вообще, в нашем языке, как правило, "лишние" пробелы могут быть только внутри кавычек. @DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
Сообщение отредактировал ded2007 - Воскресенье, 20.02.2011, 13:24
Мы уже сталкивались с выводом на экран ТЕСТОВЫХ строк (т.е. констант) или текстовых переменных. Для этого служит команда show. А блок для вывода обычно выглядит так:
Code
x y moveto % преходим в нужную точку экрана 0x00ff00 setcolor % включаем нужный цвет текст_или_переменная show % выводим на экран
или короче, в одну строку
Code
x y moveto 0x00ff00 setcolor текст_или_переменная show
Однако, если вы попробуете вывести на экран значение ЧИСЛОВОЙ константы или переменной, то, скорей всего, получите что-то типа ...
,
а после нажатия любой клавиши выйдите из gfxboot в текстовый режим grub4dos Чтобы не отвлекаться от простых тем, просто сформулируем для себя, что команда show работает только с текстом, а для вывода на экран числовой переменной, ее нужно предварительно перевести в текст = "Подготовить форматированный вывод". В принципе, язык содержит необходимую для форматированного вывода команду. Это команда snprintf. Но. Во-первых, эта команда форматирует любое количество переменных и любого типа, что явно осложнит ее детальный разбор. Во-вторых, для ее работы необходим буфер, куда будет помещаться текст. Т.е. мы должны уметь выделять память нужного объема под еще не созданный текст В-третьих, нужно задать "формат", т.е. указать выводить ли результат в десятичном или 16-тиричном виде, с разделителями или без и т.д. Все это вызывает осложнения на стартовом уровне. Поэтому: - во-первых, воспользуемся модифицированной командой sprintf, которая приведена в описании snprintf и наличествует в system.inc - во вторых, просто будем действовать по образцу, без особых подробностей "почему" и "как".
Тем более, что я и сам не "сросся" с этим вопросом . Пока читаешь описание и разбираешь пошагово, то все понятно. Но когда нужно быстро написать код, то все "в тумане" и опять нужно смотреть в справочник.
Итак: 1. Форматирование Числового значения к десятичному виду: значение "%d" buf sprintf
Начнем с буфера buf. Это и есть то самое зарезервированное место, куда будет помещаться текст. Буфер на 8 символов создается командой: /buf 8 string def Однако, если Вы при каждом выводе будете резервировать память под буфер, то она у Вас быстро закончится. Поэтому, либо буфер создается однократно, большого размера и используется во всех скриптах /buf 128 string def либо, после его использования, задействованную под него память, нужно освобождать командой free
Code
/buf 8 string def % резервирование под буфер % действия с использованием буфера buf free % очистка буфера
Теперь о строке описывающей формат "%d" %d - аргумент трактуется как ЧИСЛО и представляется в ДЕСЯТИЧНОМ виде; %x - аргумент трактуется как ЧИСЛО и представляется в ШЕСТНАДЦАТИРИЧНОМ виде (с буквами в нижнем регистре); %s - аргумент трактуется и выводится как строка. Если необходим вывод числа с ведущими нулями, то можно использовать следующую строку форматирования %08d или %08x, где "0" указывает на необходимость использования ведущих нулей, а "8" показывает количество знаков для вывода.
Вывод цветов удобно осуществлять в 16-тиричном формате. цвет "0x%06x" buf sprintf buf show В этом примере показано, что в строку формата можно включать и простой текст (это приставка "0x" к числу. Кроме того, в этой же строке, значение из буфера тут же выводится на экран командой show.
При пользовании временным буфером команда длиннее. /buf 8 string def цвет "0x%06x" buf sprintf buf show buf free
Добавил в файл boot.config строку %% include ... вроде скомпилировало ( пользовался @DED-LEGO@ довольно удобно!!! За, что отдельное Спасибо!! при компиляции писало including "мой скрипт") Но почему то отдельно не запускается он совершенно... Дело в том, что пробовал это всё дело в готовом скрипте от DED там всё работало, потом повытаскивал в отдельный не хочет... конечно, если нужно то выложу всё это... просто тема действительно не очень активна)))
r-milvus, как Вы правильно определили команда %% include имя_inc-файла_со_скриптами используется для подключения целых модулей скриптов в процессе компиляции. Ее не обязательно использовать в файле "boot.config", она может быть включена также в обычные inc-модули. Только следите за тем, чтобы команды %% include не попадали внутрь отдельных скриптов, а размещались в начале inc-модуля, между скриптами, или в конце @DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
ded2007, подскажите, что я упустил... как и писал ранее мой скрипт, внутри вашего работает... отдельно скомпилировал вроде в ядро, но не знаю, что не доработал... сам он не работает! и ещё, в определённый момент, ваша анимация продолжает работать, а логотипы уже нет... и моя анимация так-же прикрепляю файлы, в rmb0008_1.inc вставленны внутри ваших мои, rmb это собранные в отдельный файл мои, ну и сама тема))) да, хочу сказать, что в программировании, я мягко говоря 0))) просто, есть непреодолимое любопытство!!) всё, что написанно, изучалось по ходу, а в основном- методом проб и множества))) ошибок!)
А где Ваши скрипты вызываются? По какому событию? Если Вы хотите, чтобы скрипт отрабатывал в случае нажатия клавиши, то "ниточка" должна тянуться от скрипта с предопределенным именем KeyEvent Если нужен периодический вызов до первого нажатия клавиш, по аналогии с таймером, то "ниточка" тянется от Timeout Если же нужна периодическая отработка скрипта, но уже без таймаута, то "ниточка" тянется от Timer-а @DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
вроде собрал раму, вот теперь не пойму, где сбиваю толи шрифт, толи прозрачность, а может и то и другое... в меню накладывается друг на друга (если перелистывается страничка, т.е. когда пунктов больше) и всё равно, в определённый момент останавливается, сама по себе...???
Добавлено (15.03.2011, 06:06) --------------------------------------------- Похоже, я тут один ученик
Отслеживать позицию курсора, текущий цвет, текущую прозрачность, текущий шрифт и т.п. двольно муторно, особенно, когда вклиниваешься в чужой код. НО! В этом нет необходимости! Сам язык предоставляет достаточно возможностей для запоминания в стеке часто используемых параметров на входе в какой-либо скрипт и последующего восстановления их по окончании работы скрипта. Речь, в частности, идет о командах: currentpoint, currenttransparency, currentcolor, currentfont и им подобных.
currentpoint - помещает в стек текущие координаты курсора (два числа!) X и Y. Для восстановления позиции курсора достаточно задействовать команду moveto (при условии, что уровень стека правильный),
currenttransparency - в стек помещается одно число - текущее значение прозрачности. Для восстановления достаточно задействовать settransparency,
currentcolor - запоминает в стеке текущий рабочий цвет. Восстанавливается командой setcolor,
currentfont - запоминаем текущий шрифт. Восстанавливаем командой setfont.
Мы уже отмечали для себя, общий вид простого скрипта
Code
/script_name { %... % код скрипта %... } def
Теперь можем отметить "хитрости" для более сложных скриптов. Речь о скриптах, которые в своем теле могут изменить координаты курсора, цвет, прозрачность или шрифт.
Code
/script_name { % запомним в стеке ряд параметров currentpoint currenttransparency currentcolor currentfont
Примечания: 1. Вы должны быть уверены, что по окончании скрипта уровень стека правильный. Т.е. сколько вы клали в стек, столько и должны были забрать. 2. Поскольку стековые операции работают по правилу "положил позже - лежит сверху (возьмешь раньше)", то порядок восстановления ОБРАТНЫЙ порядку помещения в стек. 3. В случае передачи через стек в скрипт параметров необходимо сначала их извлечь, а уже потом запоминать "текущее состояние". Аналогично, если Ваш скрипт возвращает результат через стек, то сначал нужно "восстановить исходное состояние", а уже потом помещать результат в стек. 4. Не нужно просто копировать предложенный блок из скрипта в скрипт. Это только схема. Ведь если Ваш скрипт не меняет текущий цвет или шрифт, то и нет необходимости их запоминать и восстанавливать, т.е. некоторые команды можно поубирать. Угадайте какие
@DED-LEGO@ - конструктор для разработчиков GFX-тем ПОСМОТРЕТЬ
Сообщение отредактировал ded2007 - Вторник, 15.03.2011, 17:25
Да, но вот запутался может, использовал я этот принцып... где-то не попал... посмотрите пожалуйста, там пытался я это всё дело провернуть... мож в чём то другом проблема...