Hola,
Estoy haciendo un minijuego, y tengo un personaje que se controla con el teclado, y un visor para disparar que se controla con el raton. Hasta aqui bien.
El problema es que habra diferentes armas, y cada arma tiene un rango distinto. No se puede limitar el movimiento del raton alrededor de un radio definido del personaje, asi que he pensado en crear un puntero que tengla en cuenta la posicion del personaje, la del raton, obtenga el angulo entre ambos (con get_angle o fget_angle) y me dibuje un puntero a una distancia determinada del personaje.
Me estoy liando demasiado o voy bien?
ahora entiendo un poco mas... quizas puedas sacar la distancia y angulo del raton con respecto al punto central (personaje) y en base a eso, si la distancia es mayor al rango que quieras tu, entonces mueves el mouse basado en el angulo y la distancia rango que quieras con respecto al personaje.
Tengo hecho esto, pero no me funciona bien
Quotepuntero(6, angulo, posx, posy);
Este es el proceso encargado de dibujar el puntero
Quote
process puntero(int rango, int angle, int posx, int posy)
begin
Loop
graph = new_map(ball_width,ball_height,screen_depth);
map_clear(0,graph,rgb(0,255,255));
x = rango*cos(angle) + posx;
y = rango*sin(angle) + posy;
frame;
End
end
Quote from: SplinterGU on December 07, 2012, 05:12:42 PM
ahora entiendo un poco mas... quizas puedas sacar la distancia y angulo del raton con respecto al punto central (personaje) y en base a eso, si la distancia es mayor al rango que quieras tu, entonces mueves el mouse basado en el angulo y la distancia rango que quieras con respecto al personaje.
Tengo la distancia y el angulo... voy a probarlo
Hola, no tengo demasiado tiempo para postear largo hoy, pero te paso unas funciones que tengo por aquí que seguro que te van a ser de ayuda ;)
Van muy bien para muchas cosas..
/ EXTENDED TRIGONOMETRICS LIBRARY BY ERKOSONE.
// API REFERENCE:
//
// NOTE: All funcions works with double or float data tyte on 4º quadrant of screen.
//
// Functions:
// getDistance( x_point_A, y_point_A, x_point_B, y_pointB )
// getAngle( x_point_A, y_point_A, x_point_B, y_pointB )
// setRotation( reference_point_X, reference_pointY, distance, angle )
// setAdvance( distance, angle )
// getAdvance( reference_point_X, reference_pointY, final_point_X, final_point_Y, distance, angle )
// Documentación:
/*
getDistance();
- Retorna la distancia en pixels que existe entre dos puntos.
getAngle():
- Retorna el angulo que forman 2 puntos en el plano cartesiano.
setRotation();
- Rota el gráfico de un proceso dados los parámetros distancia y angulo.
NOTA: No se trata de un movimiento de rotación, si no de traslación sobre un punto de referencia.
El gráfico del proceso que llama a esta función rotará formando una orbita alrrededor de
las coordenadas pasadas como punto de referencia en los 2 primeros parámetros.
getRotation();
- Realiza el cálculo del movimiento de traslación para un punto en el plano cartesiano
pasados los parámetros angulo y distancia en función del punto de referencia pasado por los
2 primeros parámetros.
NOTA: Se trata como en el caso de 'setRotation()' de una función que realiza el calculo del
movimiento de traslación pero en este caso sin integración directa con los procesos del lenguaje,
La posición final se recoje mediante los 2 ultimos parámetros pasados por referencia.
setAdvance();
- Hace que el gráfico de un proceso avance una distancia en la dirección
del angulo pasado como parámetro.
getAdvance();
- Esta función retorna en las variables pasadas por referencia la posición final
resultante de avanzar en la dirección y angulo pasados como parámetros.
[size=78%] [/size]
*/
//...............................................................................
//
// DISTANCE FUNCTIONS..
//
//...............................................................................
// Precision distance between 2 cartesian points..
Function float getDistance(float x1, float y1, float x2, float y2)
begin
return( sqrt( ((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)) ) );
End
//...............................................................................
//
// ANGLE FUNCTIONS..
//
//...............................................................................
// Precision angle between 2 cartesian points..
Function float getAngle( float x1, float y1, float x2, float y2 )
begin
return( (float)atan( (x2-x1) / (y2-y1) ) );
end
//...............................................................................
//
// ROTATION 2D FUNCTIONS.. with direct process integration..
//
//...............................................................................
// Precision rotation for 1 cartesian point between another reference cartesian point..
Function float setRotation( float x1, float y1, float distance, float angle_ )
begin
father.x = x1 + ( (distance) * cos(angle_) );
father.y = y1 - ( (distance) * sin(angle_) );
Return(0);
end
//...............................................................................
//
// ROTATION 2D FUNCTIONS.. with variable containers..
//
//...............................................................................
// Precision rotation for 1 cartesian point between another reference cartesian point..
Function float getRotation( float x1, float y1, float distance, float angle_, float * xOut_, float * yOut_ )
begin
*xOut_ = x1 + ( (distance) * cos(angle_) );
*yOut_ = y1 - ( (distance) * sin(angle_) );
Return(0);
end
//...............................................................................
//
// ADVANCE FUNCTIONS.. with direct process integration..
//
//[size=78%]..........................................................................[/size]
// Precision advance for 1 point between your actual position in cartesian plane..
function float setAdvance( float distance, float angle_ )
begin
father.x += distance * cos(angle_);
father.y -= distance * sin(angle_);
Return(0);
end
//...............................................................................
//
// ADVANCE FUNCTIONS.. with variable containers..
//
//...............................................................................
// Precision advance for 1 point between your actual position in cartesian plane..
function float getAdvance( float x1, float y1, float * x2, float * y2, float distance, float angle_ )
begin
*x2 = x1 + ( (distance) * cos(angle_) );
*y2 = y1 - ( (distance) * sin(angle_) );
Return(0);
end
//...............................................................................
//...............................................................................
//...............................................................................
//...............................................................................
//...............................................................................
//...............................................................................
//...............................................................................
Esto lo escribí hace algún tiempo.. si hay que cambiar algo será mínimo seguramente, supongo que debe funcionar sin ningún problema en BennuGD.
Te he tomado prestada esta funcion, pero no me acaba de funcionar del todo bien ..
Quotefunction int setAdvance( int distancia, int angle_ )
begin
father.x += distancia * cos(angle_);
father.y -= distancia * sin(angle_);
Return(0);
end
La uso asi:
Quote
x = new_map(ball_width,ball_height,screen_depth);
map_clear(0,x,rgb(0,255,0));
ball2(0,x,personaje.x+10, &angulo0);
QuoteProcess ball2(int file,int graph,int distancia, int angulo0)
Begin
Loop
setAdvance( distancia, angulo0 );
frame;
End
End
No sé si esta bien, porque a la hora de intentar compilar me sale este error
error: Parameter type invalid ( token error: "ANGULO0" ). provocado por la linea marcada en rojo
Estoy probando también la manera que me comento SplinterGU
Quoteif (distance >= 300)
mouse.x= posx+(300*cos(angle));
mouse.y=posy+(300*sin(angle));
end
Qué pasa con los diferentes cuadrantes? Un if para cada caso no?
Hola sinplomo, el error seguramente será por que usas una variable INT y con estas funciones debe ser Float.
Lo de los cuadrantes no te preocupes, la pantalla del PC está representada en el 4º cuadrante siempre, esto solo se tiene que tener en cuenta en operaciones que calculan algo para el eje Y pero ni caso, que eso es una nota que incluí ahí que en realidad al que usa estas funciones no debe importarle lo mas mínimo.
Este es el codigo que estoy usando y funciona bien! Gracias a todos!
Quoteif (distance >= rango)
angulo= fget_angle(x,y,mouse.x,mouse.y);
mouse.x= x+((rango)*cos(angulo));
mouse.y=y-((rango)*sin(angulo));
end
Otra pregunta, se puede limitar la sensibilidad/velocidad del raton?
eso era lo que te decia... genial...
con respecto a la sensibilidad el mouse, no, no hay nada actualmente para eso... aunque quizas puedas hacer algun proceso que se encargue de manejar el mouse y en base al estado del mouse en el frame actual y el anterior ir ajustando mas o menos velocidad y demas.
Quote from: SplinterGU on December 09, 2012, 12:52:37 AM
eso era lo que te decia... genial...
con respecto a la sensibilidad el mouse, no, no hay nada actualmente para eso... aunque quizas puedas hacer algun proceso que se encargue de manejar el mouse y en base al estado del mouse en el frame actual y el anterior ir ajustando mas o menos velocidad y demas.
Es que si muevo el personje sin tocar el raton, llegado el raton, el puntero se mueve bien, va muy fluido. Si empiezo a mover el raton, "tiembla", supongo que es porque tiene que calcular una y otra vez las posiciones...
prioridades... prueba ponerle prioridades a los procesos...
la variable es priority... si no me equivoco el proceso de control del mouse tiene que tener menos prioridad que el resto de los procesos (o al reves)... como sea, prueba con eso.