Tässä olis esimerkki Ammukkset 2 oppitunnista muokattuna. Tiedän, että olis 1001 tapaa toteuttaa tämä paremmin. Halusin vain tehdä sellaista koodia, että aloittejakin ymmärtää sen.koodari299 wrote:elikkä mulla olis sellainen tosi tyhmä kysymys, eli kun otan vaikka learning centeristä ton ammukset 2 ja lisään sinne vihollisen, niin mikä koodi pätkä siihen pitää pistää ,että ammus ei mene vaan läpi vaan esim. vihun hp vähenee.
ei ole toiminut countsollisiont ja objectsoverlapit.
Code: Select all
'Esimerkki 18 : Ammukset (osa 2)
'================================================
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'Aja tämä ohjelma painamalla F5.
'Lopeta ohjelma painamalla ESC.
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
Field obj 'yksi kenttä nimeltään 'obj'
End Type
FrameLimit 40 'rajoita nopeutta
ukko=LoadObject("Media\soldier.bmp",72)
vihu=LoadObject("Media\guy.bmp",72)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
PositionObject vihu,100,100
vihuhp=100
AddText "Nuolista ohjaa, CTRL=ampuu"
Repeat
Color cbWhite
Text 0,13,"Vihuhp: "+vihuhp //Tulostetaan vihun hp
If vihuhp <= 0 Then MakeError "Vihu kuoli!" //Jos vihun hp on 0 tai pienempi tehdään virhe: Vihu kuoli!
'Ohjaa ukkoa NUOLILLA
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,2
If DownKey() Then MoveObject ukko,-2
'Ammu-systeemi. Vain, jos ase on ladattu
If KeyDown(cbKeyRControl) And reload=0 Then
luoti.AMMUS = New(AMMUS) 'luo uusi ammus
luoti\obj=CloneObject(pati) 'tee klooni
'asetetaan pati samaan paikkaan
CloneObjectPosition luoti\obj,ukko
'käännetään pati samaan suuntaan
CloneObjectOrientation luoti\obj,ukko
reload=5 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If ObjectsOverlap(luoti\obj,vihu,3) Then //Jos luoti osuu vihuun...
vihuhp = vihuhp - 10 //Vähennetään vihun hp:ta
tuhoa = True //Asetetaan tuhoa todeksi
EndIf
If ObjectX(luoti\obj)<-180 Or ObjectX(luoti\obj)>180 Or ObjectY(luoti\obj)<-130 Or ObjectY(luoti\obj)>130 Then
'ammus ylittää rajan -> tuhoa se
DeleteObject luoti\obj 'poista objekti
Delete luoti 'poista luoti kokonaan
EndIf
If tuhoa Then //Jos tuhoa on tosi..,
DeleteObject luoti\obj 'poista objekti
Delete luoti 'poista luoti kokonaan
tuhoa = False //Asetetaan tuhoa epätodeksi
EndIf
Next luoti
'tämä ennen muuta grafiikkaa (box)
DrawGame
'piirrä "kenttä"
Color cbOrange
Box 20,20,360,260,OFF
DrawScreen
Until EscapeKey()
'Analyysi:
'------------------------------------------------
'Noin. Esimerkki toimii samalla tavalla kuin
'edellinen oppitunti, mutta on puolet lyhyempi,
'ja luultavasti selkeämpi. Ohjaussysteemi ja
'luotien törmäys on edelleen sama, muuttunutta
'on vain tapa, jolla ammuksia hallitaan.
'Ohjelman alussa luomme KOKOELMAN, jonne voidaan
'lisätä ja josta voidaan poistaa jäseniä. Aina
'kun uusi jäsen luodaan, sille monistetaan FIELD-
'kentällä määritellyt omat muuttujansa. Jokainen
'jäsen on siis yksilö ja erillinen kokonaisuus.
'Kun ammutaan, rivillä 31 luodaan uusi jäsen.
'Sillä on yksi muuttuja, johon sijoitamme objektin.
'Loppu on helppoa.
'Riviltä 43 alkaen läpikäymme kaikki kokoelman
'luodit. Elossa/Kuollut-kikkailuja ei tarvita.
'Huomaa erikoinen FOR-rakenne. Siellä on nyt EACH,
'jonka jälkeen kirjoitetaan kokoelman nimi.
'Erikoisinta on se, että luoti-muuttujalla on
'erikoinen tyyppi. Sen perään kirjoitetaan .AMMUS
'Tämä kertoo CoolBasicille, että muuttuja kuuluu
'kokoelmaan ja että sen avulla viitataan kokoelman
'jäseneen. Tyyppiä ei tarvitse määritellä kuin
'ensimmäisellä kerralla, sen jälkeen riittää
'pelkkä "luoti". Selvennykseksi olen kuitenkin
'kirjoittanut sen joka kerta kun sitä käytetään
'tavallaan "uuteen" tarkoitukseen.
'Tyypeistä (kokoelmista) tulee vielä paras ystäväsi.
'Opettele käyttämään niitä. Alkuhämmennyksen
'jälkeen ne ovat paljon kätevämpiä kuin taulukot.
'Lisää tietoa tyypeistä löydät manuaalista ja
'tyyppikomentojen oppaista ja esimerkeistä.
Parantelin koodia