Jo melko kauan aikaa sitten keskustelussa oli näkynyt pieniä viittauksia, joissa olin puhunut Linkku3D-moottoristani. Ja pian näiden jälkeen julkaisinkin tämän tuotoksen, ja tässä se yhä on.
Kun laitoin The Linkku3D-moottorin Ohjelmointiputkaan, annoin hyvin negatiivisen kuvauksen siitä. Kerroin miten vääristynyt ja hidas se on. Kommentit olivat kuitenkin positiivisia, joten olen nyt poistanut nuo negatiiviset kuvaukset.
Sanon silti edelleen, että Linkku3D-moottori ei varsinaisesti ole mikään kunnon 3D-moottori, vaan olen kyhännyt sen ainoastaan niillä taidoilla, mitä minulla sitä tehdessäni oli. En katsonut tai kopioinut mitään valmiita 3D-kaavoja tms., vaan olen joutunut järkeilemään alusta alkaen ihan itse, miten saisin moottorin luoman maailman näyttämään kolmiulotteiselta. Kunnolliset metodit, kuten esim. Direct3D:n laskukaavat poikkeavat varmasti hyvin paljon minun keinoistani.
Mistä sitten tulee nimi "Linkku"? No siitä, että kun esim. liikut talon ohi, huomaat, miten seinä vääristyy, ja taittuu linkkuun. Kehitteillä oli pian Linkun julkaisun jälkeen eräänlainen "Linkku Correction"-funktio, joka olisi korjannut virheet, mutta siitä ei tullut yhtään mitään. Onneksi kaikki näyttää kohtalaisen realistiselta niin kauan kuin pysyt kauempana objekteista. Kyllä tämä riittää ihan antamaan pelaajalle tunnelman siitä, että hän on kolmiulotteisessa maailmassa, vaikka talot ovatkin vain rautalankaa.
Jonain päivänä kenties teen paremman moottorin, ehkäpä C++:lla. Tosin voi olla, että siirryn käyttämään suoraan DirectX:ää, tai OpenGL:ää, jolloin voisin suosista hylätä omat kaavani. Hienointa tässä moottorissa on vain se, että se on alusta alkaen tehty itse ilman mitään apukirjastoja, tai ohjeita.
Grafiikkaan sain onneksi parannuksen, kun opin tekemään kaksoispuskuroinnin. Muuten välkkymiseen olisi mennyt hermot. Aika hidas Linkku myös on, mutta voi olla, että saan kaavoja vielä paranneltua nopeammiksi.
Ja sitten sananen itse pelistä:
Pelissä siis ohjataan autoa 3d-maailmassa. Mitään tarkoitusta ei ole, pelkkää ajelua vain, mutta voi olla, että teen tästä oikein pelinkin, kun sitä minulta kerran pyydeltiin.
Näppäimet ovat seuraavat:
Kääntyminen: 4 ja 6
Kaasu: 8, 5
Jarru: b
Kamerakulma: c
Repulsio: *, /
Repulsio saa auton lentämään, jos voima ylittää painovoiman, joka on 10. Ajattelin lisätä senkin mukaan, vaikkei se nyt ihan autopeliin kuulukaan. Saapahan ainakin jonkinlaisen kuvan siitä, miten Linkku näyttää maailmaa lintuperspektiivistä.
Huom! Pelissä olevien talojen määrää voi vaihtaa muokkaamalla "palikka"-muuttujan määrittämistä. Vakio on 20, jota voi vaihtaa. Palikka-muuttuja löytyy ohjleman 26. riviltä, ellen väärin laskenut.
Ja huom!
Joskus talo saatetaan arpoa samaan kohtaan, mistä auto aloittaa. Tällöinen ei pääse liikkeelle ja on käynnistettävä ohjelma uudestaan.
Koodia ei kannata ruveta tutkimaan, ellei ole kiinnostunut ja perehtynyt näihin asioihin. Se on sekavaa, vaikka yritin parhaani mukaan selittää sitä kommentteja säästelemättä.
Ja tästä saa halutessaan vielä EXE:n. Kiitos Rndprogylle, joka teki nopean EXE:n osaamalla asettaa QB:hen oikeat säädöt ja laittoi vielä nettiinkin. :)
http://kotisivu.dnainternet.net/pepeos/Linkku.zip
pääohjelma
DECLARE FUNCTION Angle! () DECLARE FUNCTION Angle2! () DECLARE SUB Laske2d () DECLARE FUNCTION vino! (k!) DECLARE FUNCTION vino2! (k2!) DECLARE FUNCTION Kulma! (X!, Y!, x2!, y2!) COMMON SHARED rad AS DOUBLE COMMON SHARED viiva() COMMON SHARED X, Y, Z, CameraXA, CameraYA, a, eta, x2d, y2d, xx, yy, zz DIM plane(1 TO 100, 1 TO 5) SCREEN 7, 0, 0, 1 'asetetaan sopiva n?ytt? kaksoispuskurointia varten rad = ATN(1) * 4 / 180 'Radiaanisuhde RANDOMIZE TIMER 'Satunnaislukugeneraattori rv = 1 / (240 / 200) 'Korjataan 320/200 <> 4/3 -v??ristym? ON ERROR GOTO VIRHE 'Virherutiini palikka = 20 'Talojen m??r? (saa muuttaa koneen tehon mukaan) viivat = palikka * 12 'Viivoja on 12 per kuutio DIM viiva(1 TO viivat, 1 TO 6) 'Aloituskoordinaatit: kx = 0 ky = 0 kz = 0 'Lasketaan kameralle paikka: icp = 0 'Kameran kuvauskulma X = kx Y = 500 + ky Z = 200 'Kameran kulmat CameraXA = 0 CameraYA = 90 'Huom! Kameran Y-kulmaa ei t?ss? versiossa voi muuttaa 'Arvotaan talojen sijainnit ja lasketaan viivat niiden mukaan FOR b = 0 TO palikka - 1 px = -500 * palikka + INT(RND * 1000 * palikka) 'Arvotaan talon x py = -500 * palikka + INT(RND * 1000 * palikka) '... y 'pz = INT(RND * 20000) 'Korkeus? 'Miksih?n j?tin t?m?n pois? :) koko = 100 + INT(RND * 500) 'Arvotaan talon koko korkeus = koko + INT(RND * 3000) 'Korkeus 'Pitk? koodi viivojen laskemiseksi 'T?t? koodia EI kannata ihmeemmin tutkia viiva(b * 12 + 1, 1) = px + koko viiva(b * 12 + 1, 2) = py - koko viiva(b * 12 + 1, 3) = pz + korkeus viiva(b * 12 + 1, 4) = px - koko viiva(b * 12 + 1, 5) = py - koko viiva(b * 12 + 1, 6) = pz + korkeus viiva(b * 12 + 2, 1) = px + koko viiva(b * 12 + 2, 2) = py + koko viiva(b * 12 + 2, 3) = pz + korkeus viiva(b * 12 + 2, 4) = px - koko viiva(b * 12 + 2, 5) = py + koko viiva(b * 12 + 2, 6) = pz + korkeus viiva(b * 12 + 3, 1) = px - koko viiva(b * 12 + 3, 2) = py - koko viiva(b * 12 + 3, 3) = pz + korkeus viiva(b * 12 + 3, 4) = px - koko viiva(b * 12 + 3, 5) = py + koko viiva(b * 12 + 3, 6) = pz + korkeus viiva(b * 12 + 4, 1) = px + koko viiva(b * 12 + 4, 2) = py - koko viiva(b * 12 + 4, 3) = pz + korkeus viiva(b * 12 + 4, 4) = px + koko viiva(b * 12 + 4, 5) = py + koko viiva(b * 12 + 4, 6) = pz + korkeus viiva(b * 12 + 5, 1) = px + koko viiva(b * 12 + 5, 2) = py - koko viiva(b * 12 + 5, 3) = 0 viiva(b * 12 + 5, 4) = px - koko viiva(b * 12 + 5, 5) = py - koko viiva(b * 12 + 5, 6) = 0 viiva(b * 12 + 6, 1) = px + koko viiva(b * 12 + 6, 2) = py + koko viiva(b * 12 + 6, 3) = 0 viiva(b * 12 + 6, 4) = px - koko viiva(b * 12 + 6, 5) = py + koko viiva(b * 12 + 6, 6) = 0 viiva(b * 12 + 7, 1) = px - koko viiva(b * 12 + 7, 2) = py - koko viiva(b * 12 + 7, 3) = 0 viiva(b * 12 + 7, 4) = px - koko viiva(b * 12 + 7, 5) = py + koko viiva(b * 12 + 7, 6) = 0 viiva(b * 12 + 8, 1) = px + koko viiva(b * 12 + 8, 2) = py - koko viiva(b * 12 + 8, 3) = 0 viiva(b * 12 + 8, 4) = px + koko viiva(b * 12 + 8, 5) = py + koko viiva(b * 12 + 8, 6) = 0 viiva(b * 12 + 9, 1) = px - koko viiva(b * 12 + 9, 2) = py + koko viiva(b * 12 + 9, 3) = pz + korkeus viiva(b * 12 + 9, 4) = px - koko viiva(b * 12 + 9, 5) = py + koko viiva(b * 12 + 9, 6) = 0 viiva(b * 12 + 10, 1) = px + koko viiva(b * 12 + 10, 2) = py + koko viiva(b * 12 + 10, 3) = pz + korkeus viiva(b * 12 + 10, 4) = px + koko viiva(b * 12 + 10, 5) = py + koko viiva(b * 12 + 10, 6) = 0 viiva(b * 12 + 11, 1) = px - koko viiva(b * 12 + 11, 2) = py - koko viiva(b * 12 + 11, 3) = pz + korkeus viiva(b * 12 + 11, 4) = px - koko viiva(b * 12 + 11, 5) = py - koko viiva(b * 12 + 11, 6) = 0 viiva(b * 12 + 12, 1) = px + koko viiva(b * 12 + 12, 2) = py - koko viiva(b * 12 + 12, 3) = pz + korkeus viiva(b * 12 + 12, 4) = px + koko viiva(b * 12 + 12, 5) = py - koko viiva(b * 12 + 12, 6) = 0 NEXT b 'Asetetaan "auton" viivojen koordinaatit (auton keskipisteest? katsoen) 'Taulukon nime? ei kannata ruveta ihmettelem??n... plane(1, 1) = 50 plane(1, 2) = 120 plane(1, 3) = 20 plane(2, 1) = -50 plane(2, 2) = 120 plane(2, 3) = 20 plane(3, 1) = 50 plane(3, 2) = 80 plane(3, 3) = 20 plane(4, 1) = -50 plane(4, 2) = 80 plane(4, 3) = 20 plane(5, 1) = 50 plane(5, 2) = 120 plane(5, 3) = 0 plane(6, 1) = -50 plane(6, 2) = 120 plane(6, 3) = 0 plane(7, 1) = 50 plane(7, 2) = -80 plane(7, 3) = 0 plane(8, 1) = -50 plane(8, 2) = -80 plane(8, 3) = 0 plane(9, 1) = 50 plane(9, 2) = -80 plane(9, 3) = 20 plane(10, 1) = -50 plane(10, 2) = -80 plane(10, 3) = 20 plane(11, 1) = 50 plane(11, 2) = -20 plane(11, 3) = 50 plane(12, 1) = -50 plane(12, 2) = -20 plane(12, 3) = 50 plane(13, 1) = 50 plane(13, 2) = 20 plane(13, 3) = 50 plane(14, 1) = -50 plane(14, 2) = 20 plane(14, 3) = 50 'Ja t?st? alkaa itse peli DO 'Piirret??n taivas ja maa LINE (0, 100 - (CameraYA - 90) * 3)-(319, 0), 9, BF LINE (0, 100 - (CameraYA - 90) * 3)-(319, 199), 10, BF 'N?ytet??n koordinaatit, kaasu yms. LOCATE 1, 1: PRINT "X:"; CINT(kx); " Y:"; CINT(ky); " Z"; CINT(kz) LOCATE 2, 1: PRINT "Kaasu"; kaasu * 10; "Ratti"; PXT; "Repulsio"; rep 'T?st? alkaa itse 3d-koordinaattien muuttaminen 2d-koordinaateiksi 'kameran sijainnin ja katselukulmien perusteella FOR a = 1 TO viivat 'silmukka 'T?h?n olisi voitu k?ytt?? funktioita, mutta koska on vain yksi output- 'muuttuja, ja 2d-koordinaatteja on 2, p??tin laittaa muuttujat COMMON 'SHARED:lla jaollisiksi. 'Sub "Laske2d" laskee muuttujat "x2d" ja "y2d" muuttujien "xx", "yy" ja "zz" 'perusteella 'Asetetaan 3d-koordinaatteihin t?ll? hetkell? k?sitelt?v?n viivan koordinaatit xx = viiva(a, 1): yy = viiva(a, 2): zz = viiva(a, 3) Laske2d 'Lasketaan 2d-koordinaatit (t?m? prosessi on koko 'moottorin ydin, sit? voi tutkia jos haluaa) x2d1 = x2d y2d1 = y2d 'Ja sitten tietysti lasketaan viivan toisen p??n koordinaatit xx = viiva(a, 4): yy = viiva(a, 5): zz = viiva(a, 6) Laske2d x2d2 = x2d y2d2 = y2d 'T?ss? testataan, n?kyyk? ruudulla edes viivan toinen p??. Jos n?kyy, 'piirret??n viiva, muuten ei IF (x2d1 >= 0 AND x2d1 <= 319 AND y2d1 >= 0 AND y2d1 < 199) OR (x2d2 >= 0 AND x2d2 <= 319 AND y2d2 >= 0 AND y2d2 < 199) THEN LINE (x2d1, y2d1)-(x2d2, y2d2), 15 NEXT a 'Viivojenpiirtosilmukka loppuu 'Ja sitten silmukka, jolla piirret??n auton viivat FOR a = 1 TO 14 PXA2 = 360 - PXA 'Kulmat meniv?t jotenkin v??rin p?in, joten 'tarvittiin t?llainen 'Lasketaan auton keskipisteeseen perustuvisti 3d-koordinaateista, 'oikeat 3d-koordinaatit auton kulman perusteella. '(perustuu samaan kaavan kuin my?s l?hett?m?ni "py?ritett?v? 3d-pallo") tpx = plane(a, 1) * COS(PXA2 * rad) + plane(a, 2) * SIN(PXA2 * rad) tpy = plane(a, 2) * COS(PXA2 * rad) - plane(a, 1) * SIN(PXA2 * rad) tpz = plane(a, 3) xx = kx - tpx: yy = ky - tpy: zz = kz + tpz: Laske2d 'Ja lasketaan 2d... plane(a, 4) = x2d: plane(a, 5) = y2d NEXT a 'Ja t?ss? sitten vedet??n viivat toisiinsa. Viivojen piirtokaavan olisi 'toki voinut tehd? matriisiin, mutta se olisi vain sekoittanut jo t?t? 'entisest??n sekavaa moottoria 'T?ss? ei tarkistuskaavoja ole, koska ne olisi pit?nyt tehd? jokaiselle 'viivalle erikseen LINE (plane(1, 4), plane(1, 5))-(plane(2, 4), plane(2, 5)), 4 LINE (plane(3, 4), plane(3, 5))-(plane(4, 4), plane(4, 5)), 4 LINE (plane(1, 4), plane(1, 5))-(plane(3, 4), plane(3, 5)), 4 LINE (plane(2, 4), plane(2, 5))-(plane(4, 4), plane(4, 5)), 4 LINE (plane(5, 4), plane(5, 5))-(plane(6, 4), plane(6, 5)), 4 LINE (plane(7, 4), plane(7, 5))-(plane(8, 4), plane(8, 5)), 4 LINE (plane(5, 4), plane(5, 5))-(plane(7, 4), plane(7, 5)), 4 LINE (plane(6, 4), plane(6, 5))-(plane(8, 4), plane(8, 5)), 4 LINE (plane(1, 4), plane(1, 5))-(plane(5, 4), plane(5, 5)), 4 LINE (plane(2, 4), plane(2, 5))-(plane(6, 4), plane(6, 5)), 4 LINE (plane(9, 4), plane(9, 5))-(plane(7, 4), plane(7, 5)), 4 LINE (plane(10, 4), plane(10, 5))-(plane(8, 4), plane(8, 5)), 4 LINE (plane(10, 4), plane(10, 5))-(plane(9, 4), plane(9, 5)), 4 LINE (plane(9, 4), plane(9, 5))-(plane(11, 4), plane(11, 5)), 4 LINE (plane(10, 4), plane(10, 5))-(plane(12, 4), plane(12, 5)), 4 LINE (plane(11, 4), plane(11, 5))-(plane(12, 4), plane(12, 5)), 4 LINE (plane(13, 4), plane(13, 5))-(plane(11, 4), plane(11, 5)), 4 LINE (plane(14, 4), plane(14, 5))-(plane(12, 4), plane(12, 5)), 4 LINE (plane(13, 4), plane(13, 5))-(plane(14, 4), plane(14, 5)), 4 LINE (plane(13, 4), plane(13, 5))-(plane(3, 4), plane(3, 5)), 4 LINE (plane(14, 4), plane(14, 5))-(plane(4, 4), plane(4, 5)), 4 'Ja sitten piirret??n mittari, joka kertoo korkeuden...? CIRCLE (260, 150), 20, 7 LINE (260, 150)-(260 + SIN((225 + kz / 20) * rad) * 20, 150 - COS((225 + kz / 20) * rad) * 20 * rv), 12 'Jos kamerakulma on "ajajan perspektiivi", piirret??n ratti IF icp = 0 THEN ratx = 160 raty = 210 CIRCLE (ratx, raty), 80, 8 CIRCLE (ratx, raty), 90, 8 raku = (PXT - 3) * 20 - 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 raku = (PXT - 3) * 20 + 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 raku = (PXT + 3) * 20 - 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 raku = (PXT + 3) * 20 + 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 raku = (PXT - 9) * 20 - 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 raku = (PXT - 9) * 20 + 5 LINE (ratx, raty)-(ratx + SIN(raku * rad) * 80, raty - COS(raku * rad) * 80 * rv), 8 END IF 'Piirrot on tehty, ja nyt n?ytet??n piirretty kuva. 'Jos kokeilet ottaa t?m?n pois, ja vaihtaa SCREEN 7, 0, 0, 1:sen tilalle 'SCREEN 7, huomaat kyll? eron. PCOPY 0, 1 a$ = INKEY$ 'Luetaan n?pp?in IF a$ = "8" THEN kaasu = kaasu + 1 'N?m? varmaan tajuat selitt?m?tt?kin IF a$ = "5" THEN kaasu = kaasu - 1 IF a$ = "4" THEN PXT = PXT - 1 IF a$ = "6" THEN PXT = PXT + 1 IF a$ = "c" THEN icp = icp + 1 'Kamerakulman vaihto IF a$ = "*" THEN rep = rep + 1 IF a$ = "/" THEN rep = rep - 1 IF icp = 5 THEN icp = 0 vkx = kx: vky = ky: vkz = kz 'Tallennetaan nykyiset koordinaatit, 'silt? varalta, ett? ne pit?? palauttaa 'Force eli f-muuttujissa on tieto siit?, kuinka suurella voimalla auto 'liikkuu tuolla akselilla. xf = xf + SIN(PXA * rad) * kaasu 'X-Forcea lis?t??n kulman ja kaasun mukaan yf = yf - COS(PXA * rad) * kaasu 'Y-Forcea ... zf = zf + rep 'Z-Forcea lis?t??n repulsion mukaan zf = zf - 10 'Z-Forcea v?hennet??n painovoiman takia 'Vaihdetaan koordinaatteja Forcen mukaan kx = kx + xf ky = ky + yf kz = kz + zf 'Kitka tietysti v?hent?? Forcea xf = xf / 1.1 yf = yf / 1.1 zf = zf / 1.1 'Ja jarru vasta v?hent??kin IF a$ = "b" THEN xf = xf / 1.2: yf = yf / 1.2 'Sitten k??nnet??n autoa ratin suunnan mukaan PXA = PXA + PXT IF PXA >= 360 THEN PXA = PXA - 360 IF PXA < 0 THEN PXA = 360 + PXA IF kz < 0 THEN kz = 0: zf = 0 'Katsotaan onko auto talon sis?ll? FOR a = 1 TO viivat 'Lasketaan talojen reunat IF a MOD 12 = 9 THEN v = viiva(a, 1): h = viiva(a, 3): p = viiva(a, 6) IF a MOD 12 = 11 THEN t = viiva(a, 2) IF a MOD 12 = 0 THEN o = viiva(a, 1) IF a MOD 12 = 10 THEN e = viiva(a, 2) 'T?ss? lasketaan onko auto reunojen sis?puolella vai ulkopuolella IF a MOD 12 = 0 THEN IF kx > v AND kx < o AND ky > t AND ky < e AND kz >= p AND kz < h THEN kz = vkz: zf = 0 IF kx > v AND kx < o AND ky > t AND ky < e AND kz >= p AND kz < h THEN kaasu = 0: kx = vkx: ky = vky: kz = vkz: xf = 0: yf = 0 END IF NEXT a 'Lasketaan kameran koordinaatit katseluperspektiivin mukaan IF icp = 0 THEN X = kx: Y = ky: Z = kz + 40 CameraXA = PXA END IF IF icp = 1 THEN CameraXA = Kulma(X + .001, Y, kx, ky) X = kx + SIN((360 - CameraXA) * rad) * 400: Y = ky + COS((360 - CameraXA) * rad) * 400: Z = kz + 150 END IF IF icp = 2 THEN CameraXA = Kulma(X + .001, Y, kx, ky) X = kx + SIN((360 - CameraXA) * rad) * 600: Y = ky + COS((360 - CameraXA) * rad) * 600: Z = kz + 250 END IF IF icp = 3 THEN CameraXA = Kulma(X + .001, Y, kx, ky) END IF IF icp = 4 THEN CameraXA = Kulma(X + .001, Y, kx, ky) X = kx + SIN((360 - PXA) * rad) * 600: Y = ky + COS((360 - PXA) * rad) * 600: Z = kz + 250 END IF LOOP UNTIL a$ = CHR$(27) 'Escist? loppuu END VIRHE: 'Virhe rutiini. Pakko k?ytt?? gotoa, koska ON ERROR RESUME 'ei toimisi kaikilla QB:ill? RESUME NEXT
Kulmanlaskemisaliohjelma
FUNCTION Angle 'Kulman laskemiskaava arkustangentilla aa = xx - X 'Sivut ovat x bb = yy - Y 'ja y IF aa <> 0 AND bb <> 0 THEN k = ATN(bb / aa) / rad l = 180 IF Y < yy THEN l = 0 IF Y = yy THEN l = 0 k = k + l k = k IF k > 0 THEN k = k + 90 IF k > 180 AND k < 270 THEN k = k - 180 ELSE k = k + 270 END IF ELSE '??ritilanteissa IF aa = 0 AND bb < 0 THEN k = 0 IF bb = 0 AND aa > 0 THEN k = 90 IF aa = 0 AND bb > 0 THEN k = 180 IF bb = 0 AND aa < 0 THEN k = 270 END IF Angle = k END FUNCTION FUNCTION Angle2 ***Toinen kulman laskija 'Lasketaan toinen kulma aa = zz - Z 'Sivut ovat tietysti korkeus bb = eta 'ja xy-tason hypotenuusa IF aa <> 0 AND bb <> 0 THEN IF aa >= 0 THEN k2 = 90 - ATN(bb / aa) / rad IF aa < 0 THEN k2 = ABS(ATN(bb / aa) / rad) - 90 ELSE IF aa = 0 THEN k2 = 0 END IF Angle2 = k2 END FUNCTION
Autoa seuraavan kameran kulman laskeminen
FUNCTION Kulma (X, Y, x2, y2) 'Lasketaan kulma kameralle a = x2 - X b = y2 - Y IF a <> 0 AND b <> 0 THEN k = ATN(b / a) / rad l = 180 IF Y < y2 THEN l = 0 IF Y = y2 THEN l = 0 k = k + l IF k > 0 THEN k = k + 90 IF k > 180 AND k < 270 THEN k = k - 180 ELSE k = k + 270 END IF ELSE IF a = 0 AND b < 0 THEN k = 0 IF b = 0 AND a > 0 THEN k = 90 IF a = 0 AND b > 0 THEN k = 180 IF b = 0 AND a < 0 THEN k = 270 END IF Kulma = k END FUNCTION
Pää-aliohjelma 2d-koordinaattien laskemista varten
SUB Laske2d 'Lasketaan kulma k = Angle v = vino(k) 'Lasketaan et?isyys pythagoraan lauseella sa = ABS(xx - X) ^ 2 sb = ABS(yy - Y) ^ 2 sc = sa + sb eta = SQR(sc) 'Lasketaan toinen kulma k2 = Angle2 v2 = vino2(k2) y2d = 100 + v2 * 3 x2d = 160 + v * 3 END SUB FUNCTION vino (k) ***Vino-funktio 1 'Lasketaan 2d-koordinaatti laskettujen kulmien perusteella ri = k - CameraXA le = 360 - ABS(ri) vino = ri IF le < ri THEN vino = -le IF ri < 0 AND ABS(ri) > le THEN vino = le END FUNCTION FUNCTION vino2 (k2) ***Vino-funktio 2 'Lasketaan 2d-koordinaatti laskettujen kulmien perusteella vino2 = -k2 - CameraYA + 90 END FUNCTION
aika kiva.
no HHUHHUHUHU miten hieano!!! Hullua!
Hyvältä näyttää, vaikka sisältääkin pieniä bugeja..!
Pitkä koodi... Täytyypi kokeilla...
Kokeiltu on, ja hieno on, oikeen tosi hieno QB:llä tehdyksi!
Koodi on tosiaan pitkä, mutta siinä on paljon muutakin mukana. Itse moottori, joka laskee pisteet, on vain ehkä 100 riviä.
Mukava kuulla, jos se on teidän mielestänne hieno. Eihän tätä tietenkään pidäkään ottaa minään vakavana 3d-moottorina. Onpahan vain tavallisen koodarin ensimmäinen joten-kuten-toimiva 3d-testi.
Laskeminen toteutetaan lähinnä laskemalla kameran ja pisteen välinen kulma arkustangentilla.
no jos minä tuollaisen osaisin tehdä, niin linnut lentää takaperin MAASSA.
muuten hyvä mutta en voi kokeilla sitä, kun jos kopioin sen se ei suostu liittämään sitä QB:ssä. miten noloa...koetan kestää!
eihän tässä voi enään kuin ihailla tätä!:)
älyttömän hieno kun miettii että tämmöistä saa qb:lla aikaseksi, joskus rakentelin itekkin jotain todella kauheeta moottoria mutta se jäikin siihen että se oli niin älyttömän hidas vaikka oli vain rautalankaa :(
mutta rispektiä! :)
mamaze: Tallenna se muistiossa muotoon tiedosto.bas
Joo, hunaja ansaitsee kyllä hatun-noston tästä. Toimi varsin hyvin. Ite en viitsisi edes aloittaa moista kun kaatuisin jo lähdössä. 10p + papukaija merkki
Oikein hieno.
Niin Mamaze:
Kuten Rndprogy sanoi, koodivinkkejä kokeillaan niin, että kopioidaan teksti Notepadiin ja tallenetaan nimellä: Linkku3d.bas
Sitten se on bas-tiedosto ja sen voi avata QB:llä.
Jos tämä kerran teistä näin hieno on, niin ehkä tällä voisi tulevaisuudessa tehdä muitakin pelejä putkaan lähetettäviksi. :-)
Niin ja antakaa toki lisää kommenttia. Kaikkien mielipide kiinnostaa minua, oli se mikä hyvänsä. :)
joo mä sain sen jo liittämään!
ensin alt+enter, sitten klikkaa oikealla siniseltä ja sieltä liitä.
¨kestää hetken mutta toimii
Täytyypä kokeilla :D
Mulla ei tässä mun koneella toimi DOS-ohjelmat joten ottakaa screenshotteja :D
Yllättävän kivan enginen olet kyhännyt (tuo kuvaus antoi tosiaan hieman negatiivisen kuvan). Purkkamaiselta vaikuttaa mutta ihan kivalta näyttää.
Eniten minua harmittaa tässä se, etten saa toimimaan ylös- ja alaspäin katsomista. Silloin se vasta linkkuun meneekin, mutta tälla lailla suoraan eteenpäin kulkeminen näkyy toimivan.
Minulla ei oikein ole ohjelmaa noiden screenshottien ottamista varten, mutta jos jollain on, niin niitä voi toki ottaa.
hunajavohveli mutta kyllähän tuosta pitäisi voida ottaa screenshotteja ihan vain painamalla dossitilassa print screeniä ja kopioimalla kuva vaikkapa paintiin... (?) jos väärin muistan se toimii näin :) muutes ottaisin ite näitä kuvia mutta kun ei ole tilaa netissä pitää niitä...
ps. vieläkin leikkinyt samaisella moottorilla...
Voisko joku laitta exen nettiin kun ei ole qbtä just nyt saatavilla?
Tuo kuvankaappaus ei oikein toimi kait Windows XP:ssä? Tai ainakaan leikepöydälle ei tullut mitään, vaikka kokeilinkin. Ja netissä ei itselläni ole mitään sivua, mihin voisin pistää. Jos joku teistä tekee EXE:n niin tehkää 7.1:llä niin saadaampahan nopein mahdollinen. Itselläni EXE-kääntö tosin hidastaa mukavasti ohjelmaa.
Tuo hitaus voi johtua 7.1:n kääntö säädöistä. Ja tässä ekse
http://kotisivu.dnainternet.net/pepeos/Linkku.
niin joo. Suoraan minun kotisivuiltani ;)
Joo, tuo tekemäsi EXE tosiaan toimii nopeasti, itse asiassa nopeammin kuin QB:llä. Mitä sieltä säädöistä pitää tehdä, että sen noin saa? Itse, kun olen EXE:ksi kääntänyt, on toiminut paljon hitaammin.
Kieltämättä tää on kyllä ihan siisti. Ratin palautus vois olla jees.
Joo mutta rattiahan ei olekaan sellainen, että se pysyy käännettynä niin kauan, kun pitää pohjassa, vain aina yksi painallus kääntää rattia yhden pykälän. QB:lle on vähän hankala tehdä nappi-pohjassa-systeemiä.
otin säädöistä sen 286 jutun pois. En sitten tiedä vaikuttiko se asiaan.
Tämä on todella mahtava!
Näkyisi vaikuttaneen juuri tuo 286-juttu. Nyt sain itsekin tehtyä nopeamman EXE:n, joka vei juuri saman verran tilaakin, kun sinun tekemäsi EXE, eli kyllä se tuo 286 oli, mikä minulla hidastutti.
eikös 286 ole jokin että se laittaa koneen miettimään kuin 286-tyyliin tai jotain... en tiiä, niin olen kuullut ja sen takia raskaammat ohjelmat/pelit ovat hitaita... mutta pitää muistaa sekin että kun ottaa tuon 286:n pois päältä niin itsepelistä tulee nopeampi koneen tehojen mukaan jos oikeen muistan...
hehe tää on aika kiva :D
pelailin tota varmaa puol tuntii <3
No jopas riitti kiinnostusta. :) Ehkä voisin tehdä tällä jonkin kunnon pelinkin, enkä vain tällaista Freeride-kokeilua. Yritän parhaillani korjata pieniä bugeja... josko sitten saisi jotain aikaan.
tuota joo, yritin tossa lukee koodia ja suomentaa sitä itselleni kuinka se tehdään. Ja tee vain tosta kunnon peli!
Hyvä mutta yksitoikkoinen.
Yksitoikkoinen se epäilemättä on, kun ei mitään tarkoitustakaan ole. Tässähän ei ollut ideana hyvä peli, vaan pääasia oli pelkkä moottori, mutta yritän vääntää tuosta jotain monipuolisempaakin.
Arvaa monta kertaa oon yrittäny laskeutua talon katolle :D
aika upee varsinkin jos kaavat on saanu pohtia yksin. ite olen harrastanut samaa kaavojen pohtimista lähinnä kahdentoista ja puoli kolmen välillä öisin :D
Enpä itte osais... Hieno on.
Eikö katolle laskeutuminen onnistu? Kyllä se ihan mahdollista on. Kannattaa lentää aivan katonrajan tasolla ja pienentää repulsiota sitten kun on aivan katon päällä. Jos lentää liian ylhäällä, on vaikea arvioida, milloin on oikeassa kohdassa.
Heh, joskus tuli itsekin harrastettua tuota samaa, että kahdentoista jälkeen koodaamaan.
Kommenttien tulo yleensä loppuu heti, kun vinkki ei enää ole upouusi, mutta minun puolestani tähän saa lähettää vaikka kymmenen vuoden päästäkin. :)
no en minäkään estä! ihan hieno.. en vaan saa tuosta koodista joistain ososta selvää kun en osaa hallita tuommosta koodia.. paras 3d moottori minkä olen ikinä nähnyt (siis qbasicille)
toi on tosi siisti tolla vois tehä oman gtan
teemu9876543210: Kiitti ideasta! Voisin kaiketi alkaa kehittelemään tuota moottoria niin että Rockstar kalpenisi kapeudesta tulossa olevan Gta San Andreas:nsa kanssa :).
Ikävää, kun särjen suunnitelmanne, mutta ei tällä bugisella tekeleelläni GTA:ta voi tehdä. :) Jonkinlaisen surkean kopion kenties. Itse asiassa tein tällä yhden 3D-räiskinnän, jonka lähetän luultavasti siihen räiskintäpelikilpailuun, josta keskustelussa on puhuttu, mutta ei se peli kyllä häävi ole. Näette sen ehkä sitten. Mutta ehkäpä jaksaisitte odottaa vähän aikaa, sillä minulla on kehitteillä aivan uusi ja paljon parempi moottori. Ja teen siitä sellaisen, että sitä on helpompi ymmärtää ja soveltaa omiin tarpeisiin.
toiha vaikutti oikee hyvältä, ja jos tekstuurit lisäis ni parempi, kaikkee mukavaahan tohon vois liitellä.
jaha
Huippu! kaikkea sitä pystyy QB:lla tekemään. :P
Olen kyllä tehnyt paremmankin moottorin, joten tämä olisi ehkä parasta unohtaa. :)
Tai no.. käytänhän minä toistaalta tätä edelleen, kun teen Botmaniaa. Se onkin sitten ainoa, mihin olen Linkku3D:tä soveltanut. Botmanian voi ladata kotisivuiltani. Saan luultavasti piakkoin valmiiksi version 3.0.
jos täällä on enää keskustelua niin miltähän toi näyttäis jos seiniin lisättäisi vähän väriä?? melkein täydellinen 3d-maailma... :))
Ei tällä moottorilla kyllä täydellistä 3D-maailmaa saa, mutta jotain härpätystä olen yrittänyt joskus vääntää. Mm. tuo Botmania:
Lataa versio 2.2 tästä jos kiinnostaa
mä sanoinkin MELKEIN.... toi peli oli hieman outo mutta antaa olla.... mä alan nyt siitymään Qbasicista Visualiin... ^^
[Huh!] Onpas pitkä. Täytyy kokeilla.
Toimii QB64:llakin. Tietty "vähän" joutuu hidastamaan! ;-)
Ihan hauska. Tulee mieleen Stunts.
Muutama parannusehdotus (pieniä tyyliseikkoja; en juuri tutustunut ohjelman varsinaiseen toimintaan ja korostan, että en osaisi tehdä itse vastaavaa ohjelmaa; en myöskään huomannut ennen listan kirjoittamista, että ohjelma oli julkaistu jo vuonna kivi):
Ohjelma olisi helpompi kopioida itselleen, jos se olisi yhdessä osassa.
Joidenkin funktioiden alussa on "***"-alkuinen kommentti, jota ainakaan QuickBASIC 4.5 ei tunnista.
Ääkköset saisi näkymään oikein esim. avaamalla tiedoston jollakin tekstieditorilla (Notepad++ tms.) käyttäen merkistönä esim. DOS:in koodisivua 437.
Lohkojen (IF, FOR, DO jne.) sisällöt voisi sisentää.
Rivit voisi pitää niin lyhyinä, että ne mahtuvat QuickBASICin näytölle vaakasuunnassa (max. 78 merkkiä).
Ohjelma olisi ehkä helppolukuisempi, jos useita käskyjä ei laittaisi samalle riville kaksoispisteen avulla.
Ehkä myös THEN-lauseketta voisi käyttää aina lohkotyyliin, eli esim.
IF a THEN b = 1 END IF
eikä
IF a THEN b = 1
En käyttäisi useampaa kuin yhtä peräkkäistä tyhjää riviä. (Jos sille tuntuu olevan tarvetta ohjelman selkeyttämiseksi, se on ehkä merkki siitä, että samassa pääohjelmassa/subissa/funktiossa tehdään liian paljon asioita.)
Muuttujien ja subien/funktioiden nimet voisivat olla kaikki englanniksi (tai kaikki suomeksi).
Subien/funktioiden nimet voisivat olla kuvaavampia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.