Establecer timer < 1ms | Visual Studio 2005 / C#

erdanblo

Tengo un programa que mueve un PictureBox en una ventana. El movimiento lo hace sumando constantemente un pixel al eje x/y y el sentido depende de si el PictureBox ha llegado al final del formulario o no.

Se trata de una pelota que rebota :D

Bien, mi problema, es que el movimiento es muy lento, lo que se me ha ocurrido hacer es añadirle más pixel por desplazamiento, pero el problema es que así, el picturebox no se dibuja del todo bien.

La documentación dice que el valor mínimo de timer es 1ms (no deja poner 0.1, ya que la entrada la hace por int).

¿Alguna idea :D?

Timer Reloj;
            Reloj = new Timer();
            Reloj.Interval = 1;
            Reloj.Start(); 
            
Reloj.Tick += new EventHandler(Botar);
r2d2rigo

Quita el Timer y usa la funcion System.Diagnostics.Stopwatch, que tiene mucha mas precision. O importa timeGetTime del API de Windows:

[DllImport("winmm.dll", EntryPoint="timeGetTime")]
public static extern uint MM_GetTime();

erdanblo

Yo tomo la piara (mas bueno que el pan...($), el api no me gusta :/

La función Stopwatch, ¿no es un cronómetro? no se me ocurre como hacerla funcionar:

spoiler
r2d2rigo

Pues para algo tan sencillo con 1 ms tendrias mas que suficiente... que hace la funcion Botar? Pegala si puedes, porque si actualizases ahi el PictureBox con las nuevas coordenadas, en teoria deberia versete bien.

Si usas al final Stopwatch, vas a tener que cambiar todo el codigo, haciendo un bucle que compruebe si el tiempo transcurrido es menor que X y moviendo ahi el PictureBox.

erdanblo

La función botar la tienes ahí, es lo de dentro del do while.

Lo que hace es sumarle 1 (top++. left++) o restarselas 1(top--,left--) a la posición dependiendo de si ha rebotado con el borde o no.

kas

Y no es mas facil hacer un bucle while y corriendo?

bool parar = false;
while(! parar)
{
    // tus calculos aqui
}

Esto es lo mas rapido que hay, lo metes dentro de una funcion y la llamas en el picturebox_click.

Para que queires un timer?

GaN2

Quiere el timer para que la pelota se mueva. Yo estoy haciendo un tetris para una práctica de la universidad y uso un timer con un intervalo que depende del nivel en el que está en el jugador, que cada vez que pase el timer use una función que se llama moverAbajo que me mueve las fichas hacia esa dirección.

De todos modos, le pones de interalo = 1, me parece una brutalidad, porque la pelota va a ir folladisima, de hecho no me extraña que tengas problemas con el picturebox xD Has pensado en bajarle el tiempo al timer?

kas

Ejem.. estáis diciendo que mas o menos estáis "emulando" un juego.

Un juego es un BUCLE WHILE.

Como mucho aceptaría lo del timer por el tema de la constancia, ya que un bucle while estaría afectado por el consumo de CPU de otros programas con igual o mayor prioridad.

Por otro lado, como dice el colega de arriba, el intervalo de 1ms ya es MUY poco y ademas si lo haces con un timer es bastante impreciso, leí un articulo sobre este tema, a ver si lo encuentro.

Por otro lado, si quieres hacer una anumación:

1) Establece el doble buffer para el picturebox (busca SetStyle)
2) no mueves 1 solo pixel cada vez, haz un bucle o un timer con un intervalo mayor y mueve mas pixeles.

Y0K3S3
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint,true);
    this.UpdateStyles();

Usuarios habituales

  • Y0K3S3
  • kas
  • GaN2
  • erdanblo
  • r2d2rigo