Пройдя этот туториал, вы сможете сделать это: Для начала вам нужны две вещи 1) Лицензионная копия BlitzMax 2) Графический редактор сохраняющий в .png Отлично, но перед тем как будем программировать мы должны нарисовать красивую искру. Откройте графический редактор и нарисуйте искру размером 16x16 (Лично я сделал белую линию на черном фоне, рисуйте что хотите, но я рекомендую края затемнить серым цветом.) Когда закончите, сохраните как "spark.png" и положите в папку с будущим .bmx файлом. Теперь мы готовы писать код, Секция Инициализации: Код: Strict Graphics 800,600 Global SparkList:TList = CreateList() AutoMidHandle(True) Global iSpark:TImage = LoadImage ("spark.png",MIPMAPPEDIMAGE|FILTEREDIMAGE) SetBlend LIGHTBLEND Надеюсь, это было не сложно. Так как мы работаем в BlitzMax, мы можем добавить элементы ООП. Для начала создадим Тип, Я назвал его TSpark потому, что буква Т в начале имени Типа полезная практика. Код: Type TSpark Field x#,y#,r,g,b,xv#,yv#,scale#,life End Type X и Y будут характеризовать позицию частиц, а r,g,b – цвет, который вы сможете изменить по желанию. С помощью Scale, вы сможете масштабировать каждую частицу соответственно. Параметр Life будет отвечать за время жизни частиц. Сначала мы напишем главный цикл, что бы составить представление, о том, что будет делать Тип, а после, напишем сам Тип. Я считаю, что для вас будет проще понять предназначение Типа до его написания. Код: Repeat 'Function Create(x,y,xv,yv,scale,life) Cls 'Когда вы будете удерживать левую кнопку мыши, появиться источник частиц 'Который будет создавать частицы в месте, где находиться курсор If MouseDown(1) 'yv - это скорость по оси OY,равная единице 'так что y будет меняться на единицу каждый раз Local yv# = 1 'lx - локальная переменная, являющаяся 'вектором скорости по оси OX для частиц 'Благодаря ей, вы сможете увидеть движение частиц For Local lx# = 0.1 To 1 Step .1 'Для опрятности, сделаем скорость по оси OY – случайной. yv#:-RndFloat() 'Итак, lx# лежит в диапазоне от 0.1 до 1.Далее создаем две частицы. ' –lx# в последнем случае для того, что бы вторая частица была 'зеркальным отражением первой TSpark.Create (MouseX(),MouseY()-5,lx#,yv#,.2,660) TSpark.Create (MouseX(),MouseY()-5,-lx#,yv#,.2,660) Next End If TSpark.UpdateAll Flip Until KeyHit(KEY_ESCAPE) Надеюсь комментариев в коде достаточно для вашего понимания, если нет, то просто спросите на форуме. Теперь разберемся с Типом. Из кода выше, вы могли увидеть, что у типа используются две функции: Create() и UpdateAll(). Давайте вернемся к объявлению типа и напишем эти функции: Код: Type TSpark Field x#,y#,r,g,b,xv#,yv#,scale#,life F unction Create(x,y,xv#,yv#,scale#,life) Local Spark:TSpark = New TSpark Spark.x = x Spark.y = y Spark.xv# = xv# Spark.yv# = yv# spark.r = 255 spark.g = 255 spark.b = 255 spark.scale# = scale# spark.life = life SparkList.AddLast(Spark) End Function Method Destroy() SparkList.Remove(Self) End Method Function UpdateAll() For Local Spark:TSpark = EachIn SparkList spark.yv#:+RndFloat() Spark.x#:+Spark.xv# Spark.y#:+Spark.yv# spark.r:-1 spark.b:-2 spark.g:-1 SetColor spark.r,spark.g,spark.b SetScale spark.scale,spark.scale DrawImage (iSpark,spark.x,spark.y) SetColor 255,255,255 SetScale 1,1 spark.life:-1 If spark.life < 1 Then spark.Destroy() Next End Function End Type Из кода выше, вы можете видеть, что функция UpdateAll() увеличивает скорость по оси OY на случайное дробное число, в то время как скорость по оси ОX стабильно увеличивается на заданное число. Значение Красного и Зеленого компонентов цвета снижается на единицу, а значение Синего на два. Из-за этого, чем ближе частица к смерти, тем больше она насыщенна желтым цветом. Частица исчезнет, когда параметр life будет меньше единицы. А параметр Scale остается неизменным. Всё! Автор: Matt McFarland. Перевод by JohnK. Примечания переводчика: - В момент создания изображения искры, советую вам создать форму Круга. - Если вы учли первое примечание, то вы можете увеличить Scale параметр. Если кому интересно, то вот мой Spark.png:
|