![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#4
|
|||
|
|||
|
Hola:
Lo normal es que si un objeto se mueve a intervalos muy cortos, es decir de uno o dos pixeles, no se aprecie demasiado por el ojo humano ese movimiento Sólo Vertical - Sólo Horizontal; otra cosa es si avanzase, por ejemplo 10 ó más pixels sobre un solo eje. Si el ángulo no es de 45º, siempre habrá un eje sobre el que se desplace más pixels que sobre el otro, parecido a como se dibujan las líneas en una cuadrícula (dibuja una línea con el Paint, haz un zoom grande y verás eso con claridad). Otra cosa es cómo calcules las posiciones sucesivas que debe avanzar cada vez el objeto. Supongamos que quieres mover un objeto desde un punto PIni a otro PFin, y quieres que entre dichas posiciones transcurran 10 pasos, por ejemplo. En este ejemplo, deberías seguir más o menos este algoritmo: Código:
procedure Muevete (PIni, PFin: TPoint; Steps: Integer);
var
DeltaX, DeltaY, i : Integer;
NewPos : TPoint;
begin
DeltaX := PFin.X - PIni.X;
DeltaY := PFin.Y - PIni.Y;
for i:=1 to Steps do
begin
NewPos.X := PIni.X + MulDiv (i, DeltaX, Steps);
NewPos.Y := PIni.Y + MulDiv (i, DeltaY, Steps);
Dibujate (NewPos);
end;
end;
Espero que te sirva. PD: Añadir que si quisieras forzar que el mínimo intervalo de movimiento fuera siempre de 1 pixel, en ese caso en vez de tomar el valor Steps de la lista de parámetros, lo podrías calcular tú mismo. Después de haber calculado los Deltas, haces esto: if Abs(DeltaX) > Abs(DeltaY) then Steps := Abs(DeltaX) else Steps := Abs(DeltaY); De esta forma, el eje sobre el que se da el mayor desplazamiento, sólo se desplazará 1 píxel como máximo, y sobre el otro habrá pasos en que se desplace 1 pixel y en otros 0 pixels.
__________________
Guía de Estilo Última edición por andres1569 fecha: 09-12-2003 a las 19:18:49. |
|
|
|