Schuss-Loch in Sprite
Schuss-Loch in Sprite
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
PureBasic is the BEST!
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
...oder du renderst es direkt auf den Hintergrund...
So kannst du unendlich viele Schusslöcher darstellen^^
So kannst du unendlich viele Schusslöcher darstellen^^
Code: Alles auswählen
; Wenn geschossen wird...
UseBuffer(DAS_HINTERGRUND_SPRITE)
DisplaySprite(DAS_SCHUSSLOCH_SPRITE,X,Y)
UseBuffer(#PB_Default)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> So kannst du unendlich viele Schusslöcher darstellen
nuja.. "unendlich"...
natürlich mehr, weil man nicht in jedem frame jedes schussloch darstellen muss...
gibt aber 2 probleme:
1. wenn der level nochmal gespielt werden soll, müsste das sprite erneut geladen werden,
also lieber gleich mit ner kopie arbeiten...
2. wenn das wandsprite an verschiedenen stellen des levels angezeigt werden soll,
braucht man für jede stelle ne extra-kopie, damit nicht auf jeder wand dieselben löcher sind.
klar, mehr performance, aber auch wesentlich mehr speicherbedarf...
nuja.. "unendlich"...
natürlich mehr, weil man nicht in jedem frame jedes schussloch darstellen muss...
gibt aber 2 probleme:
1. wenn der level nochmal gespielt werden soll, müsste das sprite erneut geladen werden,
also lieber gleich mit ner kopie arbeiten...
2. wenn das wandsprite an verschiedenen stellen des levels angezeigt werden soll,
braucht man für jede stelle ne extra-kopie, damit nicht auf jeder wand dieselben löcher sind.
klar, mehr performance, aber auch wesentlich mehr speicherbedarf...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Frage
Jilocasin hat geschrieben:
1. soll ich nur die ID des Hintergrund sprites eingeben oder noch mehr
2.Soll ich bei DisplaySprite X,Y die Position Der Maus(Zielkreuz) angeben
Code: Alles auswählen
UseBuffer(DAS_HINTERGRUND_SPRITE)
DisplaySprite(DAS_SCHUSSLOCH_SPRITE,X,Y)
UseBuffer(#PB_Default)
2.Soll ich bei DisplaySprite X,Y die Position Der Maus(Zielkreuz) angeben
PureBasic is the BEST!
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
Also z.B. so:
beim Laden
und dann beim Schießen:
Wenn X und Y "0" sind, wird das Loch ganz oben links auf den Hintergrund gerendert. Wenn sich das Hintergrund-Sprite auch bei "0,0" (oben links) befindet, dann kannst du "MouseX()" und "MouseY()" direkt verwenden.
...
Kannst wenn du willst auch mal deinen Code hier posten
beim Laden
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
...
Kannst wenn du willst auch mal deinen Code hier posten

Mein code
Ein ausschnitt aus meinem Sourcecode (den Teil habe ich übrigens aus einem Tutorial)
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
PureBasic is the BEST!
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
Leider Version 3.3
Danke für alle ordentlichen Antworten!^^
Re: Mein code
Hmm, tja also die Sache mit "Dim" ist schon gut.
Trotzdem würd ich dir empfehlen eine "Liste" zu verwenden...
Da musst du nämlich die Größe nicht vorher angeben und brauchst keine Variable "FassExist"...
Eigentlich ganz einfach:
Du erstellt zunächst eine "Struktur". Das heißt quasi "Untertypen" einer Variable.
Als Beispiel so:
Anfangs ist die Liste leer, dann brauchst du für ein "neues" Fass...
Und anstatt
Bedeutung:
Er geht jedes Element "Fass" bis zum letzten existierenden durch.
In der Schleife kannst du die "Untertypen" des aktuellen Fasses ganz einfach ermitteln:
> Fass()\x
> Fass()\y
> Fass()\anim
Noch Fragen? Immer her damit
Trotzdem würd ich dir empfehlen eine "Liste" zu verwenden...
Da musst du nämlich die Größe nicht vorher angeben und brauchst keine Variable "FassExist"...
Eigentlich ganz einfach:
Du erstellt zunächst eine "Struktur". Das heißt quasi "Untertypen" einer Variable.
Als Beispiel so:
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
Und anstatt
nimmst du eben...For x = 1 To #Max_Fass
Code: Alles auswählen
ResetList(Fass())
While NextElement(Fass())
...
Wend
Er geht jedes Element "Fass" bis zum letzten existierenden durch.
In der Schleife kannst du die "Untertypen" des aktuellen Fasses ganz einfach ermitteln:
> Fass()\x
> Fass()\y
> Fass()\anim
Noch Fragen? Immer her damit
