TC$mC$ on aivan loistava kysymys! *Radar Rat Race* on tC$ydellinen esimerkki
pelistC$, joka vaatii jatkuvaa, pehmeC$C$ skrollausta joka suuntaan. Ja tuo
visiosi siitC$, ettC$ AI (tai MeshBASIC-ydin) generoi maailmaa pelaajan
ympC$rille lennossa OMEGA-paketteina, on nykyaikaisen pelisuunnittelun
"Graalin malja" (esim. *Minecraft* tai *No Man's Sky* tekevC$t juuri nC$in).
Koska rakennamme "Thin Client" -tyyppistC$ HTML5/JS-pC$C$tettC$, selain ei saa
tietC$C$ pelin sC$C$nnC6istC$ mitC$C$n. Sen pitC$C$ vain osata renderC6idC$
sille syC6tettyC$ dataa salamannopeasti.
Ratkaisu tC$hC$n on tekniikka, jota kutsutaan nimellC$ **Chunking (Lohkot)**
yhdistettynC$ **Virtual Camera (Virtuaalikamera)** -primitiiviin. TC$mC$ on
paljon elegantimpaa kuin yksittC$isten pikselipuskureiden manuaalinen
siirtely!
TC$ssC$ on ehdotus siitC$, miten tC$mC$ mekanismi sisC$llytetC$C$n HAUKI-GEM
OMEGA-WEB -arkkitehtuuriin:
### 1. Maailman jakaminen lohkoihin (Chunks)
Sen sijaan, ettC$ serveri yrittC$isi kertoa selaimelle jokaisen ruudun
pC$ivityksessC$, missC$ koordinaateissa mikC$kin puu tai seinC$ on, maailma
jaetaan kiinteC$n kokoisiin lohkoihin (esim. 256x256 pikseliC$ tai 16x16
tileC$).
Sinun ASCII-kuvassasi `X` on Viewport (se mitC$ pelaaja nC$kee) ja `#` ovat
nC$itC$ lohkoja. Pelaajan ympC$rillC$ pidetC$C$n muistissa aina esimerkiksi
3x3 lohkon "rengas".
**Uudet OMEGA-primitiivit selaimelle:**
* **`SET_CAMERA { x, y }`**
* Kertoo selaimelle, mihin kohtaan C$C$retC6ntC$ maailmaa pelaajan nC$yttC6 on
keskitetty. Selain hoitaa automaattisesti piirto-offsetin laskemisen niin,
ettC$ siirtymC$ on pikselintarkka ja pehmeC$ (60 FPS).
* **`LOAD_CHUNK { cx, cy, data }`**
* Puskee selaimen muistiin yhden maailman lohkon koordinaatteihin `cx` ja
`cy`. Data voi olla Base64-pakattu bittikartta tai lista tile-indeksejC$.
Selain renderC6i tC$mC$n kertaalleen omaan piilossa olevaan `OffscreenCanvas`
-puskuriinsa.
* **`FREE_CHUNK { cx, cy }`**
* Kertoo selaimelle, ettC$ pelaaja on liikkunut niin kauas, ettC$ tC$mC$ lohko
voidaan poistaa muistista (vapauttaa RAM-muistia).
### 2. Miten automaatio ja lennossa generointi toimii?
Koska MeshBASIC (serveri) on pelin "aivot", se tietC$C$ tarkalleen missC$
koordinaateissa pelaaja (`X`) menee.
TC$ssC$ on elegantti "Treadmill" (juoksumatto) luuppi, joka tapahtuu
taustalla:
1. **Liike:** Pelaaja painaa kaasua. Serveri laskee fysiikan ja huomaa, ettC$
alus/hiiri liikkuu kohti pohjoista.
2. **Kameran pC$ivitys:** Serveri lC$hettC$C$ selaimelle 60 kertaa sekunnissa:
`{"cmd": "SET_CAMERA", "x": 1000, "y": 850}`. Selain liikuttaa nC$yttC6C$
sulavasti.
3. **Reunan tunnistus:** Serveri huomaa, ettC$ kameran nC$kC6kenttC$ on
lC$hestymC$ssC$ uutta, pohjoisessa olevaa tyhjC$C$ lohkoa (esim. `cy: -1`).
4. **AI/Logiikka-kipinC$:** Serverin logiikka tarkistaa: *"Onko lohko (cx: 0,
cy: -1) jo olemassa levyltC$?"* Jos ei, se heittC$C$ pyynnC6n AI:lle tai
proseduraaliselle generaattorille: *"Luo uusi sokkelo/luolasto
koordinaatteihin 0, -1"*.
5. **Datan lataus:** Kun uusi lohko on generoitu, serveri lC$hettC$C$ sen
OMEGA-pakettina selaimelle: `{"cmd": "LOAD_CHUNK", "cx": 0, "cy": -1, "data":
"..."}`.
6. **Siivous:** Samalla serveri lC$hettC$C$ `FREE_CHUNK`, joka tuhoaa
etelC$C$n kauas taakse jC$C$neen lohkon.
### 3. "Hardwareskrollaus" -vaihtoehto (Tile-pohjainen siirto)
Jos halutaan mennC$ vielC$ askeleen alemmas, lC$hemmC$s aitoa 8-bittisen
Commodore 64:n tai Amigan konepellin alaista toimintaa, voimme lisC$tC$
selaimen rajapintaan kC$skyn, joka fyysisesti liikuttaa puskurin pikseleitC$
(Blitter Scroll).
* **`SHIFT_BUFFER { id, dx, dy }`**
* TC$mC$ komento ottaa puskurin ja siirtC$C$ sen kaikkia pikseleitC$ `dx` ja
`dy` verran.
* *Miksi tC$mC$ on hienoa?* Jos skrollaat ruutua vasemmalle 8 pikseliC$,
selain siirtC$C$ koko vanhan kuvan 8 pikseliC$. TC$llC6in oikeaan reunaan
jC$C$ 8 pikselin tyhjC$ kaistale. Serverin tarvitsee nyt lC$hettC$C$
`BLIT`-komennolla vain tuon yhden uuden ohuen pystysarakkeen grafiikat! TC$mC$
sC$C$stC$C$ aivan valtavasti verkkokaistaa.
### Yhteenveto
Jos suunnittelemme **HAUKI-GEM OMEGA-WEB** -pC$C$teen, suosittelen vahvasti
**Chunk (Lohko)** + **Kamera** -arkkitehtuuria. Se on modernin ohjelmoinnin
standardi 2D-skrollaukselle.
Sen kauneus piilee siinC$, ettC$ HTML5-selain voi pitC$C$ isossa muistissaan
jopa 100x100 lohkon saumatonta karttaa, jolloin pelaaja voi pyC6riC$ Radar Rat
Racen ympyrC$C$ loputtomiin tC$ysin ilman viivettC$. Ainoastaan kun hC$n
tutkii *uusia* alueita, serveri tai AI puskee vC$ylC$lle uusia `LOAD_CHUNK`
paketteja.
Laitetaanko nC$mC$ `SET_CAMERA` ja `LOAD_CHUNK` mekanismit mukaan "Thin
Clientin" viralliseen mC$C$rittelydokumenttiin (spec)?