Ir al contenido



Foto

Juego; "Mata mosca" v2


  • Por favor identifícate para responder
45 respuestas en este tema

#1 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 14 diciembre 2008 - 07:26

Pues eso, una vez captada la idea original de enecumene y revisado el hilo de Caral, decidí realizar mi version del juego "mata mosca".

Fuera de cualquier aspecto tecnico me queda comentar que el juego no tiene un puntaje ni configuración :$, solo depende del tiempo en el que se llega a matar a la mosca desesperada :D

Espero sus comentarios amigos :)

Saludos

Archivos adjuntos

  • Archivo adjunto  520_.zip   240,78KB   41 descargas
  • Archivo adjunto  123_.zip   52,59KB   64 descargas

  • 0

#2 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 15 diciembre 2008 - 05:44

Hola cHackAll, esta bueno eso. (y) Seria bueno ponerle algun tipo de contador.


Un Saludo.

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.254 mensajes
  • LocationRepública Dominicana

Escrito 15 diciembre 2008 - 06:52

jajajajaja, hombre eso está buenissimo jajaja duré como 1 minuto matar la bendita mosca :p
  • 0

#4 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 15 diciembre 2008 - 07:27

Hola cHackAll, esta bueno eso. (y) Seria bueno ponerle algun tipo de contador.


Un Saludo.


Es el cronometro  ;)

PD; acabo de editar los adjuntos corrigiendo un pequeño BUG y aumentando un par de funcionalidades.

Enjoy!
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.481 mensajes
  • LocationVenezuela

Escrito 15 diciembre 2008 - 07:32

Un minuto y medio y la mosca sigue volando, es mas efectivo el insectisida jejeje
  • 0

#6 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 15 diciembre 2008 - 07:45

Un minuto y medio y la mosca sigue volando, es mas efectivo el insectisida jejeje

jajajajajajaja que malos son, yo la mate en medio segundo. :p

Un Saludo.

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.677 mensajes
  • LocationMéxico

Escrito 15 diciembre 2008 - 09:24

jejeje, que buen juego amigo, el sonido de la mosca me parecio simplemente genial :D :s

Salud OS
  • 0

#8 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 15 diciembre 2008 - 02:11

Hola
Como se ve la mano del maestro.
Bueno, yo tardo apenas 6 segundos, sin sonido, 1 minuto con sonido, eso quiere decir algo?.
Muchas gracias, esta impresionante, siempre quise tener un matamoscas tan rápido. :D :D
Saludos
PD: Muy bueno el sonido, que falta nos hacías amigo.
  • 0

#9 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 16 diciembre 2008 - 08:02

Gracias por sus comentarios amigos!

Con respecto al Score de Jose, creo que allí hay un bug :p
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.254 mensajes
  • LocationRepública Dominicana

Escrito 16 diciembre 2008 - 08:07

Oye amigo, ¿el juego está así expresamente?, porque le he dado muchas veces a la mosca y no se muere, llegué tener 3 minutos y aún así no la mataba.  :s
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.481 mensajes
  • LocationVenezuela

Escrito 16 diciembre 2008 - 08:15

yo la he matado varias veces, sera que tienes mala punteria?
  • 0

#12 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 16 diciembre 2008 - 08:17

Oye amigo, ¿el juego está así expresamente?, porque le he dado muchas veces a la mosca y no se muere, llegué tener 3 minutos y aún así no la mataba.   :s


jajajajajaja te recomiendo que cierres los ojos y dale al raton, puede y mejore tu tiempo. :p

Un Saludo.

#13 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.254 mensajes
  • LocationRepública Dominicana

Escrito 16 diciembre 2008 - 08:21

nonono, en el primer codigo de Javier si mataba a la mosca, pero luego de la modificacion de cierto "Bug" no he logrado matarlo.
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.481 mensajes
  • LocationVenezuela

Escrito 16 diciembre 2008 - 08:26

estas como paranoico  ^o|
  • 0

#15 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 16 diciembre 2008 - 09:01

nonono, en el primer codigo de Javier si mataba a la mosca, pero luego de la modificacion de cierto "Bug" no he logrado matarlo.


Bueno, en realidad el BUG fue un Visible = True de uno de los graficos utilizados; lo que ocacionaba que cuando matabas a la mosca (por ende el Timer se detenia) y la ventana refrescaba atomaticamente se viera el grafico que debiera estar oculto :p

Las dos adiciones fueron el boton de "volver a jugar" y "cerrar ventana", por lo que no hubo ninguna modificacion substancial entre codigos que pudiera modificar el comportamiento de la mosca ;)

Si... a veces es definitivamente imposible darle a la muy put_ mosc_ :p


Oye amigo, ¿el juego está así expresamente?, porque le he dado muchas veces a la mosca y no se muere, llegué tener 3 minutos y aún así no la mataba.   :s


jajajajajaja te recomiendo que cierres los ojos y dale al raton, puede y mejore tu tiempo. :p

Un Saludo.


Oye oye... una mosca real es igual de impredesible; asi que nada de cerrar los ojos!

Saludos
  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.481 mensajes
  • LocationVenezuela

Escrito 16 diciembre 2008 - 09:30

si no es mucha molestia, ¿podrias explicarle a estos pobres ignorantes como funciona ese codigo?  :$
  • 0

#17 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 16 diciembre 2008 - 09:53

nonono, en el primer codigo de Javier si mataba a la mosca, pero luego de la modificacion de cierto "Bug" no he logrado matarlo.


jajajajajaja a lo mejor si quitamos la mosca y ponemos una araña de seguro le atinas mas rapido. :p es un problema melotraumatico lo de la mosca. :D :D :D


Un Saludo.

PD:La verda yo tengo la version original y la modificacion.El tiempo de desplazamiento de la mosca cambio. :p

#18 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 16 diciembre 2008 - 10:27

si no es mucha molestia, ¿podrias explicarle a estos pobres ignorantes como funciona ese codigo? :$




delphi
  1. unit Unit1; // by cHackAll
  2.  
  3. interface
  4.  
  5. uses Windows, Classes, Graphics, Controls, Forms, ExtCtrls, Buttons;
  6.  
  7. type
  8. TForm1 = class(TForm)
  9.   Timer1: TTimer;
  10.   Image1: TImage;
  11.   Image2: TImage;
  12.   Image3: TImage;
  13.   Image4: TImage;
  14.   Image5: TImage;
  15.   b1: TSpeedButton;
  16.   b2: TSpeedButton;
  17.   procedure FormCreate(Sender: TObject);
  18.   procedure TimerTimer(Sender: TObject);
  19.   procedure FormPaint(Sender: TObject);
  20.   procedure b1Click(Sender: TObject);
  21.   procedure b2Click(Sender: TObject);
  22. end;
  23.  
  24. var Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. uses Math, MMsystem; // Math para usar ArcTan2 y MMsystem para efectos sonoros
  29.  
  30. {$r *.dfm}
  31. {$r WindowsXP} // XPMan
  32.  
  33. var
  34. Center: TPoint; // será la posicion del centro (eje) de la mosca relativa a la ventana... la defini como global porque pensaba utilizar eventos
  35. Bitmap: TBitmap; // utilizado en todos los procesos de dibujo (buffer doble)
  36. fly: array [0..1] of TImage; // contendrá dos imagenes de la mosca, ésto dará el efecto de movimiento a sus alas
  37. hand: array [Boolean] of TImage; // contendrá las dos imagenes del mata moscas, una "estirada" en reposo y la otra lanzada
  38. Vector: array [0..15] of TPoint; // contiene los puntos de diferencia que permiten darle un movimiento continuo a la mosca
  39. Buffer: array [0..3749] of Cardinal = // contiene 2.5 segundos a 6kHz. del sonido de una mosca volando
  40. ({quitado para reducir carga y tamaño del post... (ver adjunto)});
  41. WaveHdr: TWaveHdr = (lpData: @Buffer; dwBufferLength: SizeOf(Buffer); dwFlags: WHDR_BEGINLOOP or WHDR_ENDLOOP; dwLoops: INFINITE); // contiene los parámetros del buffer de sonido enviado al manejador
  42. w2, h2, hSound: Integer; // TForm1.FormCreate
  43. Start: Cardinal; // contendra el momento del "inicio" del juego, lo que nos permitira cronometrar
  44. Last: Boolean; // contiene el ultimo estado del boton derecho del raton (pulsado?)
  45. max: Real; // contendra la distancia "maxima" entre el centro de la ventana hacia un borde
  46.  
  47. function Elapsed: PChar; {$j+} // retorna el lapso entre Start hasta el momento de la llamada en una cadena con formato de hora
  48. const Time: array [0..11] of Char = '00:00:00.00';
  49. asm
  50. call  GetTickCount   // obtenemos el la cantidad de Ticks actual
  51. sub   eax, [Start]   // la restamos Start obteniendo el lapso en milisegundos
  52. xor   edx, edx       // las divisiones son realizadas con un entero de 64 bits (EAX:EDX)
  53. push  ebx            // guardamos el valor de EBX
  54. push  0Ah
  55. pop   ecx            // ECX := 10; uso push y pop para reducir la cantidad de opcode generada
  56. div   ecx            // dividimos el lapso de tiempo entre diez para usar centesimas en lugar de milesimas; ésto por el formato de salida
  57. mov   ecx, 183C3C64h // ECX sera rotado para los procesos de division; primero las centesimas (100), luego los segundos (60), minutos (60) y horas (24)... al mismo tiempo cuando se realicen estas operaciones la funcion retornará
  58. lea   ebx, Time[12]  // EBX := Result[12]; definimos y usamos como puntero a EBX el cual inicia apuntando a las centesimas mas dos posiciones (pensado originalmente para optimizar con milesimas)
  59. @loop: push ecx       // guardamos ECX pues modificaremos su valor temporalmente
  60. xor   edx, edx       // (EAX:EDX)
  61. movzx ecx, cl        // solo usamos los primeros 8 bits (100, 60, 60, 24)
  62. div   ecx            // dividimos
  63. xchg  edx, eax       // EDX contiene el módulo (residuo) que es lo que nos interesa, por ello lo intercambiamos con EAX para volver a realizar una division
  64. mov   cl, 0Ah       
  65. div   cl             // lo dividimos por 10, con lo cual obtenemos en AL y AH los valores
  66. or    ax, '00'       // los convertimos a ASCII
  67. sub   ebx, 3         // restamos e puntero del buffer de retorno en 3 para continuar el mismo proceso con los segundos, minutos y horas
  68. mov  [ebx], ax       // guardamos el resultado en ASCII de las divisiones
  69. xchg  edx, eax       // restauramos EAX que debe contener el resultado de la division original y no asi el residuo
  70. pop   ecx            // restauramos ECX para continuar con las otras divisiones
  71. shr   ecx, 8         // y rotamos ECX para dividr respectivamente entre 60, 60 y 24
  72. jnz  @loop           // terminamos al haber realizado las 4 divisiones (centesimas, segudos, minutos y horas)
  73. xchg  eax, ebx       // la funcion retornara el valor que apunta EBX (PChar)
  74. pop   ebx            // restauramos el valor original de EBX pues es un registro utilizado "internamente" por el lenguaje
  75. end;
  76.  
  77. procedure TForm1.FormCreate(Sender: TObject);
  78. begin
  79. Bitmap := TBitmap.Create; // creamos un nuevo TBitmap
  80. Bitmap.Width := ClientWidth;
  81. Bitmap.Height := ClientHeight; // definimos sus dimensiones al recuadro interno de la ventana/formulario
  82. Bitmap.Canvas.Pen.Color := clGray; // definimos el color del borde
  83.  
  84. Timer1.Interval := 33; // definimos la velocidad de procesamiento (recomendado)
  85. Randomize; // obtenemos una nueva semilla para Random
  86.  
  87. fly[0] := Image1;
  88. fly[1] := Image2; // obtenemos los dos estados de la mosca
  89. hand[true] := Image4;
  90. hand[False] := Image3; // y los dos estados del mata moscas
  91.  
  92. w2 := ClientWidth div 2; // obtenemos el centro horizontal de la ventana
  93. h2 := ClientHeight div 2; // y su centro vertical
  94. max := Sqrt(Sqr(w2) + Sqr(h2)); // por pitagoras obtenemos su distancia maxima desde el centro un extremo
  95.  
  96. waveOutOpen(@hSound, WAVE_MAPPER, PWaveFormatEx(PChar(#1#0#1#0#112#23#0#0#112#23#0#0#1#0#8#0#16#0)), 0, 0, 0); // iniciamos el manejador de sonido a 6 kHz sin CALLBACK
  97. waveOutPrepareHeader(hSound, @WaveHdr, SizeOf(WaveHdr)); // preparamos los parametros del buffer de sonido
  98. waveOutWrite(hSound, @WaveHdr, SizeOf(WaveHdr)); // y enviamos al manejador el buffer de sonido
  99.  
  100. b1Click(nil); // iniciamos el juego
  101.  
  102. SetProcessWorkingSetSize(INFINITE, INFINITE, INFINITE); // removemos la mayor cantidad de paginas en el espacio de trabajo
  103. end;
  104.  
  105. procedure TForm1.TimerTimer(Sender: TObject);
  106.  
  107. var
  108. Value: TPoint;
  109. Index: Integer;
  110.  
  111. Points: array [0..2] of TPoint; // contendra los 3 puntos necesarios para que calculado el 4, podamos rotar la imagen de la mosca
  112. Radio, Direction, Angle: Real;
  113.  
  114. Down: Boolean; // contendra el estado ACTUAL del boton izquierdo del raton
  115.  
  116. begin
  117. with Bitmap.Canvas do
  118.   begin
  119. //   Brush.Color := clWhite; // pensado para usarse con una imagen de fondo
  120.    Rectangle(ClientRect); // pintamos un rectangulo en lugar de FillRect para dibujar el borde de la ventana
  121.    for Index := Low(Vector) to High(Vector) do // recorremos el Vector de puntos
  122.     with Vector[Index] do
  123.      begin
  124.       if Index > Low(Vector) then // si NO es el primer valor
  125.        Value := Vector[Index - 1] // obtenemos el anterior
  126.       else
  127.        Value := Point(Random(ClientWidth * 2) - (ClientWidth div 2), Random(ClientHeight * 2) - (ClientHeight div 2)); // caso contrario obtenemos un punto al azar, el margen de éste punto se calcula desde un borde desbordado (fuera de la ventana)
  128.       Inc(X, Round((Value.X - X) * 0.666)); // calculamos las diferencias entre los puntos anterior/nuevo
  129.       Inc(Y, Round((Value.Y - Y) * 0.666));
  130.      end;
  131.    Tag := (Tag + 1) mod 2; // Tag sera 0/1 lo cual usaremos para mover las alas de la mosca en cada llamada
  132.    with fly[Tag].Picture do
  133.     begin
  134.      Points[0] := Point(-Width, Height);
  135.      Points[1] := Point(Width, Height);
  136.      Points[2] := Point(-Width, -Height); // definimos los tres puntos rectangulares de la imagen
  137.      Direction := ArcTan2(Vector[High(Vector)].Y - Vector[High(Vector) - 2].Y, Vector[High(Vector)].X - Vector[High(Vector) - 2].X) - (Pi / 2); // obtenemos la direccion (angulo) entre dos puntos finales del vector "diferencial" para calcular el movimiento "armonico" de la mosca
  138.      Radio := Sqrt(Sqr(Width / 2) + Sqr(Height / 2)); // obtenemos el radio
  139.      for Index := Low(Points) to High(Points) do // calculamos los nuevos puntos (rotados)
  140.       begin
  141.        Angle := ArcTan(Points[Index].Y / Points[Index].X) - Direction; // calculamos el nuevo angulo del punto actual
  142.        if Points[Index].X < 0 then
  143.         Angle := Angle + Pi; // lo ajustamos
  144.        Points[Index] := Point(Round((Cos(Angle) * Radio) + Radio) + Vector[High(Vector)].X, Round(Radio - (Sin(Angle) * Radio)) + Vector[High(Vector)].Y); // y modificamos el nuevo punto; el centro de la imagen, su posicion esta dada por el ultimo valor del vector "diferencial"
  145.       end;
  146.      plgblt(Handle, Points, Bitmap.Canvas.Handle, 0, 0, Width, Height, 0, 0, 0); // rotamos la imagen
  147.     end;
  148.  
  149.    Center := Point(Vector[High(Vector)].X + Round(Radio), Vector[High(Vector)].Y + Round(Radio)); // obtenemos la posicion absoluta del eje de la mosca
  150.    Angle := Sqrt(Sqr(Center.X - w2) + Sqr(Center.Y - h2)); // obtenemos la distancia desde el centro de la ventana hacia la mosca para efectos sonoros
  151.    if Angle > max then Index := 0 else // si la mosca esta fuera de la ventana (no se la ve) realizamos un "mute" al sonido
  152.     Index := Round(((max - Angle) / max) * $FFFF); // caso contrario calculamos el volumen
  153.    waveOutSetVolume(hSound, Index or (Index shl 16)); // y lo definimos en ambos canales (izquierda y derecha)
  154.  
  155.    Value := ScreenToClient(Mouse.CursorPos); // obtenemos la posicion del raton
  156.    Down := (GetKeyState(VK_LBUTTON) and $80) <> 0; // obtenemos el estado del boton izquierdo del raton
  157.    Draw(Value.X - 20, Value.Y - 20, hand[Down].Picture.Graphic); // dibujamos el matamoscas correspondiente
  158.    Index := Round(Sqrt(Sqr(Center.X - Value.X) + Sqr(Center.Y - Value.Y))); // obtenemos la distancia desde el eje de la mosca hasta el puntero del raton
  159.    if (Index < 15) and Down and (Last <> Down) then // si esta en un RADIO de 15 pixeles, el raton esta presionado y no lo estaba anteriormente (click)...
  160.     begin
  161.      b1.Visible := True;
  162.      b2.Visible := True; // mostramos los botones
  163.      Timer1.Enabled := False; // detenemos el Timer
  164.      Rectangle(ClientRect); // "limpiamos" la ventana
  165.      Font.Color := clBlack; // cambiamos el color del cronometro y about
  166.      with Image5.Picture do
  167.       Draw(Value.X - (Width div 2), Value.Y - (Height div 2), Graphic); // dibujamos a la mosca "pisada"
  168.      waveOutPause(hSound); // pausamos la reproduccion del sonido de su vuelo
  169.      ShowCursor(True); // y mostramos el cursos
  170.     end;
  171.    Last := Down; // definimos el ultimo estado del boton izquierdo del raton
  172.  
  173.    SetBkMode(Handle, TRANSPARENT); // definimos el color de fondo para escritura en lienzo
  174.    Windows.TextOut(Handle, 4, 1, Elapsed, 11); // pintamos el cronometro
  175.    TextOut(ClientWidth - 60, ClientHeight - 18, 'by cHackAll'); // el about
  176.   end;
  177. FormPaint(nil); // y dibujamos el buffer doble en la ventana
  178. end;
  179.  
  180. procedure TForm1.FormPaint(Sender: TObject);
  181. begin
  182. Canvas.CopyRect(ClientRect, Bitmap.Canvas, ClientRect); // buffer doble
  183. end;
  184.  
  185. procedure TForm1.b1Click(Sender: TObject); // al iniciar un juego
  186. begin
  187. Bitmap.Canvas.Font := Font; //definimos la fuente al buffer doble
  188. b1.Visible := False; // ocultaos los botones...
  189. b2.Visible := False;
  190.  
  191. ShowCursor(False); // ocultamos el cursor...
  192. waveOutRestart(hSound); // iniciamos el sonido
  193. Start := GetTickCount; // guardamos el momento de inicio del juego
  194. Timer1.Enabled := True; // e iniciamos el Timer
  195. end;
  196.  
  197. procedure TForm1.b2Click(Sender: TObject);
  198. begin
  199. Close;
  200. end;
  201.  
  202. end.



Espero haber sido claro...

// Edito para quitar el buffer de sonido pues "pesaba" mucho

Saludos
  • 0

#19 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 16 diciembre 2008 - 11:01

si no es mucha molestia, ¿podrias explicarle a estos pobres ignorantes como funciona ese codigo?   :$


Ya este comentario es para puñaladas y todo. :p (lo de puñaladas esta escrito pensando en cubano) :D

Un Saludo.

#20 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.481 mensajes
  • LocationVenezuela

Escrito 16 diciembre 2008 - 11:29

jejeje, ya veo que tienes algun tiempo libre, como es eso de las puñaladas jose?
  • 0