Главная » Статьи » Играем Blitz » Общее |
Тут описаны некоторые изменения в синтаксисе, которыми придется пользоваться.
GraphicsУ функции Graphics теперь новые параметры: ширина, высота, глубина цвета и частота обновления. Если ты портируешь код Blitz3D, в котором используется последний параметр "режима окна", то ты увидишь, что твоя прога жутко тормозит. Это происходит потому, что BlitzMax по умолчанию ставит частоту обновления игры равной частоте обновления экрана. Если ты поставил последнее значения Graphics равным 1,2 или 3, то прога будет обновляться с частотой 1, 2 или 3 Гц соответственно! Просто убери последний параметр. КартинкиТак как 2D движок BlitzMax (Max2D) теперь рендит картинки с использованием OpenGL (ускоряя рисование аппаратно), то теперь возможно выполнение таких операций как масштабирование, поворот и альфа блендинг (т.е. делать их прозрачными) в реальном времени. В отличии от предыдущих версий Blitz степень поворота, масштабирования и прозрачности ставиться не индивидуально для отдельной картинки, а сразу для всех; теперь вызываются функции SetRotation, SetScale и SetAlpha, использование которых приведет к изменению параметров рисования всех картинок. Это значит, что если ты, например, вызовешь SetScale 0.5, 0.5, то все картинки будут рисоваться в половину от своих реальных ширины и высоты, пока ты не восстановишь нормальное масштабирование командой SetScale 1, 1, и также значит, что тебе придется звать эти функции перед рисованием отдельных картинок, если нужно нарисовать их с другими значениями. Так рисование происходит очень быстро. SetColor делает картинки "подкрашенными". Значения красного, зеленого и синего меняются в зависимомости от значений красного, зеленого и синего, определеных функцией SetColor, таким образом, 255, 255, 255 дают 100% значений красного, зеленого и синего каждого пикселя картинки, картинка нарисуется как обычно; SetColor 127, 127, 127 даст 50% каждого значения, эффективно делая картинку наполовину темнее, SetColor 0, 255, 255 уберет красную составляющую цвета всех пикселей картинки и, наконец, SetColor 255, 0, 0 оставит только красную состовляющую цвета, эффективно подкрашивая картинку красным. Если ты звал SetColor с параметрами, не равными 255, 255, 255 и хочешь, чтобы всё рисовалось как обычно, то пиши SetColor 255, 255, 255. Ты, вероятно, заметишь это, когда твои картинки вдруг замигают разными цветами! KeyDown / KeyHitBlitzMax, в отличии от предыдущих Blitz-ов, имеет набор констант, содержащих коды клавиш. Смотри секцию Key Codes в доках (под Module Reference), чтобы их узнать. Конкретно говоря, если использовать обычную "Repeat [... ] Until KeyHit (1)", чтобы отследить нажатие на Esc, поменяй его на "Repeat [... ] Until KeyHit (KEY_ESCAPE)". 1 теперь относится к левой лапе мыши, так что не думай, что у тебя сломался Esc... СпискиBlitz-овские "тип"-объекты раньше автоматически добавлялись к одному списку на тип. Теперь это не так. Так как BlitzMax позволяет использование нескольких списков на тип, то тебе необходимо создать список вручную. К счастью это легко: Заметь, что переменная списка mylist, была создана как внутренний BlitzMax-овский тип TList. Добовляются объекты к этому списку посредством функции ListAddLast (в примере ниже создается тип "Example "): Вместо просмотра списка через For... Each, используй For... EachIn : СинтаксисПеременные типов теперь декларируются с использованием символа ":" вместо старого ".": Доступ к полям типов теперь осуществляется за счет символа "." вместо старого "\" : Основные типы переменных используют те же определители, что и раньше, с добавлением "!" для чисел с плавающей точкой двойной точности (64-bit, double-precision floating point variables); теперь можно использовать их имена, если так удобней: ' Целые:
МаркерыМаркеры теперь определяются использованием символа "#": DataСекции Data теперь доступны посредством DefData, RestoreData и ReadData . Вот как это делается: Flip и FlushMemЭТО ВАЖНО: нужно звать FlushMem хотя бы в главном цикле! Просто поменяй все... ... на... FlushMem; Flip
Если не вызывать FlushMem, то прога будет тормозить или даже вылетит, т.к. память резервируется, но не освобождается. Стоит рассказать про FlushMem поподробней. FlushMem удалит все объекты, на которые ничто не ссылается (например, если ты создал объект Rocket через r:Rocket = New Rocket и, затем, поставил r:Rocket равным Null, т.к. он тебе больше не нужен). FlushMem удаляет только объекты, созданные в той-же области, в которой и вызывается FlushMem (область программы - это секция кода, такая как функция или главный цикл). Заметь, что удаляются также объекты, созданные в функциях, выполненных из той же области. Самое основное из всего этого - это то, что тебе нужно звать FlushMem только в главном цикле, но если твои функции тратят много времени на обработку циклом (особенно созданием / удалением объектов), то можно впихнуть FlushMem и в эти циклы тоже. Вот объяснение Марка про FlushMem, которое поможет тебе разобраться получше для чего нужен FlushMem: FlushMem удаляет все неиспользуемые объекты и временные резервации памяти (которые являются специальными объектами). Временные резервации памяти могут появляться по разным причинам, включая конкатенацию ("блин, а такое слово есть?... не знаю что это значит" - прим. пер.) строк, преобразование Blitz-овских строк в C-строки и т.д. Также, вызываемые тобой функции могут сами создавать временные объекты и т.п. Так почему же не сделать это автоматическим? Это дает пользователю очень плотный контроль за происходящим, когда появляется "коллекция мусора". Я чувствую, что это лучшее решение для игр и бэкграундных прог, вместо полностью автоматического управления памятью, когда система сама придумывает - куда бы впихнуть FlushMem, что может привести к странным эффектам. Используй MemAlloced (текущее резервирование памяти) и MemUsage (всё резервирование памяти с самого начала проги), чтобы узнать как используется память твоей прогой. | |
Просмотров: 92 | |
Всего комментариев: 0 | |