Bumerang

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

garret

Betreff: Bumerang

BeitragDo, März 06, 2008 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses Mal stelle ich meinen Bumerang vor, den es in 3 unterschiedlichen Varianten gibt. Ich erlaube mir mal, keine Screenshots zu zeigen, da man nur die Spielerfigur und den Bumerang sieht.

Das Paket (5,8 KB) enthält die Quelltexte und Grafiken: https://www.blitzforum.de/upload/file.php?id=2752

Variante 1 (gerade Flugbahn):
Code: [AUSKLAPPEN]

; ######################################################################################
;
; Bumerangvariante 1 by garret
;
; Bumerang fliegt gerade aus und kehrt schräg zum Spieler zurück
;
;
; ######################################################################################

Graphics 640, 480, 32, 2 : SetBuffer BackBuffer() : AppTitle "Bumerangvariante 1"

; Grafiken laden
IMG_Spieler = LoadAnimImage("Spieler.png",24,32,0,4)
IMG_Bumerang= LoadAnimImage("Bumerang.png",16,16,0,4)

; Spielerkoordinaten festlegen
SpielerX = 308
SpielerY = 224

; Geschwindigkeit des Bumerangs
BumerangSpeed = 5


; Timer erzeugen
Timer = CreateTimer(40)


; Hauptschleife
Repeat : Cls

   ; Spieler bewegen
   If KeyDown(200)
   
      SpielerRichtung = 0
      SpielerY = SpielerY - 2
      
   EndIf
   
   If KeyDown(208)
   
      SpielerRichtung = 2
      SpielerY = SpielerY + 2
      
   EndIf
   
   If KeyDown(203)
   
      SpielerRichtung = 3
      SpielerX = SpielerX - 2
      
   EndIf
   
   If KeyDown(205)
   
      SpielerRichtung = 1
      SpielerX = SpielerX + 2
      
   EndIf


   ; Bumerang einsetzen
   If KeyHit(57); Leertaste
   
      If BumerangGeworfen = 0
      
         BumerangX = SpielerX + 12; Bumerangkoordinaten werden an die Spielergrafik angepasst
         BumerangY = SpielerY + 16
         BumerangRichtung = SpielerRichtung
            
         BumerangGeworfen = 1
         
      EndIf
      
   EndIf


   ; Bumerang bewegen
   If BumerangGeworfen = 1; Bumerang auf Hinweg

      Select BumerangRichtung
      
         Case 0
            BumerangY = BumerangY - BumerangSpeed
         
         Case 2
            BumerangY = BumerangY + BumerangSpeed
            
         Case 1
            BumerangX = BumerangX + BumerangSpeed
            
         Case 3
            BumerangX = BumerangX - BumerangSpeed
            
      End Select

      ; Entfernungsprobe: Bumerang hat maximale Reichweite erreicht und kommt nun zurück
      If (Abs(SpielerX - BumerangX) + Abs(SpielerY - BumerangY)) > 300  BumerangGeworfen = 2

   ; Bumerang auf dem Rückweg
   ElseIf BumerangGeworfen = 2
   
      If BumerangX < SpielerX + 12  BumerangX = BumerangX + BumerangSpeed
      If BumerangX > SpielerX + 12  BumerangX = BumerangX - BumerangSpeed
            
      If BumerangY < SpielerY + 16  BumerangY = BumerangY + BumerangSpeed
      If BumerangY > SpielerY + 16  BumerangY = BumerangY - BumerangSpeed
      
      ;  Bumerang wieder beim Spieler
      If RectsOverlap(SpielerX,SpielerY, 24,32, BumerangX,BumerangY, 16,16)  BumerangGeworfen = 0
   
   EndIf


   ; Bumerang zeichnen
   If BumerangGeworfen

      DrawImage IMG_Bumerang, BumerangX, BumerangY, BumerangFrame      
      BumerangFrame = BumerangFrame + 1
      If BumerangFrame = 4 BumerangFrame = 0
      
   EndIf

   ; Spieler zeichnen
   DrawImage IMG_Spieler, SpielerX, SpielerY, SpielerRichtung
   
   ; Anleitung
   If BumerangGeworfen
      Text 0,0, "Bumerang geworfen"
   Else
      Text 0,0, "Bumerang mit Leertaste werfen"
   EndIf

WaitTimer Timer
Flip : Until KeyHit(1) : End



Variante 2 (mit Maus Wegpunkte bestimmen):
Code: [AUSKLAPPEN]

; ######################################################################################
;
;  Bumerang by garret
;
;  Bumerang folgt Pfad, der von der Maus vorgegeben wurde
;
;
; 1. Leertaste drücken
; 2. mit Maus Wegpunkte festlegen
; 3. Leertaste loslassen
;
; ######################################################################################

Graphics 640, 480, 32, 2 : SetBuffer BackBuffer() : AppTitle "Bumerangvariante 2"

; Grafiken laden
IMG_Spieler = LoadAnimImage("Spieler.png",24,32,0,4)
IMG_Bumerang= LoadAnimImage("Bumerang.png",16,16,0,4)

; Spielerkoordinaten festlegen
SpielerX = 308
SpielerY = 224

; Geschwindigkeit des Bumerangs
BumerangSpeed = 5

; Bumerang erhält Wegpunkte
Type BumerangWegpunkt

   Field Nr
   Field X, Y
   
End Type


; Timer erzeugen
Timer = CreateTimer(40)


; Hauptschleife
Repeat : Cls

   ; Spieler bewegen
   If KeyDown(200)
   
      SpielerRichtung = 0
      SpielerY = SpielerY - 2
      
   EndIf
   
   If KeyDown(208)
   
      SpielerRichtung = 2
      SpielerY = SpielerY + 2
      
   EndIf
   
   If KeyDown(203)
   
      SpielerRichtung = 3
      SpielerX = SpielerX - 2
      
   EndIf
   
   If KeyDown(205)
   
      SpielerRichtung = 1
      SpielerX = SpielerX + 2
      
   EndIf


   ; mit dem  Bumerang wird "anvisiert"
   If KeyDown(57)
   
      If BumerangBereit = 0
      
         BumerangBereit = 1
         AlterWegpunktX = SpielerX + 12; Bumerangkoordinaten werden an Spielergraik angepasst
         AlterWegpunktY = SpielerY + 16
         
         BumerangX = SpielerX + 12
         BumerangY = SpielerY + 16
         
         AnzahlWegpunkte = AnzahlWegpunkte + 1
      
      EndIf
      
   EndIf
   
   
   If BumerangBereit = 1
   
      If AnzahlWegpunkte < 30; Maximale Anzahl der Wegpunkte ist auf 30 gesetzt
   
         ; neuer Wegpunkt ist weit genug vom alten weg, darum wird ein neuer erstellt
         If Sqr((MouseX() - AlterWegpunktX)^2 + (MouseY() - AlterWegpunktY)^2) > 20; Schrittweite der Wegpunkte = 20
         
               BWp.BumerangWegpunkt = New BumerangWegpunkt
               BWp\Nr = AnzahlWegpunkte
               
               ; Wegpunktkoordinaten
               BWp\X = MouseX()
               BWp\Y = MouseY()

               AlterWegpunktX = BWp\X; Anfangswegpunkt wird zugewiesen
               AlterWegpunktY = BWp\Y
               
               AnzahlWegpunkte = AnzahlWegpunkte + 1
               
         EndIf
            
      EndIf
      
      ; Leertaste wird losgelassen,  Bumerang wird geworfen
      If Not KeyDown(57)
      
         BumerangGeworfen = 1; Bumerang auf Hinweg
         BumerangBereit = 2  ; Bereitschaft nicht vorhanden, aber nicht 0 (sonst könnte man zwischendurch neu werfen)

      
      EndIf
      
   EndIf


   ;  Bumerang bewegen
   If BumerangGeworfen = 1
   
      ; Bumerang läuft die erstellten Wegpunkte ab
      For BWp.BumerangWegpunkt = Each   BumerangWegpunkt
      
         If BWp\Nr = AktuelleWegpunktNummer + 1
         
            If BumerangX < BWp\X  BumerangX = BumerangX + BumerangSpeed
            If BumerangX > BWp\X  BumerangX = BumerangX - BumerangSpeed
            
            If BumerangY < BWp\Y  BumerangY = BumerangY + BumerangSpeed
            If BumerangY > BWp\Y  BumerangY = BumerangY - BumerangSpeed
            
            ; befindet sich der Bumerang in der Nähe des Wegpunktes, gilt dieser als abgearbeitet
            If Sqr((BumerangX - BWp\X)^2 + (BumerangY - BWp\Y)^2) < (BumerangSpeed + 1)
            
               AktuelleWegpunktNummer = AktuelleWegpunktNummer + 1
               Delete BWp; und wird gelöscht
               
            EndIf
            
         EndIf
         
      Next
      
      ;  Bumerang hat alle Wegpunkte gefunden und kehrt nun zurück
      If (AktuelleWegpunktNummer + 1) = AnzahlWegpunkte  BumerangGeworfen = 2
            
   ; Bumerang kehrt zum Spieler zurück
   ElseIf BumerangGeworfen = 2
   
      If BumerangX < SpielerX + 12  BumerangX = BumerangX + BumerangSpeed
      If BumerangX > SpielerX + 12  BumerangX = BumerangX - BumerangSpeed
            
      If BumerangY < SpielerY + 16  BumerangY = BumerangY + BumerangSpeed
      If BumerangY > SpielerY + 16  BumerangY = BumerangY - BumerangSpeed
      
      ;  Bumerang wieder beim Spieler
      If RectsOverlap(SpielerX,SpielerY,24,32, BumerangX,BumerangY,16,16)
      
         ; Ausgangszustand wieder herstellen
         BumerangGeworfen = 0
         BumerangBereit = 0
         AnzahlWegpunkte = 0
         AktuelleWegpunktnummer = 0
      
      EndIf
   
   EndIf
   
   ; Wegpunkte zeichnen
   For BWp.BumerangWegpunkt = Each   BumerangWegpunkt
      
      Oval BWp\X - 2,BWp\Y - 2, 4,4, 0
                     
   Next


   ;  Bumerang zeichnen
   If BumerangGeworfen

      DrawImage IMG_Bumerang, BumerangX, BumerangY, BumerangFrame      
      BumerangFrame = BumerangFrame + 1
      If BumerangFrame = 4 BumerangFrame = 0
      
   EndIf

   ; Spieler zeichnen
   DrawImage IMG_Spieler, SpielerX, SpielerY, SpielerRichtung
   
   ; Anleitung
   If BumerangBereit = 1
      Text 0,0, "Bumerang bereit zum Werfen, Wegpunkte festlegen!"
   ElseIf BumerangGeworfen
      Text 0,0, "Bumerang geworfen"
   ElseIf BumerangGeworfen = 0
      Text 0,0, "Bumerang mit Leertaste aktivieren"
   EndIf
      

WaitTimer Timer
Flip : Until KeyHit(1) : End



Variante 3 ("echte" Flugkurve):
Code: [AUSKLAPPEN]

; ######################################################################################
;
; Bumerangvariante 3 by garret
;
; Bumerang fliegt echten Kreis
;
;
; ######################################################################################

Graphics 640, 480, 32, 2 : SetBuffer BackBuffer() : AppTitle "Bumerangvariante 3"

; Grafiken laden
IMG_Spieler = LoadAnimImage("Spieler.png",24,32,0,4)
IMG_Bumerang= LoadAnimImage("Bumerang.png",16,16,0,4)

; Spielerkoordinaten festlegen
SpielerX = 308
SpielerY = 224

; Geschwindigkeit des Bumerangs
BumerangSpeed = 5; je größer, desto weniger Zwischenschritte


; Timer erzeugen
Timer = CreateTimer(40)


; Hauptschleife
Repeat : Cls

   ; Spieler bewegen
   If BumerangBereit <> 1
   
      If KeyDown(200)
      
         SpielerRichtung = 0
         SpielerY = SpielerY - 2
         
      EndIf
      
      If KeyDown(208)
      
         SpielerRichtung = 2
         SpielerY = SpielerY + 2
         
      EndIf
      
      If KeyDown(203)
      
         SpielerRichtung = 3
         SpielerX = SpielerX - 2
         
      EndIf
      
      If KeyDown(205)
      
         SpielerRichtung = 1
         SpielerX = SpielerX + 2
         
      EndIf
      
   EndIf


      ; mit dem  Bumerang wird "anvisiert"
      If KeyDown(57)
      
         If BumerangBereit = 0
         
            BumerangBereit = 1
            
            BumerangX = SpielerX + 12; Bumerangkoordinaten werden an Spielergraik angepasst
            BumerangY = SpielerY + 16
            
            BumerangRadius# = 50      ; Mindestradius des Bumerangs
            RadiusErweiterung# = 1.05   ; Der Wachstumsfaktor des Radius'

         EndIf
         
      EndIf




      If BumerangBereit = 1
      
         ; Der Radius des Wurfkreises wird bestimmt durch die Dauer des Tastendrucks
         If BumerangRadius > 500 RadiusErweiterung = (1 / 1.05)
         If BumerangRadius < 50  RadiusErweiterung = 1.05
                  
         BumerangRadius = BumerangRadius * RadiusErweiterung
         
         ; Die Wurfkreise müssen an die Blickrichtung angepasst werden
         Select SpielerRichtung
      
            Case 0; hoch
               Oval (SpielerX + 12) - BumerangRadius, (SpielerY + 16) - (BumerangRadius/2), BumerangRadius,BumerangRadius,0
               
            Case 1; rechts
               Oval (SpielerX + 12) - (BumerangRadius/2), (SpielerY + 16) - BumerangRadius, BumerangRadius,BumerangRadius,0
      
            Case 2; runter
               Oval (SpielerX + 12), (SpielerY + 16) - (BumerangRadius/2), BumerangRadius,BumerangRadius,0
      
            Case 3; links
               Oval (SpielerX + 12) - (BumerangRadius/2), (SpielerY + 16), BumerangRadius,BumerangRadius,0      
      
         End Select
         
         ; Leertaste wird losgelassen,  Bumerang wird geworfen
         If Not KeyDown(57)
         
            BumerangGeworfen = 1; Bumerang auf Hinweg
            BumerangBereit = 2  ; Bereitschaft nicht vorhanden, aber nicht 0 (sonst könnte man zwischendurch neu werfen)
            BumerangRichtung = SpielerRichtung


            Select BumerangRichtung
      
               ; Mittelkoordinaten des Kreises und Anfangswinkel werden festgelegt
               Case 0; hoch
                  BumerangMitteX = SpielerX + 12 - (BumerangRadius/2)
                  BumerangMitteY = SpielerY + 16
                  StartWinkel = 0
                  
               Case 1; rechts
                  BumerangMitteX = SpielerX + 12
                  BumerangMitteY = SpielerY + 16 - (BumerangRadius/2)
                  StartWinkel = 90
                  
               Case 2; runter
                  BumerangMitteX = SpielerX + 12 + (BumerangRadius/2)
                  BumerangMitteY = SpielerY + 16
                  StartWinkel = 180
                  
               Case 3; rechts
                  BumerangMitteX = SpielerX + 12
                  BumerangMitteY = SpielerY + 16 + (BumerangRadius/2)
                  StartWinkel = 270


            End Select
         
            Winkel = Startwinkel
         
         EndIf
         
      EndIf


      If BumerangGeworfen = 1
      
         ; Winkel erhöhen
         Winkel = Winkel - BumerangSpeed
         
         ; Bumerang positionieren
         BumerangX = BumerangMitteX + Cos(Winkel) * (BumerangRadius/2)
         BumerangY = BumerangMitteY + Sin(Winkel) * (BumerangRadius/2)
         

         ; Bumerang kann erst nach bestimmter Strecke gefangen werden, sonst ist er sofort zurück beim Spieler (RectsOverlap)
         If Abs(StartWinkel - Winkel) > 90  BumerangFangen = True
         
         If BumerangFangen = True

         ;  Bumerang wieder beim Spieler
            If RectsOverlap(SpielerX,SpielerY,24,32, BumerangX,BumerangY,16,16)
         
               ; Ausgangszustand wieder herstellen
               BumerangGeworfen = 0
               BumerangBereit = 0
               BumerangFangen = False
               Winkel = 0
               
            EndIf
            
         EndIf
         
      EndIf



      ; Bumerang zeichnen
      If BumerangGeworfen

         DrawImage IMG_Bumerang, BumerangX, BumerangY, BumerangFrame      
         BumerangFrame = BumerangFrame + 1
         If BumerangFrame = 4 BumerangFrame = 0
         
      EndIf

      ; Spieler zeichnen
      DrawImage IMG_Spieler, SpielerX, SpielerY, SpielerRichtung
      

      ; Anleitung
      If BumerangGeworfen
         Text 0,0, "Bumerang geworfen"
      ElseIf BumerangBereit = 1
         Text 0,0, "Bumerangradius bestimmen"
      ElseIf BumerangGeworfen = 0
         Text 0,0, "Bumerang mit Leertaste werfen"
      EndIf


WaitTimer Timer
Flip : Until KeyHit(1) : End



Viel Spaß damit!

MfG, garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Dottakopf

BeitragFr, März 07, 2008 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey lustige sache!

Vorallem Varriante 2 hat mich ziemlich an "Zelda twilight princess" erinnert, da konnte man auch mit seinem Bumemrang verschiedene wegpunkte angeben.

mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Fr, März 07, 2008 15:59, insgesamt einmal bearbeitet

garret

BeitragFr, März 07, 2008 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Bis auf Variante 3 kommen die so auch alle in Zelda-Teilen vor Cool
Variante 2 war aber viel mehr von Phantom Hourglass inspiriert, denn da gibt man eine Strecke mit dem Touchpen vor, die der Bumerang dann entlangfliegt.

MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group