Habe Probleme mit einer Procedure

Anfängerfragen zum Programmieren mit PureBasic.
thomas223
Beiträge: 8
Registriert: 03.02.2008 21:24

Habe Probleme mit einer Procedure

Beitrag von thomas223 »

Das ist ein Älteres Turtorial und einige dinge funktionieren nicht mehr so richtig!
Was bedeutet das wenn hinter ein Procedure ein .b steht???
Und was kann ich machen um diesen fehler zu lösen???
hier ist der Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()

OpenScreen(1024,768,16,"Schooter")
#ScreenW = 1024
#ScreenH = 768
#HeroH = 98 
#HeroW = 98
#EnemyH = 32
#EnemyW = 32

Declare KeyboardHandling()
Declare NewEnemyWave()
Declare EnemyDisplay()
Declare EnemyMovement()
Declare ShowExplosion()
Declare LeftMouseClicked()
;Declare PushingEdgeDetection()

LoadSprite(0,"E:\PureBasic\2DShooter\fx\sterne.bmp")
LoadSprite(1,"E:\PureBasic\2DShooter\fx\Hero.png")
LoadSprite(2,"e:\PureBasic\2DShooter\fx\Enemy.png")
LoadSprite(3,"fx\Fire.png")

For idx = 1 To 5
  LoadSprite(10+idx,"e:\PureBasic\2DShooter\fx\Explosion"+Str(idx)+".png")
  TransparentSpriteColor(10+idx,RGB(0,67,171))
Next

For idx = 0 To 2
TransparentSpriteColor(idx,RGB(0,67,171))
Next

Structure Hero
  X.l
  Y.l
EndStructure
Global Fighter.Hero

Structure Enemy
  X.l
  Y.l
EndStructure
Global Gegner.Enemy
Global NewList Feinde.Enemy()

Structure Explosion
  X.l
  Y.l
  State.l
EndStructure
Global NewList Explode.Explosion()

Structure Geschoss
  X.l
  Y.l
EndStructure
Global NewList Geschosse.Geschoss()

Fighter\X = #ScreenW/2-(#HeroW/2)
Fighter\Y = #ScreenH-#HeroH

Repeat
ExamineKeyboard()
ExamineMouse()

;ClearScreen(0,0,0)
DisplaySprite(0,0,0)
DisplayTransparentSprite(1,Fighter\X,Fighter\Y)
EnemyDisplay()
ShowExplosion()
FlipBuffers()

KeyboardHandling()
NewEnemyWave()
EnemyMovement()
LeftMouseClicked()
;PushingEdgeDetection()

Until KeyboardPushed(1)

Procedure KeyboardHandling()
If KeyboardPushed(#PB_Key_Right)
  If Fighter\X<#ScreenW-#HeroW
    Fighter\X+2
  EndIf
ElseIf KeyboardPushed(#PB_Key_Left)
  If Fighter\X>0
    Fighter\X-2
  EndIf
ElseIf KeyboardPushed(#PB_Key_Up)
  If Fighter\Y<(#ScreenH+#HeroH)
    Fighter\Y-2
  EndIf
ElseIf KeyboardPushed(#PB_Key_Down)
  If Fighter\Y>(0+#HeroH)
    Fighter\Y+2
  EndIf
  
EndIf
EndProcedure

Procedure NewEnemyWave()
  enemycounter.l
  enemycounter = Random(8)
    If CountList(Feinde()) = 0
      For idx = 1 To enemycounter
      AddElement(Feinde())
      Next
      
      ForEach Feinde()
      Feinde()\X = Random(1024)
      Feinde()\y = Random(200)
      Next
    EndIf
EndProcedure

Procedure EnemyDisplay()
    ForEach Feinde()
    DisplayTransparentSprite(2,Feinde()\X,Feinde()\Y)
    Next
EndProcedure

Procedure EnemyMovement()
    ForEach Feinde()
    Feinde()\y = Feinde()\Y+1.1
      If Feinde()\Y>=#ScreenH
        Feinde()\Y = 0
        Feinde()\X = Random(#ScreenW)
      EndIf
      If SpriteCollision(1,Fighter\X,Fighter\Y,2,Feinde()\X,Feinde()\Y)
        AddElement(Explode())
        Explode()\X = Feinde()\X
        Explode()\Y = Feinde()\Y
        Explode()\State = 1
        DeleteElement(Feinde())
      EndIf
    Next
 EndProcedure
 
Procedure ShowExplosion()
 ForEach Explode()
  If Explode()\State <= 5
    DisplayTransparentSprite(10+Explode()\State,Explode()\X,Explode()\Y)
    Explode()\State = Explode()\State + 1
  Else
    DeleteElement(Explode())
  EndIf
 Next
 
EndProcedure

Procedure LeftMouseClicked()
  If ExamineMouse()<>0
    If PushingEdgeDetection() = 1
      AddElement(Geschosse())
      Geschosse()\X = Fighter\X+(#HeroW/2)-18
      Geschosse()\Y = Fighter\Y
    EndIf
  EndIf
EndProcedure

Procedure.b PushingEdgeDetection()

Static pka.b
  ExamineMouse()
    If MouseButton(1)
      If pka.b= 0:pka.b=1:ProcedureReturn 1:EndIf
      ElseIf pka.b
      pka.b=0
    EndIf
  ProcedureReturn 0
  
EndProcedure
__________________________________________________
Code-Tags wurden hinzugefügt
(RSBasic)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@thomas223
.b = Byte
Siehe in der Hilfe "Variablen, Typen und Operatoren"

Du musst die Procedure von PushingEdgeDetection() vorher setzen.

Also so:

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
InitMouse() 
UsePNGImageDecoder() 

OpenScreen(1024,768,16,"Schooter") 
#ScreenW = 1024 
#ScreenH = 768 
#HeroH = 98 
#HeroW = 98 
#EnemyH = 32 
#EnemyW = 32 

Declare KeyboardHandling() 
Declare NewEnemyWave() 
Declare EnemyDisplay() 
Declare EnemyMovement() 
Declare ShowExplosion() 
Declare LeftMouseClicked() 
;Declare PushingEdgeDetection() 

LoadSprite(0,"E:\PureBasic\2DShooter\fx\sterne.bmp") 
LoadSprite(1,"E:\PureBasic\2DShooter\fx\Hero.png") 
LoadSprite(2,"e:\PureBasic\2DShooter\fx\Enemy.png") 
LoadSprite(3,"fx\Fire.png") 

For idx = 1 To 5 
  LoadSprite(10+idx,"e:\PureBasic\2DShooter\fx\Explosion"+Str(idx)+".png") 
  TransparentSpriteColor(10+idx,RGB(0,67,171)) 
Next 

For idx = 0 To 2 
TransparentSpriteColor(idx,RGB(0,67,171)) 
Next 

Structure Hero 
  X.l 
  Y.l 
EndStructure 
Global Fighter.Hero 

Structure Enemy 
  X.l 
  Y.l 
EndStructure 
Global Gegner.Enemy 
Global NewList Feinde.Enemy() 

Structure Explosion 
  X.l 
  Y.l 
  State.l 
EndStructure 
Global NewList Explode.Explosion() 

Structure Geschoss 
  X.l 
  Y.l 
EndStructure 
Global NewList Geschosse.Geschoss() 

Fighter\X = #ScreenW/2-(#HeroW/2) 
Fighter\Y = #ScreenH-#HeroH 

Repeat 
ExamineKeyboard() 
ExamineMouse() 

;ClearScreen(0,0,0) 
DisplaySprite(0,0,0) 
DisplayTransparentSprite(1,Fighter\X,Fighter\Y) 
EnemyDisplay() 
ShowExplosion() 
FlipBuffers() 

KeyboardHandling() 
NewEnemyWave() 
EnemyMovement() 
LeftMouseClicked() 
;PushingEdgeDetection() 

Until KeyboardPushed(1) 

Procedure KeyboardHandling() 
If KeyboardPushed(#PB_Key_Right) 
  If Fighter\X<#ScreenW-#HeroW 
    Fighter\X+2 
  EndIf 
ElseIf KeyboardPushed(#PB_Key_Left) 
  If Fighter\X>0 
    Fighter\X-2 
  EndIf 
ElseIf KeyboardPushed(#PB_Key_Up) 
  If Fighter\Y<(#ScreenH+#HeroH) 
    Fighter\Y-2 
  EndIf 
ElseIf KeyboardPushed(#PB_Key_Down) 
  If Fighter\Y>(0+#HeroH) 
    Fighter\Y+2 
  EndIf 
  
EndIf 
EndProcedure 

Procedure NewEnemyWave() 
  enemycounter.l 
  enemycounter = Random(8) 
    If CountList(Feinde()) = 0 
      For idx = 1 To enemycounter 
      AddElement(Feinde()) 
      Next 
      
      ForEach Feinde() 
      Feinde()\X = Random(1024) 
      Feinde()\y = Random(200) 
      Next 
    EndIf 
EndProcedure 

Procedure EnemyDisplay() 
    ForEach Feinde() 
    DisplayTransparentSprite(2,Feinde()\X,Feinde()\Y) 
    Next 
EndProcedure 

Procedure EnemyMovement() 
    ForEach Feinde() 
    Feinde()\y = Feinde()\Y+1.1 
      If Feinde()\Y>=#ScreenH 
        Feinde()\Y = 0 
        Feinde()\X = Random(#ScreenW) 
      EndIf 
      If SpriteCollision(1,Fighter\X,Fighter\Y,2,Feinde()\X,Feinde()\Y) 
        AddElement(Explode()) 
        Explode()\X = Feinde()\X 
        Explode()\Y = Feinde()\Y 
        Explode()\State = 1 
        DeleteElement(Feinde()) 
      EndIf 
    Next 
 EndProcedure 
  
Procedure ShowExplosion() 
 ForEach Explode() 
  If Explode()\State <= 5 
    DisplayTransparentSprite(10+Explode()\State,Explode()\X,Explode()\Y) 
    Explode()\State = Explode()\State + 1 
  Else 
    DeleteElement(Explode()) 
  EndIf 
 Next 
  
EndProcedure 

Procedure.b PushingEdgeDetection() 

Static pka.b 
  ExamineMouse() 
    If MouseButton(1) 
      If pka.b= 0:pka.b=1:ProcedureReturn 1:EndIf 
      ElseIf pka.b 
      pka.b=0 
    EndIf 
  ProcedureReturn 0 
  
EndProcedure

Procedure LeftMouseClicked() 
  If ExamineMouse()<>0 
    If PushingEdgeDetection() = 1 
      AddElement(Geschosse()) 
      Geschosse()\X = Fighter\X+(#HeroW/2)-18 
      Geschosse()\Y = Fighter\Y 
    EndIf 
  EndIf 
EndProcedure 
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Wenn hinter der Procedure zB .b steht, bedeutet dies, dass diese einen Byte-Wert zurückgeben kann.

Hiermal ein Beispiel wie mans nutzen kann (in diesem Fall allerdings .s für String)

Code: Alles auswählen

Procedure.s Anhaengen(In.s)
  
  In + " Mach ich!"
  
  ProcedureReturn In
  
EndProcedure

Debug Anhaengen("Haeng was an!!!")

Sollte beispielsweise "Haeng was an!!! Mach ich!" ausgeben.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Habe Probleme mit einer Procedure

Beitrag von Kiffi »

thomas223 hat geschrieben:und einige dinge funktionieren nicht mehr so richtig!
es wäre für alle von Vorteil, wenn Du zukünftig auch schreiben würdest, was
nicht so richtig funktioniert und wie sich das äußert (Fehlermeldungen, etc.)

Grüße ... Kiffi
a²+b²=mc²
Antworten