Raton y puntero

Started by sinplomo, December 07, 2012, 05:05:50 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

sinplomo

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?

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

sinplomo

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


sinplomo

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

Erkosone

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.

sinplomo

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

sinplomo

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?

Erkosone

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.

sinplomo

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?

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

sinplomo

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...

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2