Seite 1 von 1

Programm wird langsamer und langsamer

Verfasst: 24.09.2006 16:53
von Milchshake
Hab da ein problem
Wenn ich das programm starte wird es immer langsamer und langsamer und irgentwan ist es aus.Was tun?

Code: Alles auswählen

;TST 03
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"TST 2")

CreateSprite(0,64,64)
  StartDrawing( SpriteOutput(0) )
    Circle(32,32,16,$ff0000)
  StopDrawing()
CreateSprite(50,64,64)
  StartDrawing( SpriteOutput(2))
    Box(2,2,60,60,$aa6666)
  StopDrawing()
SetFrameRate(70)
Structure Mauer
 x.w
 y.w
 Image.w
 mauer.w 
EndStructure 
NewList Mauer .Mauer()
Procedure Obj(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer
EndProcedure
Procedure Ojball(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+64
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+128
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+192
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\y      = y+0
Mauer()\x      = x+256
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+320
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+384
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+448
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+512
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+576
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+640
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+192
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+704
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
AddElement(Mauer())           
Mauer()\x      = x+0
Mauer()\y      = y+256
Mauer()\Image  = Sprite
Mauer()\mauer  = mauer
EndProcedure


lvl = 1
playergo = 0
Repeat
    ExamineKeyboard()
If lvl = 1
Gosub iniobj
  Gosub grundgras
  Gosub steuerung
Gosub collision
  DisplayTransparentSprite(0, offX,offY)
EndIf  





  FlipBuffers()
  ClearScreen(0,0,0)
  
Until KeyboardReleased(#PB_Key_Escape) 





steuerung :
  
  If KeyboardReleased(#PB_Key_Right) And playergo = 0
    offX+64
  playergo = 7
  go = 1
  EndIf
  If KeyboardReleased(#PB_Key_Left) And playergo = 0
    offX-64
  playergo = 7
  go = 2
  EndIf
  If KeyboardReleased(#PB_Key_Up) And playergo = 0
    offY-64
  playergo = 7
  go = 3
  EndIf
  If KeyboardReleased(#PB_Key_Down) And playergo = 0
    offY+64
  playergo = 7
  go = 4
  EndIf
  If offX < 0
  offX = 0
  EndIf  
  If offY < 0
  offY = 0
  EndIf 
  If offy > 704
  offY = 704
  EndIf 
  If offX > 960
  offX = 960
  EndIf 
  playergo - 1
  If playergo < 0
  playergo = 0
  EndIf 
    StartDrawing(ScreenOutput())
  FrontColor(225,225,225)
  DrawingMode(1)
  Locate(10,0)
  DrawText(Str(offX))
  Locate(10,10)
  DrawText(Str(offY))
  StopDrawing()
  Return 


collision :
 ResetList(Mauer())
  While NextElement(Mauer())
If SpriteCollision(0,offx,offy,Mauer()\Image,Mauer()\x,mauer()\y)
If go = 1 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offx - 64
EndIf
If go = 2 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offx + 64
EndIf
If go = 3 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offy + 64
EndIf
If go = 4 And Mauer()\x = offX And Mauer()\y = offY And Mauer()\mauer = 1
offy - 64
EndIf
EndIf
Wend
 Return
 
 iniobj :
 ResetList(Mauer())
  While NextElement(Mauer())
    DisplayTransparentSprite(Mauer()\Image,Mauer()\x, Mauer()\y)
   Wend   
   Return 
   
 grundgras :
Ojball(50,0,0,0)
Ojball(50,64,0,0)
Ojball(50,128,0,0)
Ojball(50,192,0,0)
Ojball(50,256,0,0)
Ojball(50,320,0,0)
Ojball(50,384,0,0)
Ojball(50,448,0,0)
Ojball(50,512,0,0)
Ojball(50,576,0,0)
Ojball(50,640,0,0)
Ojball(50,704,0,0)
Ojball(50,768,0,0)
Ojball(50,832,0,0)
Ojball(50,896,0,0)
Ojball(50,960,0,0)
 Return   

Bitte Helfen :mrgreen:

Verfasst: 24.09.2006 17:08
von Macros
Du springst während jedes Programmdurchlaufs zu "grundgras"

Da wir x mal diese Procedure ausgeführt

Code: Alles auswählen

Procedure Ojball(Sprite, x, y,mauer)
  AddElement(Mauer())           
  Mauer()\x      = x
  Mauer()\y      = y
  Mauer()\Image  = Sprite
  Mauer()\mauer  = mauer 
AddElement(Mauer())

ist das Problem, deine Linked List wächst ins unendliche.

Verfasst: 24.09.2006 17:18
von Milchshake
wie soll ich das am besten beheben?

Verfasst: 24.09.2006 17:27
von DarkDragon
Milchshake hat geschrieben:wie soll ich das am besten beheben?
Durch DeleteElement()?

Verfasst: 24.09.2006 17:31
von Milchshake
thx(bin gar ned auf die idee gekommen)

Verfasst: 24.09.2006 18:40
von Kaeru Gaman
DarkDragon hat geschrieben:
Milchshake hat geschrieben:wie soll ich das am besten beheben?
Durch DeleteElement()?
quark!

man behebt doch ein problem nicht dadurch, dass man es direkt nach seiner erzeugung eliminiert,
jedenfalls nicht, wenn man selbst für die erzeugung verantwortlich ist.

verhindere gleich die erzeugung des problems!

also, strick den code so um, dass unnötige creates überhaupt nicht aufgerufen werden!

Verfasst: 24.09.2006 20:12
von Milchshake
hab ich vorher probiert(das mit delete element) doch irgentwie hab ich einen generrellen hänger im prog
sobald ich die Procedure Obj aufrufe ( ich habs daweil umgeprogt a bissl) hängt das ganze mal und wird automatisch langsamer und langsamer uns langsamer
das gleiche problem besteht also noch immer :(
hab kA was ich falsch gmacht habe :?

Verfasst: 24.09.2006 21:00
von Kaeru Gaman
...den aufruf in ner schleife, wo er nich hingehört?


...permanent aufgerufen, obwohl er nur bedingt aufgerufen werden sollte?

..ey, normalle "that's it"

Verfasst: 24.09.2006 23:46
von HeX0R
Es könnte auch an dem seltsamen Coding-Style liegen, dass du nicht mehr durchblickst.
Wie kann sowas z.B. passieren:

Code: Alles auswählen

Repeat
    ExamineKeyboard()
If lvl = 1
Gosub iniobj
  Gosub grundgras
  Gosub steuerung
Gosub collision
  DisplayTransparentSprite(0, offX,offY)
EndIf 





  FlipBuffers()
  ClearScreen(0,0,0)
 
Until KeyboardReleased(#PB_Key_Escape)
Findest du sowas nicht irgendwie übersichtlicher ?:

Code: Alles auswählen

Repeat
	ExamineKeyboard()
	If lvl = 1
		Gosub iniobj
		Gosub grundgras ;(*Hust*)
		Gosub steuerung
		Gosub collision
		DisplayTransparentSprite(0, offX,offY)
	EndIf 

	FlipBuffers()
	ClearScreen(0,0,0)

Until KeyboardReleased(#PB_Key_Escape)
Werden bei dir Leer- bzw. Tabzeichen per Zufallsgenerator gesetzt ?

Ich denke mal durch etwas bessere Strukturen fällt dir auch der Fehler auf.

Verfasst: 25.09.2006 18:39
von Milchshake
habs jetzt nochmal ein paar mal probiert und komm
trotzdem nicht auf die richtige idee
ich denke ,das sich mehrere Sprites überlappen und das dass der fehler ist,
nur ich weiß nicht wie ich das beheben soll
ich glaub ich bin unfähig :freak: