Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Manuaalisesti ohjattava 3D-Starfield

Sivun loppuun

Gwaur [10.10.2003 21:24:47]

#

Tässä tulee manuaalisesti ohjattava 3D-starfield. Kameraa voi käännellä vapaasti nuolinäppäimillä. Koodi saattaa olla hiukan epäselvää, mutta toivottavasti kaikki tajuavat missä mennään. Olen koittanut kommentoida parhaani mukaan.

TYPE star
   x AS INTEGER
   y AS INTEGER
   z AS INTEGER
   sx AS INTEGER
   sy AS INTEGER
END TYPE

SCREEN 13

'Tehdään paletti
OUT &H3C8, 0
FOR c = 0 TO 255
  OUT &H3C9, INT(c / 4)
  OUT &H3C9, INT(c / 4)
  OUT &H3C9, INT(c / 4)
NEXT

nopeus = .1 'mitä suurempi, sen hitaampi
s = 25
cx = 160 '2D-ruudun keskikohta x-suunnassa
cy = 100 '---------''--------- y-suunnassa
tahtia = 200 'tähtien määrä. 200 toimii hyvin P133MHz-koneella

DIM tahti(1 TO tahtia) AS star

DO
   b = b + 1 'jos b > 1 niin uusi tähti ilmestyy mahdollisimman kauas
             'jos ei niin uusi tähti voi yhtäkkiä ilmestyä kameran eteen :D

   'reunojen koordinaatioviivojen tyhjennys (voi poistaa)
   'jos poistat, kannattaa myös SELECT CASE:n jälkeisetkin
   'poistaa

   LINE (cx - 25, 1)-(cx + 25, 1), 0
   LINE (cx, 1)-(cx, 25), 0

   LINE (cx - 25, 199)-(cx + 25, 199), 0
   LINE (cx, 199)-(cx, 199 - 25), 0

   LINE (1, cy)-(25, cy), 0
   LINE (1, cy - 25)-(1, cy + 25), 0

   LINE (319 - 25, cy)-(319, cy), 0
   LINE (319, cy - 25)-(319, cy + 25), 0


   SELECT CASE INKEY$    'Tunnistetaan näppäinpainallukset
      CASE CHR$(0) + "K" 'vasemmalle
         cx = cx + 1
      CASE CHR$(0) + "M" 'oikealle
         cx = cx - 1
      CASE CHR$(0) + "P" 'alas
         cy = cy - 1
      CASE CHR$(0) + "H" 'ylös
         cy = cy + 1
      CASE CHR$(27)      'ESC
         END
   END SELECT

   'Jos poistit ennen SELECT CASE:a olevat viivahommelit,
   'kannattaa nämäkin poistaa!
   'Nämä viivat siis näyttävät minnepäin lennetään. Lento
   'ei siis tapahdu sinnepäin minne kamera osoittaa, vaan
   'kokoajan samaan suuntaan.

   LINE (cx - 25, 1)-(cx + 25, 1), 255
   LINE (cx, 1)-(cx, 25), 255

   LINE (cx - 25, 199)-(cx + 25, 199), 255
   LINE (cx, 199)-(cx, 199 - 25), 255

   LINE (1, cy)-(25, cy), 255
   LINE (1, cy - 25)-(1, cy + 25), 255

   LINE (319 - 25, cy)-(319, cy), 255
   LINE (319, cy - 25)-(319, cy + 25), 255

   FOR I = 1 TO tahtia
      IF tahti(I).z <= 3 THEN 'jos tähti on tarpeeksi lähellä
         PSET (tahti(I).sx, tahti(I).sy), 0     'tähden poistaminen
         PSET (tahti(I).sx + 1, tahti(I).sy), 0
         PSET (tahti(I).sx - 1, tahti(I).sy), 0
         PSET (tahti(I).sx, tahti(I).sy + 1), 0
         PSET (tahti(I).sx, tahti(I).sy - 1), 0

         tahti(I).x = INT(RND * 1000) 'arvotaan tähdelle uudet koordit
         tahti(I).y = INT(RND * 600)

         IF b < 2 THEN tahti(I).z = INT(RND * 255) + 1 ELSE tahti(I).z = 255

         IF (INT(RND * 2) = 0) THEN tahti(I).x = -tahti(I).x 'saa tähdet tulla
         IF (INT(RND * 2) = 0) THEN tahti(I).y = -tahti(I).y 'myös vasemmalle ja
       	                                                     'ylöskin :>

         tahti(I).sx = tahti(I).x * s / tahti(I).z + cx 'lasketaan tähden paikka
         tahti(I).sy = tahti(I).y * s / tahti(I).z + cy '2D-ruutuun

         PSET (tahti(I).sx, tahti(I).sy), 255 - tahti(I).z           'piirretään
         PSET (tahti(I).sx + 1, tahti(I).sy), (255 - tahti(I).z) / 2 'tähti
         PSET (tahti(I).sx - 1, tahti(I).sy), (255 - tahti(I).z) / 2
         PSET (tahti(I).sx, tahti(I).sy + 1), (255 - tahti(I).z) / 2
         PSET (tahti(I).sx, tahti(I).sy - 1), (255 - tahti(I).z) / 2

      ELSE 'jos tähti ei ole vielä tarpeeksi lähellä

         PSET (tahti(I).sx, tahti(I).sy), 0     'tähden poisto
         PSET (tahti(I).sx + 1, tahti(I).sy), 0
         PSET (tahti(I).sx - 1, tahti(I).sy), 0
         PSET (tahti(I).sx, tahti(I).sy + 1), 0
         PSET (tahti(I).sx, tahti(I).sy - 1), 0

         tahti(I).z = tahti(I).z - 1 'siirretään tähti lähemmäksi

         tahti(I).sx = tahti(I).x * s / tahti(I).z + cx 'lasketaan tähen paikka
         tahti(I).sy = tahti(I).y * s / tahti(I).z + cy '2D-ruutuun

         PSET (tahti(I).sx, tahti(I).sy), 255 - tahti(I).z           'piirretään tähti
         PSET (tahti(I).sx + 1, tahti(I).sy), (255 - tahti(I).z) / 2 'lähemmäksi kameraa
         PSET (tahti(I).sx - 1, tahti(I).sy), (255 - tahti(I).z) / 2
         PSET (tahti(I).sx, tahti(I).sy + 1), (255 - tahti(I).z) / 2
         PSET (tahti(I).sx, tahti(I).sy - 1), (255 - tahti(I).z) / 2

      END IF
   NEXT I
   alkuaika = TIMER
   DO: LOOP UNTIL TIMER - alkuaika >= nopeus / 100 'hidastus
LOOP

T.M. [11.10.2003 03:15:15]

#

muuten hieno, paitsi että kun liikuttaa kameraa pitämällä näppäintä pohjassa - ei kestä kauaakaan, kunnes speakeristä kuuluu pitkä piiiiip :O tylsää ku tähdet loppuu kesken :(

Gwaur [11.10.2003 10:50:07]

#

no enpäs tiedäkään miten poistetaan se liian-kauan-nappi-pohjassa-niin-tulee-piip juttu

Gwaur [11.10.2003 11:42:07]

#

tähdet loppuu kesken! hui kauhia :(

Gwaur [11.10.2003 11:44:09]

#

korjasin vian :)

rndprogy [11.10.2003 14:31:38]

#

korjaa se tohon koodivinkkiinki saman tien

Gwaur [11.10.2003 17:54:26]

#

korjasin jo kun sanoin "korjasin vian"

Herne [12.10.2003 14:40:26]

#

Se tais tarkottaa että korjas "loppuvat tähdet" bugin

rndprogy [12.10.2003 15:08:01]

#

Ainakin se vielä piippaa jos tarkotit että oot muka korjannu sen vian.

rndprogy [12.10.2003 18:45:15]

#

ai sori mul ei ollu tota herneen kommenttii tosa ennenku mä kirjotin ton edellisen.

Gwaur [14.10.2003 21:18:14]

#

Herne on oikeessa :)

comi [22.11.2003 15:50:46]

#

ihan mukavan näkönen ja toimiva koodin pätkä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta