Enterhaken

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

garret

Betreff: Enterhaken

BeitragFr, Feb 29, 2008 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Rahmen eines Projektes ist dieser Enterhaken bzw. Greifhaken-Code entstanden. Die Spielfigur kann auf Tastendruck einen Enterhaken verschießen und sich so an große Kisten heranziehen oder kleine Kisten zu sich ziehen. Bewegung über Pfeiltasten.

Der Link zum gesamten Paket (gigantische 5 KB): https://www.blitzforum.de/upload/file.php?id=2735

Enthalten sind der frei verwendbare Quelltext und die "geborgten" Beispielgrafiken.

Der Quelltext:
Code: [AUSKLAPPEN]

; ######################################################################################
;
; Enterhaken by garret
;
; Der Enterhaken wird vom Spieler abgeschossen. Trifft er eine Kiste, zieht sich der Spieler an diese heran.
;
; Zustände des Enterhakens (Variable EnterhakenAbgeschossen)
;
; 0 = Enterhaken momentan nicht eingesetzt
; 1 = Enterhaken auf dem Hinweg
; 2 = Enterhaken auf dem Rückweg
; 3 = Enterhaken erwischt Kiste und der Spieler zieht sich zu dieser
; 4 = Enterhaken erwischt kleine Kiste und der Spieler zieht diese zu sich
;
; ######################################################################################


Graphics 640, 480, 32, 2 : SetBuffer BackBuffer() : AppTitle "Enterhaken"
SeedRnd MilliSecs()

; IMG_Spielerer laden
IMG_Spieler = LoadAnimImage("Spieler.png",24,32,0,4)
IMG_Kiste = LoadImage("Kiste.png")
IMG_Kiste_klein = LoadImage("Kiste_klein.png")


; Spielerkoordinaten festlegen
SpielerX = 308
SpielerY = 224


; Kisten werden als Types gespeichert
Type T_Kiste

   Field Typ
   Field x, y
   Field Breite, Hoehe; Breite und Höhe
   
End Type


; zufällige große Kisten erstellen
For i = 1 To 7

   k.T_Kiste = New T_Kiste
   k\Typ = 1
   k\x = Rand(0, 600)
   k\y = Rand(0, 440)
   k\Breite = 32
   k\Hoehe = 32

Next

; zufällige kleine Kisten erstellen
For i = 1 To 7

   k.T_Kiste = New T_Kiste
   k\Typ = 2
   k\x = Rand(0, 600)
   k\y = Rand(0, 440)
   k\Breite = 24
   k\Hoehe = 24

Next


; Timer erzeugen
Timer = CreateTimer(60)


; Hauptschleife
Repeat : Cls

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

   EndIf

   ; Enterhaken einsetzen
   
      If KeyHit(57); Leertaste
      
         If EnterhakenAbgeschossen = 0
         
            EnterhakenX = SpielerX + 12; Enterhakenkoordinaten werden an die Spielergrafik angepasst
            EnterhakenY = SpielerY + 16
               
            EnterhakenAbgeschossen = 1
            
         EndIf
         
      EndIf
   
   
      ; Enterhaken bewegen
      If EnterhakenAbgeschossen = 1; Enterhaken auf Hinweg

         Select SpielerRichtung
         
            Case 0
               EnterhakenY = EnterhakenY - 5
            
            Case 2
               EnterhakenY = EnterhakenY + 5
               
            Case 1
               EnterhakenX = EnterhakenX + 5
               
            Case 3
               EnterhakenX = EnterhakenX - 5
               
         End Select
      
         ; Entfernungsprobe
         If (Abs(SpielerX - EnterhakenX) + Abs(SpielerY - EnterhakenY)) > 300
         
            EnterhakenAbgeschossen = 2; Enterhaken maximal ausgerollt und kommt nun zurück
            
         EndIf
         
      ElseIf EnterhakenAbgeschossen = 2; Enterhaken auf Rückweg
      
         Select SpielerRichtung
         
            Case 0
               EnterhakenY = EnterhakenY + 5
            
            Case 2
               EnterhakenY = EnterhakenY - 5
               
            Case 1
               EnterhakenX = EnterhakenX - 5
               
            Case 3
               EnterhakenX = EnterhakenX + 5
               
         End Select
         
         ; Enterhaken wieder beim Spieler
         If (SpielerX+12 = EnterhakenX) And (SpielerY+16 = EnterhakenY)
         
            EnterhakenAbgeschossen = 0
         
         EndIf
         
      ElseIf EnterhakenAbgeschossen = 3; Enterhaken hat Kiste erwischt und Spieler zieht sich ran
         
         Select SpielerRichtung
         
            Case 0
               SpielerY = SpielerY - 5
            
            Case 2
               SpielerY = SpielerY + 5
               
            Case 1
               SpielerX = SpielerX + 5
               
            Case 3
               SpielerX = SpielerX - 5
               
         End Select
         
         ; sobald der Spieler eine Kiste berührt, wird der Enterhaken deaktiviert
         For k.T_Kiste = Each T_Kiste
            
            If ImagesCollide(IMG_Spieler,SpielerX,SpielerY,SpielerRichtung, IMG_Kiste, k\x,k\y,0) EnterhakenAbgeschossen = 0
            
         Next
         
      EndIf
      

      ; Enterhaken zeichnen
      If EnterhakenAbgeschossen
      
         Oval EnterhakenX - 2, EnterhakenY - 2, 4, 4, 0
         Line SpielerX + 12, SpielerY + 16, EnterhakenX, EnterhakenY
      
      EndIf
   
   
      ; Kisten verwalten
      For k.T_Kiste = Each T_Kiste
      
         ; Enterhaken erwischt Kiste
         
         If EnterhakenAbgeschossen = 1
         
            Select k\Typ
            Case 1; große Kiste, Spieler zieht sich ran
         
               If RectsOverlap(EnterhakenX,EnterhakenY,1,1, k\x,k\y,32,32)
         
                  EnterhakenAbgeschossen = 3
            
               EndIf
               
            Case 2; kleine Kiste, diese wird herangezogen
            
               If RectsOverlap(EnterhakenX,EnterhakenY,1,1, k\x,k\y,24,24)
         
                  EnterhakenAbgeschossen = 4
            
               EndIf
               
            End Select
         
         EndIf
         
         ; Enterhaken hat Kiste erwischt und diese wird herangezogen
         If EnterhakenAbgeschossen = 4
         
            If RectsOverlap(EnterhakenX,EnterhakenY,1,1, k\x,k\y,24,24)
            
               Select SpielerRichtung
               
                  Case 0
                     EnterhakenY = EnterhakenY + 5
                     k\y = k\y + 5
                  
                  Case 2
                     EnterhakenY = EnterhakenY - 5
                     k\y = k\y - 5
                                       
                  Case 1
                     EnterhakenX = EnterhakenX - 5
                     k\x = k\x - 5
                     
                  Case 3
                     EnterhakenX = EnterhakenX + 5
                     k\x = k\x + 5
                     
               End Select
            
            EndIf
            
            ; trifft die Kiste den Spieler, wird der Enterhaken deaktiviert
            If ImagesCollide(IMG_Spieler,SpielerX,SpielerY,SpielerRichtung, IMG_Kiste_klein, k\x,k\y,0) EnterhakenAbgeschossen = 0
         
         EndIf
         
         
         ; Kisten zeichnen
         Select k\Typ
         
            Case 1; große Kiste
               DrawBlock IMG_Kiste, k\x, k\y
            
            Case 2; kleine Kiste
               DrawBlock IMG_Kiste_klein, k\x, k\y
            
         End Select
         
      Next
   
   
      ; Spieler zeichnen
      DrawImage IMG_Spieler, SpielerX, SpielerY, SpielerRichtung


WaitTimer Timer
Flip : Until KeyHit(1) : End


Der einzige mir bekannte Bug, begründet durch die Verwendung von Collide-Befehlen (die ich eigentlich meide, aber hier waren sie praktisch), entsteht, wenn man sich an eine Kiste heranziehen will und dabei bereits eine andere berührt. Dann berührt die Spielfigur schon eine Kiste und zieht sich nicht weiter. Durch geeignetes Leveldesign oder Codeoptimierung kann man das aber umgehen.

MfG garret
  • Zuletzt bearbeitet von garret am Di, März 04, 2008 20:21, insgesamt 2-mal bearbeitet

mabox

BeitragFr, Feb 29, 2008 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
nur blöd das der Upload nicht existiert...
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Thorsten

BeitragFr, Feb 29, 2008 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/upload/file.php?id=2735

garret

BeitragSa, März 01, 2008 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte es ein zweites Mal hochgeladen.
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group