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,0Ihan 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...