problemas con colision i otras funciones

Started by vib, February 21, 2011, 05:53:01 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

no es mala idea, podrian armarse un instituto de programacion de videojuegos... seria un trabajo que les daria unos ingresos mensuales.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Si me sale el euromillones montamos una pequeña empresa, ya tengo profesionales por aqui de sobra xD
Tu te vendrias a trabajar a Madrid Splinter ? Lo bueno es que te contentabas con poco porque despues volvias a Argentina y eras el rey con tanta pasta xD

vib

#17
No quiero ser un pesado... por hacer tantas preguntas...
Realmente este era un tema que queria consultarlo con mi profesor antes que recurrir al foro.. pero visto que la semana que viene no hay clase y yo por unos problemas llevo 2 sin asistir a clase.. os lo pregunto a vosotros...

El tema nose porque falla si es por que no hay un orden o que...es bastante raro...

No os pongo codigo... porque realmente nose que parte de codigo poneros.. os explicare lo maximo detallado y ya vosotros me deciis que parte del codigo teneis indicios que falla.

Yo estoy haciendo un juego con 1 scroll, vamos un juego de rol rpg... camara vista desde arriba.. vamos tipico juego tibia o parecido.

Uno de los puntos que os comente aqui, que queria que se borraran los textos, era porque he hecho un cursor que su funcion es.. pues pichas a un "enemigo" y te indica la cantidad de vida que le queda etc... Vale...
Problemas..

No se porque
el    scroll[0].camera=id;
lo tengo el proceso que se encarga de hacer la colision... "osea parece que este en el personaje pero realmente la camra esta en lo que se transparenta.
Ahora os paso los 2 procesos
el 1r es el proceso del cursor, para que se vea...
el 2n es el proceso que cuando pichas con el cursor llama al proceso que hace que salga la vida que le queda al enemigo.

[code language="bennu"]process rata()
BEGIN
   
   graph=15;

   z=0;
   
   LOOP
        x=mouse.x;            
       y=mouse.y;
       IF (key(_esc)) exit(); END
       //parte bocus
       
       IF (collision (TYPE ship1))  

            IF (mouse.left) while (mouse.left) frame;end //con esto evitas elf ram de 200 de abajo i puedes espamear la tecla way ;)
   
                   item_select_screen_background(id_2.graph);

            end //el de ahora porke todo esta comentado
       
      else//sino esta seleccionan elf ocus osea otro lado
           IF (mouse.left) while (mouse.left) frame;end
               signal(type item_select_screen_background,s_kill);
           end
       END
       FRAME;
   END
END
process Item_Select_Screen_Background(grafico)
private
int txt = 0;
string vida_txt;
begin
   graph=grafico;
   size=400;
   x=400; //Fondo centrado
   y=50;
   
   z=1;
    txt=write_var(0,400,100,4,vida_txt);

  loop
      vida_txt = "vida " + vida_2;
      frame;
  end

onexit:
   delete_text(txt);

end[/code]

Vale.... la duda es esta..

yo en el main llamo a los procesos de...
personaje, personaje_colision, enemigo, enemigo_colision, rata.

Si son unas coordenadas concretas... pongo como lo llamo i me explico.

[code language="bennu"]id_1=ship(410,300,13);
   col_1(400,300,20);//con esta hace focus con el de arriba no
   if(enemigo==false)//no hace flata pero asi nos e crenan todo el rato.
     
       
       
       id_2=ship1(200,100,13);
       col_2(200,100,20);
       
         //id_2=ship1(1700,2810,13); //SI PONGO ESTE GRAPIFOC CON SU RESPECTIVO COL, NO FUNCIONA EL FOCUS
       //col_2(1700,2810,17);//COORDENADA QUE NO VAL EL FOCUS
       enemigo=true;
   end
       rata();[/code]

Ya esta claro.. si a esos procesos los llamo en unas coordenadas dentro del campo de vision"" pues el if de colision de rata() para ver la vida del enemigo funciona...
Pero si llamo a esos procesos en unas posiciones en el mapa totalmente distintas " como las que estan entre comentarios"
pues el colision de la rata() ya no funciona...
No tengo ni idea porque.. alguien tiene algun indicio?

PD: Me olvidaba...
El colision para ver la " vida" solo funciona dentro del rango 0-800x, 0-600y.
Osea si te sales de esa pantalla para recorrer el scroll y ya la pantalla se mueve... ya No funciona y no me sale la "vida del focus"

DIGO ESTO por lo que pongo arriba de las llamadas de los procesos en unas coordenadas u otras.

Futu-block

'no se' se escribe separado y y se escribe con una y griega, y no latina; lo digo por lo que haces parecer, no por incordiar

SplinterGU

1) los procesos dentro del scroll tienen que ser ctype = c_Scroll;

2) debes descontar de las coordenadas de los textos y mouse las coordenadas del scroll, esto es scroll.x0 y scroll.y0.

puede que me equivoque en el nombre de alguna variable, pero la idea es esa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

No he acabado de entender ese punto de descontar las coordenadas...
eso se tendria de poner en ambos procesos? no entendi...

Luego en el proceso de la rata() i el que hace el focus para ver la vida...
no hay puesto el ctype=c_scroll; 
por el echo deque.. la rata sin ctype=c_scroll;   cuando muevo el personaje la rata sigue fija en el mismo punto.. y se "mueve" en la misma sintonia, si lo pusiera al mover el personaje la rata se perdedira por el scroll...
Lo mismo pasa con el proceso para ver la vida... pasa exactamente igual por eso les quite el ctype=c_scroll; 

Drumpi

Free: esa idea de negocio ya la tuve, la de dar clases de programación de videojuegos, de tal forma que subvencionase la otra actividad, la de crear videojuegos. Incluso añadí que se pudieran vender en el propio local los juegos que creasen los alumnos por un pequeño porcentaje.
Pero el problema de darse de alta como empresa, los impuestos y demás (sin contar que hay que comprar los equipos para ello, el local, etc...) puede ser una pesadilla y no entiendo del tema.

Pero vamos, que si la cosa se pone en marcha, y el sueldo permite alquilarse un piso, yo me traslado encantado de la vida. Aunque ahora mismo estoy pendiente de un par de cursos que me han surgido por aquí (y que están siendo una pesadilla últimamente) así que, si no importa esperar, podría estar disponible después del verano ^^U

vib: el problema que tienes es porque estas mezclando procesos de dentro del scroll con otros que no están en el scroll. Dos procesos que colisionan no deberían tener distinto ctype, salvo que se sepa lo que se está haciendo.
Si la rata se pierde en el scroll si la metes dentro y mueves el personaje, entonces debes mover a la rata, no sacarla del scroll. La estructura SCROLL tiene dos variables (X1 e Y1) que indican la posición de la esquina superior derecha de la pantalla (mas bien, de la región donde se dibuja el scroll), úsalos como origen de coordenadas o, como dice Splinter, para hayar la diferencia entre las coordenadas de la pantalla (la esquina sería la posición (0,0)) y las del scroll (la misma esquina sería (SCROLL.X1,SCROLL.Y1) respecto a la pantalla, o sea, si no se usase c_scroll).
Es usar las matemáticas, te podría dar una clase de un par de páginas para que lo entendieras mejor pero:
-Es mejor que lo intentes tú, imaginandote que la pantalla es un cuadrado, y el scroll es otro cuadrado que se desplaza por el papel, siguiendo a tu personaje. ;)
-No es la hora para hacer disertaciones ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

vib

#22
Vale.. entendi me he puesto a buscar y ya he visto como funciona scroll[0].y0 y eso.
Haciendo ejemplos.. he visto que esa manera de dar las coordenadas son para mover el scroll.. osea no se mueve el proceso, se mueve el scroll como en una cinta de correr...

Esto que solucion podria darme? porque claro.. la idea que seria.. mover el personage principal con normalidad... teniendo el
scroll[0].camera=id;

entonces el proceso de rata() que seria... a este moverme en sintonia con el movimiento del personaje... corriendo el scroll? con eso de scroll[0]y0?

Porque no he acado de entender la finalidad de como solucionaria asi mi problema...

porque claro he visto que si al proceso de la rata() le pongo  ctype=c_scroll;
entonces tal y como tengo ahora el proceso me pasa eso.. ala que me muevo y salgo del rango de resolucion... la rata no me deja pasar de alli...

edit:
me explico
yo al proceso rata() queda la parte de movimiento asi

[code language="bennu"]process rata()
BEGIN
   
    graph=4;
    //scroll[0].camera=id;   
   //scroll[4].camera=id;   
    ctype=c_scroll;   
    //cnumber=C_0;//le digo el mapa que quiero que se vea en este caso el 0, si no lo pusuera se veria en los 2 scroools.
    z=1;
   
    LOOP
         x=mouse.x;           
        y=mouse.y;
        if(key(_up)) y=y-5;
//scroll[0].y0=scroll[0].y0 - 5;
end
if(key(_down))y=y+5;
//scroll[0].y0=scroll[0].y0 + 5;
end
if(key(_left))x=x-5;
//scroll[0].x0=scroll[0].x0 -5;
end
if(key(_right))x=x+5;
//scroll[0].x0=scroll[0].x0 +5;
end[/code]

Viendo esto que se puede deducir... que al mover el proceso prinicpal " el personaje" entonces.. al ser las mismas teclas la rata tmb se tendria de mover en sintonia... lo he echo como coordenadas normal.. o como esta en comentarios moviendo directamente el mapa...
problema? que si la relosucion 800x600 ala que me muevo al 805x700 "por decir algo" sobre el scroll..la rata pierde movilidad ya que de 800x600 no me deja pasar ni haciendo lo de arriba....

como lo hariais?:S

Drumpi

#23
Scroll[0].x y scroll[0].y se pueden modificar para mover el scroll, pero ¿y si las lees?

Los procesos que usan ctype=c_screen usan un sistema de coordenadas donde el punto (0,0) es la esquina superior izquierda de la pantalla. Esto se entiende ¿no?
Pues bien, en cuanto usas ctype=c_scroll eso cambia, la esquina superior derecha de la pantalla ya no marca la coordenada (0,0), sino la coordenada (scroll[0].x,scroll[0].y).

Supongo que lo que quieres hacer es que el proceso rata siga al ratón. Bien, en ese caso, el ratón sólo se puede mover por la región de pantalla, es decir, desde la esquina superior izquierda a la esquina inferior derecha. Como usa coordenadas tipo c_screen, estas irán desde (0,0) hasta el fin de la misma, supongamos (800,600).
Ahora imaginemos que el proceso al que sigue el scroll desplaza la pantalla 10 pixels a la derecha, entonces la esquina superior izquierda apuntará al valor (10,0), por lo que el proceso rata debería poder moverse entre los valores (10,0) hasta (810,0).

Es decir, que para pasar de coordenadas de pantalla a coordenadas del scroll, debes sumarle (scroll[0].x,scroll[0].y) al proceso que tenga ctype=c_screen, en este caso, las coordenadas del ratón.

Es un simple problema de lógica ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

vib

#24
Vale ya he entendido a lo que te refieres.. genial!!!!!!
Lo he estado provando y ya veo el buen resultado.
Lo he echo de diferentes maneras y las que mejor resultado me dan son en 2, pero las 2 me falla la rata en unas cositas que no he sabido solucionar.

Tengo exactamente el mismo proceso de rata() 1r manera, lo he echo con ctype=c_scroll;    y otro sin nada osea con el c_screen.
El movimiento de la rata és el mismo os dejo el codigo
[code language="bennu"]process rata()
BEGIN
   
   graph=4;

   //ctype=c_scroll;    //uno con este, otro con este en comentario...
 
   z=1;
   
   LOOP
        x=(mouse.x+scroll[0].x0);            
       y=(mouse.y+scroll[0].y0);

write(0,300,90,4,"movimiento rata x,y");
       write_var(0,300,100,4,x);
write_var(0,300,110,4,y);
write(0,380,10,4,"scrool.x, scroll.y");
       write_var(0,300,10,4,scroll[0].x0);
write_var(0,300,20,4,scroll[0].y0);
[/code]
El diferente resultado?
1r haciendo este proceso rata() pero poniendo la funcion ctype=c_scroll;
La rata funcion de cojones, la colision va todo perfecto.. el unico fallo raro que veo y nose como solucionar esque.. tengo 2 regions "1 la zona de juego" y la 2n es el mini-mapa.
Claro al tener en el proceso rata() el ctype=c_scroll;  la rata coje prioridad con esa region del scroll y no con la screen.. entonces me sale el mini-mapa "la 2n region" por encima de la rata, que es la maxima prioridad...
con la funcion de z no me funciona sigue estando la region mini-mapa por encima..y trasteando no he aconseguido dejar la rata() por encima de todo...
Bien ese es el problema que he encontrando dejando el proceso rata() como dentro del scroll, se me solucionaba TODO pero me salia ese pequeño problema.

La 2n opcion que tuve es como me dices... dejandole el c_screen y sumandole el movimiento del scroll, lo hago... y me pasa esto de la imagen:

http://img545.imageshack.us/f/pantallazo8.png/

que se ve.. pues que cuando muevo el personaje por el scroll, ala rata tambien le sumo ese desliz.. y que pasa? que luego intento ir ala esquina superior y la rata se para antes viendose en la imagen como la rata sale del juego sin llegar a la esquina...

osea si me muevo 10, le sumo 10, pero la rata coje las coordenadas x,y+10 y pasa eso...

gracias :)
PD:ya esta cerca esto, la opcion mas facil i rapida a 1 de estos 2 me basta

Drumpi

Lo suyo es que lo metas dentro del c_scroll y trates de arreglar el problema del orden de dibujado (suponiendo que quieras meterlo dentro del scroll como un proceso más de juego, que si sólo quieres que sea el puntero del ratón puedes usar mouse.graph, pero entonces los demás procesos sólo colisionarán con el punto centrald e la imagen).
Cada scroll tiene un campo scroll[0].z donde se define la profundidad del dibujado. Los procesos tienen su propia Z, y cuanto más negativa, más por encima de todo se dibuja. Si quieres que se vea sobre todo, dale el valor -1000, por ejemplo.
Hay una serie de "objetos" que tienen una Z predefinida, que se puede modificar en cualquier momento, si no recuerdo mal:
-Fondo de pantalla: 512.
-Scroll y Modo7: 256.
-Procesos: 0.
-Textos y ratón: -512.
De hecho, es recomendable asignar una Z a cada proceso, para evitar problemas de flickering o superposiciones no deseadas.

Si usas el ctype=c_screen, no tienes que sumarle los valores de scroll[0].x ni scroll[0].y, pero si un proceso que sí use ctype=c_scroll quiere saber su posición real dentro del scroll, entonces tendrás que sumarlos, mientras no.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

vib

ombre el principio la idea principal de la rata es usarla como rata en cualquier juego.. que haga sus funcionalidades...

lo de la z es lo que te comentaba arriba...
yo tengo 2 regions...
en la region en la que meto a la rata con c_scroll, todo va perfecto...
pero claro esa rata "como tiene de hacer funcion como rata" queda realmente feo que quede por debajo de la 2n region...

es eso

nose como hacer para que esa rata pase por encima de las 2 regions estando en c_scroll con una de ellas.

porque ya as visto lo que me pasa si lo dejo en c_screen y se sumo el movimiento del scroll... :S

SplinterGU

ummm... cuando dices rata te refieres a mouse?

por otro lado, tienes 2 cosas, 1 es la Z que es el orden de dibujado y otra es priority que es el orden de ejecucion, no me queda claro a cual de las 2 te referis.

pensa que en bennugd, los procesos se ejecutan todos primero, y una vez que se ejecutaron todos, recien ahi se dibujan en pantalla.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Quote from: SplinterGU on February 28, 2011, 09:36:57 PM
ummm... cuando dices rata te refieres a mouse?


Se refiere a una rata vieja de alcatarilla xDDD

vib

Creo que no me estoy explicando bien. Haber ire por partes.

Como dije arriba, el proceso rata() "que es el proceso que simula el mouse del ordenador" como digo arriba poniendolo dentro del scroll con s_scroll, se soluciona el tema de colision etc.

El problema que tengo en ponerlo dentro de c_scroll esque yo tengo 2 regions dibujadas...
1 que es la region 0 y otra es la region 1 que la creo de esta manera.
[code language="bennu"]define_region(1, 600, 400, 200, 400);[/code]
Esta region la uso para poner un mini-mapa. Que ocupa ese espacio.
Quedando la region 1 por encima de la region 0.

El problema viene con la rata cuando moviendola intento pasarla por encima de la region 1, y no es asi, se esconde dentras de la region 1 ya que pertenece a la region 0 , ese es el problema

como seria para quedara independiente? y hiciera sus funciones? de detectar colision con un proceso de la region 0 ala vez que queda visible siempre...

he provado con priority, z, y no me funciona.

------------
La otra manera que comente es.. la rata sacandola del c_scroll, y dejandola como parte del c_screen, eso ya no me pasa ya que su z = -10, como 1r dibujo vamos.
El problema como bien digo en la foto esque al mover el scroll , la rata no forma parte de él.. pierde las coordenadas referencia y no se mueve mas... le sumo las coordenadas del scroll
[code language="bennu"]      x=(mouse.x+scroll[0].x0);           
        y=(mouse.y+scroll[0].y0);[/code]
y sigue sin ir..
ala que me salgo de la resolucion, no se mueve
--------------
Una de esas 2 soluciones me basta, el tema de priorizar la rata al maximo, sea para las region que sea? o como diablos mover la rata en c_screen sin que se pierda al usar un scroll?

esas son mis dudas.. realmente os agradezco la dedicacion que me estais ofreciendo, yo la verdad esque me estoy volviendo loco leyendome mil ejemplo sobre el tema rata, scroll, probando mil cosas y ahi me quedado encallado :(