Schießen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

Thnx, das klappt jetzt! Aber wegen meinen bekloppten GeschichtsLehrer Herr Nägerschewski (eigentlich Naguschewski) kam ich noch nicht dazu das waponezdingsda anzugucken, mache ich jetz =)
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

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)
Benutzeravatar
Machete @PB
Beiträge: 81
Registriert: 12.09.2006 03:12

Beitrag von Machete @PB »

Hm also ich glaube nicht das das hier:
ClearScreen(0+256*0+256*256*0)
so klappt. Zu mindest muss man die Parameter bei mir in der alten Version durch Kommas trennen
zb so: ClearScreen(255,255,255)

ich denke mal das liegt daran^^
Benutze Topos-PB-Version 3.3
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Ä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.

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)
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.
I´a dllfreak2001
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

ich habe es zwar immer noch nicht richtig verstanden, aber vielleicht checke ichs später^^
wäre trotzdem nett wenn mir wer das ganz langsam zum 100 mal erklärt :P

ich checke das mit den lcount nicht
und ich weiß auch nich was das for to dingsda bewirkt
bin ja uch noch nichtmal teeny löl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

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:

Code: Alles auswählen

For n=0 To 10
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.
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
Benutzeravatar
Kaisky007
Beiträge: 83
Registriert: 25.05.2008 20:58

Beitrag von Kaisky007 »

Thx, ich probiere es ma aus...
Antworten