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
Espero sus comentarios amigos
Saludos
Escrito 14 diciembre 2008 - 07:26
Escrito 15 diciembre 2008 - 05:44
Escrito 15 diciembre 2008 - 06:52
Escrito 15 diciembre 2008 - 07:27
Hola cHackAll, esta bueno eso. Seria bueno ponerle algun tipo de contador.
Un Saludo.
Escrito 15 diciembre 2008 - 07:32
Escrito 15 diciembre 2008 - 07:45
jajajajajajaja que malos son, yo la mate en medio segundo.Un minuto y medio y la mosca sigue volando, es mas efectivo el insectisida jejeje
Escrito 15 diciembre 2008 - 09:24
Escrito 15 diciembre 2008 - 02:11
Escrito 16 diciembre 2008 - 08:02
Escrito 16 diciembre 2008 - 08:07
Escrito 16 diciembre 2008 - 08:15
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.
Escrito 16 diciembre 2008 - 08:21
Escrito 16 diciembre 2008 - 08:26
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.
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.
jajajajajaja te recomiendo que cierres los ojos y dale al raton, puede y mejore tu tiempo.
Un Saludo.
Escrito 16 diciembre 2008 - 09:30
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.
Escrito 16 diciembre 2008 - 10:27
si no es mucha molestia, ¿podrias explicarle a estos pobres ignorantes como funciona ese codigo? :$
unit Unit1; // by cHackAll interface uses Windows, Classes, Graphics, Controls, Forms, ExtCtrls, Buttons; type TForm1 = class(TForm) Timer1: TTimer; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Image5: TImage; b1: TSpeedButton; b2: TSpeedButton; procedure FormCreate(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure FormPaint(Sender: TObject); procedure b1Click(Sender: TObject); procedure b2Click(Sender: TObject); end; var Form1: TForm1; implementation uses Math, MMsystem; // Math para usar ArcTan2 y MMsystem para efectos sonoros {$r *.dfm} {$r WindowsXP} // XPMan var Center: TPoint; // será la posicion del centro (eje) de la mosca relativa a la ventana... la defini como global porque pensaba utilizar eventos Bitmap: TBitmap; // utilizado en todos los procesos de dibujo (buffer doble) fly: array [0..1] of TImage; // contendrá dos imagenes de la mosca, ésto dará el efecto de movimiento a sus alas hand: array [Boolean] of TImage; // contendrá las dos imagenes del mata moscas, una "estirada" en reposo y la otra lanzada Vector: array [0..15] of TPoint; // contiene los puntos de diferencia que permiten darle un movimiento continuo a la mosca Buffer: array [0..3749] of Cardinal = // contiene 2.5 segundos a 6kHz. del sonido de una mosca volando ({quitado para reducir carga y tamaño del post... (ver adjunto)}); 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 w2, h2, hSound: Integer; // TForm1.FormCreate Start: Cardinal; // contendra el momento del "inicio" del juego, lo que nos permitira cronometrar Last: Boolean; // contiene el ultimo estado del boton derecho del raton (pulsado?) max: Real; // contendra la distancia "maxima" entre el centro de la ventana hacia un borde function Elapsed: PChar; {$j+} // retorna el lapso entre Start hasta el momento de la llamada en una cadena con formato de hora const Time: array [0..11] of Char = '00:00:00.00'; asm call GetTickCount // obtenemos el la cantidad de Ticks actual sub eax, [Start] // la restamos Start obteniendo el lapso en milisegundos xor edx, edx // las divisiones son realizadas con un entero de 64 bits (EAX:EDX) push ebx // guardamos el valor de EBX push 0Ah pop ecx // ECX := 10; uso push y pop para reducir la cantidad de opcode generada div ecx // dividimos el lapso de tiempo entre diez para usar centesimas en lugar de milesimas; ésto por el formato de salida 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á 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) @loop: push ecx // guardamos ECX pues modificaremos su valor temporalmente xor edx, edx // (EAX:EDX) movzx ecx, cl // solo usamos los primeros 8 bits (100, 60, 60, 24) div ecx // dividimos 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 mov cl, 0Ah div cl // lo dividimos por 10, con lo cual obtenemos en AL y AH los valores or ax, '00' // los convertimos a ASCII sub ebx, 3 // restamos e puntero del buffer de retorno en 3 para continuar el mismo proceso con los segundos, minutos y horas mov [ebx], ax // guardamos el resultado en ASCII de las divisiones xchg edx, eax // restauramos EAX que debe contener el resultado de la division original y no asi el residuo pop ecx // restauramos ECX para continuar con las otras divisiones shr ecx, 8 // y rotamos ECX para dividr respectivamente entre 60, 60 y 24 jnz @loop // terminamos al haber realizado las 4 divisiones (centesimas, segudos, minutos y horas) xchg eax, ebx // la funcion retornara el valor que apunta EBX (PChar) pop ebx // restauramos el valor original de EBX pues es un registro utilizado "internamente" por el lenguaje end; procedure TForm1.FormCreate(Sender: TObject); begin Bitmap := TBitmap.Create; // creamos un nuevo TBitmap Bitmap.Width := ClientWidth; Bitmap.Height := ClientHeight; // definimos sus dimensiones al recuadro interno de la ventana/formulario Bitmap.Canvas.Pen.Color := clGray; // definimos el color del borde Timer1.Interval := 33; // definimos la velocidad de procesamiento (recomendado) Randomize; // obtenemos una nueva semilla para Random fly[0] := Image1; fly[1] := Image2; // obtenemos los dos estados de la mosca hand[true] := Image4; hand[False] := Image3; // y los dos estados del mata moscas w2 := ClientWidth div 2; // obtenemos el centro horizontal de la ventana h2 := ClientHeight div 2; // y su centro vertical max := Sqrt(Sqr(w2) + Sqr(h2)); // por pitagoras obtenemos su distancia maxima desde el centro un extremo 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 waveOutPrepareHeader(hSound, @WaveHdr, SizeOf(WaveHdr)); // preparamos los parametros del buffer de sonido waveOutWrite(hSound, @WaveHdr, SizeOf(WaveHdr)); // y enviamos al manejador el buffer de sonido b1Click(nil); // iniciamos el juego SetProcessWorkingSetSize(INFINITE, INFINITE, INFINITE); // removemos la mayor cantidad de paginas en el espacio de trabajo end; procedure TForm1.TimerTimer(Sender: TObject); var Value: TPoint; Index: Integer; Points: array [0..2] of TPoint; // contendra los 3 puntos necesarios para que calculado el 4, podamos rotar la imagen de la mosca Radio, Direction, Angle: Real; Down: Boolean; // contendra el estado ACTUAL del boton izquierdo del raton begin with Bitmap.Canvas do begin // Brush.Color := clWhite; // pensado para usarse con una imagen de fondo Rectangle(ClientRect); // pintamos un rectangulo en lugar de FillRect para dibujar el borde de la ventana for Index := Low(Vector) to High(Vector) do // recorremos el Vector de puntos with Vector[Index] do begin if Index > Low(Vector) then // si NO es el primer valor Value := Vector[Index - 1] // obtenemos el anterior else 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) Inc(X, Round((Value.X - X) * 0.666)); // calculamos las diferencias entre los puntos anterior/nuevo Inc(Y, Round((Value.Y - Y) * 0.666)); end; Tag := (Tag + 1) mod 2; // Tag sera 0/1 lo cual usaremos para mover las alas de la mosca en cada llamada with fly[Tag].Picture do begin Points[0] := Point(-Width, Height); Points[1] := Point(Width, Height); Points[2] := Point(-Width, -Height); // definimos los tres puntos rectangulares de la imagen 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 Radio := Sqrt(Sqr(Width / 2) + Sqr(Height / 2)); // obtenemos el radio for Index := Low(Points) to High(Points) do // calculamos los nuevos puntos (rotados) begin Angle := ArcTan(Points[Index].Y / Points[Index].X) - Direction; // calculamos el nuevo angulo del punto actual if Points[Index].X < 0 then Angle := Angle + Pi; // lo ajustamos 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" end; plgblt(Handle, Points, Bitmap.Canvas.Handle, 0, 0, Width, Height, 0, 0, 0); // rotamos la imagen end; Center := Point(Vector[High(Vector)].X + Round(Radio), Vector[High(Vector)].Y + Round(Radio)); // obtenemos la posicion absoluta del eje de la mosca 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 if Angle > max then Index := 0 else // si la mosca esta fuera de la ventana (no se la ve) realizamos un "mute" al sonido Index := Round(((max - Angle) / max) * $FFFF); // caso contrario calculamos el volumen waveOutSetVolume(hSound, Index or (Index shl 16)); // y lo definimos en ambos canales (izquierda y derecha) Value := ScreenToClient(Mouse.CursorPos); // obtenemos la posicion del raton Down := (GetKeyState(VK_LBUTTON) and $80) <> 0; // obtenemos el estado del boton izquierdo del raton Draw(Value.X - 20, Value.Y - 20, hand[Down].Picture.Graphic); // dibujamos el matamoscas correspondiente 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 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)... begin b1.Visible := True; b2.Visible := True; // mostramos los botones Timer1.Enabled := False; // detenemos el Timer Rectangle(ClientRect); // "limpiamos" la ventana Font.Color := clBlack; // cambiamos el color del cronometro y about with Image5.Picture do Draw(Value.X - (Width div 2), Value.Y - (Height div 2), Graphic); // dibujamos a la mosca "pisada" waveOutPause(hSound); // pausamos la reproduccion del sonido de su vuelo ShowCursor(True); // y mostramos el cursos end; Last := Down; // definimos el ultimo estado del boton izquierdo del raton SetBkMode(Handle, TRANSPARENT); // definimos el color de fondo para escritura en lienzo Windows.TextOut(Handle, 4, 1, Elapsed, 11); // pintamos el cronometro TextOut(ClientWidth - 60, ClientHeight - 18, 'by cHackAll'); // el about end; FormPaint(nil); // y dibujamos el buffer doble en la ventana end; procedure TForm1.FormPaint(Sender: TObject); begin Canvas.CopyRect(ClientRect, Bitmap.Canvas, ClientRect); // buffer doble end; procedure TForm1.b1Click(Sender: TObject); // al iniciar un juego begin Bitmap.Canvas.Font := Font; //definimos la fuente al buffer doble b1.Visible := False; // ocultaos los botones... b2.Visible := False; ShowCursor(False); // ocultamos el cursor... waveOutRestart(hSound); // iniciamos el sonido Start := GetTickCount; // guardamos el momento de inicio del juego Timer1.Enabled := True; // e iniciamos el Timer end; procedure TForm1.b2Click(Sender: TObject); begin Close; end; end.
Escrito 16 diciembre 2008 - 11:01
si no es mucha molestia, ¿podrias explicarle a estos pobres ignorantes como funciona ese codigo? :$
Escrito 16 diciembre 2008 - 11:29