edit note: I decided to clean this up a bit...
as a beginner, I wanted to learn advanced content and I made this as pratice, and now Im willing to share it with hope that someone could also learn from it.
I made an
offical site for this game:
http://tachyon.arkku.net/readme/help.html
It has a lot more information and screenshots.
Now to the business:
Whoosh!
is a bowling game with Open Dynamics Engine
Some features:
Realistic physics system
-> Every throw gets completely different results.
There are 13 single player missions.
-> Normal,skill,shape,by-pass and bonus
Shader, transparency and "reflection"
It also has some animation and a skybox.
You throw with your mouse, help.html will tell more about it, its realy easy when you get used to it.
I coded this is DBP (Dark Basic Professional), some media are from other people, credits and Whoosh page tell more about it.
I dont want to praise my game, so here is some screenshots, hope you like them:
More screenshots:
http://tachyon.arkku.net/readme/help.html
License
I made this GPL so that other ODE beginners can learn from it. GPL means that it comes with sourcecode, you can modify it, but it must remain public. GPL license for more info.
DOWNLOAD (6.1Mb) Click any of these:
Download Mirror 1 Arkku.net (fast):
http://tachyon.arkku.net/Whoosh_arc.exe
Download Mirror 2 Freewebs.com (slow):
http://www.freewebs.com/maxnetti/Whoosh_arc.exe
Download Mirror 3 TGC (uber fast): Click "Download" attachement at end of the post
It is best compress winrar self extracting archive so please dont wonder about "installing" to current directory
Someone could want to see just sourcecode (its in the archive) without downloading, so its here:
(EDIT: note: Im awfully sorry that I didnt comment it in english, Im from finland and it tookt enough work for me to code it, so sorry
)
remstart
# # ## ### ###
## ## ## ## ## ####
### ## ### ### ## ####
###### ## ###### ##### #### #### ###### ####
###### ### ## ## ## ## ## ## ## ## ### ## ####
#### #### ### ##### ## ## ## ### ## ## ##
### ### ## ## ## ## ## ## ## ### ### #
### ### ## ### ## # # ## ##### ## ## ###
Project: Whoosh!
Description: Physically realistic 3D bowling game with alien
Copyright (C) 2005 Markus Viljanen
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. (GPL.txt)
remend
`***OHJELMA ALKAA***
`Tähän voidaan hypätä jos ohjelma halutaan resetoida, ensin kutsutaan tyhjennys()
PROG_START:
`*** ALKUVALIKKO ***
`Tässä valikossa valitaan haluttu valinta, haasteet, Tekijät, Apu tai poistu
`Hiirtä ei näytetä, esc ei poistu, osoitin näkyy päällä
hide mouse : disable escapekey : draw sprites last
`DB:n törmäystä ei käytetä, kamera hallitaan itse
set global collision off : autocam off
`Näyttötila ja rajoitetaan ajonopeus
sync on : sync rate 30
`Ladataan valikon kuvat
load image "texturesosoitin.bmp",1
`Ladataan ääni
if sound exist (1) = 0 then load sound "soundsnappi.wav",1
`Ladataan musiikki
if music exist(1) = 0 then load music "soundsnintendo.mp3",1
`Musiikki toistuu taustalla
loop music 1 : set music volume 1,25
`3d malli, sijoitetaan origoon
load object "modelsWhoosh.X",1 : position object 1,0,0,0
`Taivas skaalataan kokoon ja sijoitetaan keskelle
load object "modelscielo.x", 3 : scale object 3, 10000, 10000, 10000 : position object 3, 0,0,0
`Asetetaan ominaisuudet vastaamaan taivasta
set object light 3, 0 : set object texture 3, 2, 1 : set object cull 3,1
`Sijoitetaan kamera keskelle, ja varmistetaan että taivas näkyy
camX# = object size x(1)/2 : camZ# = 0 : camAY# = 0 : set camera range 1,15000
`Asetetaan valikolle fontti ja emme halua poistua
set text font "Cataneo BT" : set text size 60 : poistu = 0
`Toistetaan
repeat
`Lasketaan kameralle uusi sijainti tekstin ympärillä
camAY# = wrapvalue(camAY#+0.25) : camX# = newxvalue(object size x(1)/2,camAY#,-10) : camZ# = newzvalue(0,camAY#,-10)
`Piirretään valikkotekstit
ink RGB(0,0,255),0 : text 0,50,"Challenges" : text 0,125,"Credits" : text 0,200,"Help" : text 0,275,"Quit"
`Uusi peli
if mousex() > 0 and mousex() < 200 and mousey() > 50 and mousey() < 105 then ink RGB(255,255,0),0 : text 0,50,"Challenges!"
if mousex() > 0 and mousex() < 200 and mousey() > 50 and mousey() < 105 and mouseclick()=1 then play sound 1 : poistu = 1
`Tekijät
if mousex() > 0 and mousex() < 200 and mousey() > 125 and mousey() < 170 then ink RGB(255,255,0),0 : text 0,125,"Credits?"
if mousex() > 0 and mousex() < 200 and mousey() > 125 and mousey() < 170 and mouseclick()=1 then play sound 1 : poistu = 2
`Apu
if mousex() > 0 and mousex() < 200 and mousey() > 200 and mousey() < 250 then ink RGB(255,255,0),0 : text 0,200,"Help :O"
if mousex() > 0 and mousex() < 200 and mousey() > 200 and mousey() < 250 and mouseclick()=1 then execute file "help.html","","" : end
`Poistu
if mousex() > 0 and mousex() < 200 and mousey() > 275 and mousey() < 325 then ink RGB(255,255,0),0 : text 0,275,"Quit..."
if mousex() > 0 and mousex() < 200 and mousey() > 275 and mousey() < 325 and mouseclick()=1 then end
sprite 1,mousex(),mousey(),1 `Sijoutetaan osoitin
yrotate camera 0,camAY# : position camera 0,camX#,1,camZ# `Sijoitetaan kamera
sync
until poistu>0 `Kunnes poistutaan
`Tuhotaan turhat käyttämällä silmukkaa
for u = 1 to 6
if sprite exist(u) then delete sprite u `Spritet
next u
for u = 1 to 6
if image exist(u) then delete image u `Kuvat
next u
delete object 1 : delete object 3 `Mallit
`Testataan poistu lippu
if poistu = 2 `Jos poistu antoi signaalin 2
poistu = 0 : gosub creds`Näytetään tekijät kohta
else `Muuten
poistu = 0 `Jatketaan eteenpäin
endif `Testi loppuu
`*** HAASTEVALIKKO ***
`Tässä valikossa valitaan haluttu haaste ja näytetään mitkä on suoritettu
`Teksti näkyy päällä, käytämme 2dtä
draw sprites first : sync on : backdrop off
`Haetaan tiedot läpipäästyistä piilotetusta tiedostosta
open to read 1,"modelsalienH-Alien Data.txt"
`Ladataan kuvat
load image "texturesnorm.bmp",1
load image "texturespitkä.bmp",2
load image "textureskuvio.bmp",3
load image "texturesohi.bmp",4
load image "texturesbonus.bmp",5
load image "texturesbonuslukittu.bmp",6
load image "texturesreunus.bmp",7
load image "texturesmission.bmp",8
load image "artnäyttää3.jpg",9
load image "texturesosoitin.bmp",10
`Jokaisen taulukon kohdan ominaisuudet
type haastetiedot
tyyppi as integer `Kertoo tyypin
seloste as string `Antaa tietoja
sx as integer `X sijainti
sy as integer `Ysijainti
suo as string `tieto suorituksesta
endtype
`Haastetaulukko asetetaan käyttämään edellisiä ominaisuuksia
dim haaste(13) as haastetiedot
`1 = normaali, 2 = pitkä, 3 = kuvio, 4 = ohitettava, 5 = bonus, määritellään seloste ja tason nimi
haaste(1).tyyppi = 1 : haaste(1).seloste = "Topple all skittles in ordinary course" : #constant taso1 norm_vir
haaste(2).tyyppi = 2 : haaste(2).seloste = "Long straight line of skittles" : #constant taso2 pitk_riv
haaste(3).tyyppi = 3 : haaste(3).seloste = "Challencing lozenge to be toppled" : #constant taso3 kuvi_nel
haaste(4).tyyppi = 2 : haaste(4).seloste = "Two rows of skittles to be knocked": #constant taso4 pitk_jon
haaste(5).tyyppi = 4 : haaste(5).seloste = "Pass whiout toppling between skittles" : #constant taso5 ohit_tun
haaste(6).tyyppi = 1 : haaste(6).seloste = "All topples as a medium square" : #constant taso6 norm_kai
haaste(7).tyyppi = 2 : haaste(7).seloste = "One lonely skittle far far away" : #constant taso7 pitk_yks
haaste(8).tyyppi = 1 : haaste(8).seloste = "Skittles there and here" : #constant taso8 norm_haj
haaste(9).tyyppi = 3 : haaste(9).seloste = "Hittable arrow shape of skittles" : #constant taso9 kuvi_nuo
haaste(10).tyyppi = 4 : haaste(10).seloste = "Pass this distortedly whitout hitting": #constant taso10 ohit_sek
haaste(11).tyyppi = 4 : haaste(11).seloste = "Dont it any skitle in this row" : #constant taso11 ohit_riv
haaste(12).tyyppi = 3 : haaste(12).seloste = "This is like right sign" : #constant taso12 kuvi_oik
haaste(13).tyyppi = 5 : haaste(13).seloste = "Complete all to unlock this mystery" : #constant taso13 bonu_sss
`Luetaan tiedot suoritetuista
for x = 1 to 13
read string 1,haaste(x).suo `Talletetaan tieto taulukkoon
next x
`Testataan onko bonus avoinna
for x = 1 to 12
inc poistu,val(haaste(x).suo) `Ynnätään suoritetut yhteen
next x
if poistu = 12 `Jos lopputulos on kaikkien lukumäärä
if haaste(13).suo<>"1" `Ja haaste ei ole suoritettu
haaste(13).suo="0" `Julistetaan haaste suorittamattomaksi
endif
endif
poistu = 0 `Emme poistu tulevissa silmukoissa
`Sijoitetaan haasteiden kuvat
ysijainti = 150 `Spriten y sijainti
xsijainti = 150 `Spriten x sijainti
for x = 1 to 13
`Haetaan talletettu arvo läpikäytävästä keilasta
haaste(x).sx=xsijainti `Talletetaan X
haaste(x).sy=ysijainti `Tallennetaan Y
inc xsijainti,200 `Siirretään piirokohtaa oikealle
if xsijainti>850-100 then inc ysijainti,150 : xsijainti = 150 `Jos menee yli, niin siirretään alas ja alkuun
next x
`Grafiikoiden sijoitus
sprite 25,0,0,9 `Tausta
`Asetetaan tekstin tyyli ja koko
set text font "Arial Black" : set text size 18
`Muuttuja nykyiselle tasolle
global nyktaso
`Toistetaaan
repeat
`Käydään läpi keilat
for a = 1 to 13
`Sijoitetaan taulukkoon talletettujen kordinaattien perusteella
sprite a,haaste(a).sx,haaste(a).sy,haaste(a).tyyppi
`Testataan haasteen suoritus
if haaste(a).suo="1" `Jos haaste on suoritettu tulostetaan se vihreällä
ink rgb(0,255,0),rgb(0,255,0) : set cursor haaste(a).sx,haaste(a).sy+100 : print a,". Compeleted!"
else
if haaste(a).suo="0" `Jos haastetta ei ole suoritettu tulostetaan se punaisella
ink rgb(200,0,0),rgb(255,0,128) : set cursor haaste(a).sx,haaste(a).sy+100 : print a,". Uncompleted"
else
if haaste(a).suo="2" `Jos haaste on lukittu tulostetaan se keltaisella
ink rgb(0,128,128),rgb(128,0,128) : set cursor haaste(a).sx,haaste(a).sy+100 : print a,". Locked..."
endif
endif
endif
`Jos läpikäytävä numero on tallennetun neliöalueen sisällä
if mousex()>haaste(a).sx and mousex()<haaste(a).sx+100 and mousey()>haaste(a).sy and mousey() < haaste(a).sy+100
`kerrotaan haasteesta tehtävä kohdassa
ink rgb(0,128,255),rgb(0,0,0) : center text 500,89,haaste(a).seloste
`näytetään reunus
sprite 20,haaste(a).sx-10,haaste(a).sy-10,7
`Jos haaste valitaan
if mouseclick()=1
play sound 1 `Soitetaan ääni
`Tehdään massiivinen testi ja poistutaan
select a
case 1
nyktaso=1:restore taso1 : poistu = 1
endcase
case 2
nyktaso=2:restore taso2 : poistu = 1
endcase
case 3
nyktaso=3:restore taso3 : poistu = 1
endcase
case 4
nyktaso=4:restore taso4 : poistu = 1
endcase
case 5
nyktaso=5:restore taso5 : poistu = 1
endcase
case 6
nyktaso=6:restore taso6 : poistu = 1
endcase
case 7
nyktaso=7:restore taso7 : poistu = 1
endcase
case 8
nyktaso=8:restore taso8 : poistu = 1
endcase
case 9
nyktaso=9:restore taso9 : poistu = 1
endcase
case 10
nyktaso=10:restore taso10 : poistu = 1
endcase
case 11
nyktaso=11:restore taso11 : poistu = 1
endcase
case 12
nyktaso=12:restore taso12 : poistu = 1
endcase
case 13
`Varmistetaan ettei haaste ole lukittu
if haaste(13).suo<>"2" then restore taso13 : poistu = 1 : nyktaso=13
endcase
endselect `Valintatestin loppu
endif `Hiiriklikkaukden loppu
endif `Aluetestin loppu
next x
`Muun grafiikan piirto
sprite 21,mousex(),mousey(),10 `Sijoutetaan osoitin
sprite 22,150,70,8 `Sijoitetaan tehtävä palkki
sync `Päivitetään ruutu
until poistu = 1 `kunnes annetaan poistumissignaali
`Poistetaan turhat yksitellen
for x = 1 to 50
if sprite exist(x) = 1 then delete sprite x `Poistetaan spritet
next x
for x = 1 to 10
if image exist(x) then delete image x `Poistetaan kuvat
next x
close file 1 : delete sound 1 `Suljetaan tiedosto ja poistetaan ääni
PROG_GAME:
`*** PELI ALKAA ***
`Tässä kohtaa ladataan maailma ja tarvittavat mediat
`Asetetaan näyttötila
sync on `Rajoitetaan ajonopeutta
hide mouse : autocam off : randomize timer() `hiiri,kohdistus,satunnaisuus
set text font "Impact" : set text size 20 `fontti
`Oden alustus
ode start `Herätys
ode set world gravity 0,-20,0 : ode set world step 0.05 : ode set world erp (0.2)*2.5 : ode set world cfm 0 `Maailman ominaisuudet ja tarkkuus
`Muuttujat
`Koko ohjelman kattavat
global leveys : global pituus `Kentän leveys (x) ja pituus (z)
global vaatimus : global kaadetut `Vaatimus ja ajohetkellä kaadetut keilat
`Luetaan valikossa haetusta data kohdasta rakentamiseen tarvittavat muuttujat
read leveys,pituus,pallokoko,raja,keiloja
`Asetetaan keilojen ja pallon painon suhde (g/10)
keilapaino = 25 : pallopaino = 400
`Sijoitetaan kamera ja valot
position camera leveys/2,leveys,0-leveys : point camera leveys/2,0,pituus/2 `Pelaajan taakse
if light exist(1) = 0 then make light 1 :position light 1, 0-leveys, leveys,0-leveys*2 `Vinoon pelaajan taakse
point light 1, 0,0,pituus/2 `Osoitetaan kohti kenttää
`Ladataan äänet
load sound "soundsvierintä.wav",1
load sound "soundskeila.wav",2
load sound "soundsseinä.wav",3
load sound "soundssiivooja.wav",4
load sound "soundskeilasiivous.wav",5
`Taso
`Tehdään lattia haettujen muuttujien perusteella
make object box 1,leveys,leveys/10,pituus : position object 1,0+object size x(1)/2,0,0+object size z(1)/2 `Sijoitetaan kulma origoon
load effect "shadersPARALLAX20Parallax20.fx", 2, 1 : set object effect 1, 2 `Alustetaan heijastus
ode create static box 1 : ode setsurface mode contact slip1 1,1 `Asetetaan kappale odessa ominaisuuksineen, liukuu
temp = make vector4(1) : temp = make vector4(2) : temp = make vector4(3) : temp = make vector4(4) `Heijastuksen kordinaatit vektoreissa
set vector4 2, 1.0, 1.0, 0.5, 1.0 : set vector4 3, 0.9, 0.9, 0.9, 1.0 : set vector4 4, 0.3, 0.3, 0.3, 1.0 `Annetaan vektoreille sijainti
set vector4 1, camera position x(), camera position y(), camera position z(), 1.0 `Sijoitetaan näkövektori kameran sijaintiin
set effect constant vector 2,"EyePos",1 : set effect constant vector 2,"LightDir",2 `Annetaan heijastukselle tiedot oikeista kohdista
set effect constant vector 2,"LightCol",3 : set effect constant vector 2,"LightAmb",4
`Tehdään reunat ja koppi leveyden,pituuden ja pallon koon perusteella x,y,z ulottuvuuksiin
make object box 2,2,10*3,pituus : position object 2,0-pallokoko*1.5-1,0-pallokoko/2,pituus/2 `Vasen seinä
make object box 3,leveys+pallokoko*3,leveys/10,pituus : position object 3,leveys/2,0-pallokoko,pituus/2 `Kouru
make object box 4,2,10*3,pituus : position object 4,leveys+pallokoko*1.5+1,0-pallokoko/2,pituus/2`Oikea seinä
make object box 5,leveys+pallokoko*3,leveys,2 : position object 5,leveys/2,leveys/2-pallokoko,pituus+pallokoko*5 `Pääty seinä
make object box 6,leveys+pallokoko*3,2,leveys : position object 6,leveys/2,leveys-pallokoko,pituus+pallokoko*5-leveys/2 `Yläseinä
make object box 7,2,leveys,leveys : position object 7,0-pallokoko*1.5,leveys-leveys/2-pallokoko,pituus+pallokoko*5-leveys/2 `Vasenseinä
make object box 8,2,leveys,leveys : position object 8,leveys+pallokoko*1.5,leveys-leveys/2-pallokoko,pituus+pallokoko*5-leveys/2 `Oikeaseinä
make object box 9,leveys+pallokoko*3,10*3,2 : position object 9,leveys/2,0-pallokoko/2,0
load image "texturesmetal_shutter.BMP",2 `Kentän osien tekstuuri
`Käydään koppi läpi
for x = 2 to 9 `Silmukka
texture object x,2 `Liitetään pinta rakennettuun malliin
ode create static box x `Kerrotaan kopista ODE:lle
ode setsurface mode contact bounce x,1 `Asetetaan seinän ominaisuudet, pallo pomppaa
next x
`Tehdään keilat
load object "modelskeila3.X",102 `Ladataan kopioitava malli tiedostosta
position object 102,0,-10000,0 `Siiretään näkymästä. Muut tarvitsevat vielä dataa
for x = 10 to 10+keiloja `Käydään jokainen läpi yksitellen
instance object x,102 `Kopioidaan ladatusta mallista identtinen kopio
next x `Seuraava keila
`Sijoitetaan keilat luettuun muodostelmaan
read zraja : read xraja `X ja Y rajat
read vaatimus `vaadittu keilojen kaatomäärä
objekti = 10 `Käsiteltävän kohteen numero `Haetaan muodostelman datakohta
for z = 1 to zraja `Pituussuuntainen silmukka
for x = 1 to xraja `Leveyssuuntainen silmukka
read luku `Luetaan luku, 1=keila
`Jos luettu data on keila (1), sijoitetaan keila läpikäytävien silmukoiden perusteella ja otetaan seuraava keila
if luku = 1 then position object objekti, x*(leveys/xraja)-pallokoko/2, object size y(objekti)/2, pituus-(z*17) : inc objekti,1
next x `Siirrytään leveydessä
next z `Siirrytään pituudessa
`Kerrotaan ODElle keiloistamme
for x = 10 to 10+keiloja `Käsitellään yksitellen jättäen kentän väliin
ode create dynamic cylinder x : ode set body mass x,keilapaino `Kerrotaan ODE:lle nappulasta ja asetetaan massa
ode set contact fdir1 x,100 `Asetetaan pinta ja kitka
next x `Seuraava
`Rakennetaan ladattavat 3d mallit
`Ladataan pelaaja
load object "modelsalienH-Alien Mutant-Move.x",105 : yrotate object 105,180 : scale object 105,2500,2500,2500 `Käännetään ja suurennetaan
position object 105, leveys/2 - object size x(105)/20, object size y(1)/5 + object size y(105)/50, 0 `Sijoitetaan jalat maahan keskelle
`Tehdään pelaajan keilapallo
make object sphere 100,pallokoko : position object 100, leveys/2, object size y(100)/2+object size y(1)/2+object size y(105)/50, 10+object size z(105)/20 `Sijoitetaan alienin käteen
ode create dynamic sphere 100 : ode set body mass 100,pallopaino : color object 100,rgb(0,128,255) `Tehdään ja kerrotaan massa
ode set contact fdir1 100,0.1 : ode setsurface mode contact approx1 100,1 `Fyysinen kitka ja pinta, niin että pyörii
load image "texturesshine2.bmp",100,1 : load image "texturestex.bmp",101 : texture object 100,101 `Visuaalinen pinta
set sphere mapping on 100,100 : set object specular 100, rgb(255,255,255) : set object specular power 100, 80 `Heijastus valolle
`Osoitin laukaisemiskohdalle
load object "modelsaninuoli.X",101 : scale object 101, 1500, 1500, 1500 `Ladataan tiedostosta
position object 101,leveys/2,5,raja : fix object pivot 101 `Sijoitetaan ja varmistetaan että pyörii oikein
set object light 101,1 : ghost object on 101 `Tehdään heikoksi ja läpinäkyväksi
xliikkunut = leveys/2 : zliikkunut = pituus/2-leveys `Asetetaan keskelle
korkeus = 0+object size y(1)/2+object size y(101)/2 `Haetaan korkeus
`Mailojen siivoja
make object box 103,leveys,pallokoko,2 : position object 103,leveys/2,leveys-pallokoko,pituus+pallokoko*5-leveys `Kopin yläosassa
ode create dynamic box 103 : ode set body mass 103,10000 `Voima riittää keilojen siivoamiseen
load image "texturespuomi_smooth.bmp",102 : texture object 103,102 `Asetetaan ulkonäkö
`Kynnys, josta saa heittää
make object box 104,leveys,1,pallokoko : position object 104,leveys/2,object size y(1)/2,raja `Tehdään oikean kokoinen luettuun kohtaan
color object 104,rgb(255,0,0) : ghost object on 104,1 `Väritetään läpinäkyvän punaiseksi
`Taivas
load object "modelscielo.x", 106 `Ladataan teksturoitu neliö
set object light 106, 0 : set object texture 106, 2, 1 : set object cull 1,1 `Valo ei vaikuta, näyttää taivaalta, piirretään sisältä
set camera range 1,15000 : scale object 106, 10000, 10000, 10000 `Näytönohjain piirtää kaukana olevan taivaan
position object 106, 0,0,0 `Maailman ympärillä
`Varmistetaan ettei näkymättömiä polygoneja piirretä
for x = 1 to 150
if object exist(x) then set object cull x,1
next x
`Totuusarvo laukaisusta
laukaistu as boolean : laukaistu = 0 `1 tosi 0 epätosi; Emme ole laukaisseet palloa vielä
`Kaadetut keilat
kaadetut = -1 `Kaadettujen lukumäärä
dim testattu(20+keiloja) `Testattujen keilojen taulukko
for x = 1 to 20+keiloja : testattu(x) = 0 : next x
`Äänitoistetut keilat
dim kolari(99) : for x = 1 to 99 : kolari(x) = 0 : next x `Emme ole toistaneet, epätosi
`Siivouksessa toistetut
dim siivottu(99) : for x = 1 to 99 : siivottu(x) = 0 : next x `Emme ole toistaneet, epätosi
`Äänitoistetut kopin osat
dim koppi(10) : for x = 1 to 10 : koppi(x) = 0 : next x `Emme ole toistaneet, epätosi
`Totuusarvo pisteenlaskusta
lasketaan as boolean : lasketaan = 0 `Jos siivous alkaa, ei lasketa kaatuneita; Kaadot lasketaan alussa
`Laukaisukohdan häivytys on alussa minimalistinen
haivytys# = 275
`Haetaan kameran sijainnit
kameray# = camera position y(0) : kameraz# = camera position z(0)
`Asetetaan animaatiot
set object speed 105,25 : loop object 105,5 `Toistetaan pelaajaa
set object speed 101,50 : loop object 101 `Toistetaan osoitin
ink rgb(0,128,255),rgb(0,0,0)
` *** SILMUKKA ***
`Tässä kohtaa suoritetaan silmukkaa ladatuilla medioilla
DO `Toistetaan allaolevia käskyjä
`Sijoitetaan lattian efekti
`Haetaan kameran sijainti vektoriin
set vector4 1,camera position x(),camera position y(),camera position z(),1.0
`Asetetaan efekti haettuun vektoriin
set effect constant vector 2,"EyePos",1
`Äänet jos laskemme kaadot
if lasketaan = 0
`Niin kauan kun meillä on törmäys toistetaan allaolevaa
while ode collision message exists()
ode collision get message `Haetaan törmäyksen tiedot
Obj1 = ode get object a() : Obj2 = ode get object b() `Haetaan törmäävien numerot
`Keilapallon äänet, jos törmäävä on keilapallo niin
if Obj1=100
if Obj2 = 1 and sound playing(1) = 0 then play sound 1 `Jos toinen on lattia niin toistetaan vierimisääntä
if kolari(obj2) = 0 `Jos toinen on keila ja sitä ei ole testattu
if Obj2 =>10 and Obj2=<99 then play sound 2 : kolari(obj2) = 1`Varmistetaan että kysessä on keila ja toistetaan ääni
endif
if Obj2<10 `Jos toinen kappale on jokin tason osa
if koppi(Obj2) = 0 then play sound 3 : koppi(obj2) = 1 `Jota ei ole vielä toistettu niin toistetaan ääni
endif
endif
endwhile `Toistettava loppuu
endif `Testi loppuu
`Äänet jos kaatoja ei lasketa
if lasketaan = 1
`Niin kauan kun meillä on törmäys toistetaan allaolevaa
while ode collision message exists()
ode collision get message `Haetaan törmäyksen tiedot
Obj1 = ode get object a() : Obj2 = ode get object b() `Haetaan törmäävien numerot
`Jos törmäävä on mailjoen siivooja
if Obj2 = 103
if siivottu(obj1) = 0 `Jos siivottavaa ei ole testattu vielä
if Obj1 =>10 and Obj1=<99 then play sound 2 : siivottu(obj1) = 1 `Jos siivotta on keila niin toistetaan ääni
endif
endif
endwhile `Silmukka loppuu
endif `Testi loppuu
`Logiikka keilanpuhdistajalle pallon tippuminen alas laukaisee logiikan,
if object position y(100)+300>0 `Jos pallo on vielä radalla `Kaatoja ei enää lasketa
ode set linear velocity 103,0,1,0 `Pidetään porttia ylhäällä
else `Jos pallo on tippunut alas
lasketaan = 1 `Ei lasketa kaatoja
if sound playing (4) = 0 then play sound 4 `Siivojaa alkaa surista
if object position y(103)> 0+object size y(1)/2+object size y(103)/2+pallokoko `Liikutetaan porttia
ode set linear velocity 103,0,-15,-30 `vinosti alas
endif `Seuraava testi
if object position y(103)=<0+object size y(1)/2+object size y(103)/2+pallokoko
if object position z(103)<pituus `Liikutetaan porttia
ode set linear velocity 103,0,0,30 `Poispäin
endif
endif
if object position y(103)<0 then exit
endif
`Hallitaan liikkeitä testien perusteella
zliike# = abs(mousemovey()/8) `pituusulottuvuudessa
xliike# = mousemovex()/2 `leveysulottuvuudessa
xliikkunut = xliikkunut + xliike# `päivitetään osoittiminen kohta leveysulottuvuudessa
zliikkunut = zliikkunut + zliike# `ja pituusulottuvuudessa
set object speed 105,zliike#*20 `Asetetaan pelaajan liikkumanopeus
`Testit jos palloa ei ole laukaistu
if laukaistu = 0
`Liikutetaan pelaajaa
move object left 105,xliike#/10 `Liikutetaan leveyssunnassa hiiren perusteella
move object 105,0-zliike#/2 `Liikutetaan pituussuunnassa hiiren perusteella
position object 101,xliikkunut,korkeus,zliikkunut `Sijoitetaan laukaisukohdan osoitin liikkuneen perusteella
ode set linear velocity 100,xliike#*2.1,1,zliike#*10 `Liikutetaan oden palloa antamalla voimaa
`Testataan pallon laukaisu jos annetaan käsky ja pallo ei ole laukaistu ja liikkeessä
if mouseclick()=1 and zliike#>5 `Testataan laukaisemiselta, vauhti täytyy olla jonkin verran
ode set linear velocity 100,0,0,0 `Resetoidaan pallon nopeus
`Lisätään voimaa osoittimen suuntaan, mikä määrrää pallon liikeradan. Merkitään ylös laukaisu
ODE ADD FORCE RELATIVE 100,xliikkunut-object position x(100),0,zliikkunut-object position z(100),0,0,0 : laukaistu = 1
endif
`Testataan yliastumiselta, samalla tavalla
if object position z(100)>raja `Testataan yliastumiselta haettuun rajaan
ode set linear velocity 100,0,0,0 `Resetoidaan nopeus
`Lisätään mukaan vähän oikeaa satunnaisuutta
ODE ADD FORCE RELATIVE 100,xliikkunut-object position x(100)+(rnd(leveys)-leveys/2),0,zliikkunut-object position z(100),0,0,0 : laukaistu = 1
endif
endif
`Jos on laukaistu, niin testataan laukaisemiseen liittyvät tekijät
if laukaistu = 1 and lasketaan = 0 `Varmistetaan että laskemme kaadetut
dec haivytys#,5 `Jos olemme kerran laukaisseet osoitinta ei tarvita
fade object 101,haivytys# `Häivytetään osoitin kunnes se katoaa
`Jos pallo on radalla niin jahdataan kameralla
if object position z(100) < pituus `Niin kauan kun pallo on radalla
if (object position z(100)-75)>camera position z(0) and object position z(100)<pituus-leveys/2 then inc kameraz#,4 `Jos pallo on edellä niin kiritään
if (object position y(100)+object size y(100)*2)<camera position y(0) and object position y(100)>0 then dec kameray#,0.5 `Jos pallo on alempana niin lasketaan
endif
`Sijoitetaan kamera edellä laskettuihin arvoihin.
position camera object position x(100), kameray#, kameraz#
`Testataan keilat kaatumisilta
for x = 10 to 10+keiloja `käydään läpi yksitellen
if testattu(x) = 0 `Jos kyseistä keilaa ei ole testattu niin sitten testataan
`Testataan onko tämä keila kaatunut tai tippunut
if object angle x(x)>45 and object angle x(x)<315 or object angle z(x)>45 and object angle z(x)<360 or object position y(x)<object size y(x)/3
testattu(x) = 1 `Varmistetaan ettei keilaa testata toista kertaa
inc kaadetut,1 `Päivitetään kaadettujen keilojen lukumäärä
endif
endif
next x
endif
`Muut testit
if escapekey() then exit `Escape hyppää ulos silmukasta
ODE UPDATE `Päivitetään ode
SYNC `Päivitetään visuaalinen maailma
LOOP `Toistetaan kaikki uudelleen
`*** HEITTO ON TAPAHTUNUT ***
`Tässä kohtaa kerrotaan heiton onnistuminen, kaadetut keilat ja vaatimus
`Ladataan tunneikas otus ja tuhotaan wanha
delete object 105
`Oikean tunteen valinta jos tyyppi ei ole ohitettava
if haaste(nyktaso).tyyppi<>4
if kaadetut=>vaatimus `Jos vaatimus täyttyi
`Kirjoitetaan tiedostoon merkintä suorituksesta
delete file "modelsalienH-Alien Data.txt" `Tuhotaan olemassa oleva tiedosto
open to write 1,"modelsalienH-Alien Data.txt" `Luodaan uusi
haaste(nyktaso).suo = "1" `Tämä haaste on suoritettu
for a = 1 to 13 `Kirjoitetaan uuteen haetut tiedot
write string 1,haaste(a).suo `Kirjoitetaan 1 tai 0
next a
close file 1 `Suljetaan teidosto
load object "modelsalienH-Alien Mutant-Attack1.x",105 `Ollaan iloisia
load sound "soundsiloista.wav",99 `Ilmaistaan se äänekkäästi
else `Muuten
if kaadetut<2 `Jos meni metsään
load object "modelsalienH-Alien Mutant-Die.x",105 `Suututtaa
load sound "soundsonneton.wav",99 `Oikein äänekkäästi
else `Jos ei kumpikaan
load object "modelsalienH-Alien Mutant-Impact.x",105`Ihmetellään mitä pitäisi tehdä
load sound "soundsnjoo.wav",99 `Ja öristään vähän
endif `Muuten testin loppu
endif
`Tunteen valinta jos tyyppi on ohitettava
else
`Jos menimme ohi
if kaadetut = 0
`Sama kuin edellä, talletetaan suoritus ja ollaan iloisia
load object "modelsalienH-Alien Mutant-Attack1.x",105
load sound "soundsiloista.wav",99
delete file "modelsalienH-Alien Data.txt"
open to write 1,"modelsalienH-Alien Data.txt"
haaste(nyktaso).suo = "1"
for a = 1 to 13
write string 1,haaste(a).suo
next a
close file 1
`Jos jotein kaadettin
else `Ei olla iloisia
load object "modelsalienH-Alien Mutant-Die.x",105
load sound "soundsonneton.wav",99
endif
endif `Tunnetestin loppu
`Sijoitetaan otuksemme heittoalueelle
position object 105,leveys/2+object size x(105)/10,object size y(1)/2+object size y(105)/50,leveys/2
`Käännetään kohti keiloja ja kameraa
yrotate object 105,180 : scale object 105,2500,2500,2500
`Sijoitetaan kamera katsomaan otusta
position camera 0,leveys,leveys/3,leveys*2 : point camera 0,object position x(105),object position y(105),object position z(105)
if nyktaso = 13 and kaadetut=>vaatimus then tyhjennys():gosub creds`Jos bonus läpäistään niin lopputekstit
set object speed 105,10 : play object 105 : play sound 99 `Otus näyttää tunnetilansa
set text font "Arial Black" :set text to bold : set text size 48 `Asetetaan sopivampi fontti
poistu = 0 : show mouse `Ei poistuta ja hiiri näkyy
`SILMUKKA, nopeus ei merkitse
repeat `Toistetaan
set text size 48 : ink RGB(0,255,128),0 : text 0,50,"Retry" : text 0,125,"Main menu" `Sijoitetaan valikko
center text screen width()/2,screen height()/2,"You knocked "+str$(kaadetut) `Sijoitetaan pisteet keskelle
set text size 32 : center text screen width()/2,screen height()/2+50,"The requirement was "+str$(vaatimus)+" skittles" `Kerrotaaan vaatimus
`Jos tarkoituksena oli kaataa keiloja
if haaste(nyktaso).tyyppi<>4 and kaadetut<vaatimus then center text screen width()/2,screen height()/2+100,"Lets try again, shall we?"
if haaste(nyktaso).tyyppi<>4 and kaadetut=>vaatimus then center text screen width()/2,screen height()/2+100,"Congratulations! Mission completed"
`Jos tarkoituksena oli ohittaa keilat
if haaste(nyktaso).tyyppi=4 and kaadetut>0 then center text screen width()/2,screen height()/2+100,"Lets try again, shall we?"
if haaste(nyktaso).tyyppi=4 and kaadetut=<0 then center text screen width()/2,screen height()/2+100,"Congratulations! Mission completed"
`Uudelleen yritys
if mousex() > 0 and mousex() < 200 and mousey() > 50 and mousey() < 105 then set text size 48 : ink RGB(255,255,0),0 : text 0,50,"Retry :Z"
if mousex() > 0 and mousex() < 200 and mousey() > 50 and mousey() < 105 and mouseclick()=1 then poistu = 1
`Valikkoon
if mousex() > 0 and mousex() < 200 and mousey() > 125 and mousey() < 170 then set text size 48 : ink RGB(255,255,0),0 : text 0,125,"Main menu..."
if mousex() > 0 and mousex() < 200 and mousey() > 125 and mousey() < 170 and mouseclick()=1 then poistu = 2
sync `Päivitys
until poistu > 0 `Kunnes halutaan poistua
`Tyhjennetään
tyhjennys()
`Jos poistu oli 1 niin aloitetaan heitto alusta
if poistu = 1 then gosub PROG_GAME
`Jos poistu oli 2 niin mennään päävalikkoon
if poistu = 2 then wait 1000 : gosub PROG_START
`*** DATA TIETUEET ***
`ESIMERKKI Data tietue keilojen muodostelmasta
`Normaali virallinen muodostelma
norm_vir:
`leveys,pituus,pallokoko,raja,keiloja
data 70,500,13,60,10
`koko pituus, leveys
data 4,7
`Vaatimus
data 8
`Binääridata 1 tarkoittaa keilaa, 0 tyhjää
data 1,0,1,0,1,0,1
data 0,1,0,1,0,1,0
data 0,0,1,0,1,0,0
data 0,0,0,1,0,0,0
`Normaali kaikkikeilat muodostelma
norm_kai: `4x7
data 80,500,20,50,28
data 4,7
data 16
data 1,1,1,1,1,1,1
data 1,1,1,1,1,1,1
data 1,1,1,1,1,1,1
data 1,1,1,1,1,1,1
`Normaali hajamuodostelma
norm_haj: `4x7
data 70,500,14,60,14
data 4,7
data 8
data 1,0,1,0,1,0,1
data 0,1,0,1,0,1,0
data 1,0,1,0,1,0,1
data 0,1,0,1,0,1,0
`Pitkä rivimuodostelma
pitk_riv:
data 125,700,7,100,10
data 10,7
data 7
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
`Pitkä jonomuodostela
pitk_jon:
data 100,700,10,100,20
data 2,10
data 5
data 1,1,1,1,1,1,1,1,1,1
data 1,1,1,1,1,1,1,1,1,1
`Pitkä yksikeila
pitk_yks:
data 75,1000,3,100,1
data 1,9
data 1
data 0,0,0,0,1,0,0,0,0
`Kuvio vinoneliö
kuvi_nel:
data 50,500,12,50,8
data 5,5
data 7
data 0,0,1,0,0
data 0,1,0,1,0
data 1,0,0,0,1
data 0,1,0,1,0
data 0,0,1,0,0
`Kuvio nuoli
kuvi_nuo:
data 65,500,12,50,16
data 10,7
data 12
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 0,0,0,1,0,0,0
data 1,0,0,1,0,0,1
data 0,1,0,1,0,1,0
data 0,0,1,1,1,0,0
data 0,0,0,1,0,0,0
`Kuvio oikeinmerkki
kuvi_oik:
data 100,500,12,50,25
data 9,9
data 8
data 0,0,0,0,0,0,0,1,1
data 0,1,1,0,0,0,1,1,0
data 0,1,1,0,0,1,1,0,0
data 0,0,0,0,1,1,0,0,0
data 0,0,0,1,1,0,0,0,0
data 0,0,1,1,0,0,1,1,0
data 0,1,1,0,0,0,1,1,0
data 1,1,0,0,0,0,0,0,0
data 1,0,0,0,0,0,0,0,0
`Ohitettava tunneeni
ohit_tun:
data 150,500,17,75,20
data 4,9
data 0
data 1,1,1,1,0,1,1,1,1
data 1,1,1,0,0,0,1,1,1
data 1,1,0,0,0,0,0,1,1
data 1,0,0,0,0,0,0,0,1
`Ohitettavat kaartuvat
ohit_sek:
data 150,500,15,50,25
data 8,8
data 0
data 0,0,0,0,1,1,0,1
data 0,0,0,1,1,0,0,1
data 0,0,1,1,0,0,0,1
data 0,1,1,0,0,0,0,1
data 0,1,1,0,0,0,0,1
data 1,1,0,0,0,0,0,1
data 1,1,0,0,0,0,1,1
data 1,0,0,0,0,0,1,1
`Ohitettavat rivistö
ohit_riv:
data 155,500,6,100,10
data 1,10
data 0
data 1,1,1,1,1,1,1,1,1,1
`BONUS taso
bonu_sss:
data 225,800,50,100,85
data 15,15
data 42
data 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0
data 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0
data 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0
data 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0
data 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0
data 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0
data 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0
data 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0
data 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0
data 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0
data 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0
data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
` *** TEKIJÄT ***
`Tämä näyttää pelin tekijät ja medioiden lähteet
`Määritellään kohdalle nimi
creds:
`Ladataan tausta
draw sprites first : sync off : backdrop off
load image "artnäyttää3.jpg",1 : sprite 1,0,0,1
`Asetetaan fontti
set text font "Impact" : set text size 32 : ink rgb(255,255,255),rgb(0,0,0)
`Tekstien alkukohta
y#=700
`Näyttösilmukka
repeat `Toistetaan
dec y#,0.75 `Vieritetään
`Sijoitetaan tekstit peräkkäin
center text 1024/2,y#,"PROGRAMMING" : center text 1024/2,y#+50,"Markus Viljanen (Tachyon)" : center text 1024/2,y#+100,"www.etachyon.tk"
center text 1024/2,y#+250,"3D MODELLING" : center text 1024/2,y#+300,"Markus Viljanen" : center text 1024/2,y#+350,"DarkMATTER Collection"
center text 1024/2,y#+500,"2D ART" : center text 1024/2,y#+550,"Markus Viljanen" : center text 1024/2,y#+600,"SKYBOX by:" : center text 1024/2,y#+650,"www.alsip.net"
center text 1024/2,y#+800,"MUSIC" : center text 1024/2,y#+850,"by www.mattmcfarland.com"
center text 1024/2,y#+1000,"SOUNDS" : center text 1024/2,y#+1050,"Markus Viljanen" : center text 1024/2,y#+1100,"Dark Basic Professional Media"
center text 1024/2,y#+1250,"This game was a project, targetting to learn physics. Thank you for participating by" : center text 1024/2,y#+1300,"playing this game. Stay tuned for other games, and"
center text 1024/2,y#+1350,"Be sure to visit:" : center text 1024/2,y#+1375,"WWW.ETACHYON.TK"
center text 1024/2,y#+1500,"press any key to go back to menu..."
until inkey$()<>"" `Kunnes jotain painetaan
`Poistetaan tausta
delete image 1 : delete sprite 1 : Y# = 0
`Siirrytään alkuun
gosub PROG_START
`***TYHJENNYS FUNKTIO***
``Tällä funktiolla voidaan tyhjentää kaikki ladatut mediat
function tyhjennys()
ode end : delete light 1
for o = 1 to 100
if image exist (o) then delete image (o)
next o
for o = 1 to 100
if sprite exist (o) then delete sprite (o)
next o
for o = 1 to 1000
if object exist (o) then delete object (o)
next o
for o = 1 to 10
if effect exist (o) then delete effect (o)
next o
for o = 1 to 100
if sound exist (o) then delete sound (o)
next o
`palautetaan lukukohta alkuun
select nyktaso
case 1
nyktaso=1
restore taso1
endcase
case 2
nyktaso=2
restore taso2
endcase
case 3
nyktaso=3
restore taso3
endcase
case 4
nyktaso=4
restore taso4
endcase
case 5
nyktaso=5
restore taso5
endcase
case 6
nyktaso=6
restore taso6
endcase
case 7
nyktaso=7
restore taso7
endcase
case 8
nyktaso=8
restore taso8
endcase
case 9
nyktaso=9
restore taso9
endcase
case 10
nyktaso=10
restore taso10
endcase
case 11
nyktaso=11
restore taso11
endcase
case 12
nyktaso=12
restore taso12
endcase
case 13
nyktaso=13
restore taso13
endcase
endselect
endfunction
`*** OHJELMAN LOPPU ***
`Tässäkohtaa lopetetaan ohjelma
PROG_END:
`Lopetetaan ohjelma...
ODE END `Lopetetaan ode
END `Lopetetaan ohjelma
It is licensed GPL and here is link to GPL license:
http://www.gnu.org/copyleft/gpl.html
Hope you like my game and please give some feedback if you want.
Maybe I make Whoosh2 someday.
Thank you.
(2b)||C!(2b) (It's C++) vs. TO B OR NOT 2B (It's DarkBasic!)