foreach()...next in pb3.30

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

foreach()...next in pb3.30

Beitrag von kreeph »

Hi, Leute, ich hab eine kurze Frage:
Wie kann ich den Befhl

Code: Alles auswählen

foreach()...next
in 3.30 schreiben?
ich habs mit

Code: Alles auswählen

Listcount=CountList(List())
FirstElement(List())
For k=1 To Listcount
NextElement(List())
...
Next
probiert, aber es passiert einfach nix -.-
Ich hoffe, ihr könnt mir helfen!
Danke schonmal
kreeph
Ich benutze PureBasic 3.30
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau mal ins Waponez-beispiel.

das geht irgendwie mit ResetList und While NextElement...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
kreeph
Beiträge: 98
Registriert: 24.02.2007 11:50

Beitrag von kreeph »

Hi, *hust* ich hab den Fehler gefunden... Hab einfach ein Sprite vor das andere gesetzt und nicht gsehen, dass es doch funktioniert :oops: :oops: :oops:
naja, ich hab aber noch ein anderes problem mit einem code:

Code: Alles auswählen

If InitSprite() = 0 
  MessageRequester("Fehler", "Kann Grafik nicht Initialisieren..(DirectX7 oder höher notwendig!)", 0)
  End
EndIf
If InitKeyboard() = 0 
  MessageRequester("Fehler", "Kann Keyboard nicht Initialisieren..(DirectX7 oder höher notwendig!)", 0)
  End
EndIf
If InitSound() = 0 
  MessageRequester("Fehler", "Kann Sound nicht Initialisieren..(DirectX7 oder höher notwendig, Soundkarte notwendig!)", 0)
  End
EndIf
If InitMouse() = 0
  MessageRequester("Fehler", "Kann Maus nicht Initialisieren..", 0)
  End
EndIf
OpenScreen(1024,768,32,"Game")
IncludeFile "InitSystem.pb"
LoadSprite(0,"Gfx\Hintergrund\1.bmp")
LoadSprite(10,"Gfx\Sprites\Spieler_Comic.bmp"):TransparentSpriteColor(10,128,0,255)
LoadSprite(20,"Gfx\Sprites\Gegner_256_1.bmp"):TransparentSpriteColor(20,128,0,255)
LoadSprite(100,"Gfx\Waffen\Waffe_1.bmp"):TransparentSpriteColor(100,128,0,255)
yPlayer=350:xPlayer=50
SpeedPlayer=3
Gegnerspeed=2
Schussspeed=4
Damage=1
Schiff=1
GegnerArmor=1
enemysetdelay=100
Reloadspeed=30

Structure Schuss
  x.l                 
  y.l
  speedX.l
  speedY.l
  Damage.l
EndStructure
NewList Schuss.Schuss()
Procedure PlayerSchuss(x,y,speedX,speedY,Damage) 
  AddElement(Schuss())       
  Schuss()\x = x            
  Schuss()\y = y      
  Schuss()\speedX = speedX
  Schuss()\speedY = speedY
  Schuss()\Damage = Damage
EndProcedure


Structure enemy    
  x.l          
  y.l
  speedX.l
  speedY.l
  armor.l   
EndStructure 
NewList enemy.enemy()   
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



Repeat:ClearScreen(0,0,0);************************************************************************
StartDrawing(ScreenOutput()):DrawingMode(4)
For k=0 To 20:Box(0+k,708+k,1024-k*2,60-k*2,RGB(100-k*5,100-k*5,100-k*5)):Next
StopDrawing()
DisplaySprite(0,Gameprogress/4,0)
DisplayTransparentSprite(10,xPlayer,yPlayer)
Gosub Spieleraktion
Gosub Remove
Gosub Schuss
Gosub enemy

Gameprogress-1

FlipBuffers():Until getasynckeystate_(#vk_escape)<>0:End;***********Gosub Bereich*****************

Spieleraktion:
ExamineKeyboard()
If KeyboardPushed(#pb_key_up):yPlayer-SpeedPlayer:EndIf
If KeyboardPushed(#pb_key_down):yPlayer+SpeedPlayer:EndIf
If KeyboardPushed(#pb_key_left):xPlayer-SpeedPlayer:EndIf
If KeyboardPushed(#pb_key_right):xPlayer+SpeedPlayer:EndIf

If KeyboardPushed(#PB_Key_LeftControl) And shootDelay = 0 
 If Schiff=1
  PlayerSchuss(xPlayer+70,yPlayer+22,Schussspeed,0,Damage)   
  PlayerSchuss(xPlayer+70,yPlayer+11,Schussspeed,0,Damage)
  shootDelay = Reloadspeed EndIf
EndIf:If shootDelay>0:shootDelay-1:EndIf:endif
Return

Remove:
If yPlayer+36>708:yPlayer=708-36:ElseIf yPlayer<0:yPlayer=0:EndIf
If xPlayer+76>1024:xPlayer=1024-76:ElseIf xPlayer<0:xPlayer=0:EndIf
Return

Schuss:
   Listcount=CountList(Schuss())
   FirstElement(Schuss())
   For k=1 To Listcount
    NextElement(Schuss())
    If     Schuss()\x > 1024  : DeleteElement(Schuss())
    ElseIf Schuss()\x < 0     : DeleteElement(Schuss())
    ElseIf Schuss()\y > 708   : DeleteElement(Schuss())
    ElseIf Schuss()\y < 0     : DeleteElement(Schuss())
    EndIf
   Next

   Listcount=CountList(Schuss())
   FirstElement(Schuss())
   For k=1 To Listcount
    NextElement(Schuss())
    DisplayTransparentSprite(100,Schuss()\x,Schuss()\y)   
    Schuss()\x + Schuss()\speedX
    Schuss()\y + Schuss()\speedY
   Next

Return

enemy:
If enemyDelay=0
  AddEnemy(1024, Random(690),Gegnerspeed*-1,0,Gegnerarmor) 
  enemyDelay = enemySetDelay
Else
  enemyDelay -1
EndIf

   Listcount=CountList(enemy())
   FirstElement(enemy())
   For k=1 To Listcount
    NextElement(enemy())
   If enemy()\x < 0-SpriteWidth(20) : DeleteElement(enemy()) : EndIf
   Next
   
   Listcount=CountList(enemy())
   FirstElement(enemy())
   For k=1 To Listcount
    NextElement(enemy())
    DisplayTransparentSprite(20, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
   Next
   
Return
Man braucht an bmps:
1.bmp in gfx\hintergrund
gegner_256_1.bmp.bmp in gfx\sprites
Spieler_Comic.bmp in gfx\sprites
waffe_1.bmp in gfx\waffen

das wärs :coderselixir: ich hoffe, das macht nicht zuviel arbeit^^
der fehler liegt irgentwie bei den erzeugten gegnern und schüssen.
Die fliegen irgentwie komisch unterschiedlich schnell - zum verzweifeln
Danke nochmal schonmal :mrgreen:
kreeph
Ich benutze PureBasic 3.30
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ohne den Code probiert zu haben, weil ich null Bock habe mir irgendwelche Grafiken irgendwo herzuzaubern, stimmt deine Art die Liste durchzugehen trotzdem nicht.

Das mag daran liegen, dass dich der Kommentar von KG nicht interessiert hat.

Dein Code:

Code: Alles auswählen

   FirstElement(Schuss())
   For k=1 To Listcount
    NextElement(Schuss())
    ...mach irgendwas mit dem Element
Setzt auf das erste Element und geht dann eins weiter bevor es irgendwas macht. Soll heissen das allererste Element wird nie verarbeitet.

Richtig wäre also das was KG gesagt hat.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

oder so

Code: Alles auswählen

   FirstElement(Schuss())
   For k=1 To Listcount
    ...mach irgendwas mit dem Element
   NextElement(Schuss())
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

da fehlt dann aber die korrekte abbruchbedingung...

also, hier is mal der ausschnitt ausm WaponezII-code:

Code: Alles auswählen

  ResetList(Bullet())
  While NextElement(Bullet())  ; Process all the bullet actualy displayed on the screen

    If Bullet()\y < 0          ; If a bullet is now out of the screen, simply delete it..
      DeleteElement(Bullet())
    Else
      If Bullet()\x < 0        ; If a bullet is now out of the screen, simply delete it..
        DeleteElement(Bullet())
      Else
        If Bullet()\x > 640-Bullet()\Width
          DeleteElement(Bullet())
        Else
          If Bullet()\y > 480
            DeleteElement(Bullet())
          Else
            DisplayTransparentSprite(Bullet()\Image, Bullet()\x, Bullet()\y)   ; Display the bullet..

            Bullet()\y + Bullet()\SpeedY
            Bullet()\x + Bullet()\SpeedX
          EndIf
        EndIf
      EndIf
    EndIf
    
  Wend
also, ResetList() setzt den zeiger vor die liste, dann ein NextElement() um aufs erste zu kommen,
dieses NextElement() liefert dann auch die Abbruchbedingung.


...ich frag mich nur, was an
Kaeru Gaman hat geschrieben:schau mal ins Waponez-beispiel.
so schwierig zu verstehen war...?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Ich vereinfache das noch mal ^^

4.0 :

Code: Alles auswählen

ForEach LinkList()
 ; Code
Next
=

3.3 :

Code: Alles auswählen

ResetList(LinkList())
While NextElement(LinkList())
 ; Code
Wend
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
Antworten