Schuss-Loch in Sprite
Verfasst: 17.07.2006 18:56
hallo ich arbeite gerade an einen kleinen 2dshooter und will wissen wie ich es hinkriege das wenn ein schuss abgefeuert wird ein Schussloch an der der stelle erscheint
Code: Alles auswählen
; Wenn geschossen wird...
UseBuffer(DAS_HINTERGRUND_SPRITE)
DisplaySprite(DAS_SCHUSSLOCH_SPRITE,X,Y)
UseBuffer(#PB_Default)
Code: Alles auswählen
UseBuffer(DAS_HINTERGRUND_SPRITE)
DisplaySprite(DAS_SCHUSSLOCH_SPRITE,X,Y)
UseBuffer(#PB_Default)
Code: Alles auswählen
BG_Sprite = LoadSprite(#PB_Any,"Hintergrund.bmp")
Loch_Sprite = LoadSprite(#PB_Any,"Loch.bmp")
Code: Alles auswählen
UseBuffer(BG_Sprite) ; Sprites werden jetzt auf ein anderes Sprite gerendert
DisplaySprite(Loch_Sprite,X,Y) ; Loch-Sprite auf das Hintergrund-Sprite zeichnen
UseBuffer(-1) ; Sprites werden wieder auf den Bildschirm gerendert
Code: Alles auswählen
#Max_Fass = 20 ; Eine Konstante die die Anzahl der Maximalen Fässer speichert
Dim FassX.w(#Max_Fass) ; Die X Position der Fässer
Dim FassY.w(#Max_Fass) ; Die Y Position der Fässer
Dim FassExist.w(#Max_Fass) ; Gibt es das Fass oder nicht ?
Dim FassAnim.w(#Max_Fass) ; Die Animationsphase in der sich das Fass befindet
Global Level.w
Global Level2.w
Global Keyboard ; Das Level in dem sich der Spieler befindet
Global Maus_Knopf.w ; Speichert nach einem Schuss ab, das die Maustaste bereits gedrückt wurde
Global Punkte.w ; Die Anzahl der Punkte die der Spieler errungen hat
Global FassCount.w ; Zählt die Fässer um prüfen zu können ob für das Level genug da sind
Global Explodiert.w ; Zählt die Anzahl der Fässer die bereits durchgefallen sind.
Global Sch.w
Sch = 0
Level = 1 ; Setzt das Anfangslevel
;----------loadSprite------------
LoadSprite(0,"GFX\NeuKreuz3.bmp",0) ; Lädt unsere neue und schönere Kreuzgrafik
LoadSprite(2,"GFX\NeuKreuz3.bmp",0)
TransparentSpriteColor(0,255,0,255) ; Setzt die transparent Farbe für das Kreuz
LoadSprite(1,"GFX\Backkrossekrabbe6.bmp" ,0) ; Lädt Den Hintergrund
For x = 1 To 10 ; Schleife für das laden der Fassanimation
LoadSprite(10+x,"GFX\grana" + Str(x) + ".bmp",0) ; Alle 10 Animationsstufen des Fasses laden
TransparentSpriteColor(10+x,255,0,255) ; Und die Transparentsfarbe setzen
Next
;--------------------------
;--------load font----
LoadFont (1, "Lucida Blackletter", 150)
LoadFont (2, "Ms sans serif", 15)
LoadFont (3, "Ms sans serif", 12)
Repeat
;---------Überprüfe maus,Keyboard----------
ExamineMouse() ; Neue Mausdaten einlesen
ExamineKeyboard() ; Neue Tastaturdaten einlesen
If MouseButton(1) And Maus_Knopf = 0 ; Wenn die Maustaste gedrückt wurde
Maus_Knopf = 1 ; Jetzt kann nicht mehr gefeuert werden, bis die Taste losgelassen wird
sch + 1
PlaySound(1)
For x = 1 To #Max_Fass ; Für alle Fässer
If FassExist(x) = 1 And MouseX() > FassX(x) And MouseX() < FassX(x) + 20 And MouseY() > FassY(x) And MouseY() < FassY(x) + 20
; Check ob das Fass existiert und man mit der Maus drauf zeigt.
FassExist(x) = 2 ; Exist 2 bedeutet, das Fass ist gerade am auseinanderfallen
Dollar = Dollar + 10 ; Punkt dazurechnen
EndIf
Next
EndIf
;-------events------------
If MouseButton(1) = 0 ; Wenn die nicht Maustaste gedrückt ist
Maus_Knopf = 0; darf man wieder feuern
EndIf
If EventID = #PB_EventRepaint ; If the user has resized the window or anything,
Gosub SomeGraphics ; we will repaint our graphic
EndIf
DisplaySprite(1,0,0) ; den Hintergrund setzen (ohne MaskColor, er soll ja alles abdecken)
For x = 1 To #Max_Fass ; Für alle Fässer (mal wieder)
If FassExist(x) > 0 ; Wenn das Fass existiert
DisplayTransparentSprite(10+FassAnim(x)/3,FassX(x),FassY(x)) ; setze die aktuelle Animationphase auf den Bildschirm
EndIf
Next
;------------------Drawing---------------
DisplayTransparentSprite(0,MouseX()-32,MouseY()-32) ; Das Ziel Kreuz setzen
StartDrawing(ScreenOutput()) ; Für Schrift brauchen wir dann doch nocht 2D Drawing
DrawingFont(UseFont(2))
DrawingMode(1) ; Den Hintergrund der Schrift auf durchsichtig stellen
Locate(100,300) ; Die Punkte sollen nach links oben
FrontColor(30,255,10) ; In blau
DrawText("Dollar:" + Str(Dollar)+"$") ; Und da sind Sie auch schon
DrawingFont(UseFont(2))
Locate(100,330) ; Die Anzeige der Durchgefallenen soll nach rechts oben
FrontColor(255,0,0) ; In rot
DrawText("Explodiert:" + Str(Explodiert)) ; ...
DrawingFont(UseFont(3))
Locate(100,360) ; Die Anzeige der Durchgefallenen soll nach rechts oben
FrontColor(100,100,255) ; In rot
DrawText("Level:" + Str(level))
;---------------Draw Schüsse---
DrawingFont(UseFont(3))
Locate(100,390) ; Die Anzeige der Durchgefallenen soll nach rechts oben
FrontColor(90,200,255) ; In rot
DrawText("Schüsse:" + Str(sch))
StopDrawing() ; Damit ist der 2D Kram erledigt
FlipBuffers() ; Bildschirmseiten tauschen
;-------------------------Keyboard Funktionenen
InitKeyboard()
ExamineKeyboard()
;--------------ende Keybord funktionen--------
;-----------Fass Anim----------------
FassCount = 0 ; Die gezählten Fässer sind am Anfang Null
For x = 1 To #Max_Fass ; Mal wieder für alle Fässer
If FassExist(x) > 0 ; gibt es das Fass
FassCount = FassCount + 1 ; Dann die gezählten Fässer um 1 erhöhen
If FassExist(x) < 3 ; Wenn das Fass nicht gerade auf dem Boden zerschellt
FassY(x) = FassY(x) + 1 ; Es weiter nach unten bewegen
EndIf
If FassExist(x) > 1 ; Nur Für FassExist 2 und 3, da diese Animatier sind
FassAnim(x) = FassAnim(x) + 1 ; Die Animation um 1 erhöhen
If FassAnim(x) > 30
PlaySound(2) ; Wenn die Animation beim Ende Angekommen
FassExist(x) = 0 ; dann existiert das Fass ab jetzt nicht mehr
EndIf
EndIf
If FassExist(x) = 1 And FassY(x) > 556 ; Wenn das Fass Existiert (nicht gerade kaputt geht) und auf den Boden fällt
Explodiert = Explodiert + 1 ; Ist eins mehr durchgefallen
FassExist(x) = 3 ; Und das Fass zerschellt am Boden
EndIf
EndIf
Next
If FassCount < Level ; Wenn es weniger Fässer im Bild gibt
For x = 1 To #Max_Fass ; Für alle Fässer
If FassExist(x) = 0 ; Wenn es das Fass nicht gibt
FassExist(x) = 1 ; Wird aus Ihm ein neues
FassAnim(x) = 3 ; Die Animation wird auf den Anfang zurück geschaubt
FassY(x) = -40 ; Das Fass kommt ganz nach oben
FassX(x) = Random(620) ; Auf eine zufällige X Position
x = #Max_Fass+1 ; Und die Schleife wird beendet
EndIf
Next
EndIf
If (Dollar / 100) + 1 > Level ; Alle 100 Punkte
Level = Level + 1
PlaySound(3)
StartDrawing(ScreenOutput()) ; Für Schrift brauchen wir dann doch nocht 2D Drawing
Code: Alles auswählen
Structure FassStructure
x.w
y.w
anim.w
EndStructure
NewList Fass.FassStructure(); Erstellen einer neuen Fässer-"Liste"
Code: Alles auswählen
AddElement(Fass())
Fass()\x = IRGENDWO
Fass()\y = IRGENDWO
nimmst du eben...For x = 1 To #Max_Fass
Code: Alles auswählen
ResetList(Fass())
While NextElement(Fass())
...
Wend