Bienvenidos

En este blog se publicaran proyectos en c++, les doy la bienvenida y espero sea de ayuda para ustedes este espacio, no olviden comentar!

domingo, 20 de noviembre de 2011

Efecto de Nieve Usando Pixeles en Movimiento en C++

El siguiente programa simula la caída de nieve . El programa es muy simple, solo se hace uso de pixeles en movimiento y formas sencillas como la elipse para dibujos circulares. Dibuje un muñeco de nieve en la escena con motivo de navidad.


 El programa ejecutándose se muestra en la imagen:




Les muestro los componentes de la forma 
2 Timer 
11 PaintBox

El dibujado del muñeco se hizo sobre los PaintBox.
Este es el código del dibujado del muñeco, tengan en cuenta que el orden de los PaintBox en la forma dibujaran círculos y deben coincidir para formar el muñeco:
Todo este código va sobre un Timer 



void __fastcall TForm1::Timer2Timer(TObject *Sender)
{


  this->Canvas->Brush->Color=clSilver+random(40);
  this->Canvas->Ellipse(10,10,110,110);


  PaintBox4->Canvas->Brush->Color=clMaroon;
  PaintBox5->Canvas->Brush->Color=clMaroon;
  PaintBox4->Canvas->Rectangle(0,0,PaintBox4->Width, PaintBox4->Height);
  PaintBox5->Canvas->Rectangle(0,0,PaintBox5->Width, PaintBox5->Height);


  PaintBox1->Canvas->Brush->Color=clWhite;
  PaintBox2->Canvas->Brush->Color=clWhite;
  PaintBox3->Canvas->Brush->Color=clWhite;




  PaintBox1->Canvas->Pen->Color=clWhite;
  PaintBox2->Canvas->Pen->Color=clWhite;
  PaintBox3->Canvas->Pen->Color=clWhite;


  PaintBox1->Canvas->Ellipse(0,0,PaintBox1->Width, PaintBox1->Height);
  PaintBox2->Canvas->Ellipse(0,0,PaintBox2->Width, PaintBox2->Height);
  PaintBox3->Canvas->Ellipse(0,0,PaintBox3->Width, PaintBox3->Height);


  PaintBox6->Canvas->Brush->Color=clBlack;
  PaintBox7->Canvas->Brush->Color=clBlack;
  PaintBox8->Canvas->Brush->Color=clBlack;
  PaintBox9->Canvas->Brush->Color=clBlack;


  PaintBox6->Canvas->Ellipse(0,0,PaintBox6->Width, PaintBox6->Height);
  PaintBox7->Canvas->Ellipse(0,0,PaintBox7->Width, PaintBox7->Height);
  PaintBox8->Canvas->Ellipse(0,0,PaintBox8->Width, PaintBox8->Height);
  PaintBox9->Canvas->Ellipse(0,0,PaintBox9->Width, PaintBox9->Height);




  PaintBox10->Canvas->Pen->Color=clBlack;
  PaintBox10->Canvas->Pen->Width=5;


  PaintBox11->Canvas->Pen->Color=clBlack;
  PaintBox11->Canvas->Pen->Width=5;


  PaintBox10->Canvas->MoveTo(0,PaintBox10->Height);
  PaintBox10->Canvas->LineTo(PaintBox10->Width,0);


  PaintBox11->Canvas->MoveTo(PaintBox11->Width, PaintBox11->Height);
  PaintBox11->Canvas->LineTo(0,0);
}

  
Para dibujar la nieve inicializamos las variables en el .h 



private:
// User declarations
    POINT Puntos[1000];//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
    POINT Nieve[1000];



Nos vamos al evento FormPaint y ponemos las posicio iniciales de los puntos o pixeles



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 ; // Y calcular el punto medio
      MediaY = ClientHeight ;
}



Ahora el movimiento de los pixeles se pone en el otro Timer, se agrego una breve descripción de lo que hace el código 



void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  for (int N = 0; N < 10000; 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] = clNavy;
    // 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] = clWhite;//Black;
     Contador++; // Pasar al punto siguiente
     //O al primero si ya se han recorrido todos
    if (Contador == 1000)
      Contador = 0;
   }


}

Al ejecutar el programa se observa que la nieve se mueve de forma diagonal.
El código del muñeco se puede omitir sin afectar el funcionamiento del programa.
El fin de este programa fue manipular los pixeles en c++. Para ver el uso de pixeles en c# vayan la publicación donde esta el juego de la serpiente en este mismo blog.
Próximamente se subirán mas ejemplos con pixeles también programación en 3D.

Comenten y den sugerencias GRACIAS! 

1 comentario: