Эффект «Bioletter»
Этот эффект превращает обычный текст в пульсирующую неоновую материю. Буква «B» формируется математически (без использования шрифтов), а затем каждая её точка начинает хаотично «кипеть» и светиться.
Секрет отсутствия мерцания:
При переносе старых графических примеров с Windows на Linux пользователи часто сталкиваются с диким мерцанием. Это происходит из-за того, что функция circle в Linux работает крайне медленно, а clear window мгновенно заливает экран черным, оставляя пустоту на время расчетов.
В этом коде мы обошли проблему:
Листинг кода:
Этот эффект превращает обычный текст в пульсирующую неоновую материю. Буква «B» формируется математически (без использования шрифтов), а затем каждая её точка начинает хаотично «кипеть» и светиться.
При переносе старых графических примеров с Windows на Linux пользователи часто сталкиваются с диким мерцанием. Это происходит из-за того, что функция circle в Linux работает крайне медленно, а clear window мгновенно заливает экран черным, оставляя пустоту на время расчетов.
В этом коде мы обошли проблему:
- Используем только быструю команду fill rect (даже для имитации округлых форм).
- Применяем точечную очистку: вместо стирания всего экрана мы закрашиваем черным только маленький квадрат вокруг старой точки и тут же рисуем на её месте новую. Экран никогда не остается пустым!
Листинг кода:
Код: Выделить всё
// Effect 1: Bioletter (No Tearing, Point-by-Point Clear)
width = 640 : height = 480
open window width, height
clear screen // Обязательно для работы inkey$
backcolor 0,0,0
clear window
// Математическая маска буквы "B"
sub is_b(x, y)
local dx, dy, b
dx = x - 200
dy = y - 80
b = 0
if dx >= 0 and dx <= 40 and dy >= 0 and dy <= 320 b = 1
if dx > 40 and dx <= 160 and dy >= 0 and dy <= 40 b = 1
if dx > 130 and dx <= 180 and dy > 40 and dy <= 130 b = 1
if dx > 40 and dx <= 130 and dy > 110 and dy <= 150 b = 1
if dx > 40 and dx <= 160 and dy > 150 and dy <= 190 b = 1
if dx > 140 and dx <= 190 and dy > 190 and dy <= 280 b = 1
if dx > 40 and dx <= 140 and dy > 260 and dy <= 320 b = 1
return b
end sub
dim bx(5000), by(5000), px(5000), py(5000)
count = 0
// Заполняем координаты точек
for y = 80 to 400 step 8
for x = 200 to 400 step 8
if is_b(x, y) = 1 then
count = count + 1
bx(count) = x
by(count) = y
px(count) = x
py(count) = y
end if
next x
next y
do
// Никакой глобальной очистки экрана!
for i = 1 to count
// 1. Мгновенно стираем СТАРУЮ точку
color 0, 0, 0
fill rect px(i)-4, py(i)-4 to px(i)+4, py(i)+4
// 2. Вычисляем НОВУЮ позицию (эффект кипения)
px(i) = bx(i) + (2 - int(ran(5)))
py(i) = by(i) + (2 - int(ran(5)))
// 3. Рисуем тусклый ореол
color 80, 80, 80
fill rect px(i)-3, py(i)-3 to px(i)+3, py(i)+3
// 4. Рисуем яркое ядро
color 255, 255, 255
fill rect px(i)-1, py(i)-1 to px(i)+1, py(i)+1
next i
pause 0.03
k$ = inkey$(0.001)
if k$ = "esc" or k$ = chr$(27) then
break
end if
loop
close window
end