Адрес: ул. Б. Очаковская 32 Москва Россия
Наши официальные канал и чат в telegram, группа в ВКонтакте

Эффект «Bioletter» на yabasic: пульсирующий текст без мерцания (Linux fix)

Оживляем текст на yabasic! Математическая маска буквы, эффект "кипения" и секрет быстрой отрисовки без мерцания в Linux.

Скачать бесплатные программы для Yabasic на Windows, Linux, MacOS, PlayStation 2
Аватара пользователя
Anton
Site Admin
Сообщения: 261
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Тема касается GNU\Linux Эффект «Bioletter» на yabasic: пульсирующий текст без мерцания (Linux fix)

Сообщение Anton »

Эффект «Bioletter» на yabasic: пульсирующий текст без мерцания (Linux fix)
Эффект «Bioletter»

Этот эффект превращает обычный текст в пульсирующую неоновую материю. Буква «B» формируется математически (без использования шрифтов), а затем каждая её точка начинает хаотично «кипеть» и светиться.

⚡ Секрет отсутствия мерцания:
При переносе старых графических примеров с Windows на Linux пользователи часто сталкиваются с диким мерцанием. Это происходит из-за того, что функция circle в Linux работает крайне медленно, а clear window мгновенно заливает экран черным, оставляя пустоту на время расчетов.

В этом коде мы обошли проблему:
  • Используем только быструю команду fill rect (даже для имитации округлых форм).
  • Применяем точечную очистку: вместо стирания всего экрана мы закрашиваем черным только маленький квадрат вокруг старой точки и тут же рисуем на её месте новую. Экран никогда не остается пустым!
Управление: Нажмите Esc в окне терминала для выхода (не забываем про обязательный clear screen для работы inkey$).

Листинг кода:

Код: Выделить всё

// 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
У вас нет необходимых прав для просмотра вложений в этом сообщении.