Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von NeoRon »

Hallo,

dieses Tutorial bekomm ich nicht zum laufen.

Wisst ihr an was das legen könnte.

es besteht aus 3 Files die Bilder weis ich nicht hier hochzuladen aber hier ist der link wo man das tutorial als rar datei laden kann.

Spiele für Fortgeschrittene

http://www.purearea.net/pb/german/tutorials.htm



1.File

Code: Alles auswählen

IncludeFile "InitSystem.pb"  
IncludeFile "InitGame.pb"  
                        

PlayModule(#Module_Mucke)  



;MainLoop ######################################

Repeat
ExamineKeyboard() 

DisplaySprite(#Sprite_Back, 0, 0) 

If GetModulePosition() = 41 : SetModulePosition(5) : EndIf   

If playerLife < 0
  CloseScreen()
  MessageRequester("Du bist tot..", "Schade!" + Chr(10) + "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
  End
ElseIf enemySetDelay < 5
  CloseScreen()
  MessageRequester("Geschafft..", "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
  End
EndIf


;Neu, immer wenn 2500 Punkte überschritten sind, wird der Level erhöht und ein
;Sound abgespielt. enemySetDelay wird um 15 verringert, damit die Gegner schneller
;auftauchen.
;LevelUP wird dann wieder auf 0 gesetzt um erneut bis 4000 zu zählen...usw.
If levelUP > 2500 : level + 1 : levelUP = 0 : enemySetDelay - 15: PlaySound(#Sound_LevelUP) : EndIf
                                                                  
         
Gosub steuerung 
Gosub playershots
Gosub enemy
Gosub collisions
Gosub explosions   
Gosub drawing     


AddExplo(playerX-10, 6+playerY+Random(6)-3, Random(3)-3, 0, 120, 122, 2) 
DisplayTransparentSprite(#Sprite_Player, playerX, playerY)

FlipBuffers() 
Until KeyboardReleased(#PB_Key_Escape) : End 

;MainLoop ENDE ##################################











;-Sub Steuerung ##################################
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 < 565 -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) 
    PlaySound(#Sound_Blaster) : shootDelay = 15                             
  EndIf
  
  If shootDelay > 0 : shootDelay - 1 : EndIf 
  
Return







;-Sub Playershots ##########################

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






;-Sub Enemy #################################

enemy:

  If enemyDelay = 0
    AddEnemy(800, Random(560), -2-Random(1), 0, 100) 
    enemyDelay = enemySetDelay
  Else
    enemyDelay - 1
  EndIf


  ForEach enemy()
    
    If enemy()\x < 0-SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : EndIf
 
    If enemy()\armor < 1
     
      For i = 1 To 4   
        AddExplo(enemy()\x+15, enemy()\y, Random(6)-3, Random(6)-3, 100, 108, 2)  
        AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 110, 113, 5) 
      Next
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 140, 140, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 141, 141, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 142, 142, 25)  
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 143, 143, 25)  

      DeleteElement(enemy())
      PlaySound(#Sound_Explosion)
      score + 150 : levelUP + 150   ; Neu, damit wir nach einer Anzahl an Punkten den Level erhöhen können
    EndIf
  
  Next



  ForEach enemy()
    AddExplo(enemy()\x+SpriteWidth(#Sprite_Enemy), enemy()\y+7+Random(6)-3, Random(3)+1, 0, 130, 132, 3) 
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
  Next

Return






;-Sub Collisions ###########################

collisions:

ForEach playershots()
  If SpriteCollision (#Sprite_Enemy, enemy()\x, enemy()\y, #Sprite_Player, playershots()\x, playershots()\y)
    PlaySound(#Sound_Explosion)
      playerLife - 1
      playershots()\playerX = 0
      playershots()\playery = 300
    EndIf
ForEach enemy()

  ForEach playershot()
    If SpriteCollision(#Sprite_Blaster, playershot()\x, playershot()\y, #Sprite_Enemy, enemy()\x, enemy()\y)
      PlaySound(#Sound_Hit)
      enemy()\armor - 20
      DeleteElement(playershot())
    EndIf
  Next
 
  If SpriteCollision(#Sprite_Player, playerX, playerY, #Sprite_Enemy, enemy()\x, enemy()\y)
    PlaySound(#Sound_Explosion)
    enemy()\armor - 100 
    playerLife - 1           
  EndIf

Next

Return






;-Sub Drawing ###########################

drawing:

StartDrawing(ScreenOutput()) : DrawingMode(1)   
  FrontColor(0,0,0) : Box(0, 570, 800, 30)     

  FrontColor (200,200,200) 
  Locate(360, 575) : DrawText(Str(playerLife))
  Locate(100, 575) : DrawText(Str(score))
  Locate(660, 575) : DrawText(Str(level))   ;Neu, der aktuelle Level wird nun auch angezeigt

  FrontColor(200,100,0) 
  Locate(300, 575) : DrawText("Lives:")
  Locate(10, 575) : DrawText("SCORE:")
  Locate(600, 575) : DrawText("Level:")   
StopDrawing()

Return





;-Sub Explosions ###########################

explosions:

  ForEach(explo())
    
    DisplayTransparentSprite(explo()\spriteStart, explo()\x, explo()\y)
    explo()\x + explo()\speedX : explo()\y + explo()\speedY

    If explo()\spriteStart = explo()\spriteEnd And explo()\delay = 1 
      DeleteElement(explo()) 
    ElseIf explo()\delay > 0 
      explo()\delay - 1
    Else
      explo()\delay = explo()\animSpeed
      explo()\spriteStart+1
    EndIf
    
  Next
  
Return

2. File

Code: Alles auswählen

Variablen #################################################################

Global playerX.l   
Global playerY.l  
Global playerSpeed.l 
Global playerLife.l    
Global shootDelay.l   
Global enemyDelay.l  
Global enemySetDelay.l 
Global score.l 

Global level.l       ;Neu, unsere beiden Variablen für den Schwierigkeitsgrad
Global levelUP.l     ;


playerX = 0     
playerY = 300    
playerSpeed = 4  
playerLife = 3 

enemySetDelay = 100  






;-Konstanten #################################################################

Enumeration    
  #Sprite_Player   
  #Sprite_Back
  #Sprite_Blaster  
  #Sprite_Enemy   
  
  #Sound_Blaster
  #Sound_Explosion  
  #Sound_Hit       
  #Sound_LevelUP    ;Neu, unser Sound wenn ein neuer Level erreicht wird.
  
  #Module_Mucke    
EndEnumeration





;-Strukturen und Listen ######################################################

Structure playershot  
  x.l                   
  y.l
  speedX.l
  speedY.l
EndStructure
NewList playershot.playershot()  

Structure enemy    
  x.l          
  y.l
  speedX.l
  speedY.l
  armor.l      
EndStructure 
NewList enemy.enemy()  

Structure explo   
  x.l           
  y.l
  speedX.l
  speedY.l
  spriteStart.l     
  spriteEnd.l      
  animSpeed.l       
  delay.l          
EndStructure       
NewList explo.explo() 




;-Prozeduren ##################################################################

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

Procedure AddPlayershot(x, y, speedX, speedY)  
  AddElement(playershot())       
  playershot()\x = x             
  playershot()\y = y      
  playershot()\speedX = speedX
  playershot()\speedY = speedY
EndProcedure

Procedure AddExplo(x, y, speedX, speedY, spriteStart, spriteEnd, animSpeed)
  AddElement(explo())
  explo()\x = x
  explo()\y = y
  explo()\speedX = speedX
  explo()\speedY = speedY
  explo()\spriteStart = spriteStart
  explo()\spriteEnd = spriteEnd
  explo()\animSpeed = animSpeed
  explo()\delay = animSpeed
EndProcedure






;-Grafiken und Sounds #########################################################

LoadSprite(#Sprite_Player,  "..\GFXSND\player.bmp") 
LoadSprite(#Sprite_Blaster, "..\GFXSND\blaster.bmp")    
LoadSprite(#Sprite_Back,    "..\GFXSND\back.bmp")     
LoadSprite(#Sprite_Enemy,   "..\GFXSND\gegner.bmp")   

For i = 100 To 108 : LoadSprite(i,   "..\GFXSND\explo" + Str(i-99) + ".bmp")         : Next
For i = 110 To 113 : LoadSprite(i,   "..\GFXSND\particle" + Str(i-109) + ".bmp")     : Next
For i = 120 To 122 : LoadSprite(i,   "..\GFXSND\antrieba" + Str(i-119) + ".bmp")     : Next
For i = 130 To 132 : LoadSprite(i,   "..\GFXSND\antriebb" + Str(i-129) + ".bmp")     : Next
For i = 140 To 143 : LoadSprite(i,   "..\GFXSND\gegner_split" + Str(i-139) + ".bmp") : Next


LoadSound(#Sound_Blaster,   "..\GFXSND\blaster.wav")     
LoadSound(#Sound_Hit,       "..\GFXSND\hit.wav")           
LoadSound(#Sound_Explosion, "..\GFXSND\explosion.wav")     
LoadSound(#Sound_LevelUP,   "..\GFXSND\levelup.wav")     ;Neu, unser Level-UP-sound

LoadModule(#Module_Mucke,   "..\GFXSND\humatarg.mod")      



3. File

Code: Alles auswählen

;-Initialisation--------------------------------------

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

If InitModule() = 0
  MessageRequester("Fehler", "Kann die Module-Umgebung nicht Initialisieren..",  0) 
  End
EndIf
; Ende der Umgebungs-Initialisierung



OpenScreen(800,600,16,"Ballerkurs")  ; Vollbildmodus, 800*600 Pixel, 16bit Farbtiefe

The World is Cyber
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von Bisonte »

Ich probier hier rum und wundere mich laufend über Abstürze....

Der Tutorial Ersteller hat doch tatsächlich in ALLEN seiner Kursbeispiele nicht ein einziges mal
einen Screen geöffnet >_<

Mannomann....

Welchen der Kursteile meinst du denn genau ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von NeoRon »

Die gehören zusammen.
Sprich er ruft in der Hauptdatei die datei "initsystem" und "initgame" auf.

Bei mir kommt bei gleich bei der innitsystem datei ein fehler.

Hier bei meldet er "initmodule is not a function, array, list, map or macro"

Code: Alles auswählen

If InitModule() = 0
  MessageRequester("Fehler", "Kann die Module-Umgebung nicht Initialisieren..",  0) 
  End
EndIf
; Ende der Umgebungs-Initialisierung
Wenn ich das weg lasse meldet er mir aus dem hauprprogramm aus das enemy not a function list... ist
The World is Cyber
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von Bisonte »

initsystem.pb

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(800, 600, 32, "") ; <-- ich schmeiss den mal an ;)
InitGame.pb

Code: Alles auswählen

;-Variablen #################################################################

Global playerX.l   
Global playerY.l  
Global playerSpeed.l 
Global shootDelay.l   
Global enemyDelay.l    ;Diese Variable wird benötigt, um die Menge an Gegnern, 
                        ;die auftauchen, zu regulieren 
Global enemySetDelay.l ;Auf diesen Wert wird enemyDelay gesetzt, nachdem ein Gegner eingefügt wurde

playerX = 0     
playerY = 300    
playerSpeed = 4  
enemySetDelay = 100  ;Neu

;-Konstanten #################################################################

Enumeration    
  #Sprite_Player   
  #Sprite_Back
  #Sprite_Blaster  
  #Sprite_Enemy    ;Neue Konstante für das Gegner-Sprite
  #Sound_Blaster
EndEnumeration

;-Strukturen und Listen ######################################################

Structure playershot  
  x.l                   
  y.l
  speedX.l
  speedY.l
EndStructure
Global NewList playershot.playershot()  

;Dies ist die Struktur für die Gegner
Structure enemy    
  x.l          
  y.l
  speedX.l
  speedY.l
  armor.l      ;Die Armor(Rüstung) des Gegners wird mit jedem Treffer reduziert und wenn sie
EndStructure  ;0 oder kleiner ist, dann ist der Gegner zerstört.

;Dies ist die Liste für die Gegner
Global NewList enemy.enemy()   

;-Prozeduren ##################################################################

;Dies ist die Prozedur für die Gegner
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

Procedure AddPlayershot(x, y, speedX, speedY)  
  AddElement(playershot())       
  playershot()\x = x             
  playershot()\y = y      
  playershot()\speedX = speedX
  playershot()\speedY = speedY
EndProcedure

;-Grafiken und Sounds #########################################################

LoadSprite(#Sprite_Player,  "..\GFXSND\player.bmp") 
LoadSprite(#Sprite_Blaster, "..\GFXSND\blaster.bmp")    
LoadSprite(#Sprite_Back,    "..\GFXSND\back.bmp")     
LoadSprite(#Sprite_Enemy,   "..\GFXSND\gegner.bmp")   ;laden des Gegner-Sprites    

LoadSound(#Sound_Blaster, "..\GFXSND\blaster.wav")     
Kurs4.pb

Code: Alles auswählen

IncludeFile "InitSystem.pb"  
IncludeFile "InitGame.pb"  

Procedure Steuerung()
  
  ;-Sub Steuerung #### Diese Gosubs hab ich mal in proceduren gepackt...
  ;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 
  
EndProcedure
Procedure PlayerShoots()
  ;-Sub 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  
  
EndProcedure
Procedure Enemies()
  
;-Sub Enemy #################################

;Falls enemyDelay = 0 ist, einen Gegner mit Geschwindigkeit -2 und einem Rüstungswert von 100
;erstellen und enemyDelay wieder hochsetzen, ansonsten enemyDelay um 1 verringern
;Die y position wird per Random() zufällig ermittelt.
If enemyDelay = 0
  AddEnemy(800, Random(560), -2, 0, 100) 
  enemyDelay = enemySetDelay
Else
  enemyDelay - 1
EndIf
;Checken ob der Gegner links aus dem Bild geflogen ist, wenn ja dann löschen wir ihn.
ForEach enemy()
  If enemy()\x < 0-SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : EndIf
Next
;Alle Gegner auf den Bildschirm ausgeben und nach links bewegen.
ForEach enemy()
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
Next
;Wir benutzen hier 2 getrennte ForEach Schleifen, da ansonsten immer der
;letzte Gegner kurz flimmert, wenn ein anderer das Bild verlässt.
;
;Das liegt daran, daß nach dem löschen eines Listenelementes, alle anderen nachrücken
;und somit immer 1 Gegner bei der Darstellung ausgelassen würde.
EndProcedure

;MainLoop ######################################

Repeat
ExamineKeyboard() 

DisplaySprite(#Sprite_Back, 0, 0) 
              
Steuerung()
PlayerShoots()
Enemies()

StartDrawing(ScreenOutput()) : DrawingMode(1)   
  FrontColor(RGB(200,100,0))
  DrawText(0,0,"ESC-Ende")
  ;Wir zeigen hier zusätzlich die Anzahl aller Gegner und Schüsse an
DrawText(10, 100, "Anzahl Gegner: " + Str(CountList(enemy()))) 
DrawText(10, 120, "Anzahl Schüsse: " + Str(CountList(playershot())))  
StopDrawing()

DisplayTransparentSprite(#Sprite_Player, playerX, playerY)

FlipBuffers() 
Until KeyboardReleased(#PB_Key_Escape) : End 

;MainLoop ENDE ##################################
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von NeoRon »

Jetzt bringt er beim laden der Sprites ein "invalid memory access" error.

Was bedeutet das und wie behebe ich den error?

Grüße
The World is Cyber
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von Bisonte »

welches programm, welcher sprite, welche pb-version ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von NeoRon »

Ich hab PB 5.11
Das Tutorial ist in Version 3.81 geschrieben worden.

im Programm: Init Game.

Code: Alles auswählen

LoadSprite(#Sprite_Player,  "..\GFXSND\player.bmp") ;Das Raumschiff laden
LoadSprite(#Sprite_Blaster, "..\GFXSND\blaster.bmp")    ;Laden der Schussgrafik
LoadSprite(#Sprite_Back,    "..\GFXSND\back.bmp")     ;Hintergrund laden
LoadSprite(#Sprite_Enemy,   "..\GFXSND\gegner.bmp")   ;laden des Gegner-Sprites  


Bei allen Sprites kam diese Fehlermeldung "invalid memory access"

Komischerweise wenn ich die Programme zusammen füge in einer Datei läd er die Sprites ohne Probs.

Grüße

__________________________________________________
Code-Tags hinzugefügt
26.06.2013
RSBasic
The World is Cyber
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von Bisonte »

In den Vorraussetzungen für diesen Kurs steht :
  • Grundsätzliches Wissen, z.B. was sind: Sprites, Animationen u.ä.
  • Gutes Wissen über Variablen, LinkedLists, Arrays, Prozeduren und Strukturen
  • Ein wenig Wissen über Vererbung (Listen erben von Strukturen)
  • Du solltest Code lesen und Interpretieren können.
Da Du diesen Anforderungen entsprichst :

Dort sind Gosub Aufrufe ohne Ende in den Kursteilen. Diese Verursachen IMA's an den unmöglichsten
Stellen. Wenn du diese "Subroutinen" in Prozeduren verpackst läuft es...

Und nicht vergessen. Listen sind nicht mehr von vornherein Global. Diese müssen Global gemacht werden.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NeoRon
Beiträge: 67
Registriert: 22.03.2013 18:56

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von NeoRon »

Jop alle Subroutinen sind in Prozeduren verpackt und die Listen sind globalisiert.
Sowie andere ungereimtheiten wie den extra Befehl Locate bei Drawtext sind korregiert.

Aber trotzdem bringt er mir diese error Meldung "invalid memory acsess" bei den oben angegebenen Sprites.

Ka was ich da machen soll das Programm zum laufen zu brinben auf PB 5.11. -_-

Ich schicke dir mal den, Dank dir, korregierten code:
Bin mit Screens nen neuling sry ^^

GameTest:

Code: Alles auswählen

IncludeFile "InitSystem.pb"  
IncludeFile "InitGame.pb"  

;MainLoop ######################################

Repeat
  ExamineKeyboard() 
  
  DisplaySprite(#Sprite_Back, 0, 0) 
  
  If playerLife < 0
    CloseScreen()
    MessageRequester("Du bist tot..", "Schade!" + Chr(10) + "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
    End
  ElseIf enemySetDelay < 5
    CloseScreen()
    MessageRequester("Geschafft..", "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
    End
  EndIf
  
  ;Neu, immer wenn 2500 Punkte überschritten sind, wird der Level erhöht und ein
  ;Sound abgespielt. enemySetDelay wird um 15 verringert, damit die Gegner schneller
  ;auftauchen.
  ;LevelUP wird dann wieder auf 0 gesetzt um erneut bis 4000 zu zählen...usw.
  If levelUP > 2500 : level + 1 : levelUP = 0 : enemySetDelay - 15: PlaySound(#Sound_LevelUP) : EndIf
  
  StartDrawing(ScreenOutput()) : DrawingMode(1)   ;;Drawing für Textausgabe
  FrontColor(RGB(200,100,0))
  DrawText(0,0,"ESC-Ende")
  ;Wir zeigen hier zusätzlich die Anzahl aller Gegner und Schüsse an
  Debug CountString("How many 'ow' contains Bow ?", "ow") ; wird 3 ausgeben
  DrawText(10, 100, "Anzahl Gegner: " +  Str (enemy()))
  DrawText(10, 120, "Anzahl Schüsse: " + Str (playershot())) 
  StopDrawing()
  
  DisplayTransparentSprite(#Sprite_Player, playerX, playerY);Das Raumschiff anzeigen
  
  FlipBuffers() ; Damit alle Grafiken auch angezeigt werden
  
  steuerung()
  playershots()
  enemy2()
  collisions()
  explosions()   
  drawing()     
  
  AddExplo(playerX-10, 6+playerY+Random(6)-3, Random(3)-3, 0, 120, 122, 2) 
  DisplayTransparentSprite(#Sprite_Player, playerX, playerY)
  
  FlipBuffers() 
Until KeyboardReleased(#PB_Key_Escape) : End ;MainLoop so lange abarbeiten, bis ESC 

;MainLoop ENDE ##################################

;-Sub Steuerung ##################################
Procedure 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 < 565 -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) 
    PlaySound(#Sound_Blaster) : shootDelay = 15                             
  EndIf
  
  If shootDelay > 0 : shootDelay - 1 : EndIf 
  
EndProcedure

;-Sub Playershots ##########################

Procedure 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
  
EndProcedure

;-Sub Enemy #################################

Procedure enemy2()
  
  If enemyDelay = 0
    AddEnemy(800, Random(560), -2-Random(1), 0, 100) 
    enemyDelay = enemySetDelay
  Else
    enemyDelay - 1
  EndIf
  
  ForEach enemy()
    
    If enemy()\x < 0-SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : EndIf
    
    If enemy()\armor < 1
      
      For i = 1 To 4   
        AddExplo(enemy()\x+15, enemy()\y, Random(6)-3, Random(6)-3, 100, 108, 2)  
        AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 110, 113, 5) 
      Next
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 140, 140, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 141, 141, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 142, 142, 25)  
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 143, 143, 25)  
      
      DeleteElement(enemy())
      PlaySound(#Sound_Explosion)
      score + 150 : levelUP + 150   ; Neu, damit wir nach einer Anzahl an Punkten den Level erhöhen können
    EndIf
    
  Next
  
  ForEach enemy()
    AddExplo(enemy()\x+SpriteWidth(#Sprite_Enemy), enemy()\y+7+Random(6)-3, Random(3)+1, 0, 130, 132, 3) 
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
  Next
  
EndProcedure 

;-Sub Collisions ###########################

Procedure collisions()
  
  ForEach enemy()
    
    ForEach playershot()
      If SpriteCollision(#Sprite_Blaster, playershot()\x, playershot()\y, #Sprite_Enemy, enemy()\x, enemy()\y)
        PlaySound(#Sound_Hit)
        enemy()\armor - 20
        DeleteElement(playershot())
      EndIf
    Next
    
    If SpriteCollision(#Sprite_Player, playerX, playerY, #Sprite_Enemy, enemy()\x, enemy()\y)
      PlaySound(#Sound_Explosion)
      enemy()\armor - 100 
      playerLife - 1           
    EndIf
    
  Next
  
EndProcedure

;-Sub Drawing ###########################

Procedure drawing()
  
  StartDrawing(ScreenOutput()) : DrawingMode(1)   
  FrontColor(RGB(0,0,0)) : Box(0, 570, 800, 30)     
  
  FrontColor(RGB(200,200,200))
  DrawText(360, 575, Str(playerLife))
  DrawText(100, 575,Str(score))
  DrawText(S660, 575,Str(level))   ;Neu, der aktuelle Level wird nun auch angezeigt
  
  FrontColor(RGB(200,100,0)) 
  DrawText(300, 575, "Lives:")
  DrawText(10, 575,"SCORE:")
  DrawText(600, 575,"Level:")   
  StopDrawing()
  
EndProcedure

;-Sub Explosions ###########################

Procedure explosions()
  
  ForEach(explo())
    
    DisplayTransparentSprite(explo()\spriteStart, explo()\x, explo()\y)
    explo()\x + explo()\speedX : explo()\y + explo()\speedY
    
    If explo()\spriteStart = explo()\spriteEnd And explo()\delay = 1 
      DeleteElement(explo()) 
    ElseIf explo()\delay > 0 
      explo()\delay - 1
    Else
      explo()\delay = explo()\animSpeed
      explo()\spriteStart+1
    EndIf
    
  Next
  
EndProcedure

Initsystem:

Code: Alles auswählen

;-Initialisation--------------------------------------

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(800,600,16,"Ballerkurs")  ; Vollbildmodus, 800*600 Pixel, 16bit Farbtiefe

Initgame:

Code: Alles auswählen


Declare steuerung()
Declare playershots()
Declare enemy2()
Declare collisions()
Declare explosions()   
Declare drawing()

;-Variablen #################################################################

Global playerX.l   
Global playerY.l  
Global playerSpeed.l 
Global playerLife.l    
Global shootDelay.l   
Global enemyDelay.l  
Global enemySetDelay.l 
Global score.l 

Global level.l       ;Neu, unsere beiden Variablen für den Schwierigkeitsgrad
Global levelUP.l     ;

playerX = 0     
playerY = 300    
playerSpeed = 4  
playerLife = 3 

enemySetDelay = 100  

;-Konstanten #################################################################

Enumeration    
  #Sprite_Player   
  #Sprite_Back
  #Sprite_Blaster  
  #Sprite_Enemy   
  
  #Sound_Blaster
  #Sound_Explosion  
  #Sound_Hit       
  #Sound_LevelUP    ;Neu, unser Sound wenn ein neuer Level erreicht wird.
  
EndEnumeration

;-Strukturen und Listen ######################################################

Structure playershot  
  x.l                   
  y.l
  speedX.l
  speedY.l
EndStructure
Global NewList playershot.playershot()  

Structure enemy2  
  x.l          
  y.l
  speedX.l
  speedY.l
  armor.l      
EndStructure 

Global NewList enemy.enemy2() 

Structure explo   
  x.l           
  y.l
  speedX.l
  speedY.l
  spriteStart.l     
  spriteEnd.l      
  animSpeed.l       
  delay.l          
EndStructure       

Global NewList explo.explo() 

;-Prozeduren ##################################################################

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


Procedure AddPlayershot(x, y, speedX, speedY)  
  AddElement(playershot())       
  playershot()\x = x             
  playershot()\y = y      
  playershot()\speedX = speedX
  playershot()\speedY = speedY
EndProcedure

Procedure AddExplo(x, y, speedX, speedY, spriteStart, spriteEnd, animSpeed)
  AddElement(explo())
  explo()\x = x
  explo()\y = y
  explo()\speedX = speedX
  explo()\speedY = speedY
  explo()\spriteStart = spriteStart
  explo()\spriteEnd = spriteEnd
  explo()\animSpeed = animSpeed
  explo()\delay = animSpeed
EndProcedure

;-Grafiken und Sounds #########################################################

LoadSprite(#Sprite_Player,  "..\GFXSND\player.bmp") 
LoadSprite(#Sprite_Blaster, "..\GFXSND\blaster.bmp")    
LoadSprite(#Sprite_Back,    "..\GFXSND\back.bmp")     
LoadSprite(#Sprite_Enemy,   "..\GFXSND\gegner.bmp")   

For i = 100 To 108 : LoadSprite(i,   "..\GFXSND\explo" + Str(i-99) + ".bmp")         : Next
For i = 110 To 113 : LoadSprite(i,   "..\GFXSND\particle" + Str(i-109) + ".bmp")     : Next
For i = 120 To 122 : LoadSprite(i,   "..\GFXSND\antrieba" + Str(i-119) + ".bmp")     : Next
For i = 130 To 132 : LoadSprite(i,   "..\GFXSND\antriebb" + Str(i-129) + ".bmp")     : Next
For i = 140 To 143 : LoadSprite(i,   "..\GFXSND\gegner_split" + Str(i-139) + ".bmp") : Next

LoadSound(#Sound_Blaster,   "..\GFXSND\blaster.wav")     
LoadSound(#Sound_Hit,       "..\GFXSND\hit.wav")           
LoadSound(#Sound_Explosion, "..\GFXSND\explosion.wav")     
LoadSound(#Sound_LevelUP,   "..\GFXSND\levelup.wav")     ;Neu, unser Level-UP-sound

Habe die Prozedure enemy2 genannt weil es schon ne liste gibt die enemy heist.

Will unbedingt das doofe Tutorial zum laufen bringen, bin da hartnäckig xD sry hoffe kannst mir da helfen ^^

Außerdem der folgende Code Abschnitt hat den befehl "addexplo" und er meint das dies keine funktion ist.
Das ja klar ist.
Wie schreibt man die Befehlsreihe richtig im neuen PB?

Dort sollen die Geschwindigkeit der gegnerischen raumschiffe festgelegt werden sowie die explosionen und explosions und sounds verarbeitet werden.

Code: Alles auswählen

Procedure enemy2()

  If enemyDelay = 0
    AddEnemy(800, Random(560), -2-Random(1), 0, 100) 
    enemyDelay = enemySetDelay
  Else
    enemyDelay - 1
  EndIf


  ForEach enemy()
    
    If enemy()\x < 0-SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : EndIf
 
    If enemy()\armor < 1
     
      For i = 1 To 4   
        AddExplo(enemy()\x+15, enemy()\y, Random(6)-3, Random(6)-3, 100, 108, 2)  
        AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 110, 113, 5) 
      Next
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 140, 140, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 141, 141, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 142, 142, 25)  
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 143, 143, 25)  

      DeleteElement(enemy())
      PlaySound(#Sound_Explosion)
      score + 150 : levelUP + 150   ; Neu, damit wir nach einer Anzahl an Punkten den Level erhöhen können
    EndIf
  
  Next



  ForEach enemy()
    AddExplo(enemy()\x+SpriteWidth(#Sprite_Enemy), enemy()\y+7+Random(6)-3, Random(3)+1, 0, 130, 132, 3) 
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
  Next

EndProcedure 
Hier die Structur:

Code: Alles auswählen

Structure explo   
  x.l           
  y.l
  speedX.l
  speedY.l
  spriteStart.l     
  spriteEnd.l      
  animSpeed.l       
  delay.l          
EndStructure       

Global NewList explo.explo() 
Grüße
NeoRon
The World is Cyber
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Tutorial PB V.3.81 auf PB V 5.00 zum laufen bringen?

Beitrag von Bisonte »

Ich hab das mal als "OneFile" gebastelt. Die Unterschiede solltest du problemlos finden. (Einige
Kommentare eingefügt)

Desweiteren hab ich da die Musik eingebaut, und du solltest den Pfad für die Bilder und musik anpassen.
Das Beispiel läuft bei mir (PB5.11)

Code: Alles auswählen

EnableExplicit

; --- InitSystem

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

OpenWindow(0, 0, 0, 800, 600, "Ballerkurs", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 800, 600)

; --- InitGame

Enumeration 1 ; Sprite
  #Sprite_Player   
  #Sprite_Back
  #Sprite_Blaster 
  #Sprite_Enemy   
EndEnumeration
Enumeration 1 ; Sound
  #Sound_Blaster
  #Sound_Explosion 
  #Sound_Hit       
  #Sound_LevelUP    ;Neu, unser Sound wenn ein neuer Level erreicht wird.
  #Module_Mucke
EndEnumeration

Structure struct_playershot 
  x.i                   
  y.i
  speedX.i
  speedY.i
EndStructure
Structure struct_enemy
  x.i                   
  y.i
  speedX.i
  speedY.i
  armor.i    
EndStructure
Structure struct_explo
  x.i                   
  y.i
  speedX.i
  speedY.i  
  spriteStart.i     
  spriteEnd.i   
  animSpeed.i       
  delay.i     
EndStructure       

Global NewList explo.struct_explo()
Global NewList enemy.struct_enemy()
Global NewList playershot.struct_playershot() 

Global playerX = 0
Global playerY = 300
Global playerSpeed = 4
Global playerLife = 3
Global shootDelay   
Global enemyDelay 
Global enemySetDelay = 100
Global score

Global level       ;Neu, unsere beiden Variablen für den Schwierigkeitsgrad
Global levelUP     ;

Define GFXSND.s = "GFXSND\"

LoadSprite(#Sprite_Player,  "GFXSND\player.bmp")
LoadSprite(#Sprite_Blaster, "GFXSND\blaster.bmp")   
LoadSprite(#Sprite_Back,    "GFXSND\back.bmp")     
LoadSprite(#Sprite_Enemy,   "GFXSND\gegner.bmp")   

Define i

For i = 100 To 108 : LoadSprite(i,  GFXSND + "explo" + Str(i-99) + ".bmp")         : Next
For i = 110 To 113 : LoadSprite(i,  GFXSND + "particle" + Str(i-109) + ".bmp")     : Next
For i = 120 To 122 : LoadSprite(i,  GFXSND + "antrieba" + Str(i-119) + ".bmp")     : Next
For i = 130 To 132 : LoadSprite(i,  GFXSND + "antriebb" + Str(i-129) + ".bmp")     : Next
For i = 140 To 143 : LoadSprite(i,  GFXSND + "gegner_split" + Str(i-139) + ".bmp") : Next

LoadSound(#Sound_Blaster,   GFXSND + "blaster.wav")     
LoadSound(#Sound_Hit,       GFXSND + "hit.wav")           
LoadSound(#Sound_Explosion, GFXSND + "explosion.wav")     
LoadSound(#Sound_LevelUP,   GFXSND + "levelup.wav")     ;Neu, unser Level-UP-sound

LoadModule(#Module_Mucke,   GFXSND + "humatarg.mod")  

; --- 

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
Procedure AddPlayershot(x, y, speedX, speedY) 
  AddElement(playershot())       
  playershot()\x = x             
  playershot()\y = y     
  playershot()\speedX = speedX
  playershot()\speedY = speedY
EndProcedure
Procedure AddExplo(x, y, speedX, speedY, spriteStart, spriteEnd, animSpeed)
  AddElement(explo())
  explo()\x = x
  explo()\y = y
  explo()\speedX = speedX
  explo()\speedY = speedY
  explo()\spriteStart = spriteStart
  explo()\spriteEnd = spriteEnd
  explo()\animSpeed = animSpeed
  explo()\delay = animSpeed
EndProcedure

; --- 

Procedure 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 < 565 -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)
    PlaySound(#Sound_Blaster) : shootDelay = 15                             
  EndIf
 
  If shootDelay > 0 : shootDelay - 1 : EndIf
 
EndProcedure
Procedure 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
 
EndProcedure
Procedure enemy2()
  
  Protected i
  
  If enemyDelay = 0
    AddEnemy(800, Random(560), -2-Random(1), 0, 100)
    enemyDelay = enemySetDelay
  Else
    enemyDelay - 1
  EndIf
 
  ForEach enemy()
    
    ; --- hier muss ein BREAK eingefügt werden, damit es nicht zu einem Fehler kommt
    ; --- wenn kein Element mehr vorhanden ist in enemy()
    If enemy()\x < 0-SpriteWidth(#Sprite_Enemy) : DeleteElement(enemy()) : Break : EndIf
    
    ; --- man könnte hier auch überprüfen, ob noch ein Element vorhanden ist...
    If enemy()\armor < 1
     
      For i = 1 To 4   
        AddExplo(enemy()\x+15, enemy()\y, Random(6)-3, Random(6)-3, 100, 108, 2) 
        AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 110, 113, 5)
      Next
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 140, 140, 25)
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 141, 141, 25)
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 142, 142, 25) 
      AddExplo(enemy()\x+15, enemy()\y, Random(10)-5, Random(10)-5, 143, 143, 25) 
     
      DeleteElement(enemy())
      PlaySound(#Sound_Explosion)
      score + 150 : levelUP + 150   ; Neu, damit wir nach einer Anzahl an Punkten den Level erhöhen können
    EndIf
   
  Next
 
  ForEach enemy()
    AddExplo(enemy()\x+SpriteWidth(#Sprite_Enemy), enemy()\y+7+Random(6)-3, Random(3)+1, 0, 130, 132, 3)
    DisplayTransparentSprite(#Sprite_Enemy, enemy()\x, enemy()\y)
    enemy()\x + enemy()\speedX
  Next
 
EndProcedure
Procedure collisions()
 
  ForEach enemy()
   
    ForEach playershot()
      If SpriteCollision(#Sprite_Blaster, playershot()\x, playershot()\y, #Sprite_Enemy, enemy()\x, enemy()\y)
        PlaySound(#Sound_Hit)
        enemy()\armor - 20
        DeleteElement(playershot())
      EndIf
    Next
   
    If SpriteCollision(#Sprite_Player, playerX, playerY, #Sprite_Enemy, enemy()\x, enemy()\y)
      PlaySound(#Sound_Explosion)
      enemy()\armor - 100
      playerLife - 1           
    EndIf
   
  Next
 
EndProcedure
Procedure drawing()
 
  ;StartDrawing(ScreenOutput())
  
  ; --- Hier habe ich das StartDrawing/ Stopdrawing entfernt, damit
  ; --- es nicht mehrmals aufgerufen wird. Habe natürlich auch den
  ; --- Aufruf der drawing() Prozedur in den vorhandenen StartDrawing/StopDrawing
  ; --- Block verschoben. Damit flackert die untere Leiste nicht mehr
  
  DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)   
  FrontColor(RGB(0,0,0)) : Box(0, 570, 800, 30)     
 
  FrontColor(RGB(200,200,200))
  DrawText(360, 575, Str(playerLife))
  DrawText(100, 575,Str(score))
  DrawText(660, 575,Str(level))   ;Neu, der aktuelle Level wird nun auch angezeigt
 
  FrontColor(RGB(200,100,0))
  DrawText(300, 575, "Lives:")
  DrawText(10, 575,"SCORE:")
  DrawText(600, 575,"Level:")   
  ;StopDrawing()
 
EndProcedure
Procedure explosions()
 
  ForEach(explo())
   
    DisplayTransparentSprite(explo()\spriteStart, explo()\x, explo()\y)
    explo()\x + explo()\speedX : explo()\y + explo()\speedY
   
    If explo()\spriteStart = explo()\spriteEnd And explo()\delay = 1
      DeleteElement(explo())
    ElseIf explo()\delay > 0
      explo()\delay - 1
    Else
      explo()\delay = explo()\animSpeed
      explo()\spriteStart+1
    EndIf
   
  Next
 
EndProcedure

; --- 

Procedure ScreenEventLoop()
  
  Protected Quit = #False ;<-- um das Escape drücken zu erkennen und dann die Windowsloop zu beenden
  
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Escape) : Quit = #True : EndIf
  
  DisplaySprite(#Sprite_Back, 0, 0)
  
  ; --- Hier wird die Musik zurückgesetzt (wahrscheinlich wegen der Schleife damit man es nicht merkt)
  If GetModulePosition(#Module_Mucke) = 41 : SetModulePosition(#Module_Mucke,5) : EndIf   
  
  If playerLife < 0
    CloseScreen()
    MessageRequester("Du bist tot..", "Schade!" + Chr(10) + "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
    End
  ElseIf enemySetDelay < 5
    CloseScreen()
    MessageRequester("Geschafft..", "Erreichte Punkte: " + Str(score) + Chr(10) + "In Level: " + Str(level), 0)
    End
  EndIf
  
  If levelUP > 2500 : level + 1 : levelUP = 0 : enemySetDelay - 15: PlaySound(#Sound_LevelUP) : EndIf
  
  StartDrawing(ScreenOutput()) : DrawingMode(1)   ;;Drawing für Textausgabe
  FrontColor(RGB(200,100,0))
  DrawText(0,0,"ESC-Ende")
  ;Wir zeigen hier zusätzlich die Anzahl aller Gegner und Schüsse an
  ;Debug CountString("How many 'ow' contains Bow ?", "ow") ; wird 3 ausgeben
  If ListSize(enemy()) : DrawText(10, 100, "Anzahl Gegner: " +  Str (ListSize(enemy()))) : EndIf
  If ListSize(playershot()) : DrawText(10, 120, "Anzahl Schüsse: " + Str (ListSize(playershot()))) : EndIf

  drawing() ; <-- hier den verschobenen Aufruf
  
  StopDrawing()
  
 
  DisplayTransparentSprite(#Sprite_Player, playerX, playerY);Das Raumschiff anzeigen
 
  FlipBuffers() ; Damit alle Grafiken auch angezeigt werden
 
  steuerung()
  playershots()
  enemy2()
  collisions()
  explosions()   
     
 
  AddExplo(playerX-10, 6+playerY+Random(6)-3, Random(3)-3, 0, 120, 122, 2)
  DisplayTransparentSprite(#Sprite_Player, playerX, playerY)
 
  FlipBuffers()
  ClearScreen(0) ; <-- hier um den Bildschirm komplett zu löschen, falls da noch Reste sind ^^
  
  ProcedureReturn Quit
  
EndProcedure

Define Event, Quit = #False

PlayModule(#Module_Mucke)  ; < Musik starten

Repeat
  
  Event = WindowEvent()
  
  ; --- hier wird nur auf das Schliessen des Fensters reagiert
  If Event = #PB_Event_CloseWindow
    Quit = 1
  EndIf
  
  ; --- Hier habe ich alles was mit dem Screen in der Eventloop
  ; --- passiert, in eine extra Prozedur getan.
  ; --- Das Ergebnis der Prozedur (was ja der Druck auf Escape ändert)
  ; --- beendet dann das Programm
  If ScreenEventLoop()
    Quit = 1
  EndIf
  
  Delay(1)
  
Until Quit > 0
Mannomann ist das lange her, wo ich was mit Screens gemacht hab ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten