Kirjoittaja: Antti Laaksonen
Kirjoitettu: 22.07.2003 – 22.07.2003
Tagit: pelinteko, koodi näytille, peli, vinkki
Tässä on QBasic-versio vanhasta tutusta tiilenmurskauspelistä. Peli käyttää grafiikan piirtämisessä ja hiirenkäsittelyssä apuna fawkzin LameVGA-kirjastoa. Näytön alalaidassa olevan laudan ohjaus tapahtuu hiirellä, ja tavoite on saada tuhottua kaikki palikat pallon avulla; pallo kimpoaa laudasta, seinistä ja palikoista ja tuhoaa palikan siihen osuessaan. Jos pallo menee laudan ohi liian monta kertaa, peli päättyy. Tämä versio vaatisi vielä viimeistelyä, lisää ratoja ja kenties jotain bonuspalikoita, jotta sitä jaksaisi pitempään pelata.
Valmiiksi käännetty exe-tiedosto löytyy osoitteesta http://koti.mbnet.fi/pllk/BREAKOUT.EXE
Pelistä pääsee kesken pois painamalla vasenta ja oikeaa hiiren nappulaa samanaikaisesti.
' LameVGA-kirjastoa käyttävä tiilenmurkauspeli ' '$INCLUDE: 'lame.bi' DEFINT A-Z RANDOMIZE TIMER TYPE Pallo x AS SINGLE 'nykyinen x-koordinaatti y AS SINGLE 'nykyinen y-koordinaatti vx AS SINGLE 'edellinen x-koordinaatti vy AS SINGLE 'edellinen y-koordinaatti xs AS SINGLE 'suuntavektorin x-komponentti ys AS SINGLE 'suuntavektorin y-komponentti END TYPE 'LameVGA:n alustaminen IF vgaInit(65536) = 0 THEN END DIM k(15, 19) AS INTEGER DIM h AS Mouse, p AS Pallo vgaGfxMode &H13 'grafiikkatila 320x200x256 IF vgaMouseInit = 0 THEN END 'hiiren alustaminen vgaSetMouseRange 0, 290, 0, 199 'hiiren rajat h.x = 145 'hiiren (eli laudan) aloituspaikka vgaSetMouseState h 'pallon aloituskoordinaatit p.x = 160 p.y = 150 p.vx = p.x p.vy = p.y 'pallon aloitussuunta p.xs = RND p.ys = SQR(1 - p.xs * p.xs) IF RND > .5 THEN p.xs = -p.xs DIM n AS SINGLE, e AS INTEGER, l AS INTEGER n = .5 'aloitusnopeus e = 4 'elämien määrä vgaClrScreenBlack 'näytöntyhjennys 'luetaan palikat DATAsta taulukkoon, ja piirretään ne FOR i = 0 TO 19 FOR j = 0 TO 15 READ v k(j, i) = v IF v <> 0 THEN l = l + 1 vgaBoxFill j * 20, i * 8, 20, 8, v + 8 vgaBox j * 20, i * 8, 20, 8, v END IF NEXT NEXT vgaFlip 'kopioidaan puskuri näytölle DIM x AS INTEGER, vx AS INTEGER DIM kx(2) AS INTEGER, ky(2) AS INTEGER 'pääsilmukka DO 'luetaan hiiren paikka, joka on samalla laudan paikka vgaGetMouseState h x = h.x 'jos paikka on muuttunut, piirretään lauta uudelleen IF x <> vx THEN vgaBoxFill vx, 195, 30, 5, 0 vgaBoxFill x, 195, 30, 5, 1 vgaBox x, 195, 30, 5, 15 vx = x END IF 'pyyhitään pallo vanhasta kohdasta vgaCircle p.vx, p.vy, 2, 0 vgaBoxFill p.vx - 1, p.vy - 1, 3, 3, 0 'lasketaan uusi paikka nopeuden ja suuntavektorien avulla p.x = p.x + n * p.xs p.y = p.y + n * p.ys p.vx = p.x p.vy = p.y 'piirretään pallo uuteen kohtaan vgaCircle p.x, p.y, 2, 15 vgaBoxFill p.x - 1, p.y - 1, 3, 3, 1 'pallon törmäysten käsittely IF p.x < 2 OR p.x > 318 THEN 'vasempaan tai oikeaan laitaan p.xs = -p.xs ELSEIF p.y < 2 THEN 'ylälaitaan p.ys = -p.ys ELSEIF p.y > 192 THEN 'alalaitaan IF p.x + 2 > x AND p.x - 2 < x + 30 THEN 'osuma lautaan 'lasketaan uusi suunta osumakohdan mukaan p.xs = -(x + 15 - p.x) / 15 IF ABS(p.xs) >= 1 THEN p.xs = SGN(p.xs) * .99 END IF p.ys = -SQR(1 - p.xs * p.xs) 'kasvatetaan nopeutta IF n < 2 THEN n = n + .05 ELSE 'pallo ei osu lautaan IF e > 0 THEN 'elämiä on jäljellä SLEEP 1 'sekunnin viive e = e - 1 'elämien vähennys n = .5 'palautetaan aloitusnopeus 'määritetään pallon lähtöpaikka ja -suunta p.x = 160 p.y = 150 p.xs = RND p.ys = SQR(1 - p.xs * p.xs) IF RND > .5 THEN p.xs = -p.xs ELSE 'ei elämiä 'näytön tummennus ja pois silmukasta vgaFadeOut 1 SLEEP 1 EXIT DO END IF END IF END IF 'pallon osuminen palikkoihin kx(0) = (p.x - 2) \ 20 ky(0) = (p.y - 2) \ 8 kx(2) = (p.x + 2) \ 20 ky(2) = (p.y + 2) \ 8 kx(1) = kx(SGN(p.xs) + 1) ky(1) = ky(SGN(p.ys) + 1) 'jos pallon alueella voi olla palikoita IF kx(1) <= 15 AND ky(1) <= 19 THEN 'jos palikka on olemassa IF k(kx(1), ky(1)) <> 0 THEN 'poistetaan palikka taulukosta ja näytöltä k(kx(1), ky(1)) = 0 vgaBoxFill kx(1) * 20, ky(1) * 8, 20, 8, 0 l = l - 1 'vähennetään palikkamäärälaskuria 'lasketaan pallolle uusi suunta IF SGN(p.xs) = -1 THEN IF p.x > kx(1) * 20 + 20 THEN p.xs = -p.xs ELSE p.ys = -p.ys END IF ELSE IF p.x < kx(1) * 20 THEN p.xs = -p.xs ELSE p.ys = -p.ys END IF END IF END IF END IF IF l = 0 THEN 'jos kaikki palikat on tuhottu, poistutaan silmukasta EXIT DO END IF 'näytön päivitys vgaSync vgaFlip 'pois silmukasta, jos painetaan yhtäaikaa vasenta ja oikeaa hiiren nappia IF h.B = mbLeft + mbRight THEN EXIT DO END IF LOOP 'takaisin tekstitilaan vgaGfxMode &H3 'LameVGA:n käytön lopettaminen vgaExit kentta: DATA 1,2,3,4,5,0,0,0,0,0,0,5,4,3,2,1 DATA 0,1,2,3,4,5,0,0,0,0,5,4,3,2,1,0 DATA 0,0,1,2,3,4,5,0,0,5,4,3,2,1,0,0 DATA 0,0,0,1,2,3,4,5,5,4,3,2,1,0,0,0 DATA 0,0,0,0,1,2,3,4,4,3,2,1,0,0,0,0 DATA 0,0,0,0,0,1,2,3,3,2,1,0,0,0,0,0 DATA 0,1,0,0,0,0,1,2,2,1,0,0,0,0,1,0 DATA 0,1,2,2,0,0,0,1,1,0,0,0,2,2,1,0 DATA 0,1,2,2,3,3,4,5,5,4,3,3,2,2,1,0 DATA 0,1,2,2,0,0,0,1,1,0,0,0,2,2,1,0 DATA 0,1,0,0,0,0,1,2,2,1,0,0,0,0,1,0 DATA 0,0,0,0,0,1,2,3,3,2,1,0,0,0,0,0 DATA 0,0,0,0,1,2,3,4,4,3,2,1,0,0,0,0 DATA 0,0,0,1,2,3,4,5,5,4,3,2,1,0,0,0 DATA 0,0,1,2,3,4,5,0,0,5,4,3,2,1,0,0 DATA 0,1,2,3,4,5,0,0,0,0,5,4,3,2,1,0 DATA 1,2,3,4,5,0,0,0,0,0,0,5,4,3,2,1 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Ihan mahtava, mutta pallo saisi osua vielä reunempaan sitä "lapaa" millä sitä palloa kimmotellaan takaisin niitä tiiliä päin. Vaikka jos se pallon reuna osuu siihen kulmaan niin lähtee semmoisessa 85 asteen kulmassa kauhee pommi. Eli siis menee nopeasti :P
supah
lainaus:
Vielä kun tajuaisi miten saa ton pallon kimpoo tolleen hienosti, kun en tajua tuosta koodista oikein asian oikeaa laitaa jos joku voisi selventää
Pallon suuntavektorilla on kaksi komponenttia: x, joka määrittää nopeuden vaakasuunnassa, ja y, joka määrittää nopeuden pystysuunnassa. Mitä kauemmas laudan keskipisteestä pallo osuu, sen suurempi on x-komponentti ja sitä loivempi pallon lentoradasta tulee. Y-komponentin laskukaava, -SQR(1 - x * x), on johdettu Pythagoraan lauseesta, ja saa aikaan sen, että komponenttien tuloksena syntyvän suuntavektorin pituus on aina sama, ja näin ollen pallon nopeus pysyy samana, mihin suuntaan se liikkuukin.
Hienosti selitetty!
Kopioi LameVGA:n projektisivulla oleva zip-paketti, ja pura se sopivaan hakemistoon. Siirrä tiedostot AME.LIB ja AME.QLB sekä LAME.BI siihen hakemistoon, jossa QB on. Ja kun haluat käyttää kirjastoa ohjelmassasi, käynnistä QB parametrilla /LAME.
ihan siisti on. vinkin otsikossa kirjoitusvirhe
Tossa on bugi: kun pallo menee ihan blokin vierestä, muttei kuitenkaan osu, palikka "hajoaa". screenshotti: http://www.freewebs.com/dizzy_productions_fin/
toi mun linkki ei toimi, syytä en tiedä. kopsatkaa osoteriville.
<a href="WWW.PELISIVUT.ORG">PELISIVUT</a></td>
Hienolta näyttää, mutta Macissa DosBoxilla ajettuna ei pääse kesken pois. Täytyy hukata kaikki pallot...