kann man ein Sprite in einen Brush verwandeln ?

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

kann man ein Sprite in einen Brush verwandeln ?

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten