Seite 2 von 2

Re: list() ist keine Funktion, Makro..

Verfasst: 06.04.2013 14:40
von ts-soft
PureSoft hat geschrieben:Denke das Problem mit dem Fehler hat sich durch das Flag erledigt, nur crasht der Compiler weiterhin nach ein paar Sekunden..
also wurde das Problem nicht gelöst, sondern verschoben, durch das Flag.
PureSoft hat geschrieben:Soll ich mal den kompletten Code posten?
Wenn er nicht zu lang ist, besser erstmal auf ein minimum reduzieren, so das der Code lauffähig bleibt und den Fehler
produziert.

Re: list() ist keine Funktion, Makro..

Verfasst: 06.04.2013 14:52
von STARGÅTE
Wenn du ein element löschst, dann solltest du danach immer ein Continue aufrufen, damit zB in einer ForEach-Schleife sofort zum nächsten Element gesprungen wird und kein Code mehr nach dem löschen ausgeführt wird, denn das verursacht den Fehler, wenn auf einem gelöschten Elemente etwas gemacht werden soll.

GELÖSCHT

Verfasst: 06.04.2013 14:57
von mirca
GELÖSCHT

Re: list() ist keine Funktion, Makro..

Verfasst: 07.04.2013 13:42
von PureSoft
Sorry hab nicht viel Zeit weil ich übers Wochenende von Arbeit her weg war/bin, poste schnell den Code, hoffe es ist nicht zu viel..

Code: Alles auswählen

IncludeFile "InitSystem.pb"
IncludeFile "InitGame.pb"

Repeat
  
  ExamineKeyboard()
  
  DisplaySprite(#Sprite_Back, 0, 0)
  
  Gosub steuerung
  Gosub playershots
  Gosub enemy
  
  DisplayTransparentSprite(#Sprite_Player, playerX, playerY)
  
  FlipBuffers()
  
Until KeyboardReleased(#PB_Key_Escape) : End

; GOSUBS -------------------------------------------------------------------------------

steuerung:

If KeyboardPushed(#PB_Key_Left) And playerX > 0
  playerX - playerSpeed
EndIf

If KeyboardPushed(#PB_Key_Right) And playerX < 800 - SpriteWidth(#Sprite_Player)
  playerX + playerSpeed
EndIf

If KeyboardPushed(#PB_Key_Up) And playerY > 0
  playerY - playerSpeed
EndIf

If KeyboardPushed(#PB_Key_Down) And playerY < 600 - SpriteHeight(#Sprite_Player)
  playerY + playerSpeed
EndIf

If KeyboardPushed(#PB_Key_LeftControl) And shootDelay = 0
  AddPlayershot(playerX + 25, playerY - 3, 10, 0)
  AddPlayershot(playerX + 25, playerY + 16, 10, 0)
  
  shootDelay = 15
  PlaySound(#Sound_Blaster)
EndIf

If shootDelay > 0 : shootDelay - 1 : EndIf

Return



playershots:

ForEach(playershot())
  If playershot()\x > 800 : DeleteElement(playershot())
  ElseIf  playershot()\x < 0 : DeleteElement(playershot())
  ElseIf playershot()\y > 600 : DeleteElement(playershot())
  ElseIf playershot()\y < 0 : DeleteElement(playershot())
  EndIf
Next

ForEach(playershot())
  DisplayTransparentSprite(#Sprite_Blaster, playershot()\x, playershot()\y)
  playershot()\x + playershot()\speedX
  playershot()\y + playershot()\speedY
Next

Return

enemy:

If enemyDelay = 0 
  AddEnemy(800, Random(560), -2, 0, 100)
  enemyDelay = enemySetDelay
Else
  enemyDelay - 1
EndIf

ForEach enemy()
  If enemy()\x < 0 - SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : EndIf
  If enemy()\armor < 1 
    DeleteElement(enemy(), 1)
  EndIf
Next

ForEach enemy()
  DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
  enemy()\x + enemy()\speedX
Next

Return
InitSystem:

Code: Alles auswählen

;Initialiersierungen
If InitSprite() = 0
  MessageRequester("Fehler", "Kann Grafik nicht Initialisieren..(DirectX 7 oder höher notwendig!)", 0)
  End
EndIf

If InitKeyboard() = 0
  MessageRequester("Fehler", "Kann Keyboard nicht Initialisieren..(DirectX 7 oder höher notwendig!)", 0)
  End
EndIf

If InitSound() = 0
  MessageRequester("Fehler", "Kann Sound nicht Initialisieren..(DirectX 7 oder höher notwendig!)", 0)
  End
EndIf

If InitMouse() = 0
  MessageRequester("Fehler", "Kann Maus nicht Initialisieren..(DirectX 7 oder höher notwendig!)", 0)
  End
EndIf

OpenScreen(800, 600, 16, "Uebung")
InitGame:

Code: Alles auswählen

Global playerX.l 
Global playerY.l
Global playerSpeed.l

Global shootDelay.l
Global enemyDelay.l

Global enemySetDelay.l

playerX = 0
playerY = 300
playerSpeed = 4

enemySetDelay = 100

Enumeration
  #Sprite_Player
  #Sprite_Back
  #Sprite_Blaster
  #Sprite_Enemy
  
  #Sound_Blaster
  #Sound_Hit
EndEnumeration

Structure playershot
  x.l
  y.l
  speedX.l
  speedY.l
EndStructure
Global NewList playershot.playershot()

Structure enemy
  x.l
  y.l
  speedX.l
  speedY.l
  armor.l
EndStructure
Global NewList enemy.enemy()

Procedure AddPlayershot(x, y, speedX, speedY)
  AddElement(playershot())
  playershot()\x = x
  playershot()\y = y
  playershot()\speedX = speedX
  playershot()\speedY = speedY
EndProcedure

Procedure AddEnemy(x, y, speedX, speedY, armor)
  AddElement(enemy())
  enemy()\x = x
  enemy()\y = y
  enemy()\speedX = speedX
  enemy()\speedY = speedY
  enemy()\armor = armor
EndProcedure



LoadSprite(#Sprite_Player, "Grafik\player.bmp")
LoadSprite(#Sprite_Back, "Grafik\back.bmp")
LoadSprite(#Sprite_Blaster, "Grafik\blaster.bmp")
LoadSprite(#Sprite_Enemy, "Grafik\gegner.bmp")

LoadSound(#Sound_Blaster, "Grafik\blaster.wav")
LoadSound(#Sound_Hit, "Grafik\hit.wav")
Vielen lieben dank an alle bisherigen Antworten :)

Re: list() ist keine Funktion, Makro..

Verfasst: 07.04.2013 13:52
von ts-soft
Naja, also das ganze jetzt zusammen zu kopieren hab ich echt keine Lust und mir selber Grafiken zu suchen, da
solltest Du doch bessere Vorarbeit leisten (oder entsprechende Prämien aussetzen :mrgreen: ).

Aber ich denke das STARGÅTE richtig lag und du in der sub playershots: ein Continue einfügen solltest:

Code: Alles auswählen

ForEach enemy()
  If enemy()\x < 0 - SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : Continue : EndIf
  If enemy()\armor < 1
    DeleteElement(enemy(), 1)
  EndIf
Next
Ansonsten ist nicht sichergestellt, das es beim zweitem DeleteElement überhaupt noch ein Element gibt.

Oder vielleicht auch so:

Code: Alles auswählen

ForEach enemy()
  If (enemy()\x < 0 - SpriteWidth(#Sprite_Enemy)) Or (enemy()\armor < 1) : DeleteElement(enemy()) : EndIf
Next
Gruß
Thomas

Re: list() ist keine Funktion, Makro..

Verfasst: 07.04.2013 14:29
von PureSoft
Wie gesagt sorry, bin unterwegs und hatte den Source nur auf mein Handy kopiert um ihn hier posten zu können :oops:

Jaa es funktioniert so auf deine Methode hoffentlich, herzlichen Dank, wieder etwas gelernt :)

Re: list() ist keine Funktion, Makro..

Verfasst: 07.04.2013 14:45
von ts-soft
Achso, das ,1 bei DeleteElement besser wieder weglassen, hab ich ganz übersehen.