Itselläni kävi vähän samalla tavalla yhdessä avaruuslentely projektissani. Ongelma ratkesi tyyppien tyhjennyksellä, aina kun tuli gameoveri (sinun tapauksessasi myös kun tulee voitto). Tuossa ylemmässä koodin pätkässä vähän mietityttää, että miksi ihmeessä se on aAsteroidi, kun muutamaa riviä aiemmin se on newAsteroidi? Sinun koodiisi mukautettuna se tyyppien tyhjennys menisi varmaankin jotenkin näin:(katso voitto ja havisit, siihen aAsteroidiin en koskenut)
Code: Select all
'Kokoelmat
Type AMMUS 'luo kokoelma, jonka nimi on AMMUS
Field obj 'yksi kenttä nimeltään 'obj'
End Type
Type ASTEROIDIT'Kokoelma asteroidi
Field obj'yksi kenttä nimeltään 'obj'
End Type
'Alkuvalmistelut
SCREEN 400, 300
AddText "Ladataan.."
times = 0
'Musiikki ennen kaikkea!
PlaySound "media\NFSIIIaquila.mid"
FrameLimit 33
alku :
ClearObjects //<--tuon myös lisäsin
ClearText
'Ns. menu
Locate 55,115
AddText "Paina 1 aloittaaksesi tavallisen pelin"
AddText "Paina 2 aloittaaksesi kaksinpelin"
AddText "Paina 3 nähdäksesi pelin infotiedoston"
If voitot > 0 Then
AddText "Paina 4 aloittaaksesi pelin hc-modella"
EndIf
Locate 7,5
AddText "Avaruuslentelypeli alpha [BETA 2]"
Locate 7,280
AddText "(c) Veikko 'Wee' Vauhkonen 2008"
'Piirretään ylä-ja alaviivat kentälle
Line 0,26,400,26
Line 0,260,400,260
DrawScreen
WaitKey
ClearText
'Minne mennään menusta?
If KeyDown(cbkey1) Then Goto peli
If KeyDown(cbkey2) Then Goto kaksinpeli
If voitot > 0 Then
If KeyDown(cbkey4) Then
Goto hc
EndIf
EndIf
peli :
SetWindow "Rivi: 59"
'Ladataan objecktit, spritet, äänet
pumsnd = LoadSound("media/Blaster.wav")
alus = LoadObject("media/ship.png", 4)
pati = LoadObject("media/pati.png", 4)
asteroidi = LoadObject("media/asteroidi.png", 1)
ShowObject pati,OFF
TurnObject alus, 90
PositionObject alus, -160, 30
PositionObject asteroidi, -250,-250
'PERUSPELISILMUKKA
Repeat
SetWindow "Rivi: 73"
If uusiutuminen>0 Then uusiutuminen=uusiutuminen-1
SetWindow "Rivi: 75"
'Asteroidit...'
If uusiutuminen=0 Then
newAsteroidi.ASTEROIDIT= New(ASTEROIDIT)
newAsteroidi\obj=CloneObject(asteroidi)
PositionObject newAsteroidi\obj, 230, Rand(110,-100)
MoveObject newAsteroidi\obj,Rand(-0.5,-5)
uusiutuminen=Rand(10,27)
EndIf
SetWindow "Rivi: 84"
'Päivitetään asteroidit
a=0
For aAsteroidi.ASTEROIDIT= Each ASTEROIDIT //sitä ihmettelin että miksi <-- tuolla on aAsteroidi,
MoveObject aAsteroidi\obj,Rand(-2,-4.5)//vaikka se on muutamaa riviä ylempänä newAsteroidi?
If ObjectX(aAsteroidi\obj)< -225 Then
DeleteObject aAsteroidi\obj
Delete aAsteroidi
pisteet=pisteet-10
EndIf
a=a+1
Next aAsteroidi
SetWindow "Rivi: 96"
'Pisteet yläkulmaan
Text 300,2, "Pisteet: "
Text 370,2, pisteet
'Tekstinsyötötökokeilut ylös, ja alaspäin vas. ylänurkka
If UpKey() Then
ClearText
Text 2,2, "Painat nuolta ylöspäin"
EndIf
If DownKey() Then
ClearText
Text 2,2, "Painat nuolta alaspäin"
EndIf
'Päiväys alareunaan
Text 1,280, "Tänään on"
Text 80,280,Date()
Text 177,280,Time()
'FPS oikeaan alareunaan
Text 340,280, "FPS:"
Text 370,280,FPS()
'Piirretään ylä-ja alaviivat kentälle
Line 0,26,400,26
Line 0,260,400,260
'Aluksen liikkuminen
If UpKey() Then MoveObject alus, 4.5
If DownKey() Then MoveObject alus, -4.5
'Aluksen pelikentän rajaaminen
If ObjectX(alus)>200 Then PositionObject alus, 200,ObjectY(alus)
If ObjectX(alus)<-200 Then PositionObject alus, -200,ObjectY(alus)
If ObjectY(alus)>115 Then PositionObject alus, ObjectX(alus),115
If ObjectY(alus)<-100 Then PositionObject alus, ObjectX(alus),-100
SetWindow "Rivi: 133"
'Ampuminen oikealle
If KeyDown(cbkeyspace) And aselataus=0 Then
PlaySound pumsnd, 65
luoti.AMMUS = New(AMMUS)
luoti\obj=CloneObject(pati)
CloneObjectPosition luoti\obj,alus
PositionObject luoti\obj, ObjectX(luoti\obj)+11.5,ObjectY(luoti\obj)-1
aselataus=8
EndIf
If aselataus>0 Then aselataus=aselataus-1
SetWindow "Rivi: 144"
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
DeleteObject luoti\obj
Delete luoti
EndIf
Next luoti
SetWindow "Rivi: 152"
'Mitäpä jos asteroidi ja ammus törmäävät?
For aAsteroidi.ASTEROIDIT= Each ASTEROIDIT
For luoti.AMMUS = Each AMMUS
If Distance2 (luoti\obj, aAsteroidi\obj)<20 Then
pisteet=pisteet+1
DeleteObject aAsteroidi\obj
Delete aAsteroidi
DeleteObject luoti\obj
Delete luoti
Exit
EndIf
Next luoti
Next aAsteroidi
SetWindow "Rivi: 166"
'Pelin lopetus
If pisteet<0 Then
pisteet = 0
Goto havisit
EndIf
If pisteet>49 Then
pisteet = pisteet+1
Goto voitto
EndIf
'Pelikentän pisteet, "tähdet"
Dot 40,50
Dot 150,200
Dot 300,97
Dot 270,160
Dot 210,185
Dot 25,143
Dot 180,240
Dot 190,50
Dot 17,85
Dot 45,240
Dot 50,150
Dot 350,200
Dot 75,201
Dot 150,200
Dot 180,150
Dot 120,40
Dot 170,195
Dot 100,110
Dot 365,100
Dot 340,50
Dot 80,70
Dot 240,90
Dot 270,210
Dot 350,220
Dot 170,80
'Se unohtumaton
DrawScreen
Forever
SetWindow "Rivi: 207"
kaksinpeli :
ClearObjects
Text 50,50, "Kaksinpeli on kivaa!"
DrawScreen
WaitKey
End
hc :
ClearObjects
Text 50,50, "HC:kin on kivaa!"
DrawScreen
WaitKey
End
voitto :
Repeat
Text 30,100,"Läpäisit pelin, ja sait 50 pistettä!"
Text 30,110,"Paina SPACE mennäksesi alkuvalikkoon"
Text 30,120,"Avasit peruspelitilan voittamalla HC - moodin!"
For luoti.AMMUS = Each AMMUS
DeleteObject luoti\obj
Delete luoti
Next luoti
For newAsteroidi.ASTEROIDIT = Each ASTEROIDIT
DeleteObject newAsteroidi\obj
Delete newAsteroidi
Next newAsteroidi
DrawScreen
Until KeyHit(cbkeyspace)
times = times+1
voitot = voitot+1
Goto alku
havisit :
Repeat
Text 10,100,"Hävisit pelin, sillä pisteesi menivät miinukselle."
Text 10,110,"Paina SPACE mennäksesi alkuvalikkoon"
Text 10,120,"Voit lopettaa pelin painamalla mitä vain"
//Tuo alin teksti ei kyllä enää ole totta, mutta ei sillä kai ole kauheasti väliä :P
For luoti.AMMUS = Each AMMUS
DeleteObject luoti\obj
Delete luoti
Next luoti
For newAsteroidi.ASTEROIDIT = Each ASTEROIDIT
DeleteObject newAsteroidi\obj
Delete newAsteroidi
Next newAsteroidi
DrawScreen
Until KeyHit(cbkeyspace)
times = times+1
Goto alku
Jos ei toimi näin, niin sitten menee luultavasti minullakin jo sormi suuhun. Niin ja hyvät uudet vuodet sinullekin!