_..-~* sprite3D Catchsprite? *~-.._

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

_..-~* sprite3D Catchsprite? *~-.._

Beitrag von Max_der_Held »

Hallo Leute,

[Grundfrage: Wie kann ich Catchsprite beschleunigen, oder
- wie kann ich ein sprite3D mit transparentem Text ohne catchsprite erzeugen]

Ich möchte einen Zeiger drehen und Winkelmaße darunter anzeigen. - mit sprite3d.
Dafür muss Text mit Alpha-channel gebaut werden. das geht nur über den catchsprite-Umweg..

sprich:
  • CreateImage
  • -> drauf gezeichnet ->
  • Catchsprite
  • createsprite3d
Das läuft alles gut.. bis auf den catchsprite Aufruf..
Manchmal braucht er einfach 15 ms. Immer wieder mal -> Zufällig.
Wie kann ich die Font-Texte jetzt schneller anzeigen?..
Startdrawing( screenoutput()) dauert noch viel länger.

Kann ich catchsprite() in einen thread auslagern, muss ich dann auf flipbuffers aufpassen, dass das nicht zwischenfunkt ??..

Bild

Sourcecode zu groß.. Teile:

Code: Alles auswählen

Structure gui_sprite
   spriteID.i
   sprite3d.i
   spriteBuffer.i; falls es ein TEXT bild ist, hat es ein original-bild.
EndStructure 

mein_text.gui_sprite = gui_createtext ( " Hallo Welt" , 100 , 20 ) ; einfach ein Sprite3d erstellen mit transparentem Text!.. 

Procedure gui_SaveImage32_ToMemory(imagenum) ; Adds alpha to Image

  colorsize = ImageWidth(imagenum)*ImageHeight(imagenum)*SizeOf(RGBQUAD)
  ImageSize = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) + colorsize
  *rawimage = AllocateMemory(ImageSize) 
  *fileheader.BITMAPFILEHEADER = *rawimage 
  *header.BITMAPINFOHEADER = *rawimage + SizeOf(BITMAPFILEHEADER) 
  
  With *fileheader 
    \bfType = 19778 ; word containing 2 bytes, 'BM' for 'BIT' 'MAP' ;) 
    \bfSize = ImageSize 
    \bfOffBits = SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER) 
  EndWith 
  
  With *header
    \biSize         = SizeOf(BITMAPINFOHEADER) 
    \biWidth        = ImageWidth(imagenum) 
    \biHeight       = ImageHeight(imagenum)
    \biPlanes       = 1 
    \biBitCount     = 32
  EndWith 
  
  If StartDrawing(ImageOutput(imagenum))
    CopyMemory  (DrawingBuffer(), *rawimage + SizeOf(BITMAPFILEHEADER) + SizeOf(BITMAPINFOHEADER), colorsize) 
    StopDrawing()
  EndIf 
  
  ProcedureReturn *rawimage
  
EndProcedure

Procedure gui_CreateText(gesamttext.s,width,height , color=#gui_menucolor, Ausrichtung = #gui_ausrichtung_zentriert, IsTransparent = 1) ; returns a gui_sprite-pointer!!
   Protected ImageID , *gui_sprite.gui_sprite ,x,y, zeilenzahl , text.s , textheight
   startzeit = ElapsedMilliseconds()
   *gui_sprite    = AllocateMemory( SizeOf( gui_sprite))
   ImageID        = CreateImage(#PB_Any , width , height ,32)
   gesamttext     + Chr(10) ; für stringfield.. damit er auch 1-zeilen-texte erkennt.!=)
   zeilenzahl     = CountString ( gesamttext , Chr(10))
   
   ;{ auf Bild zeichnen
   If StartDrawing ( ImageOutput(ImageID ))
      DrawingMode  ( #PB_2DDrawing_AlphaChannel )
      Box          ( 0, 0, ImageWidth(ImageID), ImageHeight(ImageID),0)
      DrawingMode  ( #PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
      DrawingFont  ( FontID(gui_font ))
      FrontColor   ( RGB(255,104,37 ))
      textheight   = TextHeight ( gesamttext)
      
      For n = 1 To zeilenzahl ; alle zeilen anzeigen (multizeilen support.)
         text  = StringField( gesamttext  , n , Chr(10))
          If Ausrichtung = #gui_ausrichtung_zentriert
            x = width  / 2 - TextWidth(text)  / 2
          EndIf 
          y = height / 2 - textheight *0.5 * zeilenzahl  + textheight *(n-1) 
          DrawText(1+x,1+y,text ,#gui_menucolor_shadow)   ; background des textes zum bessern Lesen.
          DrawText(  x,  y,text ,color)   ;RGBA(255,216,43,255))
      Next 
      
      StopDrawing()
   EndIf 
   ;}
   
   *imagemem                = gui_SaveImage32_ToMemory(ImageID  ) 
   *gui_sprite\spriteBuffer = *imagemem
   FreeImage  ( ImageID )
   
      *gui_sprite\spriteID   = CatchSprite(#PB_Any , *imagemem ,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending )
      *gui_sprite\sprite3d   = CreateSprite3D( #PB_Any , *gui_sprite\spriteID  )
    ; FreeMemory ( *imagemem ) ; macht er unten
    dauer = ElapsedMilliseconds() - startzeit
      If dauer > 0
        Debug "DAUER: " + Str(dauer ) + " " + gesamttext 
      EndIf 
   ; 
   ProcedureReturn *gui_sprite
EndProcedure 
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: _..-~* sprite3D Catchsprite? *~-.._

Beitrag von WPö »

Max, tu Dir bitte selbst und uns einen Gefallen und laß die kindischen Spielereien mit dem Thementitel. Du wirst sehen: Mit einem seriösen und aussagekräftigen wirst Du mehr Rückmeldungen bekommen. Danke.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
Max_der_Held
Beiträge: 595
Registriert: 18.04.2006 17:01
Wohnort: Bavaria
Kontaktdaten:

Re: _..-~* sprite3D Catchsprite? *~-.._

Beitrag von Max_der_Held »

Ich glaube Arthur oder Stargate haben schonmal was in der Richtung gemacht (?)
Kann catchsprite mit flipbuffers kollidieren in threads?
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: _..-~* sprite3D Catchsprite? *~-.._

Beitrag von PMV »

DX9 darf nur in ein und dem selben Thread ausgeführt
werden. Da ist nix mit Multithreading.
Mache dir vorgefertigte Sprites die du dann nur noch anzeigen
musst, anstelle immer alles komplett neu zu zeichnen. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: _..-~* sprite3D Catchsprite? *~-.._

Beitrag von bobobo »

Warum fällt mir dazu knobman ein ?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten