Error en el algoritmo para "apuntar" (Usando mod_chipmunk)

Started by Marc, March 01, 2013, 03:14:24 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Marc

Buenas, estoy haciendo un Space Invaders pero a mi manera, complicando los controles un poco (para darme algún aliciente, que ya hice un arkanoid en C con ASCII (xD) y es más o menos lo mismo.

Así que lo que estaba intentando era a partir de la "mod_chipmunk" editar el API para que la gravedad no exista pero quedarme la "velocidad residual"(Para darle un toque al espacio y la fuerza de los planetas, estrellas, agujeros negros, etc..) y las ventajas que me aportaba y bueno, eso lo conseguí yo solo y fue relativamente sencillo.

Pero ahora estoy intentando que la nave que es el personaje este apuntando donde tenga el mouse y no lo consigo. En resumen, W A S D mueve la posición X e Y del personaje  y del mouse leo el mouse.x y mouse.y y de esas dos posiciones he de conseguid que el personaje apunte hace el mouse.x/y pero no hay manera :(

Adjunto el código en un rar, sin los graficos pero vamos son una castaña xD

Erkosone

Para conseguir ese efecto solo tienes que hacer 2 cosas, la primera es aplicar a la nave el angulo correcto, para esto debes comprobar que angulo forman el personaje y el mouse entre si, esto es bien sencillo y se hace así "desde el personaje":



angle = get_angle(id_mouse);




Añade una variable global llamada 'id_mouse' al programa y en el proceso raton simplemente haces: id_mouse = id;
Ahora que tienes el angulo necesitas avanzar en esa dirección, esto se puede hacer de diversas maneras, pero nunca con funciones como ADVANCE() o similar, siempre hay que hacerlo mediante la aplicación de fuerzas que posteriormente el motor de la chipmunk resolverá en un cambio de posición automáticamente, esto se hace así:


Physics_entity_add_velocity( 3.0, (float)angle );


Se usa el angulo obtenido de la función get_angle() pero casteandolo explicitamente como float, no lo he probado pero debe funcionar bien, pruebalo y me cuentas ;)

Marc

No lo consigo, algo no hago bien xD

process Personaje:
angle = get_angle(id_mouse);      
write_var(0,80,160,2,angle);

Process Raton:
mouse.angle = id_mouse;

Siempre el write_var me devuelve el valor -1.

Erkosone

Quote from: Erkosone on March 01, 2013, 05:10:24 PM y en el proceso raton simplemente haces: id_mouse = id;


para que haces mouse.angle = id_mouse?


jeje.. te has liado, tienes que hacer simplemente:
id_mouse = ID;


Haber te explico que hace esto por que creo que no lo entiendes y lo has intentado por lo menos, así que te mereces la explicación jeje..


todos los objetos de un programa en bennuGD, llamo objetos a los 'procesos', pues eso, que todos los procesos/objetos de un programa en bennugd tienen una variable llamada 'ID', esta variable indica simplemente el nombre de un proceso, no el nombre que tu le pones si no el nombre/número que el motor interno de bennuGD ha asignado a ese objeto, todos los procesos tienen su ID, es como un número que identifica a cada proceso dentro del programa.


Entonces al hacer esto:   id_mouse = ID;  lo que estás haciendo es guardar el identificador del proceso del mouse en la variable id_mouse, y como id_mouse es una variable Global pues será accesible desde otro proceso/objeto.


Para que sirve esto? simple, si desde el proceso personaje quieres saber por ejemplo el valor de X del proceso raton() puedes consultarlo de esta manera:  'mi_variable = id_mouse.X'
Como ves, con la variable id_mouse puedes acceder a la entidad/objeto del raton() y con un punto y seguidamente la variable que tu quieras puedes acceder a ella desde otro proceso sea el que sea.


Espero que ahora lo comprendas mejor ;)

Marc

Y hola otra vez, Erkosone he hecho lo que dijiste y también he entendido lo del ID, haces como un puntero a la variable y en esa dirección estrían todos los valores (x , y , z, size, flags, etc.. ? ) en vez de hacer un global por variable como hacia pues el ID lo contiene todo o eso creo, si estoy equivocado que alguien me lo diga!

Y a lo que me interesa, estoy aún haciendo lo del mouse y no hay manera de que me haga caso, si miráis las imágenes que adjunto veréis el problema, me sigue al mouse pero el  objeto&&mouse no hacen un angulo de 360º como lo entendería yo, entonces me hace una forma rara :(

Lo que me pasa es que el eje de las Y y el comportamiento del personaje van bien pero el eje de las X y el comportamiento del personaje van invertidos >.<

Adjunto el código e imágenes de lo que me pasa por si alguien quiere aprender como no se hace :p





Erkosone

Cuelga un ZIP con el programa y lo miramos, cuelgalo entero con gráficos y todo.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

¿cómo haces el avance?

Recuerda que el eje y está invertido (hacia abajo incrementa).
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Marc

Subo el rar de todo el proyecto a ver si alguien me puede aclarar que hago mal jajaja :)

SplinterGU: Los sprites no son míos (aun) son de internet.

Prg: No hago ningún advance xD

Prg

tienes el flags=1, lo que invierte los ángulos; este es el problema. El flags debe ser 0.

También veo que en el bucle haces write_var. Write_var no necesita llamarse varias veces para actualizar un texto, de hecho estás llenando tu memoria y subrecargando el procesador de la forma que lo haces.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

Quote from: Prg on March 06, 2013, 05:55:02 PM
tienes el flags=1, lo que invierte los ángulos; este es el problema. El flags debe ser 0.

También veo que en el bucle haces write_var. Write_var no necesita llamarse varias veces para actualizar un texto, de hecho estás llenando tu memoria y subrecargando el procesador de la forma que lo haces.
Este prg es todo un master yaaa. Muy bien visto tio.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Marc

Pff, sois unos cracks! Ahora a meterle disparos y cuando lo consiga, empezare el juego de verdad ^^

Un placer y la próxima intentare hacer el post en "Proyectos" aunque no se si cuenta como tal al ser de pequeña envergadura, si alguien sabe algo que envie un MP con información.

Saludos!

Prg

Quote from: DCelso on March 06, 2013, 06:50:55 PM
Quote from: Prg on March 06, 2013, 05:55:02 PM
tienes el flags=1, lo que invierte los ángulos; este es el problema. El flags debe ser 0.

También veo que en el bucle haces write_var. Write_var no necesita llamarse varias veces para actualizar un texto, de hecho estás llenando tu memoria y subrecargando el procesador de la forma que lo haces.
Este prg es todo un master yaaa. Muy bien visto tio.

Gracias :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)