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
NEXTAliohjelma 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 SUBtosi hieno!
Ei piru sä oot taitava! *respect*
No todistetusti ainakin yksi 15-vuotias on tehnyt saman. Tosin C-kielellä. Ei tähän niin sairaasti taitoa tarvita.
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.
aika nätti. mäkin huomasin sen viiruilun
do loop while inkey$ = chr$(27)
taas se unohtui!
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ää.