viernes, 10 de febrero de 2012

Pixeles En Movimiento

Hola chavos que tal! Espero que estén todos muy bien y pues en esta ocasión continuaremos realizando aplicaciones en C++ Builder. Ahora crearemos un programa muy sencillo lo único que hará será mover pixeles hacia el centro de la pantalla. En esta ocasión utilizaremos la estructura POINT, la cual cuenta con campos para las posiciones X y Y en donde dibujaremos los pixeles, lo cual lo haremos de manera aleatoria en la forma.

Para esta aplicación lo único que utilizaremos será un Timer, el cual se encuentra en la pestaña System de la barra de componentes. Y también cambiamos el color de la forma a blanco, para evitar el rastro que dejan los pixeles en el efecto de movimiento.

Bueno pues para comenzar necesitamos ir al archivo H, donde está la definición de la clase TForm1 y agregar las siguientes declaraciones en la parte "private", debe quedar de la siguiente manera:


class TForm1 : public TForm
{
__published: // IDE-managed Components
        TTimer *Timer1;
        void __fastcall FormPaint(TObject *Sender);
        void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
        POINT Puntos[1000]; // Matriz para mantener la posición de 1000 puntos
        int Contador; // Contador general para la matriz anterior
        int MediaX, MediaY; // Punto medio del área de dibujo
public: // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------


Ahora buscamos en evento de la forma llamado OnPaint y damos doble clic para abrirlo, entonces escribimos el siguiente código:


void __fastcall TForm1::FormPaint(TObject *Sender)
{
        for(int N = 0; N < 1000; N++)
        {
                // Calcular los 1000 puntos
                Puntos[N].x = random(ClientWidth); // de forma aleatoria
                Puntos[N].y = random(ClientHeight);
                Canvas->Pixels[Puntos[N].x][Puntos[N].y] = clBlack;
        }
        Contador = 0; // Inicializar el contador
        MediaX = ClientWidth / 2; // Y calcular el punto medio
        MediaY = ClientHeight / 2;
}
//---------------------------------------------------------------------------

Finalmente damos doble clic en el Timer agregado en la forma y escribimos el siguiente código:



void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        for (int N = 0; N < 1000; N++)
        {
                // Desplazar 100 puntos en cada ciclo, probar en vez de 100 - 1000
                // Desactivar el punto de su posición actual
                Canvas->Pixels[Puntos[Contador].x][Puntos[Contador].y] = clWhite;
                // Calcular su nueva posición
                Puntos[Contador].x+=(Puntos[Contador].x<MediaX)*1+(Puntos[Contador].x>MediaX)*-1;
                Puntos[Contador].y+=(Puntos[Contador].y<MediaY)*1+(Puntos[Contador].y>MediaY)*-1;
                // Si el punto está en el centro del área debe desaparecer
                if (Puntos[Contador].x == MediaX && Puntos[Contador].y == MediaY)
                {
                        // Reapareciendo en un punto aleatorio
                        Puntos[Contador].x = random(ClientWidth);
                        Puntos[Contador].y = random(ClientHeight);
                }
                // Mostrarlo en la nueva posición
                Canvas->Pixels[Puntos[Contador].x][Puntos[Contador].y] = clRed;//Black;
                Contador++; // Pasar al punto siguiente
                // O al primero si ya se han recorrido todos
                if (Contador == 1000)
                Contador = 0;
        }
}
//---------------------------------------------------------------------------


Bueno finalmente compilamos y corremos nuestra aplicación y deberíamos tener algo por el estilo:


Bueno amigos terminamos por esta ocasión, la siguiente vez modificaremos nuestra aplicación para que se vea mejor y seguir prácticando nuetras habilidades con el C++ Builder, nos vemos hasta la próxima amigos!!

No hay comentarios:

Publicar un comentario