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

).
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
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.