Пятница, 26.04.2024, 14:54
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Категории каталога
BlitzMax [14]
Blitz3D [9]
BlitzPlus [0]
Xna [1]
DarkBasic [0]
Общее [3]
Наш опрос
Hans Zimmer - что это для вас?
1. Где?
2. Композитор вроде
3. Простые символы
4. Любимый композитор
5. Я не определился
Всего ответов: 12
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Статьи
Главная » Статьи » BlitzMax

Переход на BlitzMax с Blitz3D: Синтаксис
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 / KeyHit

BlitzMax, в отличии от предыдущих Blitz-ов, имеет набор констант, содержащих коды клавиш. Смотри секцию Key Codes в доках (под Module Reference), чтобы их узнать. Конкретно говоря, если использовать обычную "Repeat [... ] Until KeyHit (1)", чтобы отследить нажатие на Esc, поменяй его на "Repeat [... ] Until KeyHit (KEY_ESCAPE)". 1 теперь относится к левой лапе мыши, так что не думай, что у тебя сломался Esc...
Списки

Blitz-овские "тип"-объекты раньше автоматически добавлялись к одному списку на тип. Теперь это не так. Так как BlitzMax позволяет использование нескольких списков на тип, то тебе необходимо создать список вручную. К счастью это легко:
mylist:TList = CreateList()

Заметь, что переменная списка mylist, была создана как внутренний BlitzMax-овский тип TList. Добовляются объекты к этому списку посредством функции ListAddLast (в примере ниже создается тип "Example "):
myobject:Example = New Example
ListAddLast mylist, myobject

Вместо просмотра списка через For... Each, используй For... EachIn :
For e:Example = EachIn mylist
Print e.blah
Next

Синтаксис

Переменные типов теперь декларируются с использованием символа ":" вместо старого ".":
' Старая версия:
p.Player = New Player

' Новая версия:
p:Player = New Player

Доступ к полям типов теперь осуществляется за счет символа "." вместо старого "\" :
Type Oink
Field x
End Type

o:Oink = New Oink
o.x = 1

Print o.x

Основные типы переменных используют те же определители, что и раньше, с добавлением "!" для чисел с плавающей точкой двойной точности (64-bit, double-precision floating point variables); теперь можно использовать их имена, если так удобней:
' Целые:

i = 5 ' если нет определителя, то тип - целое число...
i% = 5
i:Int = 5

' С плавающей точкой:

f# = 5.0 ' (Инфо для пользователей UK Mac: символ # получается нажатием Alt + 3!)
f:Float = 5.0

' Строки:

s$ = "Oink"
s:String = "Oink"

' Байтовые:

b:Byte = 1

' Shorts:

s:Short = 10

' Doubles:

d! = 10000
d:Double = 10000

Маркеры

Маркеры теперь определяются использованием символа "#":
#mylabel
If a = 1 Then Goto mylabel

Data

Секции Data теперь доступны посредством DefData, RestoreData и ReadData . Вот как это делается:
RestoreData mydata

For a = 1 To 5
ReadData info
Print info
Next

#mydata
DefData 2, 4, 6, 8, 10

Flip и FlushMem

ЭТО ВАЖНО: нужно звать FlushMem хотя бы в главном цикле! Просто поменяй все...
Flip

... на...
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 (всё резервирование памяти с самого начала проги), чтобы узнать как используется память твоей прогой.

Источник: http://blitzetc.boolean.name/issue03.htm#a34

Категория: BlitzMax | Добавил: JohnK (31.03.2007) | Автор: MANIAK_dobrii
Просмотров: 2149
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright JohnK© 2024