Schießen
Mhmmm, habe es jetzt so, klappt immer noch nicht, wo ist der Fehler?
			
			
									
									
						Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(800,600,32,"Vollbild")
LoadSprite(0,"F:\Kai´s Spiel\Pics\Weltraum.bmp",0)
LoadSprite(1,"F:\Kai´s Spiel\Pics\Shuttle.bmp",0)
LoadSprite(2,"F:\Kai´s Spiel\Pics\Schuss.bmp",0)
 HBX = 0
 HBY = 0
 
 ShuttleX = 350
 ShuttleY = 350
 
  Structure Schuss
  SchussX.w
  SchussY.w
  EndStructure
  
 Global NewList Schuss.Schuss()
 
Procedure AddSchuss(SchussX,SchussY)
  AddElement(Schuss())           
  Schuss()\SchussX      = SchussX
  Schuss()\SchussY      = SchussY
EndProcedure
Repeat
ClearScreen(0+256*0+256*256*0)
 Pause + 1
 SchussY - 10
  If ShuttleX > 700
    ShuttleX = 700
  EndIf
  
  If ShuttleX < 0
    ShuttleX = 0
  EndIf
  
ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Left)
    ShuttleX - 5
  EndIf
  
  If KeyboardPushed(#PB_Key_Right)
    ShuttleX + 5
  EndIf
  If KeyboardPushed(#PB_Key_Space) And Pause > 10
    Pause = 0
    AddElement(Schuss())
    SchussX = ShuttleX + 49
    SchussY = ShuttleY - 5
  EndIf
  
DisplayTransparentSprite(0,HBX,HBY)
DisplayTransparentSprite(1,ShuttleX,ShuttleY)
DisplayTransparentSprite(2,SchussX,SchussY)
FlipBuffers()
Until KeyboardPushed(1)- Machete @PB
 - Beiträge: 81
 - Registriert: 12.09.2006 03:12
 
- dllfreak2001
 - Beiträge: 2925
 - Registriert: 07.09.2004 23:44
 - Wohnort: Bayern
 
Äh, du durchläufst die Liste garnicht und deine Schüsse werden auch nie gelöscht. Außerdem übergibst die Werte für den Schuss nicht an die Elemente der Liste.
Hab dir paar Kommentare dazugemacht, die grüne Box ist jetzt dein Schiff und die roten sind die Schüsse.
Bei Clearscreen berechnet er ja so den RGB-Wert deshalb ist es ja richtig
dafür kannst du auch die Funktion RGB(r,g,b) reinschreiben.
Wenn du den Hintergrund schwarz haben willst brauchts ja nur eine 0 rein.
Wenn man aber sowieso ein Hintergrundbild hat, dass den ganzen Screen ausfüllt kann man den Befehl sowieso weglassen, da das Hintergrundbild den Kramm in jedem Umlauf überzeichnet.
			
			
									
									Code: Alles auswählen
InitSprite() 
InitKeyboard() 
OpenScreen(800,600,32,"Vollbild") 
 HBX = 0 
 HBY = 0 
  
 ShuttleX = 350 
 ShuttleY = 350 
  
  Structure Schuss 
  SchussX.f  ;Sich bewegende Objekte lieber mit Floats oder Doubles machn
  SchussY.f 
  EndStructure 
  
 Global NewList Schuss.Schuss() 
  
Repeat 
ClearScreen(0+256*0+256*256*0) 
 Pause + 1 
 SchussY - 10 
  If ShuttleX > 700 
    ShuttleX = 700 
  EndIf 
  
  If ShuttleX < 0 
    ShuttleX = 0 
  EndIf 
  
ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Left) 
    ShuttleX - 5 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Right) 
    ShuttleX + 5 
  EndIf 
  If KeyboardPushed(#PB_Key_Space) And Pause > 10 
    Pause = 0 
    AddElement(Schuss()) 
    Schuss()\SchussX = ShuttleX + 8 ; Einem Listen element übergibt man Werte so
    Schuss()\SchussY = ShuttleY - 5 
  EndIf 
  
  
  
  
  
  lcount.l = CountList(Schuss()) ;Listenelemente zählen damit man sie später in der Schleife durchlaufen kann
  
  
  
  
StartDrawing(ScreenOutput()) ; Damit ich es auch ausführen kann
  ;Das ist dein Schiff
  Box(ShuttleX,ShuttleY,32,32,RGB(0,255,0)) 
  
  
  
  If lcount > 0 ; Wenn es keine Schüsse gibt braucht man auch keine Darstellen
    For n = 0 To lcount  - 1 ; "lcount - 1 " weil 0 auch schon das erste Element ist
     
      ; Das ist dein Schuss
      SelectElement(Schuss(), n)      
      Schuss()\SchussY - 1.5 ; Damit sich der Schuss bewegt       
      Box(Schuss()\SchussX,Schuss()\SchussY,16,16,RGB(255,0,0)) 
      
    Next
    
    ;Hier werden die Schüsse ab einer bestimmten Grenze gelöscht bei mir ist es wenn Schuss()\SchussY < 32 ist
    
    FirstElement(Schuss()) ;Erstes Element auswählen
    
    For n = 0 To lcount - 1 ;Wie oben in der Schleife
      
      If Schuss()\SchussY < 32 ; Wenn SchussY < 32 ist dann wir gelöscht
        DeleteElement(Schuss(),1)    ; Schuss löschen und dann auf das Element davor springen damit alles nacher gut funzt
      EndIf
      
      NextElement(Schuss()) ;Nächstes Element
    
    Next
 
  
  EndIf
  
StopDrawing()
FlipBuffers() 
Until KeyboardPushed(1)Bei Clearscreen berechnet er ja so den RGB-Wert deshalb ist es ja richtig
dafür kannst du auch die Funktion RGB(r,g,b) reinschreiben.
Wenn du den Hintergrund schwarz haben willst brauchts ja nur eine 0 rein.
Wenn man aber sowieso ein Hintergrundbild hat, dass den ganzen Screen ausfüllt kann man den Befehl sowieso weglassen, da das Hintergrundbild den Kramm in jedem Umlauf überzeichnet.
I´a dllfreak2001
						Wenn du die GrundBegriffe von Programmierung nicht anwenden kannst, solltest du dort anfangen und später dein Spiel schreiben:
Das "for to dingsda" ist eine Schleife, genauergesagt eine Kopfgesteuerte Schleife.
Das heißt das Programm kommt an die Stelle:
nun wird n auf 0 gesetzt und das innere der Schleife bearbeitet bis das Programm erreicht, dort wird dann die SchleifenVariable n um 1 erhöht.
dann geht das Programm wieder in den Kopf und prüft, ob die Schleife bereits die geforderten Umläufe hatte oder nicht.
Bei n = 10 läuft das programm ein letztes mal die Schleife durch, und führt das programm dann nach dem Next weiter aus.
			
			
									
									Das "for to dingsda" ist eine Schleife, genauergesagt eine Kopfgesteuerte Schleife.
Das heißt das Programm kommt an die Stelle:
Code: Alles auswählen
For n=0 To 10Code: Alles auswählen
Nextdann geht das Programm wieder in den Kopf und prüft, ob die Schleife bereits die geforderten Umläufe hatte oder nicht.
Bei n = 10 läuft das programm ein letztes mal die Schleife durch, und führt das programm dann nach dem Next weiter aus.
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
						Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr