Eli, teinpä tällaisen esimerkin vaihtuvista aseista, kun niin moni sitä täällä foorumeilla tuntuu tarvitsevan. Se on yksinkertaisesti toteutettu muuttujalla "ase". Ohjelmassa selvitetään, mikä on muuttujan "ase" arvo, ja suoritetaan sen mukaan erilainen ampumistyyli. Haulikon toiminta on yksinkertainen: For...Nextillä tehdään viisi ammusta: Ensimmäinen ammus sijoitetaan kulmaan ukko - 15, seuraava 6 pikseliä edemmäs jne. Eli -15...+15. Koska 30 (haarukka) \ 5 (ammusten määrä) = 6 (ammusten kulman etäisyys toisistaan), niin ammukset lähtevät tasaisesti. Muut aseet lienee tuttuja oppitunnista 18: Ammukset 2. Tästä luultavasti on hyötyä jollekin. Koodi:
'Esimerkki 18 : Ammukset (osa 3) By: TukeKoodi
'================================================
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'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)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
AddText "Nuolista ohjaa, CTRL=ampuu"
ase = 1
Repeat
'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
If KeyHit(CbKeyQ) Then ase = ase + 1
If KeyHit(CbKeyA) Then ase = ase - 1
If ase = 1 Then Gosub pistooli
If ase = 2 Then Gosub haulikko
If ase = 3 Then Gosub sarjatuliase
If ase = 1 Then
Text 0, 20, "Ase: pistooli"
EndIf
If ase = 2 Then
Text 0, 20, "Ase: haulikko"
EndIf
If ase = 3 Then
Text 0, 20, "Ase: rynnäkkökivääri"
EndIf
If ase < 1 Then ase = 1
If ase > 3 Then ase = 3
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
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
Next luoti
DrawScreen
Until EscapeKey()
pistooli:
If KeyHit(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
Return
sarjatuliase:
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=3 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 5
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=20 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 5
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
RotateObject luoti\obj, ObjectAngle(ukko)+Rand(-15,15)
Next i
reload=20 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
Pitemmittä koodeitta, ei kannattais tuota panoksen kulman satunnaisuutta tehdä RotateObjectilla ja ObjectAnglella, kun sinulla on jo aijemmin koodissa CloneObjectOrientation. Voisit vaan CloneObjectOrientationin alle laittaa TurnObject Luoti\obj, rnd(-25, 25)
Solar Eclipse
Meneillä olevat Projektit:
Solar Engine - Modernin OpenGL rajapinnan päällä toimiva 3D ja 2D pelimoottori.
'Esimerkki 18 : Ammukset (osa 3) By: TukeKoodi,Execute
'================================================
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'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)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
AddText "Nuolista ohjaa, CTRL=ampuu"
ase = 1
Repeat
'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
If KeyHit(CbKeyQ) Then ase = ase + 1
If KeyHit(CbKeyA) Then ase = ase - 1
If ase = 1 Then Gosub pistooli
If ase = 2 Then Gosub haulikko
If ase = 3 Then Gosub sarjatuliase
If ase = 4 Then Gosub bom
If ase = 5 Then Gosub haulikko2
If ase = 1 Then
Text 0, 20, "Ase: pistooli"
EndIf
If ase = 2 Then
Text 0, 20, "Ase: haulikko"
EndIf
If ase = 3 Then
Text 0, 20, "Ase: rynnäkkökivääri"
EndIf
If ase = 4 Then
Text 0,20, "Ase: pommi"
EndIf
If ase = 5 Then
Text 0,20, "Ase: haulikko2"
EndIf
If ase < 1 Then ase = 1
If ase > 5 Then ase = 5
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
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
Next luoti
DrawScreen
Until EscapeKey()
pistooli:
If KeyHit(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
Return
sarjatuliase:
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=3 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 5
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=20 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
bom:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 99
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=100 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko2:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 10
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=50 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
kokonaista 2 uutta asetta... Pommi ja haulikko2
SpaceCraft on kokopitkä peli! Nyt ladattavissa! Tsekkaa!
'Esimerkki 18 : Ammukset (osa 3) By: TukeKoodi,Execute
'================================================
'! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
'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)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
AddText "Nuolista ohjaa, CTRL=ampuu"
ase = 1
Repeat
'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
If KeyHit(CbKeyQ) Then ase = ase + 1
If KeyHit(CbKeyA) Then ase = ase - 1
If ase = 1 Then Gosub pistooli
If ase = 2 Then Gosub haulikko
If ase = 3 Then Gosub sarjatuliase
If ase = 4 Then Gosub bom
If ase = 5 Then Gosub haulikko2
If ase = 1 Then
Text 0, 20, "Ase: pistooli"
EndIf
If ase = 2 Then
Text 0, 20, "Ase: haulikko"
EndIf
If ase = 3 Then
Text 0, 20, "Ase: rynnäkkökivääri"
EndIf
If ase = 4 Then
Text 0,20, "Ase: pommi"
EndIf
If ase = 5 Then
Text 0,20, "Ase: haulikko2"
EndIf
If ase < 1 Then ase = 1
If ase > 5 Then ase = 5
'Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
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
Next luoti
DrawScreen
Until EscapeKey()
pistooli:
If KeyHit(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
Return
sarjatuliase:
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=3 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 5
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=20 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
bom:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 99
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=100 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
haulikko2:
If KeyDown(cbKeyRControl) And reload=0 Then
For i = 1 To 10
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
RotateObject luoti\obj, ObjectAngle(ukko)+kulma
kulma = kulma + 6
Next i
kulma = - 15
reload=50 'aseen lataus
EndIf
'päivitä aseen lataaminen
If reload>0 Then reload=reload-1
Return
kokonaista 2 uutta asetta... Pommi ja haulikko2
Emmä nyt tiiä, haulikko2=copypasta mun koodista ja 2 lukua + nimi muutettu. bom=copypasta mun koodista ja 2 lukua + nimi muutettu.
TukeKoodin ja Executen molempien koodit olivat melko purkkaa ja eivät näyttäneet oikein hyvää esimerkkiä aloittelijoille. Tässä ammusesimerkki monella aseella käyttäen tyyppikokoelmia:
//Ammukset (Osa PWNED) by TheDuck
//
Type ASE //Asekokoelma
Field bulletsPerShot As Integer
Field spread As Float
Field reloadTime As Integer
Field name As String
EndType
Type AMMUS //luo kokoelma, jonka nimi on AMMUS
Field obj //yksi kenttä nimeltään 'obj'
End Type
FrameLimit 60 //rajoita nopeutta
ukko=LoadObject("Media\soldier.bmp", 72)
pati=LoadObject("Media\bullet.bmp")
ShowObject pati,OFF
pistooli.ASE = New(ASE)
pistooli\spread = Rnd(2) //hieman randomiutta panoksen suuntaan
pistooli\reloadTime = 1000 //1000 millisekuntttia latausaika
pistooli\name = "Pistooli" //nimi
pistooli\bulletsPerShot = 1 //ammuksia kerralla
haulikko.ASE = New(ASE)
haulikko\spread = Rnd(16) //panokset lentämään melko erilleen haulikon tyyliin
haulikko\reloadTime = 2000 //2000 millisekuntttia latausaika
haulikko\name = "Haulikko" //nimi
haulikko\bulletsPerShot = 8 //ammuksia kerralla
sarjatuli.ASE = New(ASE)
sarjatuli\spread = Rnd(3) //hieman randomiutta panoksen suuntaan
sarjatuli\reloadTime = 100 //100 millisekuntttia latausaika (nopea!)
sarjatuli\name = "Konekivääri" //nimi
sarjatuli\bulletsPerShot = 1 //ammuksia kerralla
current.ASE = First(ASE)
ReloadTimer = 0
Repeat
//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
//Vähän tekstiä ruudulle
Text 0, 0, "Nuolista ohjaa, CTRL=ampuu, SPACE vaihtaa asetta"
Text 0, 16, current\name
If KeyHit(cbkeyspace) Then
If current <> Last(ASE) Then //Jos nykyinen ase ei ole kokoelman viimeinen jäsen
current.ASE = After(current) //Nykyinen ase --> seuraava jäsen kokoelmassa
Else //Jos taas se on viimeinen
current.ASE = First(ASE) //Nykyinen ase -> eka jäsen kokoelmassa
EndIf
EndIf
//Ammu-systeemi. Vain, jos ase on ladattu
If KeyDown(cbKeyRControl) And Reloading = False Then
For i = 1 To current\bulletsPerShot
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
//käännetään luotia spreadin aikaansaamiseksi
TurnObject luoti\obj, Rnd(-current\spread, current\spread)
Next i
Reloading = True //Aloitetaan aseen lataus
ReloadTimer = Timer() //ajastin käyntiin!
EndIf
//päivitä aseen lataaminen
If Reloading And Timer() > ReloadTimer + current\reloadtime Then Reloading = False
//Päivitä kaikki ammukset
For luoti.AMMUS = Each AMMUS
MoveObject luoti\obj,6
If ObjectX(luoti\obj)<-200 Or ObjectX(luoti\obj)>200 Or ObjectY(luoti\obj)<-150 Or ObjectY(luoti\obj)>150 Then
//ammus ylittää rajan -> tuhoa se
DeleteObject luoti\obj //poista objekti
Delete luoti //poista luoti kokonaan
EndIf
Next luoti
DrawScreen
Until EscapeKey()