03.12.2022
статья
Фишки pygame #2

Всем привет!

Сегодня я вам покажу несколько интересных штук в pygame.


Первое, что я хотел бы вам показать - это система частиц. Вот код с комментариями:

# Функция создания частицы
def createPart(x, y, x_s, y_s, r, massive,chance):
    # Шанс создания частицы
    if random.randint(1,chance) == 1:

    # Добавление частицы в массив
        massive.append([[x,y], [x_s,y_s], r])

# Функция обновления частиц
def updatePart(massive, screen, color, minus,outline=False, colorOutline=(0,0,0),outlineRad=1.5, glow=False, colorGlow=(0,0,0),glowRad=1.5,xm=0,ym=0):
    for particle in massive:
        # Изменения в параметрах
        particle[0][0]  = particle[1][0]
        particle[0][1]  = particle[1][1]
        particle[2] -= minus
        particle[0][1]  = xm
        particle[1][1]  = ym

        # Эффект свечения
        if glow:
            radius = particle[2] * glowRad
            surface = pg.Surface((radius*2,radius*2))
            surface.set_colorkey((0,0,0))
            pg.draw.circle(surface,colorGlow,(radius,radius),radius)
            screen.blit(surface,(particle[0][0]-radius,particle[0][1]-radius),special_flags=pg.BLEND_RGB_ADD)

        # Эффект обводки
        if outline:
            radius = particle[2] * outlineRad
            surface = pg.Surface((radius*2,radius*2))
            surface.set_colorkey((0,0,0))
            pg.draw.circle(surface,colorOutline,(radius,radius),radius)
            surface.set_alpha((50))
            screen.blit(surface,(particle[0][0]-radius,particle[0][1]-radius))

        # Сама частица
        pg.draw.circle(screen, color,(int(particle[0][0]),int(particle[0][1])),particle[2])

        # Удаление частицы
        if particle[2] <= 0.5:
            massive.remove(particle)

Параметры функций:
createPart
(позиция x, позиция y, скорость по x, скорость по y, радиус частицы, массив, шанс появления)
updatePart
(массив, поверхность(окно, экран), цвет частицы, скорость уничтожения, обводка(да/нет), цвет обводки, радиус обводки(будет умножаться на радиус частицы), свечение(да/нет), цвет свечения(нужно выбирать тёмный, иначе будет не красиво), радиус свечения(также как и у обводки))
Свечение и обводка.
Обводка реализована с помощью отдельной поверхности. На ней рисуется круг,  а сама поверхность становится полу-прозрачной.
Свечение сделано более сложным образом. Также создаётся поверхность, также рисуется круг. Только здесь нужно выбирать тёмные цвета. Поверхность рисуется на экране со "специальными флагами"(они так и называются). А именно, с флагом BLEND_RGB_ADD. Он добавляет смешивание цветов. То есть этот цвет будет смешиваться с другими. Если сделать светлый цвет, то нормального свечения не будет, так как при смешивании сам цвет становится светлее. Надеюсь понятно объяснил.


Теперь поговорим об одной очень интересной функции. Её я взял с библиотеки Scrab-1.0 на javascript и переделал под python. Она вычисляет дистанцию до определённого объекта. Для её работы требуется библиотека math.
Вот эта функция:

(math.fabs(rect.x - object.x))   (math.fabs(rect.y - object.x))

Так как я в 6 классе, то тригонометрию мы ещё не проходили. Поэтому я точно не смогу объяснить, как это работает.


Ещё хотел бы сказать одну небольшую вещь. Цвета в pygame можно обозначать строкой. Например, "white", или "blue". Вот применение: screen.fill("black")


На этом всё. Сегодня выйдет второй пост о выходе beta-версии моей игры.

Всем пока!

Комментарии (0)
Увы.. комментариев пока нет..