Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: The Linkku3D-moottori

Sivun loppuun

hunajavohveli [21.02.2004 11:35:46]

#

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

rndprogy [21.02.2004 13:48:29]

#

aika kiva.

sooda [21.02.2004 13:51:20]

#

no HHUHHUHUHU miten hieano!!! Hullua!

T.M. [21.02.2004 13:53:46]

#

Hyvältä näyttää, vaikka sisältääkin pieniä bugeja..!

Quiz [21.02.2004 14:01:23]

#

Pitkä koodi... Täytyypi kokeilla...

Quiz [21.02.2004 14:13:01]

#

Kokeiltu on, ja hieno on, oikeen tosi hieno QB:llä tehdyksi!

hunajavohveli [21.02.2004 14:14:51]

#

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.

mamaze [21.02.2004 15:26:35]

#

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ää!

nomic [21.02.2004 15:45:14]

#

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ä! :)

rndprogy [21.02.2004 16:30:34]

#

mamaze: Tallenna se muistiossa muotoon tiedosto.bas

E.K.Virtanen [21.02.2004 17:02:23]

#

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

KimmoKM [21.02.2004 17:48:10]

#

Oikein hieno.

hunajavohveli [21.02.2004 19:56:00]

#

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. :-)

hunajavohveli [21.02.2004 20:40:49]

#

Niin ja antakaa toki lisää kommenttia. Kaikkien mielipide kiinnostaa minua, oli se mikä hyvänsä. :)

mamaze [21.02.2004 20:58:38]

#

joo mä sain sen jo liittämään!

ensin alt+enter, sitten klikkaa oikealla siniseltä ja sieltä liitä.
¨kestää hetken mutta toimii

makeuu [21.02.2004 22:58:48]

#

Täytyypä kokeilla :D

Gwaur [21.02.2004 23:23:06]

#

Mulla ei tässä mun koneella toimi DOS-ohjelmat joten ottakaa screenshotteja :D

thefox [22.02.2004 00:58:26]

#

Yllättävän kivan enginen olet kyhännyt (tuo kuvaus antoi tosiaan hieman negatiivisen kuvan). Purkkamaiselta vaikuttaa mutta ihan kivalta näyttää.

hunajavohveli [22.02.2004 12:50:07]

#

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.

nomic [22.02.2004 14:45:25]

#

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...

Meitsi [22.02.2004 14:55:26]

#

Voisko joku laitta exen nettiin kun ei ole qbtä just nyt saatavilla?

hunajavohveli [22.02.2004 17:05:54]

#

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.

rndprogy [22.02.2004 18:32:29]

#

Tuo hitaus voi johtua 7.1:n kääntö säädöistä. Ja tässä ekse
http://kotisivu.dnainternet.net/pepeos/Linkku.zip
niin joo. Suoraan minun kotisivuiltani ;)

hunajavohveli [22.02.2004 21:00:27]

#

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.

Dustbin [22.02.2004 21:19:16]

#

Kieltämättä tää on kyllä ihan siisti. Ratin palautus vois olla jees.

hunajavohveli [22.02.2004 21:22:19]

#

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ä.

rndprogy [22.02.2004 22:00:00]

#

otin säädöistä sen 286 jutun pois. En sitten tiedä vaikuttiko se asiaan.

kaviaari [23.02.2004 08:39:43]

#

Tämä on todella mahtava!

hunajavohveli [23.02.2004 13:59:41]

#

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.

nomic [24.02.2004 08:30:44]

#

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...

dera [27.02.2004 21:46:20]

#

hehe tää on aika kiva :D

dera [27.02.2004 21:46:36]

#

pelailin tota varmaa puol tuntii <3

hunajavohveli [28.02.2004 14:18:22]

#

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.

mamaze [01.03.2004 17:11:38]

#

tuota joo, yritin tossa lukee koodia ja suomentaa sitä itselleni kuinka se tehdään. Ja tee vain tosta kunnon peli!

Stume [01.03.2004 18:01:00]

#

Hyvä mutta yksitoikkoinen.

hunajavohveli [02.03.2004 14:55:07]

#

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.

Puhveli [13.03.2004 17:51:09]

#

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

iostream [15.03.2004 16:20:42]

#

Enpä itte osais... Hieno on.

hunajavohveli [17.03.2004 21:50:23]

#

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.

hunajavohveli [29.03.2004 20:51:21]

#

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. :)

Claw [06.04.2004 18:04:39]

#

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)

teemu9876543210 [15.05.2004 10:13:34]

#

toi on tosi siisti tolla vois tehä oman gtan

herkko [24.06.2004 00:47:49]

#

teemu9876543210: Kiitti ideasta! Voisin kaiketi alkaa kehittelemään tuota moottoria niin että Rockstar kalpenisi kapeudesta tulossa olevan Gta San Andreas:nsa kanssa :).

hunajavohveli [24.06.2004 11:00:38]

#

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.

Juhisl [28.06.2004 14:51:18]

#

toiha vaikutti oikee hyvältä, ja jos tekstuurit lisäis ni parempi, kaikkee mukavaahan tohon vois liitellä.

JJKulmo [05.07.2004 12:23:49]

#

jaha

Touho [28.09.2004 15:01:57]

#

Huippu! kaikkea sitä pystyy QB:lla tekemään. :P

hunajavohveli [16.10.2004 17:16:59]

#

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.

eraggo [08.03.2005 07:41:00]

#

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... :))

hunajavohveli [08.03.2005 14:35:29]

#

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

eraggo [10.03.2005 19:41:22]

#

mä sanoinkin MELKEIN.... toi peli oli hieman outo mutta antaa olla.... mä alan nyt siitymään Qbasicista Visualiin... ^^

Juhko [15.10.2006 20:34:09]

#

[Huh!] Onpas pitkä. Täytyy kokeilla.

Make1971 [02.01.2017 09:52:06]

#

Toimii QB64:llakin. Tietty "vähän" joutuu hidastamaan! ;-)

qalle [28.01.2017 07:11:07]

#

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):


Sivun alkuun

Vastaus

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

Tietoa sivustosta