Kirjautuminen

Haku

Tehtävät

Koodit: QB: Tekstuurimappaus

Kirjoittaja: Antti Laaksonen

Kirjoitettu: 19.03.2002 – 19.03.2002

Tagit: grafiikka, koodi näytille, vinkki

Tekstuurimappaus ei välttämättä ole kaikkein korrekteinta suomea, mutta kuitenkin sana on tärkeä 3d-pelien ym. teossa. Kuvaa siis venytetään haluttuun muotoon, ja sillä voi päällystää muuten yksivärisiä pintoja. QBasic ei välttämättä ole paras kieli tällaisten pelien tekoon, mutta tässä on kuitenkin yksi yritys.

Ohjelma näyttää ensin kirjaimet Q, B, a, s, i ja c zoomaten ja sitten pyörittää ja zoomaa tekstiä QBasic.

Nopeus riippuu tietenkin koneen nopeudesta, joten nopeasta koneesta ei suuremmin haittaa ole.

Pääohjelma

DECLARE SUB TexMap (kuva() AS INTEGER, paikat AS ANY, l AS INTEGER, k AS INTEGER, moodi AS INTEGER)

'uudet paikat sisältävä tyyppi
TYPE tpaikat
  x1 AS SINGLE
  y1 AS SINGLE
  x2 AS SINGLE
  y2 AS SINGLE
  x3 AS SINGLE
  y3 AS SINGLE
  x4 AS SINGLE
  y4 AS SINGLE
END TYPE

TYPE tkohta
  X AS SINGLE
  Y AS SINGLE
END TYPE

'taulukot kuville
DIM Q(9, 15) AS INTEGER
DIM b(9, 15) AS INTEGER
DIM a(9, 15) AS INTEGER
DIM s(9, 15) AS INTEGER
DIM i(9, 15) AS INTEGER
DIM c(9, 15) AS INTEGER
DIM kuva(60, 25) AS INTEGER

SCREEN 13

COLOR 1: PRINT "Q";
COLOR 2: PRINT "B";
COLOR 3: PRINT "a";
COLOR 4: PRINT "s";
COLOR 5: PRINT "i";
COLOR 6: PRINT "c";


'luetaan kirjaimet
FOR i = 0 TO 7
  FOR j = 0 TO 13
    Q(i + 1, j + 1) = POINT(i, j)
    b(i + 1, j + 1) = POINT(i + 8, j)
    a(i + 1, j + 1) = POINT(i + 16, j)
    s(i + 1, j + 1) = POINT(i + 24, j)
    i(i + 1, j + 1) = POINT(i + 32, j)
    c(i + 1, j + 1) = POINT(i + 40, j)
  NEXT
NEXT
'luetaan koko teksti
FOR i = 0 TO 47
  FOR j = 0 TO 13
    kuva(i + 5, j + 5) = POINT(i, j)
  NEXT
NEXT

DIM paikat AS tpaikat

'kukin kirjain näytetään vuorollaan
FOR h = 1 TO 6
  'aloituspaikat
  paikat.x1 = 160 - 2
  paikat.y1 = 100 - 2
  paikat.x2 = 160 + 2
  paikat.y2 = 100 - 2
  paikat.x3 = 160 - 2
  paikat.y3 = 100 + 2
  paikat.x4 = 160 + 2
  paikat.y4 = 100 + 2
  CLS
  FOR i = 1 TO 35
    'uudet paikat
    paikat.x1 = paikat.x1 - 2
    paikat.x2 = paikat.x2 + 4
    paikat.x3 = paikat.x3 - 2
    paikat.x4 = paikat.x4 + 4
    paikat.y1 = paikat.y1 - 2
    paikat.y2 = paikat.y2 - 2
    paikat.y3 = paikat.y3 + 4
    paikat.y4 = paikat.y4 + 4
    'mikä kirjain?
    SELECT CASE h
    CASE 1
      TexMap Q(), paikat, 8, 15, 2
    CASE 2
      TexMap b(), paikat, 8, 15, 2
    CASE 3
      TexMap a(), paikat, 8, 15, 2
    CASE 4
      TexMap s(), paikat, 8, 15, 2
    CASE 5
      TexMap i(), paikat, 8, 15, 2
    CASE 6
      TexMap c(), paikat, 8, 15, 2
    END SELECT
    'hidaste
    WAIT &H3DA, 8
  NEXT
NEXT
CLS

'koko tekstin pyöritys+zoomaus
pii = 4 * ATN(1)
'aloituskohdat
ak = 0
bk = pii / 2
ck = pii
dk = pii + pii / 2
keskix = 160 - 50 / 2
keskiy = 100 - 15 / 2
koko = 1
FOR i = 0 TO 275
  'pyörittäminen
  ak = ak + .2: IF ak >= 2 * pii THEN ak = 0
  bk = bk + .2: IF bk >= 2 * pii THEN bk = 0
  ck = ck + .2: IF ck >= 2 * pii THEN ck = 0
  dk = dk + .2: IF dk >= 2 * pii THEN dk = 0
  'koon lisäys
  koko = koko + .5
  'uusien paikkojen laskenta
  paikat.x1 = keskix + koko * SIN(ak)
  paikat.y1 = keskiy + koko * COS(ak)
  paikat.x3 = keskix + koko * SIN(bk)
  paikat.y3 = keskiy + koko * COS(bk)
  paikat.x4 = keskix + koko * SIN(ck)
  paikat.y4 = keskiy + koko * COS(ck)
  paikat.x2 = keskix + koko * SIN(dk)
  paikat.y2 = keskiy + koko * COS(dk)
  'piirtäminen
  TexMap kuva(), paikat, 60, 25, 2
NEXT

Aliohjelma TexMap

SUB TexMap (kuva() AS INTEGER, paikat AS tpaikat, l AS INTEGER, k AS INTEGER, moodi AS INTEGER)
  DIM uudet(l + 1, k + 1) AS tkohta

  'uusien x-arvojen laskeminen
  XVK = ((paikat.x3 - paikat.x1) / k)
  XOK = ((paikat.x4 - paikat.x2) / k)
  XV = paikat.x1
  XO = paikat.x2
  FOR i = 1 TO k
    XV = XV + XVK
    XO = XO + XOK
    Askel = ((XO - XV) / l)
    FOR j = 1 TO l
      uudet(j, i).X = XV + j * Askel
    NEXT
  NEXT

  'uusien y-arvojen laskeminen
  YYK = ((paikat.y2 - paikat.y1) / l)
  YAK = ((paikat.y4 - paikat.y3) / l)
  YY = paikat.y1
  YA = paikat.y3
  FOR i = 1 TO l
    YY = YY + YYK
    YA = YA + YAK
    Askel = ((YA - YY) / k)
     FOR j = 1 TO k
      uudet(i, j).Y = YY + j * Askel
    NEXT
  NEXT

  'moodi1=piirto ilman taustaa
  'moodi2=piirto taustan kanssa
  'moodi0=vanhan kuvan pyyhkiminen
  IF moodi = 1 THEN
    FOR i = 1 TO l - 1
      FOR j = 1 TO k - 1
        IF kuva(i, j) <> 0 THEN LINE (uudet(i, j).X, uudet(i, j).Y)-(uudet(i + 1, j + 1).X, uudet(i + 1, j + 1).Y), kuva(i, j), BF
      NEXT
    NEXT
  ELSEIF moodi = 2 THEN
    FOR i = 1 TO l - 1
      FOR j = 1 TO k - 1
        LINE (uudet(i, j).X, uudet(i, j).Y)-(uudet(i + 1, j + 1).X, uudet(i + 1, j + 1).Y), kuva(i, j), BF
      NEXT
    NEXT
  ELSEIF moodi = 0 THEN
    FOR i = 1 TO l - 1
      FOR j = 1 TO k - 1
        LINE (uudet(i, j).X, uudet(i, j).Y)-(uudet(i + 1, j + 1).X, uudet(i + 1, j + 1).Y), 0, BF
      NEXT
    NEXT
  END IF
END SUB

Kommentit

Jaakko [20.03.2002 19:36:19]

#

tosi hieno!

Lassi Eronen [25.03.2002 09:48:20]

#

Ei piru sä oot taitava! *respect*

(nimetön) [01.04.2002 12:28:41]

#

No todistetusti ainakin yksi 15-vuotias on tehnyt saman. Tosin C-kielellä. Ei tähän niin sairaasti taitoa tarvita.

Sami [19.02.2003 19:53:49]

#

Hiano on joo, mutta QBasic ei tosiaan sovi oikein tämmöiseen tarkoitukseen. Mulla se kuva viiruili vähän väliä kun se tuli lähemmäksi.

Puhveli [13.03.2004 17:53:34]

#

aika nätti. mäkin huomasin sen viiruilun

Fisher [05.05.2004 19:10:13]

#

do
loop while inkey$ = chr$(27)

taas se unohtui!

Dude [29.07.2007 17:44:47]

#

Fisher kirjoitti:

do
loop while inkey$ = chr$(27)

taas se unohtui!

eikö äly riitä.

Hieno mutta viiruilee.
Edit: Siis tarkootan että sitä ei oo tainnu olla tarkootuskaa pistää.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta