list() ist keine Funktion, Makro..

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Zuletzt geändert von mirca am 17.10.2013 11:46, insgesamt 1-mal geändert.
Benutzeravatar
PureSoft
Beiträge: 20
Registriert: 18.06.2008 11:08
Wohnort: Saarland
Kontaktdaten:

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

Beitrag 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 :)
Projekte: -
Fortschritt: -
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureSoft
Beiträge: 20
Registriert: 18.06.2008 11:08
Wohnort: Saarland
Kontaktdaten:

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

Beitrag 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 :)
Projekte: -
Fortschritt: -
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag von ts-soft »

Achso, das ,1 bei DeleteElement besser wieder weglassen, hab ich ganz übersehen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten