Seite 1 von 1

Animationen des Hintergrundes

Verfasst: 07.01.2009 19:20
von Andreas21
Hi,

Ich benutze momentan ein Skin für mein Fenster und würde es gern mit Animationen versehn. Z.b.: ein gesicht das zwinkert.

Deswegen dacht ich mir ein bmp über den hintergrun des Fenster anzeigen zu lassen. Mit tranzparens: Nur der Code will nicht so recht. Und er leuft leider auch nicht mit SkinWin.

Ich will halt nur einen kleinen teil des Hintergrunds Animieren.

Versuchs Code:

Code: Alles auswählen

Global window.l

Procedure createimage_(image)
  hbimglist=CreateImage(image, 300, 200)
  StartDrawing(ImageOutput(image))
    DrawingMode(#PB_2DDrawing_Transparent)
    BackColor(RGB(0,155,155)) 
    FrontColor(RGB(255,0,0)) 
    DrawText(100,100+Random(50),"test")
  StopDrawing()
  ProcedureReturn hbimglist
EndProcedure

Procedure Animation()
  ptst.PAINTSTRUCT
  himglist=ImageList_Create_(300,200,#ILC_COLOR8|#ILC_MASK,1,0)
  ImageList_AddMasked_(himglist,createimage_(0),RGB(0,0,0))
  hdc=BeginPaint_(window,@ptst)
    ImageList_Draw_(himglist,0,hdc,100,100,#ILD_TRANSPARENT) 
  EndPaint_(window,@ptst)
  ImageList_Destroy_(himglist)
EndProcedure

window = OpenWindow(0, 0, 0, 640, 480, "",  #PB_Window_ScreenCentered )

Repeat 
  
  Delay(100)
  Animation()
  
Until Event = #PB_Event_CloseWindow
Er zeigt ja die test das word "test" an das ich zum test anzeige. Aber mehr passiert nicht. Normaler weise müsste er alle 100 ms das word "test" an einer anderen position anzeigen.

Ich weis nicht ob das nit SkinWin gut währ jedesmal den kompleten hinter grund neu zu laden. Zumal das auch mehhre hintergrund bilder pro fenster währen.

Verfasst: 07.01.2009 19:50
von Fluid Byte
Begin - / EndPaint() dürfen ausschließlich in Verbindung mit der #WM_PAINT Nachricht verwendet werden.

Verfasst: 07.01.2009 19:53
von Andreas21
Giebts dann einen anderen weg sowas umzusetzen?

Verfasst: 07.01.2009 20:28
von Fluid Byte
So vielleicht:

Code: Alles auswählen

CreateImage(0,100,50)

StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(0,0,"test",#Red)
StopDrawing()

himlDemo = ImageList_Create_(100,50,#ILC_COLOR8 | #ILC_MASK,1,0)
ImageList_AddMasked_(himlDemo,ImageID(0),0)

OpenWindow(0,0,0,640,480,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

Repeat
	EventID = WaitWindowEvent(20)
	
	If ElapsedMilliseconds() > (TimerInit + 500)
		TimerInit = ElapsedMilliseconds()
		hdc = StartDrawing(WindowOutput(0))
 		ImageList_Draw_(himlDemo,0,hdc,Random(630),Random(470),#ILD_TRANSPARENT)
		StopDrawing()
	EndIf
Until EventID = #PB_Event_CloseWindow

ImageList_Destroy_(himlDemo)

Verfasst: 08.01.2009 03:39
von Andreas21
So hatte ich es gemeint:

Code: Alles auswählen

Procedure Animation(ani)
  CopyImage(1, 2)
  LoadImage(3,"image\"+Str(ani)+".bmp")
  himlDemo = ImageList_Create_(50, 50,#ILC_COLOR8 | #ILC_MASK,1,0) 
  ImageList_AddMasked_(himlDemo,ImageID(3),RGB(255,242,0))
  hdc = StartDrawing(ImageOutput(2)) 
    ImageList_Draw_(himlDemo,0,hdc,0,0,#ILD_TRANSPARENT) 
  StopDrawing() 
  ImageList_Destroy_(himlDemo)
  StartDrawing(WindowOutput(0)) 
    DrawImage(ImageID(2), 270,180)  
  StopDrawing() 
  FreeImage(2)
  FreeImage(3)
EndProcedure

Window = OpenWindow(0,0,0,320,240,"Animation", #PB_Window_BorderLess | #PB_Window_ScreenCentered | #PB_Window_Invisible) 
ButtonGadget(0, 10, 10, 60, 20, "Ende")

Image = LoadImage(0,"hintergrund.bmp")
SkinWin(Window,Image)
HideWindow(0, 0) 

GrabImage(0, 1, 270, 180, 50, 50)
ani = 1

Repeat 
   EventID = WaitWindowEvent(20) 
    
   If ElapsedMilliseconds() > (TimerInit + 200) 
     TimerInit = ElapsedMilliseconds() 
     If ani > 10 
       ani = 1
     EndIf
     Animation(ani)
     ani+ 1
   EndIf 
   If EventID = #WM_LBUTTONDOWN 
    SendMessage_(Window,#WM_NCLBUTTONDOWN, #HTCAPTION,0)
   EndIf
   If EventID = #PB_Event_Gadget
     If EventGadget() = 0
       CloseWindow(0)
       End
     EndIf
   EndIf  
Until EventID = #PB_Event_CloseWindow
Der Code mit Grafiken hier.

Edit:
So ist es besser

Code: Alles auswählen

Procedure Animation(window,himage,x,y,ani.s,Farbe)
  Image = LoadImage(#PB_Any ,ani)
  himlDemo = ImageList_Create_(ImageWidth(Image), ImageHeight(Image),#ILC_COLOR8 | #ILC_MASK,1,0) 
  ImageList_AddMasked_(himlDemo,ImageID(Image),Farbe)
  hdc = StartDrawing(WindowOutput(window)) 
    DrawImage(ImageID(himage), x,y) 
    ImageList_Draw_(himlDemo,0,hdc,x,y,#ILD_TRANSPARENT) 
  StopDrawing() 
  ImageList_Destroy_(himlDemo)
  FreeImage(Image)
EndProcedure

Window = OpenWindow(0,0,0,320,240,"Animation", #PB_Window_BorderLess | #PB_Window_ScreenCentered | #PB_Window_Invisible) 
ButtonGadget(0, 10, 10, 60, 20, "Ende")

Image = LoadImage(0,"hintergrund.bmp")
SkinWin(Window,Image)
HideWindow(0, 0) 

GrabImage(0, 1, 270, 180, 50, 50)
ani = 1

Repeat 
   EventID = WaitWindowEvent(20) 
    
   If ElapsedMilliseconds() > (TimerInit + 200) 
     TimerInit = ElapsedMilliseconds() 
     If ani > 10 
       ani = 1
     EndIf
     Animation(0,1,270,180,"image\"+Str(ani)+".bmp",RGB(255,242,0))
     ani+ 1
   EndIf 
   If EventID = #WM_LBUTTONDOWN 
    SendMessage_(Window,#WM_NCLBUTTONDOWN, #HTCAPTION,0)
   EndIf
   If EventID = #PB_Event_Gadget
     If EventGadget() = 0
       CloseWindow(0)
       End
     EndIf
   EndIf  
Until EventID = #PB_Event_CloseWindow 
Animation(Fenster ID, Image zum wieder herstellen des alten hintergrundes, x Pos, y Pos, BMP Grafik File, Tranzparente Farbe)