Kirjautuminen

Haku

Tehtävät

Koodit: QB: Tiilenmurskaus (LameVGA)

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

Kommentit

odys [22.07.2003 21:49:31]

#

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

Gwaur [23.07.2003 20:05:49]

#

supah

Antti Laaksonen [24.07.2003 02:44:28]

#

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.

Gwaur [24.07.2003 03:15:40]

#

Hienosti selitetty!

Antti Laaksonen [25.07.2003 00:13:14]

#

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.

T.M. [06.08.2003 22:04:02]

#

ihan siisti on. vinkin otsikossa kirjoitusvirhe

Meitsi [28.08.2003 17:54:47]

#

Tossa on bugi: kun pallo menee ihan blokin vierestä, muttei kuitenkaan osu, palikka "hajoaa". screenshotti: http://www.freewebs.com/dizzy_productions_fin/bugi.jpg

Meitsi [28.08.2003 17:55:45]

#

toi mun linkki ei toimi, syytä en tiedä. kopsatkaa osoteriville.

Stume [30.01.2004 17:57:30]

#

<a href="WWW.PELISIVUT.ORG">PELISIVUT</a></td>

Juhko [28.10.2006 18:47:00]

#

Hienolta näyttää, mutta Macissa DosBoxilla ajettuna ei pääse kesken pois. Täytyy hukata kaikki pallot...

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta