Seite 1 von 1

foreach()...next in pb3.30

Verfasst: 30.09.2007 18:42
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

Verfasst: 30.09.2007 18:43
von Kaeru Gaman
schau mal ins Waponez-beispiel.

das geht irgendwie mit ResetList und While NextElement...

Verfasst: 30.09.2007 19:10
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

Verfasst: 30.09.2007 21:14
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.

Verfasst: 30.09.2007 21:42
von #NULL
oder so

Code: Alles auswählen

   FirstElement(Schuss())
   For k=1 To Listcount
    ...mach irgendwas mit dem Element
   NextElement(Schuss())

Verfasst: 30.09.2007 21:48
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...?

Verfasst: 30.09.2007 22:34
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