Brauche GrabTransparentSprite...

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Brauche GrabTransparentSprite...

Beitrag von Drago »

Hallo Leute,

ich habe ein transparentes Sprite, welches ich rotieren möchte und dann auf ein anderes transparentes Sprite
zeichnen will und ich bekomme es nicht hin :-(
Ich bräuchte das ganze auch als 3D Sprite, gibt es da eine Lösung für ?

Wäre danbar wenn mir einer helfen könnte..

LG Klaus
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Brauche GrabTransparentSprite...

Beitrag von Bisonte »

Irgendwo kommt dein Sprite doch her ....

Ist es ein PNG mit Transparenz ? Zeichnest du es selbst ?
Benutzt du nur TransparentSprite() um die Transparente Farbe zu benennen ?

In den beiden ersten Fällen : Erstelle ein Image mit Alphakanal und male das Bild neu da drauf (DrawAlphaImage())
Im letzteren Fall downloade Gimp (kostenlos) und erstelle das Bild mit richtiger Transparenz und du hast weniger Sorgen damit ;)

Oder du machst es umständlicher...
Transparentes Image erstellen,
das gesamte Bild Punkt für Punkt abklappern und die transparente Farbe löschen...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Brauche GrabTransparentSprite...

Beitrag von Drago »

Hallo Bisonte..

Das Bild, welches ich lade, ist ein .png, natürlich mit Alphakanal. Dieses Bild stellt einen Plasmpartikel dar.
Jetzt möchte ich auf ein anderes Sprite viele dieser Partikel zeichnen, um eine Explosion darzustellen.
Da ich für mein Projekt zeitweise auf über 2000 Partikel käme, dauert es zu lange, diese einzeln zu
zeichnen, deswegen wollte ich die Explosionen sozusagen vorrendern.
Da diese Partikel als kurze Linie gezeichnet sind und in verschiedene Richtungen fliegen sollen,
dachte ich an Sprite3D,wegen der Rotation.

Ich habe es schon mit einem Image versucht, scheitere aber an der Rotation, da die Beispiele von
Rotateimage aus Purearea.net bei mir kein zufriedenstellendes Ergebniss liefern.
Auch habe ich dann wieder das Problem, daraus ein Sprite zu erstellen.

Habe schon versucht ein Transparentes Sprite zu erstellen und darauf zu zeichnen, aber das
funktioniert nicht.

Sitzte echt auf dem Schlauch.
Gibt es nicht eine andere Lösung dafür ?

LG Drago
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Brauche GrabTransparentSprite...

Beitrag von Bisonte »

Dann solltest Du dir evt. mal MP3D von mpz genauer ansehen...

Diese Userlib kann auch eine Menge 2D gedusel... Hat, soweit ich weiss auch noch von Epyx ein paar
Effekte dabei (ob Partikeldingens dabei sind weiss ich allerdings nicht genau).

Ich dachte bei deinem Eingangspost nicht an Partikel ;)

Edit : Link nachreich : http://purebasic.fr/german/viewtopic.php?f=10&t=21483
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Brauche GrabTransparentSprite...

Beitrag von Drago »

Vielen Dank Bisonte, werde ich mir mal anschauen, dieses 2D gedusel... :D

Ich verstehe nicht, warum man nicht einfach ein Sprite3D in ein anderes zeichnen kann
( Ich weis das es mit normalen 2D Sprites geht ).
Wie du schon sagtest, irgendwo kommen die Daten ja her.
Und wenn ich meine Explosion auf dem Bildschirm darstelle und es von da Grabe, fehlt mir die Transparenz.
Menno...
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Brauche GrabTransparentSprite...

Beitrag von Thorium »

Drago hat geschrieben: Ich verstehe nicht, warum man nicht einfach ein Sprite3D in ein anderes zeichnen kann
( Ich weis das es mit normalen 2D Sprites geht ).
Wie du schon sagtest, irgendwo kommen die Daten ja her.
Und wenn ich meine Explosion auf dem Bildschirm darstelle und es von da Grabe, fehlt mir die Transparenz.
Menno...
Klar geht das.
Ein Sprite3D hat einfach keine Bilddaten. Das ist einfach ein Rechteck, was auf ein normales Sprite verweisst. Du musst in das normale Sprite malen, welches du beim erstellen des Sprite3D angegeben hast.

Kannst dir ja mal das anschauen: http://www.purebasic.fr/german/viewtopi ... 3&p=258116
Ist zwar nicht genau das was du brauchst aber da kannst du sehen wie du ein Image in ein Sprite kopieren kannst (mit Alphakanal).
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Brauche GrabTransparentSprite...

Beitrag von Regenduft »

Drago hat geschrieben:Und wenn ich meine Explosion auf dem Bildschirm darstelle und es von da Grabe, fehlt mir die Transparenz.
Menno...
Da nutze ich folgenden Trick: Einmal auf einen schwarzen Screen zeichnen und grabben (Sprite 1), dann ClearScreen() und auf einen weißen Screen zeichnen und grabben (Sprite 2). Die Differenz pro Pixel zwischen Sprite 1 und 2 entspricht dann dem Alpha-Kanal (einfach Point() oder DrawingBuffer() nutzen).

Ich habe auf diesem Rechner hier leider keinen Quelltext, wo ich das so gemacht habe, aber wenn Du es nicht hinbekommst (vmtl. weil ich mich so schlecht ausdrücke :wink:), dann kannst Du mir gerne einmal (oder mehrmals) eine PN als Erinnerung schreiben und ich poste den Quelltext. Da ich z.Zt. (wie leider fast immer) am oberen Ende meiner Belastungsgrenze laufe kann man mich auch ausdrücklich mehrmals per PN erinnern, denn sonst vergesse ich's 100%ig.

EDIT:Falls Dir UseBuffer() als Idee kommst: Ich hatte da nur Probleme und es hatte überhaupt nicht geklappt. Ich weiß aber leider nichtmehr warum bzw. was das Problem war, da ich UseBuffer() danach nie mehr genutzt hatte.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Brauche GrabTransparentSprite...

Beitrag von Regenduft »

Hier der versprochene Quelltext (nicht mein "Original", daher quick 'n' dirty zusammencodet. Debugger einschalten!):

Code: Alles auswählen

; Datei zum wandeln von Image zu Sprite
TempDatei$ = GetTemporaryDirectory()+"TempAlphaImage0815.png"

; Puffer für 2 Screenshots
Dim Bitmap(1, $FF, $FF)

; Image-Plugins
UsePNGImageDecoder()
UsePNGImageEncoder()

; Initialisierungen und Fenster/Screen
InitSprite()
InitSprite3D()
OpenWindow(0,0,0,256,256,"Alpha")
OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0),WindowHeight(0),0,0,0) 

; Temporäre Images erstellen/zeichnen
For Image = 0 To 1
  CreateImage(Image,256,256,32)
  StartDrawing(ImageOutput(Image))
    DrawingMode(#PB_2DDrawing_AllChannels) ; <- nicht bei Sprites möglich
    For i = 0 To 255
      Box(i, 0, 1, 256, RGBA($FF*Image, $FF*(1-Image), 0, i))
    Next
  StopDrawing()
Next

; Images zu Sprites wandeln
For i = 0 To 1
  SaveImage(i,TempDatei$,#PB_ImagePlugin_PNG,0,32)
  FreeImage(i)
  LoadSprite(i,TempDatei$,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
  DeleteFile(TempDatei$)
Next i

; Zielsprite erstellen (für das Endprodukt)
CreateSprite(2,256,256,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)

; 3D-Sprites erstellen
For i = 0 To 2
  CreateSprite3D(i,i)
Next i

; 3D-Sprite drehen (Zufallswinkel)
RotateSprite3D(0,Random(360),#PB_Absolute)
RotateSprite3D(1,Random(360),#PB_Absolute)

; 2 mal Sprites anzeigen und Screenshots machen
For i = 0 To 1
  ClearScreen($FFFFFF * i)
  Start3D()
    DisplaySprite3D(0,0,0)
    DisplaySprite3D(1,0,0)
  Stop3D()
  StartDrawing(ScreenOutput())
    For y = 0 To $FF
      For x = 0 To $FF
        Bitmap(i,x,y) = Point(x,y)
      Next
    Next
  StopDrawing()
Next i

; Zielsprite zeichnen (wieder über Image-Umweg)
CreateImage(0,256,256,32)
StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_AllChannels) ; <- nicht bei Sprites möglich
  For y = 0 To $FF
    For x = 0 To $FF
      ; Farbdifferenzen Screenshot 1 und 2
      n = Bitmap(1,x,y) - Bitmap(0,x,y)
      a = n >> 0  & $FF
      b = n >> 8  & $FF
      c = n >> 16 & $FF
      ; Max. Differenz als Tansparenz (= ~Alpha)
      If a>b And a>c
        trans = a
      ElseIf b>c
        trans = b
      Else
        trans = c
      EndIf
      ; Plotten
      Plot(x, y, (~trans)<<24 | Bitmap(0,x,y))
      ;Plot(x, y, ~trans<<24 | Bitmap(0,x,y)) ; <- "Überlauf" dank x64-Integer oder was?!
    Next
  Next
StopDrawing()
SaveImage(0,TempDatei$,#PB_ImagePlugin_PNG,0,32)
FreeImage(0)
LoadSprite(2,TempDatei$,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
DeleteFile(TempDatei$)

; Screen mit Pixelrauschen füllen (damit man den Alphakanal besser erkennt)
; und das Endprodukt (Sprite 2) darüber anzeigen.
StartDrawing(ScreenOutput())
  For y = 0 To $FF
    For x = 0 To $FF
      Plot(x,y,Random($FFFFFF))
    Next
  Next
StopDrawing()
Start3D()
  DisplaySprite3D(2,0,0)
Stop3D()
FlipBuffers() ; <- Erster und einziger Puffertausch!

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
2 Beispiel-Bilder des "Endprodukts":
BildBild

[offtopic]
Und wenn man 'nen coolen Bug reinbastelt: :wink:
Bild
[/offtopic]
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten