¿Cómo hacer que la bola se mueva a lo largo de una curva en flash as3? Similar al movimiento de la pelota en el juego de Zuma. No use la capa de arranque, use código AS.
Yo. Primero conozco el camino.
1. Utilice el método del punto de seguimiento para establecer valores aproximados.
2. Luego extrae las coordenadas de los puntos anteriores y agrega la matriz:
var?MapData=,,,,,,
,,,, ,
p>
,,,
,,,,,]];
Puede utilizar el siguiente método primitivo para ver la ruta:
función?initMap(arr . Array)?{
graphics.lineStyle(2, 0xFFFFFF);
graphics.moveTo(arr[0][0 ], arr[0][1]);
for(var?i:uint?=?1;?ilt;arr.length?-?2;? i)?{
var?xc:Número?(arr[ i][0]? ?arr[i 1][0])/2;
var?yc: Número?=?curveTo(arr[ i][0], arreglo[i][1 ], arreglo[i 1][0 ], arreglo[i 1][1]);
}
3. Luego use la clase de curva de Bézier para generar una cierta cantidad de puntos clave.
Clase de curva de Bezier:
¿paquete?{
import?flash.geom.Point;
¿clase pública?Bezier ?{
/? =======================================?Atributo
//?Variable externa
privada; static; var; p_start: Punto //p>privado?static?var?p_ctrl ;//?Punto Bezier
privado?static?var?p_over: Punto; //?Punto final
privado?static?var?step: uint //?Dividir número de comparte
//?Variables auxiliares
privada?static?var?ax: int;
privada?static?var?ay: int;
privado?static?var?bx: int;
privado?static?var?by: int;
privado?static?var?A: Número ; p>
privado?estático?var?B: Número;
privado?longitud
//?Función de velocidad
privado?estático? función?s(t:Número):Número; {
return?Math.sqrt(A?*?t?*?t? ?B?*?t? ?C);
}
/?Función de longitud
¿privada?estática?función?L(t:Número):Número?{
var?temp_ctrl:Número ?=?Math.sqrt(C? ?t?*?(B? ?A?*?t));
var?temp_over:Número?=?(2?*?A?*? t?*?temp_ctrl? ?B?*(temp_ctrl?-?Math.sqrt(C)));
var?temp3:Número?=?Math.log(B? ?2?*? Math.sqrt(A)?*?Math.sqrt(C));
var?temp4:Número?=?Math.log(B? ?2?*?A?*?t? ? 2?*?Math.sqrt(A)?*?temp_ctrl);
var?temp5: Número=2*Math.sqrt(A)*temp_over;
var?temp6 :Número=?(b?*?b?-?4?*?a?*?c)?(b?*?b?-?4?*?a?*?c)?(temp3?-?temp4 );
retorno?(temp5? ?temp6)?/(8?*?Math.pow(A,?1.5));
}
/?La función inversa de la función de longitud, resuelta usando el método tangente de Newton
private?static?function?InvertL(t:Number,?l:Number):Number?{
var?t1: Número=t;
var?t2: Número;
hacer?{
>
t2?=?t1?-? (L(t1)?-?l)/s(t1);
if?(Math.abs(t1-t2)?lt;? 0.000001)?{
interrupción;
}
t1=t2;
}mientras(verdadero);
return?t2;
}
/?Devuelve el número total de pasos requeridos
public?static?function?init($p_start: Point, $p_ctrl: Punto, $p_over: Punto, $velocidad: Número): uint?{
p_start=$p_start;
p_ctrl=$p_ctrl;
p_over=$p_over;
/step?=?30;
ax=p_start.x-2*p_ctrl.x p_over.x;
ay= p_start.y-2*p_ctrl.y p_over.y;
bx=2*p_ctrl.x-2*p_start.x;
by=2*p_ctrl.y-2 *p_start.y;
A=4*(ax*ax ay*ay);
B=4*(ax*bx ay*by);
C=bx*bx by*by;
/?Calcular la longitud
total_length=L(1);
//?Calcular el número de pasos
step=Math.floor(total_length/?$speed);
if(total_length??$speed?gt;?$speed?/?2)?{
paso;
}
regresar? Obtener el punto de anclaje según la posición nIndex especificada: devolver coordenadas y ángulo
public?static ?function?getAnchorPoint( nIndex: Número): ¿Matriz?{
if(nIndex?gt;=?0?amp;amp;? nIndex?lt;=?step)?{
var?t :Número=nIndice/paso;
/?Si crece por fila y columna, calcula la longitud de la curva correspondiente al punto
var?l: Number=t*total_length;
/?Según la función inversa de la función L, encuentre el valor t correspondiente a l
t=InvertL(t, l); p>
//?Según la curva de Bézier Función para encontrar las coordenadas x, y del punto
var?xx: Número?=?(1?-?t)?*?( 1?-?t)?*?p_start.x? ?(1?-?t)?*?t?*?p_ctrl.x? p>var?yy:Número?=?(1? -?t)?*?(1?-?t)?*?p_start.y?2?*?(1?-?t)?*?t ?*?p_ctrl.y? ?t?*?t ?*?p_over.y;
//?Obtener tangente
var?Q0: Punto?=?nuevo?Punto ((1?-?t)?*?p_start. x? ?t?*?p_ctrl.x,? (1?-?t)?*?p_start.y? ?t?*?p_ctr
l.y);
var?Q1: Punto?=?new?Point((1?-?t)?*?p_ctrl.x? ?t?*?p_over.x,? (1?- ?t)?*?p_ctrl.y? ?t?*?p_over.y);
//?Calcular ángulo
var?dx: Número=Q1.x-Q0 .x;
var?dy: Número=Q1.y-Q0.y;
var?radianes: Número=Math.atan2(dy,dx);
var?grados.Number=radianes*180/Math.PI;
xx=int(xx*10)/10
yy=int(yy*10)/ 10
grados=int(grados*10)/10
return?[xx,?yy,?grados];
}?else?{
¿regresar?[];
}
}
}
¿regresar?
¡Los puntos son códigos, no líneas guía!
Dos aplicaciones:
Por no estar en esta pregunta se omiten