Журнал о программированнии на языках Blitz3D, BlitzPlus, BlitzMax

Делаем частицы с ООП

Материал из Blitz Et Cetera

Перейти к: навигация, поиск

Делаем частицы с ООП

Пройдя этот туториал, вы сможете сделать это:

Для начала вам нужны две вещи

  • Лицензионная копия BlitzMax ;)
  • Графический редактор сохраняющий в .png :)

Отлично, но перед тем как будем программировать мы должны нарисовать красивую искру. Откройте графический редактор и нарисуйте искру размером 16x16.

Когда закончите, сохраните как "Sparkle.png" и положите в папку с будущим .bmx файлом. Если лень рисовать, то вот готовая:

Теперь мы готовы писать код, Секция Инициализации:

Strict

Graphics 800,600
Global SparkList:TList = CreateList()
AutoMidHandle(True)
Global iSpark:TImage = LoadImage ("Sparkle.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
        Function 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 остается неизменным.

Вот код полностью:

Strict

Graphics 800,600
Global SparkList:TList = CreateList()
AutoMidHandle(True)
Global iSpark:TImage = LoadImage ("Sparkle.png",MIPMAPPEDIMAGE|FILTEREDIMAGE)
SetBlend LIGHTBLEND

Type TSpark
        Field x#,y#,r,g,b,xv#,yv#,scale#,life
        Function 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

Repeat
        'Function Create(x,y,xv,yv,scale,life)
        Cls
        'Kогда вы будете удерживать левую кнопку мыши, появится источник частиц
        'Kоторый будет создавать частицы в месте, где находиться курсор
        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)

Всё!


Автор: Matt McFarland
Перевод: JohnK (e-mail: JohnK_08_sobaka_mail.ru, ICQ: 438-180-831)

Другие

Друзья