Seite 1 von 1

Brauche GrabTransparentSprite...

Verfasst: 28.06.2012 10:59
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

Re: Brauche GrabTransparentSprite...

Verfasst: 28.06.2012 14:55
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...

Re: Brauche GrabTransparentSprite...

Verfasst: 28.06.2012 18:45
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

Re: Brauche GrabTransparentSprite...

Verfasst: 28.06.2012 19:00
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

Re: Brauche GrabTransparentSprite...

Verfasst: 28.06.2012 19:37
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...

Re: Brauche GrabTransparentSprite...

Verfasst: 06.07.2012 02:15
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).

Re: Brauche GrabTransparentSprite...

Verfasst: 14.07.2012 02:31
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.

Re: Brauche GrabTransparentSprite...

Verfasst: 20.07.2012 19:45
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]