• Lunes 23 de Diciembre de 2024, 17:13

Autor Tema:  Campo De Estrellas  (Leído 2687 veces)

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Campo De Estrellas
« en: Miércoles 13 de Julio de 2005, 18:01 »
0
El pasado son solo recuerdos, el futuro son solo sueños

JeoV

  • Miembro activo
  • **
  • Mensajes: 49
    • Ver Perfil
Re: Campo De Estrellas
« Respuesta #1 en: Jueves 14 de Julio de 2005, 00:26 »
0
Salu2 :hola:

yo estoy haciendo un juego tipo SpaceInvaders en allegro, y para generar estrellas hago algo similar al articulo.

#define NUM_STARS 20

//Hice un objeto Class estrella el cual actualiza la posicion de la estrella y la dibuja en la pantalla;
estrella Stars[NUM_STARS];
int Actual_Star;

for(Actual_Star=1; Actual_Star<=NUM_STARS; Actual_Star++)
{
 
Star[Actual_Star].draw(buf);
Star[Actual_Star].Act;
}

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Campo De Estrellas
« Respuesta #2 en: Jueves 21 de Julio de 2005, 22:40 »
0
Si alguna vez quieren hacer un campo de estrellas esférico, aqui va un ejemplo para delphi. (funciona en d3 para arriba)


Utiliza la clase TDIB que permite acceso rápido a pixeles de forma cómoda la cual adjunté en la sección delphi.

Hay que crear un nuevo proyecto y asignar estos eventos en el form:

    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);

No se olviden de ninguno!.

NOTA: no modifiquen el acceso a pixeles a menos que sepan lo que están haciendo.

Código: Text
  1.  
  2. unit main;
  3. {AUTOR: Sergio Alex Chávez Rico}
  4. interface
  5.  
  6. uses
  7.   Classes, Controls, Forms,windows, DIBitmap,dialogs,sysutils;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     procedure FormCreate(Sender: TObject);
  12.     procedure FormDestroy(Sender: TObject);
  13.     procedure FormPaint(Sender: TObject);
  14.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  15.       Y: Integer);
  16.   private
  17.     { Private declarations }
  18.     MOUSE_X,MOUSE_Y:integer;
  19.     DIB:TDIB;
  20.     procedure Pintar;
  21.   public
  22.     { Public declarations }
  23.   end;
  24.  
  25. var
  26.   Form1: TForm1;
  27.  
  28. implementation
  29. {&#036;R *.DFM}
  30.  
  31. //de Math.pas:
  32.  
  33. function ArcTan2(Y, X: Extended): Extended;
  34. asm
  35.         FLD     Y
  36.         FLD     X
  37.         FPATAN
  38.         FWAIT
  39. end;
  40.  
  41. procedure SinCos(Theta: Extended; var Sin, Cos: Extended);
  42. asm
  43.         FLD     Theta
  44.         FSINCOS
  45.         FSTP    tbyte ptr [edx]    // Cos
  46.         FSTP    tbyte ptr [eax]    // Sin
  47.         FWAIT
  48. end;
  49.  
  50.  
  51. const
  52.   ANCHO_BMP_RENDER=512;
  53.   ALTO_BMP_RENDER=512;
  54.   BITS_POR_PIXEL=16;
  55.  
  56. procedure TForm1.FormCreate(Sender: TObject);
  57. begin
  58.   color:=0;
  59.   DIB:=TDIB.Create(self.handle,ANCHO_BMP_RENDER,ALTO_BMP_RENDER,BITS_POR_PIXEL);
  60.   DIB.left:=40;
  61.   DIB.top:=144;
  62. end;
  63.  
  64. procedure TForm1.Pintar;
  65. type TPixeles=array[0..ALTO_BMP_RENDER-1,0..ANCHO_BMP_RENDER-1] of word;
  66. var Pixeles:^TPixeles;
  67.   procedure PintarEstrellas;
  68. {
  69. De esférico a cilíndrico:
  70.  
  71. r=p*cos(phi)
  72. theta=theta
  73. h=p*sin(phi)
  74.  
  75. De cilíndrico a cartesiano:
  76.  
  77. x=r*cos(theta) //z
  78. y=r*sin(theta)
  79. z=z           //x
  80.  
  81. De cartesiano a cilíndrico:
  82. r = sqrt(x*x+y*y);
  83. theta =arctan2(y/x);
  84. z = z
  85.  
  86. De esférico a cartesiano:
  87.  
  88. theta: cilindrico, phi: latitud
  89. x=p*sin(phi)*cos(theta);//z
  90. y=p*sin(phi)*sin(theta);
  91. z=p*cos(phi); //x
  92. }
  93.   var i,c,px,py:integer;
  94.       phi_0,theta_0,theta_R,theta_R2,phi,theta,r,x,y,z:double;
  95.       sin_theta,cos_theta,sin_phi,cos_phi:extended;
  96.   begin
  97.     Pixeles:=DIB.lpSurface;
  98.     bitblt(DIB.DIBhdc,0,0,DIB.width,DIB.height,0,0,0,blackness);
  99.     RandSeed:=10101;
  100.     theta_R2:=(MOUSE_Y)/1024*pi*2+pi/2;
  101.     theta_R:=(MOUSE_X)/1024*pi*2;
  102.     for i:=0 to 10000 do
  103.     begin
  104.       c:=(random(32) shl 5) or (random(32) shl 10);
  105.       //definimos en esférico
  106.       phi_0:=random*pi*2;
  107.       theta_0:=random*pi*2;
  108.       {p=1;}
  109.       theta:=theta_0+theta_R;//podemos girar de esta forma en esférico
  110.       phi:=phi_0;
  111.       //pasamos a &#34;cilíndrico eje x&#34;:
  112.       //primero debemos pasar de esférico a cartesiano
  113.       sincos(theta,sin_theta,cos_theta);
  114.       sincos(phi,sin_phi,cos_phi);
  115.       x:=sin_phi*cos_theta;//z
  116.       z:=sin_phi*sin_theta;
  117.       y:=cos_phi; //x
  118.       //luego de cartesiano a &#34;cilíndrico eje x&#34; (x &#60;-&#62; z):
  119.       r := sqrt(sqr(z)+sqr(y));
  120.       theta :=arctan2(y,z)+theta_R2;//podemos girar el otro ángulo
  121.       z := x;
  122.       //luego de &#34;cilíndrico eje x&#34; a cartesiano
  123.       sincos(theta,sin_theta,cos_theta);
  124.       if (r*cos_theta){z}&#60;0 then continue;//no dibujar los que están &#34;ocultos&#34;
  125.       py:=round((z)*254+256);
  126.       px:=round((r*sin_theta)*254+256);
  127.       pixeles[px and &#036;1ff,py and &#036;1ff]:=c or &#036;3FF;
  128.       pixeles[(px+1) and &#036;1ff,py and &#036;1ff]:=c;
  129.       pixeles[px and &#036;1ff,(py+1) and &#036;1ff]:=c;
  130.       pixeles[(px-1) and &#036;1ff,py and &#036;1ff]:=c;
  131.       pixeles[px and &#036;1ff,(py-1) and &#036;1ff]:=c;
  132.     end;
  133.   end;
  134. begin
  135.   PintarEstrellas;
  136.   DIB.draw;//Mandar a memoria de video
  137. end;
  138.  
  139. procedure TForm1.FormDestroy(Sender: TObject);
  140. begin
  141.   DIB.free;
  142. end;
  143.  
  144. procedure TForm1.FormPaint(Sender: TObject);
  145. begin
  146.   DIB.draw;
  147. end;
  148.  
  149. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  150.   Y: Integer);
  151. begin
  152.   MOUSE_X:=x;
  153.   MOUSE_Y:=y;
  154.   pintar;
  155. end;
  156.  
  157. end.
  158.  
  159.  

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Campo De Estrellas
« Respuesta #3 en: Viernes 22 de Julio de 2005, 22:01 »
0
Citar
Utiliza la clase TDIB que permite acceso rápido a pixeles de forma cómoda la cual adjunté en la sección delphi.

No la encuentro  :blink:
 :rolleyes:

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Campo De Estrellas
« Respuesta #4 en: Viernes 22 de Julio de 2005, 22:13 »
0
Se lo puede encontrar buscando "pixeles" en "código fuente"

El título completo es:
"Acceso a pixeles mas rapido que scanline"

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Campo De Estrellas
« Respuesta #5 en: Viernes 22 de Julio de 2005, 23:12 »
0
Cita de: "Amilius"
Se lo puede encontrar buscando "pixeles" en "código fuente"

El título completo es:
"Acceso a pixeles mas rapido que scanline"
Ahí ta. :)

No es un campo de estrellas, es todo una galaxia esférica B)

 :P