Liste überfüllt sich

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Liste überfüllt sich

Beitrag von NeoRon »

Hallo,

ich beziehe die Daten der Sprites aus einer verknüpften Liste aus Parameter. Daten wie x und y Position usw.

Das Problem ist das ich Sie nicht leeren kann ohne das es nen RunTime Error gibt oder das die Sprites nicht mehr angezeigt werden.

Könnt ihr mir da bei einer Lösung helfen?

LG
Manuel

Hier der Code:

Code: Alles auswählen

Structure struct_enemy
  x.i
  y.i
  speedX.i
  speedY.i
  objectID.i
  armor.i
EndStructure

Global NewList enemy.struct_enemy()

Code: Alles auswählen

Procedure AddEnemy(x, y, speedX, speedY, objectID, armor)  
     AddElement(enemy()) 
    With Enemy()
    \x = x
    \y = y
    \speedX = speedX
    \speedY = speedY
    \objectID = objectID
    \armor = armor
  EndWith
 EndProcedure

Code: Alles auswählen

Procedure EnemySetPlanes(c.l, List Planes.struct_enemy())
  
  Protected i
  
  Define x, y, speedX, speedY, objectID, armor
  
  AddElement(Planes())
  With  Planes()
    \x = x
    \y = y
    \speedX = speedX
    \speedY = speedY
    \objectID = objectID
    \armor = armor
  EndWith

  If enemy\ENEMY_PLANE_DELAY = 0 And enemy\ENEMY_ON_SCREEN < #MAX_ENEMY_ON_SCREEN
    
    ADDEnemy(0 - SpriteWidth(#Sprite_EYPlane), Random(200 - SpriteHeight(#Sprite_EYPlane),0 ) , Random(3, 1),0 ,2, 100) ;x, y, speedX, speedY, objectID
    Planes()\x + Planes()\speedx 
    enemy\ENEMY_PLANE_DELAY = #ENEMY_SET_PLANE_DELAY : enemy\ENEMY_ON_SCREEN + 1
    
    ElseIf enemy\ENEMY_PLANE_DELAY > 0 : enemy\ENEMY_PLANE_DELAY - 1 : EndIf  
  
  ForEach planes()
    If planes()\Armor < 1 And planes()\objectID = 2
      For i = 0 To 4
        ADDeffect(planes()\x, planes()\y, Random(6)-3, Random(6)-3, 100, 108, 5)  ;x, y, speedX, speedY, spriteStart, spriteEnd, animSpeed
      Next  
    :DeleteElement(planes()): PlaySound(#Sound_FXExplosion)  :enemy\ENEMY_ON_SCREEN - 1 : EndIf
  Next
  
  ForEach Planes()
    
    If planes()\objectID = 2
      DisplayTransparentSprite(#Sprite_EYPlane, Planes()\x,Planes()\y)
      Planes()\x + Planes()\speedx
      PlanesLocationX = Planes()\x
      PlanesLocationY = Planes()\y
      
      If Planes()\x > 1024  + SpriteWidth(#Sprite_EYPlane) : DeleteElement(Planes()) : enemy\ENEMY_ON_SCREEN - 1 : EndIf
    EndIf 
  Next
  
EndProcedure

Code: Alles auswählen

  EnemySetPlanes(1,enemy())
The World is Cyber
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: Liste überfüllt sich

Beitrag von _sivizius »

1. Schau dir mal Interfaces an.
2. hat da eine Liste den selben Name wie eine Variable? (enemy) -.-
3. Versuch mal zu debuggen, wann du ein Element hinzufügst und wie groß die Liste ist.
Ich kann mir grad wenig vorstellen, was Sache ist :-/
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Liste überfüllt sich

Beitrag von NeoRon »

Interface kannte ich noch nicht werds mir auf jedenfall anschaun.

Code: Alles auswählen

Global enemy.game
lautet eine strukuriete Variable

Soll ich den ganzen code posten?
The World is Cyber
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Liste überfüllt sich

Beitrag von Danilo »

Benutzt Du EnableExplicite?

2 globale Variablen mit dem gleichen Namen ist aber auch nicht unbedingt
einen gute Idee:

Code: Alles auswählen

Structure struct_enemy
  x.i
  y.i
  speedX.i
  speedY.i
  objectID.i
  armor.i
EndStructure

Global NewList enemy.struct_enemy()

Structure game
EndStructure

Global enemy.game
Wenn Du die Liste enemy() an eine Funktion übergibst, und nur mal die Klammern vergisst (enemy statt enemy()),
könnte das schon einen Programmabsturz verursachen. Ist nicht zu empfehlen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten