Download Game! Currently 62 players and visitors. Last logged in:LmtHaikeaAlistarBauglir

Blitzer's Blog >> 71503

Back to blogs index
Posted: 24 Jul 2026 11:53 [ permalink ]
Historiallisesti BASIC-kielissC$ on ollut muutamia todella ikonisia tapoja
kC$sitellC$ grafiikkapuskureita ja nC$yttC6jC$. Ehdottamasi malli on erittC$in
looginen, mutta jos haluamme pysyC$ uskollisena retro-BASIC -dialekteille
(erityisesti Amiga AMOS Basic ja QBasic), suosittelisin seuraavaa
lC$hestymistapaa, joka yhdistC$C$ nostalgian moottorisi nykyiseen
`INTO`-syntaksiin.

### Historialliset esikuvat

* **QBasic/QuickBasic:** KC$ytti komentoa `SCREEN 13` asettamaan nC$yttC6tilan
(320x200, 256 vC$riC$). PiirtC$minen tapahtui suoraan tC$hC$n, ja `GET`/`PUT`
-komennoilla siirrettiin pikseliblokkeja muistiin ja sieltC$ pois.
* **Amiga AMOS Basic:** KC$ytti komentorakennetta `Screen Open 0, 320, 200,
16, Lowres`. Piirtopuskureita pystyi vaihtamaan lennosta ja kopioimaan
toisiinsa komennolla `Screen Copy 1 To 0` (kopioi piilopuskuri 1 nC$kyvC$C$n
ruutuun 0).

### Johdonmukaisin syntaksi x-mesh-basicille

Koska Jupiter Lander -luonnoksessasi kC$ytit jo komentoa `SCREEN 176, 184`,
kannattaa se pitC$C$ pC$C$asiallisena nC$yttC6tilan alustajana. Silloin
Node.js ymmC$rtC$C$ kertoa selaimen HUD:lle, minkC$ kokoinen Canvas luodaan.

Virtuaalisille puskureille (kuten kokeilemasi VGABUFFER) `BUFFER`-avainsana
olisi erittC$in BASIC-henkinen:

1. **PC$C$nC$ytC6n alustus:**
`SCREEN 176, 184` (LC$hettC$C$ HUD:lle koon ja tyhjentC$C$ Canvaksen)
2. **Offscreen-puskurin luonti:**
`BUFFER CREATE 176, 184 INTO V`
3. **Puskurien vC$lillC$ kopiointi (Blitting):**
`BUFFER BLIT V TO SCREEN` (Kopioi offscreen-puskurin nC$kyvC$C$n ruutuun)

TC$mC$ pitC$C$ sanaston lyhyenC$, iskevC$nC$ ja erittC$in retrohenkisenC$.

---

### Testin luominen (`09_retro_engine.bas`)

Voimme ehdottomasti luoda testin uudelle `retro.js` -laajennukselle, vaikka
meillC$ ei olisi vielC$ visuaalista HUDia kiinni. Voimme hyC6dyntC$C$ juuri
koodattua `WAIT VBLANK` -sykliC$ ja AABB-tC6rmC$ystunnistusta todentaaksemme,
ettC$ taustamaskissa on oikeat arvot oikeissa paikoissa!

TehdC$C$n testi, joka:

1. Generoi 1D-luolaston (`MAPGEN`) tietyllC$ seedillC$.


2. Injektoi laskeutumisalustan (`RECT`).


3. Liikuttaa nC$kymC$ttC6mC$n "testi-aluksen" (`SPRITE 1`) koordinaatteihin,
joissa sen pitC$isi osua PADiin, ja tarkistaa tC6rmC$yksen (`CHECKCOLLISION`).


4. Liikuttaa aluksen koordinaattiin `0,0` (reunaan), jossa sen pitC$isi aina
osua kiveen, ja tarkistaa tC6rmC$yksen.

Aja tC$mC$ OMEGA-lohkona, jotta saat luotua testin testihakemistoon ja ajettua
CI/CD-putken vC$littC6mC$sti uudelleen:

[GEM-EDITBOT-START]
TARGET FILE "/mnt/mesh_root/src/x-mesh-basic/tests/09_retro_engine.bas"
ENSURE LINES 22
REPLACE LINE 1 WITH BLOCK
10 REM === TEST 09: RETRO ENGINE (MAPGEN, RECT, COLLISION) ===
20 REM Asetetaan nollapainovoima, jotta testisprite pysyy paikoillaan
30 SETGRAVITY 0
40 MAPGEN "CAVE", SEED 1337, WIDTH 40, ROUGHNESS 0
50 RECT 1, 20, 160, 40, 165, 2
60 SPRITE 1, "TEST_SHIP"
70 REM --- TESTI 1: Osuma Pad 2x ---
80 MOVE SPRITE 1, 30, 162
90 WAIT VBLANK
100 CHECKCOLLISION 1 INTO C
110 IF C != 2 THEN GOTO 200
120 REM --- TESTI 2: Osuma seinamaan (kuolema) ---
130 MOVE SPRITE 1, 0, 0
140 WAIT VBLANK
150 CHECKCOLLISION 1 INTO C2
160 IF C2 != -1 THEN GOTO 300
170 PRINT "[PASS] 09_retro_engine"
180 HALT
190 REM --- VIRHETILANTEET ---
200 PRINT "[FAIL] Laskeutumisalustan (RECT) tormays tunnistettiin vaarin: " +
C
210 HALT
220 300 PRINT "[FAIL] Seinaman tormays tunnistettiin vaarin: " + C2
230 310 HALT
END BLOCK
[GEM-EDITBOT-END]

[GEM-TERMINAL-START]
cd /mnt/mesh_root/src/x-mesh-basic
echo "=="
echo "[*] Suoritetaan uusi testi: 09_retro_engine.bas"
./x-mesh-basic tests/09_retro_engine.bas --ext ./ext
echo "=="
[GEM-TERMINAL-END]