Seite 1 von 2

Schuss-Loch in Sprite

Verfasst: 17.07.2006 18:56
von Anfänger
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

Verfasst: 17.07.2006 19:14
von Kaeru Gaman
mach ein sprite mit dem schussloch, und das displayst du drüber...

btw:
sprites sind keine objekte, sondern sowas wie brushes.
du kannst dasselbe sprite beliebig oft auf einen screen zeichnen.

Verfasst: 18.07.2006 08:24
von Jilocasin
...oder du renderst es direkt auf den Hintergrund...
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)

Verfasst: 18.07.2006 10:56
von Kaeru Gaman
> 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...

Verfasst: 18.07.2006 12:50
von Eric
> So kannst du unendlich viele Schusslöcher darstellen

Oder du packst die Positionen der Schusslöcher in eine verlinkte Liste, stellst
erst das Level und danach die Schusslöcher dar.

Und es stellt sich noch die Frage, ob die Ansicht von Oben von der Seite oder
isometrisch ist.

Verfasst: 18.07.2006 13:06
von Kaeru Gaman
hast ja recht eric, aber ich frag mich grad, ob die begriffe

> verlinkte Liste
> isometrisch

vielleicht für "Anfänger" noch bömische dörfer sind... ;)

was ein Nickname.. was machstn in zwei Jahren, wenn Du dich auskennst...

Frage

Verfasst: 18.07.2006 17:16
von Anfänger
Jilocasin hat geschrieben:

Code: Alles auswählen

UseBuffer(DAS_HINTERGRUND_SPRITE) 
DisplaySprite(DAS_SCHUSSLOCH_SPRITE,X,Y) 
UseBuffer(#PB_Default)
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

Verfasst: 19.07.2006 10:38
von Jilocasin
Also z.B. so:

beim Laden

Code: Alles auswählen

BG_Sprite = LoadSprite(#PB_Any,"Hintergrund.bmp")
Loch_Sprite = LoadSprite(#PB_Any,"Loch.bmp")
und dann beim Schießen:

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
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 ;-)

Mein code

Verfasst: 19.07.2006 19:16
von Anfänger
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 

Re: Mein code

Verfasst: 20.07.2006 08:25
von Jilocasin
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:

Code: Alles auswählen

Structure FassStructure
  x.w
  y.w
  anim.w
EndStructure

NewList Fass.FassStructure(); Erstellen einer neuen Fässer-"Liste"
Anfangs ist die Liste leer, dann brauchst du für ein "neues" Fass...

Code: Alles auswählen

AddElement(Fass())
Fass()\x = IRGENDWO
Fass()\y = IRGENDWO

Und anstatt
For x = 1 To #Max_Fass
nimmst du eben...

Code: Alles auswählen

ResetList(Fass())
While NextElement(Fass())

...

Wend
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 :mrgreen: