2008-10-09 33 views
43

Necesito eliminar una animación rápida en C#/Windows Forms para una exhibición de Halloween. Solo algunas formas 2D moviéndose sobre un fondo sólido. Dado que este es solo un proyecto único e inmediato I realmente no quiero instalar y aprender un conjunto completo de herramientas para esto. (Kits de desarrollo de DirectX, Silverlight, Flash, etc.) También tengo que instalar esto en varias computadoras para que cualquier cosa más allá del .Net framework básico (2.0) sea un dolor de cabeza.Animación simple usando C#/Windows Forms

Para herramientas tengo VS2k8, 25 años de experiencia en desarrollo, una carretilla, una capa de holocausto, y alrededor de 2 días para noquearla. No he hecho animación desde que utilicé el ensamblador en mi Atari 130XE (¡hurra para cambiar páginas y gráficos de jugadores/misiles!)

¿Consejo? Aquí hay algunas cosas que me gustaría saber:

  • Puedo dibujar en cualquier widget vacío (como un panel) jugueteando con su controlador OnPaint, ¿verdad? Así es como dibujaría un widget personalizado. ¿Hay una mejor técnica que esta?
  • ¿Existe una técnica de cambio de página para este tipo de cosas en Windows Forms? No estoy buscando una alta velocidad de cuadros, tan solo un poco de parpadeo/dibujo según sea necesario.

Gracias.

Post Mortem Editar ... "un par de días después de codificación"

Bueno, el proyecto se lleva a cabo. Los siguientes enlaces fueron útiles, aunque algunos de ellos fueron 404. (Ojalá SO permita que más de una respuesta se marque como "correcta"). El mayor problema que tuve que superar fue el parpadeo, y un error persistente cuando traté de dibujar el formulario directamente.

  • Usando el evento OnPaint para el formulario: mala idea. Nunca conseguí que eso funcione; muchos errores misteriosos (desbordamientos de pila o ArgumentNullExceptions). Terminé usando un panel de tamaño para llenar el formulario y funcionó bien.
  • El uso del método OnPaint es lento de todos modos. En algún lugar en línea, leí que construir PaintEventArgs era lento, y no estaban bromeando. Mucho parpadeo desapareció cuando abandoné esto. Omita OnPaint/Invalidate() y simplemente pinte usted mismo.
  • Al configurar todas las opciones de "doble almacenamiento en búfer" en el formulario todavía quedaba algo de parpadeo que tenía que ser reparado. (Y encontré documentos conflictivos que decían "configúrelos en el control" y "configúrelos en el formulario". Los controles de pozo no tienen un método .SetStyle().) No he probado sin ellos, por lo que podrían ser hacer algo (this es la forma):

    this.SetStyle(ControlStyles.UserPaint, true); 
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
    

Así que el caballo de batalla del código terminó pareciéndose (pf es el panel de control):

void PaintPlayField() 
    { 
     Bitmap bufl = new Bitmap(pf.Width, pf.Height); 
     using (Graphics g = Graphics.FromImage(bufl)) 
     { 
      g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pf.Width, pf.Height)); 
      DrawItems(g); 
      DrawMoreItems(g); 
      pf.CreateGraphics().DrawImageUnscaled(bufl, 0, 0); 
     } 
    } 

Y acabo de llamar a PaintPlayField de el interior de mi ciclo Timer. Sin parpadeo en absoluto.

+1

vea la [animación simple de pregunta en winforms] relacionada (http://stackoverflow.com/questions/11318/simple-animation-in-winforms). –

+0

Lo ideal es reutilizar el 'Bitmap' en su código en cada cuadro, siempre que el ancho y la altura no cambien. Es un desperdicio asignarlo a cada fotograma. También debe desecharse cuando haya terminado, al igual que el valor de retorno 'pf.CreateGraphics()'. –

Respuesta

13

Ajuste un temporizador a la velocidad de cuadros que desee. En cada temporizador disparando twiddle la representación interna de las formas en la pantalla (su modelo) por el movimiento de animación que desea lograr, luego llame al Invalidate(true). Dentro de OnPaint solo dibuja el modelo en la pantalla.

Ah, sí, y es probable que desee activar el doble búfer (esto es como el cambio de página automático).

Cuestiones relacionadas