propiedad - Animación simple usando C#/ Windows Forms
propiedad tag c# (2)
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 y rápido, realmente no quiero instalarlo y aprender todo un nuevo conjunto 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.
Para las herramientas, tengo VS2k8, 25 años de experiencia en desarrollo, una carretilla, capa de holocausto, y alrededor de 2 días para eliminar esto. No he hecho animación desde que utilicé el ensamblador en mi Atari 130XE (hurra para voltear 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) jugando 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 Edit ... "un par de días después de la codificación"
Bueno, el proyecto está hecho. 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.
Establecer todas las opciones de "doble almacenamiento en búfer" en el formulario todavía dejó un 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 haciendo algo (
this
es la forma):this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Entonces el caballo de batalla del código terminó pareciéndose a ( pf
es el control del panel):
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 desde el interior de mi ciclo Timer. Sin parpadeo en absoluto.
Configura un temporizador a la velocidad de fotogramas deseada. 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 a Invalidate(true)
. Dentro de OnPaint solo dibuja el modelo en la pantalla.
Ah, sí, y es probable que quieras activar Double Buffering (esto es como el cambio de página automático).
Animación basada en temporizador
Ambos dan buenos ejemplos de animación. El código es bastante directo. Los usé cuando necesitaba hacer una animación rápida para mi hijo.