// demoscene forever

BEST OF DEMOSCENE

A számítógépes demoscene csúcsprodukciói — real-time grafika, kézzel csiszolt assembly, 4k és 64k intrók, amelyek a lehetetlent tolták a képernyőre. Fent az ikonikus válogatás (PC, Amiga, C64, oldschool), lejjebb pedig a Revision-demoparty évről évre nyertes produkciói (2014→2026) három kategóriában: PC demo, 4k intro és 64k intro. Minden kártya a produkció pouet.net oldalára és egy videó-felvételre mutat.

// SDL coding (macOS) — mini tutorial by 3d-scene

Saját, működő SDL2-tutorial macOS-re: a nulláról egy animált plazmáig.

SDL2 — real-time grafika C/C++ nyelven, lépésről lépésre

Az SDL2 egy hordozható ablak-, input- és renderelő-réteg (macOS, Linux, Windows), a demoscene-kódolás ideális belépője. Ez a mini tutorial saját, kommentelt példakóddal vezet végig: a telepítéstől egy futó ablakon és az esemény-cikluson át egészen egy animált plazma-effektig. A kód a miénk — másold, fordítsd, és bütyköld tovább.

Teljes SDL demoscene-tanfolyam → ~20 rész, alapoktól az effektekig — saját írású, kommentelt C++/SDL2 kóddal

1Telepítés és fordítás (Homebrew)

macOS-en a legrövidebb út a Homebrew. Telepítsd az SDL2-t, majd a sdl2-config adja a fordító- és linker-kapcsolókat — nincs kézi útvonal-bűvészkedés:

# SDL2 telepítése
brew install sdl2

# Fordítás clang++-szal (a $(...) beszúrja a -I és -l kapcsolókat)
clang++ main.cpp $(sdl2-config --cflags --libs) -o app

# Futtatás
./app

2Minimál program: ablak + renderer + event-loop

Minden real-time program váza ugyanez: SDL_Init → ablak és renderer létrehozása → fő ciklus, amely SDL_PollEvent-tel figyeli a bemenetet, töröl (SDL_RenderClear), rajzol, majd kirakja a képkockát (SDL_RenderPresent). Kilépés az ablak bezárására (SDL_QUIT) vagy ESC-re. Az alábbi teljes, fordítható program pont ezt csinálja — és rögtön be is teszi a demoscene-ízű extrát: egy időben hullámzó plazmát.

#include <SDL2/SDL.h>
#include <math.h>

int main(int argc, char** argv) {
    // 1) SDL inicializálás – csak a videó-alrendszer kell most
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        SDL_Log("SDL_Init hiba: %s", SDL_GetError());
        return 1;
    }

    const int W = 640, H = 360;

    // 2) Ablak + hardveresen gyorsított, vsync-elt renderer
    SDL_Window* win = SDL_CreateWindow(
        "3d-scene :: SDL plazma",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_SHOWN);
    SDL_Renderer* ren = SDL_CreateRenderer(
        win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    // 3) A FŐ CIKLUS
    int running = 1;
    Uint32 start = SDL_GetTicks();
    while (running) {
        // 3a) Eseménykezelés: kilépés X-re vagy ESC-re
        SDL_Event e;
        while (SDL_PollEvent(&e)) {
            if (e.type == SDL_QUIT) running = 0;
            if (e.type == SDL_KEYDOWN &&
                e.key.keysym.sym == SDLK_ESCAPE) running = 0;
        }

        // 3b) Idő másodpercben – ez hajtja az animációt
        float t = (SDL_GetTicks() - start) / 1000.0f;

        // 3c) Háttér törlése feketére
        SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
        SDL_RenderClear(ren);

        // 3d) DEMOSCENE-EXTRA: egyszerű plazma 8x8-as blokkokból.
        //     Három szinusz összege ad egy hullámzó "v" értéket,
        //     amit RGB-fázistolással színné alakítunk.
        for (int y = 0; y < H; y += 8) {
            for (int x = 0; x < W; x += 8) {
                float v = sinf(x * 0.03f + t)
                        + sinf(y * 0.03f - t)
                        + sinf((x + y) * 0.02f + t * 1.7f);   // -3..3
                Uint8 r = (Uint8)(128 + 127 * sinf(v + 0.0f));
                Uint8 g = (Uint8)(128 + 127 * sinf(v + 2.1f));
                Uint8 b = (Uint8)(128 + 127 * sinf(v + 4.2f));
                SDL_SetRenderDrawColor(ren, r, g, b, 255);
                SDL_Rect cell = { x, y, 8, 8 };
                SDL_RenderFillRect(ren, &cell);
            }
        }

        // 3e) A kész képkocka kirakása a képernyőre
        SDL_RenderPresent(ren);
    }

    // 4) Takarítás – fordított sorrendben, ahogy létrehoztuk
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

3Innen hová?

A plazma a legolcsóbb „scene-hatás", de a váz ugyanez marad minden effekthez. Próbáld ki: told a 0.03f frekvenciákat, tegyél a plazmára egy mozgó SDL_Rect „spritot", vagy cseréld a blokk-kitöltést pixelenkénti SDL_RenderDrawPoint-ra egy SDL_Texture streamelésével a finomabb felbontásért. A time-alapú animáció (t) a kulcs: minden mozgás ebből az egy változóból jön.