Paletten-Animation

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
garfield9992003
Beiträge: 35
Registriert: 24.04.2005 03:49

Paletten-Animation

Beitrag von garfield9992003 »

Guten Morgen zusammen :)

Ich brüte hier nun seit geraumer Zeit immer noch an meinem Problem ein geplottetes Rechteck auf einer Form mit einer Paletten-Animation zu versehen. Die "Box" soll so animiert werden, dass eine schwarz/weiss-gestreifte Linie wandert.

Das Blöde ist nur, dass ich noch nie irgendwas in dieser Richtung gemacht habe. Habe nun schon tonnen Google-Seiten geschmöckert.

Zudem weis ich nciht, ob das so in einem normalen Fenster geht.

Kann mir jemand dabei helfen?

Grüße

Frank, der nun nen Kaffee braucht
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

die paletten in purebasic habe ich noch nicht benutzt, und auch kein bock mir das im moment genauer anzugucken, aber im prinzip ist das ganz einfach. du malst dein rechteck pixel für pixel abwechselnd mit zwei farben aus der farbpalette, zb mit farbe 0 und farbe 1. zum animieren vertauscht du dann nur deren inhalt direkt im palettenarray.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Paletten-Animation

Beitrag von Danilo »

garfield9992003 hat geschrieben:Ich brüte hier nun seit geraumer Zeit immer noch an meinem
Problem ein geplottetes Rechteck auf einer Form mit einer
Paletten-Animation zu versehen.
Die "Box" soll so animiert werden, dass eine schwarz/weiss-gestreifte
Linie wandert.
[...]
Zudem weis ich nciht, ob das so in einem normalen Fenster geht.
Ich denke Palettenanimation geht da in die falsche Richtung,
da Du das direkt auf Fenstern oder Gadgets machen willst.
garfield9992003 hat geschrieben:Kann mir jemand dabei helfen?
Ich habe es mal mit Pens gemacht - vielleicht hilft Dir dieses
kleine Beispiel:

Code: Alles auswählen

;
; simple Windows Pen Animation
;
; by Danilo, 01.05.2005 - german forum
;
Global CurrentPenIndex
Global AnimRect.RECT

#timer_speed = 250      ; in milliseconds
#color1      = $FFFFFF
#color2      = $000000

#pen_pattern = 0        ; style, can be 0 or 1

Dim Pens.l(4)



Procedure CreateGeometricPen_Horz(color1,color2)
  If CreateImage(#PB_Any,8,1)
    If StartDrawing(ImageOutput())
      CompilerIf #pen_pattern = 0
        LineXY(0,0,4,0,color1)
        LineXY(4,0,8,0,color2)
      CompilerElse
        LineXY(0,0,1,0,color1)
        LineXY(2,0,3,0,color2)
        LineXY(4,0,5,0,color1)
        LineXY(6,0,7,0,color2)
      CompilerEndIf
      StopDrawing()
      lb.LOGBRUSH
      lb\lbStyle = #BS_PATTERN
      lb\lbHatch = ImageID()
      pen = ExtCreatePen_(#PS_GEOMETRIC,1,@lb,0,0)
    EndIf
  EndIf
  ProcedureReturn pen
EndProcedure


Procedure CreateGeometricPen_Vert(color1,color2)
  If CreateImage(#PB_Any,1,8)
    If StartDrawing(ImageOutput())
      CompilerIf #pen_pattern = 0
        LineXY(0,0,0,4,color1)
        LineXY(0,4,0,8,color2)
      CompilerElse
        LineXY(0,0,0,1,color1)
        LineXY(0,2,0,3,color2)
        LineXY(0,4,0,5,color1)
        LineXY(0,6,0,7,color2)
      CompilerEndIf
      StopDrawing()
      lb.LOGBRUSH
      lb\lbStyle = #BS_PATTERN
      lb\lbHatch = ImageID()
      pen = ExtCreatePen_(#PS_GEOMETRIC,1,@lb,0,0)
    EndIf
  EndIf
  ProcedureReturn pen
EndProcedure



Procedure SetRect(x,y,w,h)
  AnimRect\left   = x
  AnimRect\top    = y
  AnimRect\right  = x+w
  AnimRect\bottom = y+h
EndProcedure



Procedure WndProc(hWnd,Msg,wParam,lParam)
  If hWnd = WindowID(0)
    Select Msg
      Case #WM_PAINT
        hDC = BeginPaint_(hWnd,ps.PAINTSTRUCT)
        If hDC
          oldPen = SelectObject_(hDC,Pens(CurrentPenIndex))
            MoveToEx_(hDC,AnimRect\left  ,AnimRect\top,@saved.POINT)
            LineTo_  (hDC,AnimRect\right ,AnimRect\top)
            MoveToEx_(hDC,AnimRect\left  ,AnimRect\bottom,@p.POINT)
            LineTo_  (hDC,AnimRect\right ,AnimRect\bottom)
          SelectObject_(hDC,Pens(CurrentPenIndex+1))
            MoveToEx_(hDC,AnimRect\left  ,AnimRect\top,@p.POINT)
            LineTo_  (hDC,AnimRect\left  ,AnimRect\bottom)
            MoveToEx_(hDC,AnimRect\right ,AnimRect\top,@p.POINT)
            LineTo_  (hDC,AnimRect\right ,AnimRect\bottom)
          SelectObject_(hDC,oldPen)
          MoveToEx_(hDC,saved\x,saved\y,@p.POINT)
        EndIf
        EndPaint_(hWnd,@ps)
        ProcedureReturn 0
      Case #WM_TIMER
        If CurrentPenIndex = 0
           CurrentPenIndex = 2
        Else
           CurrentPenIndex = 0
        EndIf
        InvalidateRect_(hWnd,0,1)
        UpdateWindow_(hWnd)
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure 



; create 4 pens for animation
Pens(0)  = CreateGeometricPen_Horz(#color1,#color2)
Pens(1)  = CreateGeometricPen_Vert(#color1,#color2)
Pens(2)  = CreateGeometricPen_Horz(#color2,#color1)
Pens(3)  = CreateGeometricPen_Vert(#color2,#color1)

; set the AnimRect co-ordinates
SetRect(10,10,300,200)

; go!
OpenWindow(0,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible,"Windows PenAnim")
  SetWindowCallback(@WndProc())
  SetTimer_(WindowID(),1,#timer_speed,0) ; start timer
HideWindow(0,0)

Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow
      Break
  EndSelect 
ForEver

; free the 4 pens
For i = 0 To 3
  DeleteObject_(Pens(i))
Next i
Geschwindigkeit der 'Animation', die Farben, und 2 verschiedene
Styles kannst Du mit den 4 Konstanten am Anfang einstellen.

Wie Du siehst werden hier einfach 4 Linien gezogen, nur wird
der Zeichenstift (Pen) dafür alle #timer_speed Millisekunden
gewechselt.

Viel Spaß damit! ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
garfield9992003
Beiträge: 35
Registriert: 24.04.2005 03:49

Update

Beitrag von garfield9992003 »

Mit der Paletten-Animation das habe ich nun auch verworfen.

Der unetre Code macht eigentlich das, was ich meine.
JEdoch weis ich nciht, ob es die Systemschonende Art & Weise ist.

Ich habe in dem Code nur das Nötigste drin - hier bei mir im Projekt lässt sich das Rechteck resizen und verschieben.

Wie lässt sich das nun noch Optimieren in Bezug auf Tempo/Systemauslastung?

Code: Alles auswählen

Global x1.l, x2.l, y1.l, y2.l
x1=10: x2=300: y1=10: y2=420
#VorschauX=320
#VorschauY=440

; die Koordinaten werden zur Laufzeit geändert, daher flexibel.

Global s.b
Procedure PaintPoint(x.w, y.w)
  If s<=4: Plot(x,y,0): EndIf
  If s>5: Plot(x,y,$FFFFFF): EndIf
  s=s+1: If s=10: s=0: EndIf
EndProcedure
Procedure Animate()
  StartDrawing(ImageOutput()) 
  DrawingMode(1|4)
  For x=x1 To x2: PaintPoint(x,y1): Next
  For y=y1 To y2: PaintPoint(x2,y): Next
  For x=x2 To x1 Step -1: PaintPoint(x,y2): Next
  For y=y2 To y1 Step -1: PaintPoint(x1,y): Next
  StopDrawing()   
  SetGadgetState(1,UseImage(0))
EndProcedure

hWnd=OpenWindow(0,100,150,600,460,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Plustek Book Pilot - alpha Version") 
CreateGadgetList(WindowID()) 
CreateImage(0, #VorschauX,#VorschauY)
ImageGadget(1,10,10,#VorschauX,#VorschauY,UseImage(0))

SetTimer_(0, 0, 75, @Animate())
Repeat
  EventID = WaitWindowEvent()
Until EventID = #PB_EventCloseWindow
KillTimer_(0, 0)

End

@Danilo, gerade habe ich dein Beispiel gesehen und probiere es aus.

Grüße

Frank
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Update

Beitrag von Danilo »

garfield9992003 hat geschrieben:@Danilo, gerade habe ich dein Beispiel gesehen und probiere es aus.
Und, passt es oder nicht? Kannst auch mal Speed auf 100 setzen
oder den Style auf 1.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
garfield9992003
Beiträge: 35
Registriert: 24.04.2005 03:49

Beitrag von garfield9992003 »

Ja, schaut gut aus, ich werde es gleich mal in mein Project integrieren und dann berichten.
Antworten