Korjautuu, kun lisäät ehtoon, että "If reload = 0 And ammukset>0 And ase<>0 Then"
Edellisestä unohtui pari kohtaa, niin tässä vielä vähäsen päivitettynä. Kun olet älynnyt, mitä nuo koodirivit tekevät, niin voit harventaa runsasta kommentointiani sekä vanhoja koodipätkiä...
Code: Select all
peli:
While luku<100
AddText "Ladattu... "+luku+"%"
luku = Min( luku+Rand(1,30), 100) // lisätään lukuun randomisti ja rajoitetaan se 100:aan
DrawScreen
Wait Rand(500,1500)
Wend
// näytetään vielä lopuksi 100%
AddText "Ladattu... "+luku+"%"
DrawScreen
Wait 500
SCREEN 800,600
FrameLimit 40
//tehdään tyypit
Type BULLETS
Field obj
// Field hp ' et tarvitse hp:ta ammukselle
Field dmg
Field speed // tätäkin käytit vain yhdessä kohdassa, mutta jatkossa voit tarvita,
// jos teet ammuksen nopeudesta riippuvaisen aseesta
// Field id ' ID:tä en huomannut missään
End Type
Type vihut
Field obj
Field id
Field hp
Field dmg
Field score
EndType
//pelin maasto
grass=MakeObjectFloor()
lawn=LoadImage("metsä.png")
PaintObject grass,lawn
PositionObject grass,0,0, -2
//ladataan kaikki pelin objectit
pati = LoadObject("luoti.png")
hiiri = LoadObject ("tähtäin.png")
pelaaja = LoadObject ("ukkopistooli.png",72)
miekkaase = LoadObject ("miekka.png",72)
miekkaukko = LoadObject ("miekkaukko.png",72)
pistooliukko = LoadObject ("ukkopistooli.png",72)
konepistooliukko = LoadObject ("konepistooli.png",72)
osuma = LoadAnimObject("osuma.png",40,40,0,4)
ShowObject pati,OFF
ShowObject miekkaukko,OFF
ShowObject pistooliukko,OFF
ShowObject konepistooliukko,OFF
////vihollisen jutut////
vihollinen1 = LoadObject ("monsteri1.png",72)
vihollinen2 = LoadObject ("monsteri2.png",72)
ShowObject vihollinen1,OFF
ShowObject vihollinen2,OFF
//ladataan musiikit ja äänet
pistooli = LoadSound ("sword.ogg")
konepistooli = LoadSound ("machinegun.ogg")
miekka = LoadSound ("sword.ogg")
lyöminen = LoadSound ("bulletbody.ogg")
osui = LoadSound ("bulletbody.ogg")
vihollinen = LoadSound ("snorker 1.ogg")
yläpalkki = LoadImage ("yläpalkki.png")
ruumis = LoadObject ("ruumis.png")
kuolit = LoadObject ("ruumis.png")
ShowObject kuolit,OFF
ShowObject ruumis, OFF
//laitetaan pelaajan hp , voima , kaikkea..
hp = 100
voima = 5
ammukset = 20
tapot = 0
tapotpisteet = 1000
//ASEET
// MÄÄRITELLÄÄN YHDELLÄ MUUTTUJALLA KAIKKI ASEET
// Aseen voimat yms. Voitaisiin tallentaa taulukkoon / tekstifileen
ase = 1
'miekka=0
'pistooli=1
'konepistooli=2
ShowMouse OFF // tätä ei tarvitse määritellä joka kierros uudestaan..
Repeat////
// todennäköisesti turhia määritellä joka kierros
' ObjectOrder pelaaja,1
' ObjectOrder osuma,1
//pelaajan ohjaus
PositionObject hiiri,MouseWX(),MouseWY()
// TÄMÄ ennen alempaa riviä, koska alempi rivi tarkastelee hiiren sijaintia,
// muuten lukee sijainnin vasta kierroksen jäljessä olevasta sijainnista
PointObject pelaaja, hiiri
' If LeftKey() Then TurnObject pelaaja,5
' If RightKey() Then TurnObject pelaaja,-5
' If UpKey() Then MoveObject pelaaja,2
' If DownKey() Then MoveObject pelaaja,-2
// Pelaaja osoittaa jo valmiiksi objektiin, niin sivusuunnassa ei voi liikkua..
// Yksinkertaisemaa kirjoittaa ainakin mielestäni näin yhdelle riville
// MoveObject pelaaja, (UpKey()-DownKey() ) * nopeus
MoveObject pelaaja, (UpKey()+KeyDown(cbkeyW)-KeyDown(cbkeyS)-DownKey() ) * 2
///////////////////////
////// AMPUMINEN //////
///////////////////////
// Alkuperäinen oli hirveää copypastea, joten muutin vähäsen..
If reload = 0 And ammukset>0 And ase<>0 Then
// jos ollaan jo ammuttu ja ase on pistooli, niin esto on päällä ja nollataan ammuttu
If ammuttu = 1 And ase = 1 Then esto=ON
If MouseDown(1) And esto=OFF Then
newBullet.BULLETS= New(BULLETS)
newBullet\obj = CloneObject(pati)
newbullet\dmg = voima
newbullet\speed = speedupg
' HUOM et ole määritellyt speedupg-muuttujaa missään
' mieluiten määrittele nopeus ase kohtaisesti ;)
CloneObjectPosition newBullet\obj,pelaaja
CloneObjectOrientation newbullet\obj,pelaaja
MoveObject newBullet\obj,24
ammukset - 1
Select ase
// Jos ei sittenkään ammuta miekalla
'Case 0 Nyrkki
' ammukset + 1 lisätään ammuksia yksi, jos halutaan, että nyrkkiä voi käyttää loputtomasti
Case 1 ' Pistooli
PlaySound pistooli, 50
reload = 8
Case 2 ' Konekiväri
PlaySound konepistooli,50
reload = 8
EndSelect
ammuttu = 1
EndIf
EndIf
// kun hiiri nousee, niin poistetaan esto (jos sitä on edes ollut)
If MouseUp(1) Then esto=OFF : ammuttu = 0
If reload>0 Then reload-1 // vähennetään vain kun on realoadia...
////aseen vaihto
//käytä elselauseita kun mahdollista
If KeyHit (cbkey1)
PaintObject pelaaja,pistooliukko
ShowObject miekkaase,OFF
ase = 1
ElseIf KeyHit (cbkey2)
PaintObject pelaaja,konepistooliukko
ShowObject miekkaase,OFF
ase = 2
ElseIf KeyHit (cbkey3)
PaintObject pelaaja,miekkaukko
ShowObject miekkaase,ON // Showobject komennon määrittämistä ei tarvitse tehdä joka kierros..
ase = 0
EndIf
// Ohjaukset siirretty ylös
// miksi näissä oli eri nopeudet kuin aikaisemmissa??
' If KeyDown(cbKeyW) Then MoveObject pelaaja,4' 17 = W
' If KeyDown(cbKeyS) Then MoveObject pelaaja,-3
If ase=0 Then
CloneObjectPosition miekkaase,pelaaja
miekkaangle = WrapAngle(miekkaangle + (KeyDown(cbkeyA)-KeyDown(cbkeyD)) * 10 )
RotateObject miekkaase, miekkaangle + ObjectAngle(pelaaja)
// ensin ylempi rivi, koska alempirivi tarvitsee sitä, että tarkistus ei mene kierrosta jäljessä.
EndIf
' If miekka=1 Then CloneObjectPosition miekkaase,pelaaja
' RotateObject miekkaase, miekkaangle + ObjectAngle(pelaaja)
' If miekka=1 And KeyDown(cbkeyA) Then miekkaangle = WrapAngle(miekkaangle + 10)
' If miekka=1 And KeyDown(cbkeyD) Then miekkaangle = WrapAngle(miekkaangle - 10)
//ALIENIT
// timeria käyttämällä voisi olla tasaisempaa alieneiden luontinopeus eri tietokoneilla
If luo>80
newAlien.vihut= New(vihut)
PositionObject newAlien\obj,Rand(-1600,1000),Rand(1600,-1000)
newAlien\id=Rand(1,2)
Select newAlien\id 'käytä mielummin selectiä on selvempi
Case 1
newAlien\obj=CloneObject(vihollinen1)
newAlien\hp=Rand(130,190):newAlien\dmg=Rand(2,5):newAlien\score=Rand(10,30)
Case 2
newAlien\obj=CloneObject(vihollinen2)
newAlien\hp=Rand(300,320):newAlien\dmg=Rand(5,8):newAlien\score=Rand(15,35)
Default
MakeError "Annetulle IDlle ei ole asetettu toimintoa"
EndSelect
luo=0
EndIf
luo+1
For iAlien.vihut= Each vihut'Aloitetaan zombien läpikäynti
If iAlien\ID>0 Then ' jos on elossa
' Jos muuttujaa ei käytetä kuin kerran kannattaa muuttujan arvo kirjoittaa
' suoraan tarvittavaan paikkaan.. MoveObject iAlien\obj,0,Rand(-20,20)
' sidle=Rand(-20,20)
// Ensin kannattaa tähdätä ja sitten vasta liikkua...
PointObject iAlien\obj, pelaaja 'zombi tähtää pelaajaan
// liikkuminen tähtäyksen jälkeen, jos ei ole osumia ja näkee pelaajan
If ObjectSight (iAlien\obj,pelaaja) And CountCollisions(iAlien\obj)=0 Then
MoveObject iAlien\obj,1
Else
MoveObject iAlien\obj,0,Rand(-20,20)
EndIf
// vähennetään ukon energiaa, kun alien ja pelaaja ovat päällekkäin
If ObjectsOverlap(iAlien\obj,pelaaja) Then hp-iAlien\dmg : iAlien\hp-4
// samaa if-lausetta ei tarvitse kirjoittaa uudestaan, vaan voit lisätä
// seuraukset aijempaan samaan if-lauseeseen
' If ObjectsOverlap (pelaaja,iAlien\obj) Then iAlien\hp-4
// tämän tarkistuksen voisi tehdä ammusten tarkistus silmukassa, mutta tässäkin kohtaa menettelee
For ibullet.bullets=Each bullets
If ObjectsOverlap(ibullet\obj,iAlien\obj) Then
PlaySound osui,50
iAlien\hp-ibullet\dmg
EndIf
Next ibullet
// jos pelaajaan osutaan, niin soitetaan ääni
// tätä pitää tarkistaa muulloinkin kuin kuollessa..
If ObjectsOverlap (pelaaja,Ialien\obj) Then
CloneObjectPosition osuma,pelaaja
PlaySound vihollinen, 100 ' 250 ei ole mahdollinen voimakkuus. 100% on kuitenkin maksimi
PlayObject osuma,2,11,0.25 ' onko osuma sijoitettu oikeaan paikkaan, kun se käynnistetään??
EndIf
// Zombin kuolema
If iAlien\hp<0 Then 'jos zombin energiat loppuu, niin tapetaan se ja annetaan pisteet
tapotpisteet+1
tapot+1
// Alempi koodi tulisi tarkistaa kokoajan, eikä vain zombin kuollessa!!
// siirretty ylemmäs
' If ObjectsOverlap (pelaaja,Ialien\obj) Then
' CloneObjectPosition osuma,pelaaja
' PlaySound vihollinen, 250
' PlayObject osuma,2,11,0.25
' EndIf
xx=ObjectX(iAlien\obj)
yy=ObjectY(iAlien\obj)
ShowObject iAlien\obj, OFF
iAlien\obj = CloneObject(ruumis)
PositionObject iAlien\obj,xx,yy
ShowObject iAlien\obj, ON
ObjectOrder iAlien\obj,1
iAlien\ID=-1 ' estetään toiminnot
ObjectLife iAlien\obj,300 'poistetaan tietyn ajan kuluttua
ObjectOrder ruumis,-1
EndIf
EndIf
Next iAlien
For iBullet.BULLETS= Each BULLETS
' If CountCollisions(ibullet\obj) Then ibullet\hp-32
' miksi ammuksella pitäisi olla hp. Tarkistukseen voi suoraan istää councollisions..
MoveObject iBullet\obj,6 'voisit muuttaa MoveObject iBullet\obj,iBullet\speed
If Distance2(iBullet\obj,pelaaja)>600 Or CountCollisions(ibullet\obj)>0 Then 'jos...niin tuhotaan ammus
DeleteObject iBullet\obj
Delete iBullet
EndIf
Next iBullet
DrawGame
// Valikko
DrawImage yläpalkki ,0,0
Text 10,10,"PISTEITÄ :"+tapotpisteet
Text 200,10,"TAPOT :"+tapot
Text 20,30, "LISÄÄ HP(4) + 50hp - 30p"
Text 20,45, "HP nyt = "+hp
Text 250,30,"LISÄÄ VOIMAA(5) + 5 voima - 20p"
Text 250,45,"VOIMA nyt = "+voima
Text 500,30,"LISÄÄ AMMUKSIA(6) + 25 ammusta - 10p"
Text 500,45,"AMMUKSIA nyt = "+ammukset
' tapotpisteet <> 30 tarkoittaa samaa kuin Not tapotpisteet=30
// voit muuttaa nämä normaaleiksi if-lauseiksi jos haluat painaa napeja yhtäaikaa
If KeyHit(cbkey4) And tapotpisteet>30
hp+50
tapotpisteet-30
ElseIf KeyHit(cbkey5) And tapotpisteet>20
voima+5
tapotpisteet-20
ElseIf KeyHit(cbkey6) And tapotpisteet>10
ammukset+25
tapotpisteet-10
EndIf
// näistä ei ole mitään hyötyä!!!
// välttääksesi koko homman kirjoitat vain tapotpisteet>30
' If Not tapotpisteet=30 Then
' hp-0
' tapotpisteet-0
' EndIf
// Tässä kohtaa kannattaa käyttää Updategame- komentoa, koska muuten kuva tökkii reinään törmätessä
UpdateGame
CloneCameraPosition pelaaja
DrawScreen
// tämä Drawscreenin jälkeen, niin tulee ajankohtainen kuva, eikä edelliseltä kierrokselta..
If KeyHit(cbkeyf12) Then ScreenShot "C:\capture.bmp"////screenshot-komento
Forever