Seite 1 von 2

kann man ein Sprite in einen Brush verwandeln ?

Verfasst: 04.03.2008 23:50
von hjbremer
Ist es möglich ein Sprite umzuwandeln oder was auch immer so das ich das Sprite als Brush zum füllen von z.B. einem Rechteck benutzen kann ?

Hab mir das folgendermaßen vorgestellt, siehe Codeschnipsel, nur es funktioniert nicht.

Code: Alles auswählen

 nID = CreateImage(99, 200, 100) 
  dc = StartDrawing(ImageOutput(99))
  
       hdc = CreateCompatibleDC_(dc)        
       
       brush = myimageID ;SpriteID(#sprite1)
       
       SelectObject_(hdc,brush)
       
       BitBlt_(dc,0,0,200,100,hdc,0,0,#SRCCOPY)

       
       StopDrawing() 
       
 ImageGadget(98,10,10,0,0,nid)       
mit einer Imageid eines beliebigen Bildes funktioniert es wie erwartet. Mit der SpriteID nicht.

Geht das überhaupt ????

PS: Der Grund für meine Idee ist mit Sprites hat man mehr Gestaltungsmäglichkeiten. Mit Grabsprite und Savesprite ist mir das nicht praktisch genug.

Verfasst: 05.03.2008 01:10
von Kaeru Gaman
warum lädst du das sprite nicht als image, wenn du es dann als brush benutzen willst?

ich versteh auch nicht ganz, was dein codeschnipsel machen soll... ein image in ein image copieren?

Verfasst: 05.03.2008 01:25
von hjbremer
ich hab das Sprite doch noch garnicht ! das Programm soll das Sprite erst erstellen.

Und dann soll dieses Sprite einem Imagegadget oder ButtonImagegadget zugewiesen werden oder in ein anderes Image kopiert werden etc.

Wenn es denn möglich ist.

Verfasst: 05.03.2008 01:33
von Kaeru Gaman
also du willst ein sprite erstellen,
weil du damit praktischere sachen machen kannst, als mit einem image,
aber später willst du es dann in ein image überführen....?

die einzige lösung, die mir spontan einfällt, ist SaveSprite->LoadImage, also der Umweg über die Festplatte....

Verfasst: 05.03.2008 01:52
von #NULL
nen sprite ist doch ne ganz andere datenstuktur. wie soll den die winapi damit klarkommen? außerdem müßte das sprite sicherlich im hauptspeicher liegen (#PB_Sprite_Memory).

<edit>
für kleinere sachen kannste das sprite auch auf ein neues image plotten. routine hab ich glaub ich da, falls du brauchst.

oder willst du das sprite/image während des anzeigens live bearbeiten?

Verfasst: 05.03.2008 16:00
von NicTheQuick
Sprites laufen über DirectX oder OpenGL. Images über GDI oder SDL. Das
sind verschiedene Systeme, die mit verschiedenen Datenstrukturen,
Formaten und Handles arbeiten.

Verfasst: 05.03.2008 16:24
von PMV
Es gibt irgend wo im Forum (oder im Englischen) Quellcode, die ein Sprite
in ein Image umwandeln kann ... ist aber nichts für den Echtzeitgebrauch.
Musst mal die Suchfunktion nutzen, vielleicht ists auch im CodeArchiv.

MFG PMV

Verfasst: 05.03.2008 21:23
von hjbremer
Erstmal danke für eure Antworten.

Also im Codearchiv ist tatsächlich etwas, der Code kann aber nur mit normalen Sprites umgehen.

Code: Alles auswählen

Procedure CreateBitmapFromSprite(Sprite)
  hDC=StartDrawing(SpriteOutput(Sprite))
  bmp.BITMAP\bmWidth=SpriteWidth(Sprite)
  bmp\bmHeight=SpriteHeight(Sprite)
  bmp\bmPlanes=1
  bmp\bmBitsPixel=GetDeviceCaps_(hDC,#BITSPIXEL)
  bmp\bmBits=DrawingBuffer()
  bmp\bmWidthBytes=DrawingBufferPitch()
  hBmp=CreateBitmapIndirect_(bmp)
  StopDrawing()
  ProcedureReturn hBmp
EndProcedure
Das bringt nicht viel bis garnix. Hätte schon gerne 3D.
Bleibt nur die Lösung GrabSprite->SaveSprite->LoadImage.
Und das funktioniert recht gut, wenn man es ein bißchen mit #PB_Window_Invisible und HideWindow(0,0) garniert.

Obwohl, so ganz kann ich da noch nicht daran glauben, das es nicht geht. Auch ein 3D Sprite hockt irgendwo im Speicher. Vielleicht fällt ja noch jemandem etwas zu dieser Bitmap Structure ein. Ich verstehe davon leider zu wenig, als das ich das MSDN Geschreibsel begreife.

Verfasst: 05.03.2008 21:31
von NicTheQuick
Du kannst doch 'UseBuffer()' mit einem temporären Sprite verwenden und
dort das 3D-Sprite draufzeichnen. Dann nutzt du die Procedure, die du
gepostet hast.

Verfasst: 05.03.2008 21:32
von PMV
Ach Sprite3D ... da wirst dich wohl mit DirectX oder OpenGL befassen
dürfen ... da ist das mit dem GrabSprite() schon wesentlich einfacher.
Hm, vielleicht gibts aber auch nen GrabImage() irgend wo ...

Der DX-Screen hat doch auch nen DC ... sonnst würd StartDrawing() ja
nicht mit dem Screen klappen, oder? Somit könnteste die Prozedur da so
umschreiben, dass sie auf den Screen greift anstelle eines Sprites :wink:
NicTheQuick hat geschrieben:Du kannst doch 'UseBuffer()' mit einem temporären Sprite verwenden und
dort das 3D-Sprite draufzeichnen. Dann nutzt du die Procedure, die du
gepostet hast.
Seit wann funktioniert UseBuffer() mit Sprite3D :shock:
... wäre ja cool ... is mir aber neu ... :?

MFG PMV