Koitin kokeilla esimerkin 19(painovoima) avulla pystynkö ottamaan näytön yläreunassa olevaan laatikkoon värin tilemapista, ukon kohdalta. Miksi laatikko pysyy melkein kokoajan mustana , vaikka taustalla ei ole lähes yhtään mustaa?
Code: Select all
'Esimerkki 19 : Painovoima (Tasohyppelyssä)
'================================================
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'OHJAUS:
' - nuolilla liikkuu
' - Z = hyppy
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Const PAINOVOIMA = -0.1 'painoviman voimakkuus
'pienempi->suurempi pv.
'positiiviset arvot->
'painovoima ylöspäin?!
yPlus#=0 'Tämä hallitsee hyppyä
'Asetetaan ruutu hieman zoomattuun tilaan
SCREEN 320,240,0,cbsizable
SetWindow "Painovoimaesimerkki",3 'suurenna ruudulle
'JOS PELI TÖKKII TAI PÄTKII TAI NYKII, MUUTA:
' 1) cbSizable -> cbFullScreen
' 2) poista rivi 23
FrameLimit 40 'rajoita nopeutta
'-------------------------------------------------
'lataa kartta, siirrä sitä ylöspäin ja animoi se.
kenttä=LoadMap("Media\testmap.til","Media\tileset.bmp")
PositionObject kenttä,0,50
PlayObject kenttä,0,0,0.5
'lataa animaatiosarja oikealle, maskaa ja piilota se
oikea=LoadAnimObject("Media\zerorun1.bmp",47,51,0,13)
MaskObject oikea,cbMagenta
ShowObject oikea,OFF
ObjectRange oikea,30,51 'tämä pitää asettaa kaikkiin
'sama vasemmalle
vasen=LoadAnimObject("Media\zerorun2.bmp",47,51,0,13)
MaskObject vasen,cbMagenta
ShowObject vasen,OFF
ObjectRange vasen,30,51 'tämä pitää asettaa kaikkiin
'Tämä on varsinainen pelihahmo, joka piirretään ja
'jota hallitaan. Sille asetetaan törmäys->kartta
'Tätä EI PIILOTETA.
pelihahmo=CloneObject(oikea)
SetupCollision pelihahmo,kenttä,1,4,2
ObjectRange pelihahmo,30,51 'tämä pitää asettaa kaikkiin
'-------------------------------------------------
'Pääsilmukka
Repeat
vauhti=0 'oletuksena ei liikettä
If RightKey() Then
'juokse oikealle
PaintObject pelihahmo,oikea 'vaihda kuvaa...
If maassa Then PlayObject pelihahmo,2,11,0.25
vauhti=2 'vauhtia oikealle
ElseIf LeftKey() Then
'juokse vasemmalle
PaintObject pelihahmo,vasen 'vaihda kuvaa...
If maassa Then PlayObject pelihahmo,2,11,0.25
vauhti=-2 'vauhtia vasemmalle
Else
'pysäytä animaatio, jos ei liikuta
PlayObject pelihahmo,0
EndIf
'liikuta pelihahmoa
TranslateObject pelihahmo,vauhti,yPlus#
yPlus=yPlus+PAINOVOIMA 'päivitä painovoima
UpdateGame 'päivitä törmäys
CloneCameraPosition pelihahmo 'liimaa kamera
maassa=0 'ilmassa jollei toisin käy ilmi
törmäykset=CountCollisions(pelihahmo)
'katsotaan tärmätäänkö kattoon tai lattiaan
For i=1 To törmäykset
If GetCollision(pelihahmo,i)=kenttä
'lattia
If CollisionAngle(pelihahmo,i)=90 Then
yPlus#=-1
maassa=1 'jalat on maassa
EndIf
'katto
If CollisionAngle(pelihahmo,i)=270 Then
yPlus#=-1
EndIf
EndIf
Next i
'jos ollaan ilmassa, näytä toisenlainen kuva
If törmäykset=0 Then PlayObject pelihahmo,12,0
'HYPPY (vain jos jalat maassa)
If KeyHit(cbKeyZ) And maassa Then
yPlus#=4.5 'voimaa ylös päin
EndIf
DrawGame
PickColor ObjectX(pelihahmo), ObjectY(pelihahmo)
Box 10,10,10,10,1
DrawScreen 'piirrä näyttö
Until EscapeKey()
'Analyysi:
'------------------------------------------------
'Tämä tasoloikkarunko on mahdollista kirjoittaa
'alle 80 rivin, jos ylimääräiset kommentit pois-
'tetaan. Tästäkin rivimäärästä 1/5 on kuvien ja
'kentän latausta. Samalla kenttä animoidaan,
'ja hahmo voi liikkua ja hyppiä animoituna. Ja
'kaiken päälle lätkäistään vielä painovoima ja
'törmäyksentunnistus. Pääohjelma on vain noin
'50 riviä pitkä. CoolBasic näyttää kyntensä!
'Rivi 14 määrittelee VAKION. Se on kuin muuttuja,
'mutta sen arvoa ei voi jälkikäteen muuttaa.
'Eli se on kuin mikä tahansa luku, mutta se
'esitetään NIMELLÄ. Painovoima sopii vakioksi,
'koska se ei muutu. Voit säätää pinovoiman
'voimakkuutta pienentämällä vakion arvo entises-
'tään.
'Rivillä 22 ja 23 asetetaan ensin ikkuna zoomattuun
'tilaan (cbSizable). Ikkuna esitetään aluksi
'alkuperäisessä koossaan ruudulla, mutta sen
'sisäiset ulottuvuudet on zoomattu haluttuihin
'mittoihin. Rivi 23 suurentaa ikkunan koko
'näytölle.
'Rivit 31-53 pitäisi olla tuttua kauraa jo tähän
'mennessä. Pointti on kuitenkin se, että kaikki
'animaatiosarjat (tässä vasen ja oikea) ladataan
'valmiiksi, mutta piilotetuna. Näitä tarvitaan
'vain PaintObjectia varten. Lopuksi luodaan
'varsinainen pelihahmo, joka kloonataan oikea-
'sarjasta, joten oletussuunta - mihin pelaaja
'katsoo - on oikealle.
'Ohjauksesta sen verran, että joka kerran kun
'nuolia painetaan, käytetään PaintObjectia
'muuttamaan pelihahmon katselusuuntaa. Hahmo
'animoidaan (PlayObject) vain jos jalat on
'maassa (tieto edellisestä silmukkakerrasta).
'Jos mitään ei paineta, soitetaan joutilas-
'animaatio (frame 0).
'Sitten liikutetaan pelihahmoa - myös pysty-
'suunnassa painovoiman vaikutuksesta.
'Painovoimaa hallitaan itse asiassa muuttujalla
'"yPlus#", joka määrää paljonko hahmo liikkuu
'pystysuunnassa. Siksi tätä muuttujaa kasvatetaan
'painovoimalla, joten y-nopeus kasvaa. Y-nopeus
'nollataan, jos jalat on maassa (käsitellään kohta).
'Myös Hypyssä tätä arvoa muutetaan.
'HUOM! UpdateGamea kutsutaan tässä vaiheessa,
'ENNEN törmäyksen käsittelyä.
'Törmäys tarkistetaan seuraavasti:
' - lasketaan montako törmäystä tapahtui
' - käydään ne kaikki läpi
' - jos törmättiin kattoon, nollataan yPlus,
' mikä saa hahmon tippumaan alaspäin
' - jos törmättiin lattiaan, nollataan taas
' yPlus, ja sen lisäksi JALAT ON MAASSA.
' - kaikissa muissa tapauksissa jalat on ILMASSA,
' koska missään vaiheessa ei muuteta, että
' alat olisivat maassa.
'Tietoa JALAT MAASSA tarvitaan hypyssä. Ensinäkin
'hyppy voi tapahtua vain maasta käsin, muuten
'palihahmo pystyisi lentämään, koska hyppy
'tapahtuisi myös ilmassa. Hypyn tapahtuessa
'annetaan hahmon Y-nopeudeksi positiivinen
'arvo, eli hypyn voimakkuus. Muuta tätä säätääk-
'sesi hypyn voimakkuutta. Pienempi arvo -> matalampi
'hyppy.
'Leikkimään:
'------------------------------------------------
'1) Muuta painovoimaa
Kiitän auttajia etukäteen.