Hola, primero gracias por la ayudita que me disteis con la funcion time() me ha ido a pelo!.
Luego haber.. tengo unos problemas al que no encuentro solucion, realmente nose donde esta el fallo.
1r:
Tengo este codigo.
[code language="bennu"]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);
delete_text(es_focus);
//destruir=0;
//focus=0;
end
END
FRAME;
END
END
process Item_Select_Screen_Background(grafico)
begin
graph=grafico;
size=400;
x=400; //Fondo centrado
y=50;
//scroll[0].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=2;
loop
es_focus=write(0,400,100,4,"vida " + vida_2);
frame;
end
end [/code]
El escrito que hay en la variable es_focus no me funciona, directamente cuando quito el focus, va al if de arriba, mata el proceso y deberia matar ese escrito de vida. Y no lo hace.
Lo necesito hacer asi porque con un delete_text(0) me borra todo y hay cosas que no quiero que se borren.
---------
Problema con la colision:
Os pongo una foto y os cuento.
http://img262.imageshack.us/i/colh.png/
Vale viendo la foto que es lo que hay...
2 personajes rodeados por una cuadrado de color.
La colision de los personajes es a partir de esos cuadrados... asi mantengo un margen cuadrado con los 2 personajes, ya que es la unica manera que se me ha ocurrido.
Todo va bien, el problema es.. que quiero que esos 2 cuadrados "y los mas que pondre" queden escondidos debajo del scrool, simplemente que hagan su funcion de colision i ya, que no se vean....
como lo ariais? o que manera hay para hacer una colision con una imagen con fondo transparente y poner un margen cuadrado?
Gracias
porque no usas onexit?
asi
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);
//destruir=0;
//focus=0;
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;
//scroll[0].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=2;
txt=write_var(0,400,100,4,vida_txt);
loop
vida_txt = "vida " + vida_2;
frame;
end
onexit:
delete_text(txt);
end
Problema con los textos:
Los textos, al contrario que los gráficos, no están asociados a los procesos: si un proceso muere, los textos que ha escrito no, porque los textos son una especie de proceso en sí.
Cuando usas WRITE (o WRITE_VAR), esta función devuelve un ID, como los procesos, que puedes usar con funciones especiales como son MOVE_TEXT o DELETE_TEXT, como es tu caso, y como te indica Splinter.
Otra cosa, que también lo pone Splinter en el código pero no lo explica: procura usar las funciones WRITE fuera de los bucles, porque como te he dicho, son como procesos, y es como si estuvieses creando uno nuevo a cada frame (a menos que los borres también a cada frame). Es más, el número de textos en pantalla es limitado, si superas ese límite se producirá un error y el programa se cerrará dándote el correspondiente mensaje de error.
Lo suyo es usar WRITE_INT o WRITE_VAR o la que necesites, ya que actualiza el valor de forma automática, así que sñolo tienes que escribirlo una vez.
Las colisiones:
Esos cuadrados deberían ir en otros procesos aparte (supongo que ya lo sabes), así que con ponerles el ALPHA a 0, ya lo tienes. De todas formas, también tienes unas funciones nuevas de colisión (COLLISION_BOX) que puedes usar, o bien hacer la detección usando las coordenadas de los procesos (creas un proceso aparte, que coja la lista de procesos personaje, y compruebe si están demasiado cerca). Algo como:
if (abs(ID1.x-ID2.x) < 10 AND abs(ID1.y-ID2.y) < 10)
//hay colisión
end
Obviamente, esto tienes que analizarlo y aplicarlo tu, que aquí no damos las cosas hechas ;)
JODER Xd
sois unos putos cracks!!!
sabeis mas que mi profe enserio... el estando 1 hora mirandose el codigo no tuvo huevos a saber porque no se esborraba xD
Bueno lo del texto... solo he echo copiar/pegar y funciona, luego ya hare mas pruebas pero sin duda es lo que necesitaba
gracias :)
Lo que me habeis dicho sobre la 2n duda de las colisiones luego me lo mirare con calma y os comento
PD:Me dejais alucionado con lo que sabeis.. y eso que esto esta lleno de funciones infinitas xD
me alegro mucho que te hayamos sido de ayuda...
ahora con respecto a tu profesor y a lo que hayamos dicho aca, piensa que (tratandose de bennugd) si yo no lo se o no lo puedo resolver, estamos en un gran problema...
vale, hecho.
He provado lo que me habeis dicho y exelente a primera vista.
lo de alpha parece que es una especie de z no? el profe nos explico la z el alpha mola mas...
Luego lo de collision_box me he puesto a buscar y no e encontrado nada xD
Lo que dices de colision la parte de comprovar la distancia de los procesos del personaje es una muy buena idea.. ya la tuve encuenta usando los get_dist.
De momento he visto que el alpha hace la funcion que yo queria... y tampoco probare muchas cosas nuevas que en 2 semanas he de entregar el projecto y me queda hacer toda la parte grafica ...
Muchisimas gracias como siempre :)
Soys rapidos, eficaces y concretos me encanta!
espero un dia ser yo quien os ayude ;)
alpha no es z, sino transparencia del grafico...
collision_box, es similar a la distancia, no es lo mismo, pero se acerca mucho, calcula la colision en base al area formado por las esquinas del grafico, y no por el grafico en si.
tu profesor te enseña bennugd? como se llama tu profesor? en que instituto te enseña?
Juas, no es que sepamos mucho, es que no es lo mismo los conceptos que tenga tu profesor con los que usa Bennu: por ejemplo, la Z podría ser la posición de una figura en un mundo tridimensional, pero en Bennu es símplemente la profundidad, o sea sobre qué o debajo de qué se va a dibujar, tan simple como eso.
Por aquí ya hemos visto textos, X, Y, Z etc, y son el pan nuestro de cada día. Cuando avances con el lenguaje ya te asustarás con el mundo de posibilidades que tiene (vamos, creo que ni Splinter es capaz de saber manejar todo Bennu, aunque lo haya programado él :D :D :D).
Por cierto, Splinter, para odiar la POO, estás manteniendo uno, que no llega al nivel de C, pero que podría llegar si le metes herencia como querías hacer ;D
yo creo que el profesor le esta enseñando bennugd.
Quote from: SplinterGU on February 22, 2011, 02:47:21 PM
si yo no lo se o no lo puedo resolver, estamos en un gran problema...
me encanta, karma++
maestro astilla, has pasado a formar parte de mi firma, je je
Pues SplinterGU
yo este año acabo el grado superior de programacion informatica
y una asignatura que solo se hace a mi instituto es programacion para videojuegos.. y tocamos bennu
De mi ciudad es en el unico lugar donde lo enseñan.. osea en gerona, españa ;)
Pero no tiene mucha idea por lo que veo..
lo de la colision el queria usar un metodo de get_pixel bla bla super raro que jamas nos salio...
Quote from: SplinterGU on February 22, 2011, 02:47:21 PM
yo no lo se resolver, estamos en un gran problema, tengo que aprender, tu profesor me puede dar clases ?
Joer, estas mal pero muy mal ;D
Quote from: FreeYourMind on February 23, 2011, 10:14:12 PM
Quote from: SplinterGU on February 22, 2011, 02:47:21 PM
yo no lo se resolver, estamos en un gran problema, tengo que aprender, tu profesor me puede dar clases ?
Joer, estas mal pero muy mal ;D
yo no dije eso!
Quote from: vib on February 23, 2011, 09:39:59 PM
Pues SplinterGU
yo este año acabo el grado superior de programacion informatica
y una asignatura que solo se hace a mi instituto es programacion para videojuegos.. y tocamos bennu
De mi ciudad es en el unico lugar donde lo enseñan.. osea en gerona, españa ;)
Pero no tiene mucha idea por lo que veo..
lo de la colision el queria usar un metodo de get_pixel bla bla super raro que jamas nos salio...
Juas, pues si necesitan gente con experiencia para dar clases de bennu y pagan un sueldo decente, estoy disponible ;D
Me has dado una idea Drumpi, que tal abrir unos cursos de programacion en madrid y te vienes de profesor ?
no es mala idea, podrian armarse un instituto de programacion de videojuegos... seria un trabajo que les daria unos ingresos mensuales.
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
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.
'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
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.
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;
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
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
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 ;)
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
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.
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
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.
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
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 :(
Con la z=-1000 debería bastar, te lo he dicho antes. Cualquier valor inferior a las Z de los procesos del minimapa ya vale.
vamos por partes...
1) las collisiones solo se hacen sobre graficos del mismo ctype.
2) con el mouse no te conviene usar collision, ya que solamente se chequea por 1 pixel, y este pixel es el pixel del centro o punto de control 0 del grafico del mouse, por ende no tiene sentido y te estas complciando la vida.
chequea por las coordenadas mouse.x y mouse.y sumando (o restando, segun compares) los valores del scroll y listo.
3) con respecto a la Z, usa ctype = c_screen y pone de z un valor -10000 o algun valor alto (mouse.z, quizas) y ya esta.
Vale no sabia que las colisiones solo se hacian sobre el mismo ctype. Entonces no me queda otra que usar digasemos la rata() en el mismo ctype que las cosas que quiero colisionar.
Eso implica, a que tienen todos de estar a una misma region? "es una duda" osea si haces 3 regions, la colision de la rata solo valdria para una de ellas?
luego con respeto al tema de la prioridad...
si necesito estar en el mismo ctype que las colisiones, he de estar en el scroll osea la opcion que tenia de c_screen y sumar y tal no me vale.
lo de la prioridad lo tengo asi
he provado con z, y con priority
[code language="bennu"]process rata()
BEGIN
graph=15;
ctype=c_scroll;
z=-1000;
//PRIORITY=1000;
LOOP
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);[/code]
Provando he visto cosas como...
la prioridad de z, solo surgen con los procesos que estan dentro del mismo ctype...
osea el mini-mapa que directamente esta en otra region y en el ctype=c_screen, y en el proceso de focus()"es el proceso que sale la vida del bicho etc" tambien esta en c_screen...
en ambos, la prioridad se la pasa por el forro, vamos que la rata queda por debajo de procesos con un z mas alto y que esten en c_screen.
Tambien queda por debajo de textos del mismo ctype teniendo la rata como veis prioridad maxima o z maxima....
Quizas sea un poco muy pesado con el tema..pero esta tan cerquita lo que quiero...simple tema de prioridad ..
espero que se alla entendido! :)
region no se usa con collision, solo se usa ctype
z = mouse.z;
repito, priority es el orden de ejecucion, no de dibujado.
Nada ;S
Visto lo visto... voy hacer una cosa.. os dejo el codigo para que lo probeis haber si asi se entiende mejor...
si el problema surge...espero que no porque no se que hacer ya.
Os comento. El codigo lo he dejado ordenado y he puesto los puntos que se han estado mencionando exclusivamente.
Una rata, un personaje, un "enemigo", los 3 en el mismo ctype que es c_scroll.
UN proceso que es focus, que esta en diferente ctype, es c_screen. Tambien he añadido algunos escritos como coordenadas y eso.
El problema la rata queda por debajo de, los textos y del proceso focus "el que esta en diferente ctype.
yo quiero que quede por encima de todo y no hay manera.
Os envio el codigo, antes para que funcione.
teneis de hacer un archivo
scroll.fpg con 3 imagenes y sus numeros de asceso.
1-mapa "el scroll"
3-focus" la imagen que salga de referencia al hacer focus".
4-el cursor "la rata" o el mouse.
[code language="bennu"]import "mod_key";
import "mod_scroll";
import "mod_video";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
//PAG 379.Ñ..
process main()
private
int idfpg;
end
begin
set_mode(640,480,32);
idfpg=load_fpg("scroll.fpg");
start_scroll(0,idfpg,1,0,0,15);
//llamo procesos
proceso1();
proceso2();
rata();
loop
write_var(0,20,10,4,scroll[0].x0);
write_var(0,20,20,4,scroll[0].y0);
if(key(_q)) stop_scroll(0); end
if(key(_esc)) exit();end
frame;
end
end
process proceso1()//personaje principal
begin
scroll[0].camera=id;
ctype=c_scroll;
graph=new_map(30,30,32);map_clear(0,graph,rgb(255,255,255));
x=320;y=240;
z=1;
loop
if(key(_up)) y=y-5; end
if(key(_down))y=y+5; end
if(key(_left))x=x-5; end
if(key(_right))x=x+5; end
frame;
end
end
process proceso2()//enemigo al colisionar con rata y pcihar left sale focus.
begin
ctype=c_scroll;
graph=new_map(30,30,32);map_clear(0,graph,rgb(255,255,0));
x=220;y=200;
z=1;
loop
if(key(_w)) y=y-5;end
if(key(_s))y=y+5;end
if(key(_a))x=x-5;end
if(key(_d))x=x+5;end
frame;
end
end
process rata()//el mouse normal y corriente
BEGIN
graph=4;
ctype=c_scroll;
z=-10000;
//escritos orientativos.
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);
LOOP
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);
IF (key(_esc)) exit(); END
IF (collision (TYPE proceso2)) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
IF (mouse.left) while (mouse.left) frame;end
focus();
end
else
IF (mouse.left) while (mouse.left) frame;end
signal(type focus,s_kill);
end
END
FRAME;
END
END
process focus()
private
begin
graph=3;
size=400;
x=400; //Fondo centrado
y=50;
z=2;
loop
frame;
end
end
[/code]
Os agradezco de veras, mucho vuestra ayuda, os aseguro que os enseñare el juego y direis olé !!! ha merecido la pena :) xD
los fpg?
si arriba lo pongo
el archivo ha de estar en la misma carpeta y con el nombre "scroll.fpg"
contiene 3 imagenes y sus numeros de asceso.
1-mapa "el scroll"
3-focus" la imagen que salga de referencia al hacer focus".
4-el cursor "la rata" o el mouse.
los graficos son nada cualquier dibujo tonto solo para que se vea..
o espera os las pongo yo, no hace falta que las hagas.
mapa scroll : http://img143.imageshack.us/i/primero.png/
"es mu xorra lo se xD"
personaje, enemigo y focus: http://img339.imageshack.us/i/derecha1.png/
rata: http://img195.imageshack.us/i/cuadroespada.png/
creo que es suficiente.
visto el exito...
mas facil.. os dejo el link de descargar..
solo descargar.. ejecutais el prg..
y lo miraris..si podeis :(
la cosa es clara.. la rata queda por debajo de los textos y del proceso focus que focus() se activa cuando pixas con la rata al enemigo...
ahi os lo dejo
http://www.mediafire.com/?c131c4vw4jek402
Bueno veo que esto se ha quedado estancado Drumpi, SplinterGU
El caso lo he medio solucionado con una xapuza... me hubiera gustado haber sabido un buena manera...
lo que he echo es hacer un proceso rata_screen();
solo mostrando la rata... esta sale encima de la otra, poniendo su ctype=c_screen
cuando la rata normal se pone encima de un proceso c_screen queda por debajo, pero rata_screen por encima simulando la rata :)
Los textos siguen quedando por encima de la rata, no he sabido solucinar eso...si sabeis como ya sabeis sino nada
PD: os agradezco SplinterGU y Drumpi vuestro esfuerzo, he aprendido cosas interesante gracias a vosotros asi que por agradecimiento os he dado 1 de karma a cada uno que parece que eso se valora pos os lo regalo ;)
ahora reviso el ejemplo, disculpa, pero estoy con mill cosas de trabajo... pero ahora me hago unos minutos.
he visto tu codigo, mira, tu solucion esta bien, aunque tambien podrias directamente asignarle un grafico al mouse y trabajar con colision contra este.
te paso una modificacion de tu codigo, pero solo a modo didactico (hay algunos tips que te pueden ser utiles), tu solucion esta bien, una sugerencia, al proceso rata que esta detras, ponele alpha=0; asi directamente ni se ve, ni se dibuja.
import "mod_key";
import "mod_scroll";
import "mod_video";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
//PAG 379.Ñ..
process main()
private
int idfpg;
end
begin
set_mode(640,480,32);
idfpg=load_fpg("scroll.fpg");
start_scroll(0,idfpg,1,0,0,15);
//llamo procesos
proceso1();
proceso2();
rata();
loop
write_var(0,20,10,4,scroll[0].x0);
write_var(0,20,20,4,scroll[0].y0);
if(key(_q)) stop_scroll(0); end
if(key(_esc)) exit();end
frame;
end
end
process proceso1()//personaje principal
begin
scroll[0].camera=id;
ctype=c_scroll;
graph=3;
size=200;
x=320;y=240;
z=1;
loop
if(key(_up)) y=y-5; end
if(key(_down))y=y+5; end
if(key(_left))x=x-5; end
if(key(_right))x=x+5; end
frame;
end
end
process proceso2()//enemigo al colisionar con rata y pcihar left sale focus.
begin
ctype=c_scroll;
graph=3;
size=200;
x=300;y=400;
z=1;
loop
if(key(_w)) y=y-5;end
if(key(_s))y=y+5;end
if(key(_a))x=x-5;end
if(key(_d))x=x+5;end
frame;
end
end
process rata()//el mouse normal y corriente
private
int col;
BEGIN
graph=4;
ctype=c_scroll;
z=mouse.z;
//escritos orientativos.
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);
LOOP
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);
IF (key(_esc)) exit(); END
ctype=c_scroll;
col = collision (TYPE proceso2);
ctype=c_screen; x=(mouse.x); y=(mouse.y);
IF (col) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
focus();
else
signal(type focus,s_kill);
END
FRAME;
END
END
#define ONE_INSTANCE_OF_ME(t) while(p=get_id(type t))if(p!=id)return;end; end
process focus()
private
p;
begin
ONE_INSTANCE_OF_ME(focus);
graph=3;
size=400;
x=400; //Fondo centrado
y=50;
z=2;
loop
frame;
end
end
Me as dejado alucinado!
Lo has clavado...
hay cosas por cierto que me han dejado sorprendio...
el cursors pasa por encima de todo asta los textos... eso he visto que lo has echo con z=mouse.z
estoy aluciando porque yo lo pruebo en mi codigo.. y no me funciona... hare copy /pega de es parte xD
Luego... he visto que en la rata canvias el ctype de la rata.. lo inicias en scroll y en el loop pasa de screen a scroll...
no sabia que daria ese efecto, ni lo habia pensado...
vamos que da? precisamente que este como en los 2 ctypes? mola
Lo 3r es la funcion que haces en el focus.. ONE_INSTANCE_OF_ME he estado buscando y no he encontrado nada imagino por el nombre.. que es una funcion para que ese proceso solo se active 1 vez y ya esta...
el define
#define ONE_INSTANCE_OF_ME(t) while(p=get_id(type t))if(p!=id)return;end; end
me ha dejado loco, vamos ni papa xD
total muxisimas gracias.. te doy otro karma.. y muy bien merecido.. realmente me has solucionado el problema en el que llevaba varias semanas peleandome
y el tema por mi ya puede cerrarse.. GRACIAS !!
lo del ctype no es que este en los 2 ctypes al mismo tiempo, sino que para la funcion collision trabaja en el scroll y luego en el momento de dibujar lo hace en la screen.
Yo lo siento, pero ya no podía dedicarle más tiempo al código, estoy con otras cosas más importantes ahora mismo (como ganarme los garbanzos :D).
Respecto a lo de ONE_INSTANCE_FOR_ME es que ha usado define para crear una pequeña rutina, una especie de mini-proceso que contiene el código que le sigue, de forma que se pueda usar en los procesos como una función más (más o menos es lo que se entiende).
Aunque sigo sin entender por qué un proceso dentro de un cscroll no puede ponerse sobre otro cscroll sólo cambiando la Z. Con varios modos7 en la misma región funciona.
Hola de nuevo...
re-abro el tema... por un problema que me surge con un codigo antiguo de este mismo post...
llevo toda la semana mirandolo el error con mi profe.. y lo unico que ha sabiado hacer él son debug sin llegar a nada...
Os pongo el cacho de codigo y lo que ocurre:
[code language="bennu"]process Item_Select_Screen_Background(grafico)
private
int txt = 0;
string vida_txt;
begin
graph=grafico;
size=400;
x=400; //Fondo centrado
y=50;
//scroll[0].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=2;
txt=write_var(0,400,100,4,vida_txt);
loop
vida_txt = "vida " + vida_2;
frame;
end
onexit:
delete_text(txt);
end
[/code]
Bien este codigo es una copia de un codigo de aqui que me corregiste tu SplinterGU.
Hize un copi-paste ya que se adapataba perfecto a mis necesidades.. vamos.. resumidamente...
al crear el proceso me cree un grafico en un lugar de la pantalla... y un texto...
y que cuando matara el proceso.. pues desapareciera todo..
se hizo asi porque no sabia como coño borrar un texto sin borrar otros textos en pantalla....
El problema es.. que no va bien...pensaba que si.. pero haciendo pruebas he visto que aveces al crear el proceso.. se crea el grafico pero el texto no..
osea el texto no se crea... entonces cuando matas el proceso y va a onexit... al no haber la variable de delete_text(txt)
hace un delete_text de todo.. borrandome todos los textos de la pantalla...
La cosa es esa.. aveces el texto
[code language="bennu"]txt=write_var(0,400,100,4,vida_txt);
loop
vida_txt = "vida " + vida_2;
frame;
end
[/code]
No aparece...no tengo ni idea de porque.. he provado de canviarlo de sitio, de poner write_string(0,400,100,4,&vida_text)
de ponerlo fuera del proceso y ponerlo donde llamo para crear el proceso...
y nada aveces se escribe y aveces no.
cuantos textos en pantallas tenes?
luego el delete text es tan simple con poner un if (txt) delete_text(txt);
El problema no es que cuando no aparezca el text me lo esborre todo.. el problema es que cuando creo el proceso.. pues 3 de cada 10 veces no sale el texto...
osea no me crea el texto...
por eso te pregunto, cuantos textos en pantalla tenes? hay un limite, y si no tenes control que cada instancia se cree 1 vez, cuando lanzas 1 proceso texto, podes estar lanzando 100 o 200, y ahi te vas a quedar rapido sin textos disponibles y por ende te va a fallar, aunque vos solo veas un texto, porque se superponen entre si.
ay limite?
pues haber en el momento de las pruebas tenia....8 textos..
2 en un loop que no pasaba anda si se borraban porque se volvian a crear.. y 6 sueltos..
cuando creaba el focus ese era el 9 textos...
y tengo una validacion para solo crear un proceso de focus.. osea como maximo ese es el 9.. aveces sale aveces no...
no, lo maximo son 512 o 1024, algo asi.
pone un ejemplo compilable de tu codigo y lo vemos.
No hace falta... con lo que em digiste fue suficiente para arrecglarlo.. a menos a simple vista es asi..
no se me ocurrio antes.. quite los write de dentro el loop
i los saque a fuera.. y yata xD
claro en el loop se van creando llegan al cupo de escritos i plaf... ya no va...
mexi
si, es eso.
pero el codigo que habias puesto aca (el mismo que puse yo) no tenia el write dentro del loop... imagino que lo tenias en otro proceso...
bien... ya me parecia raro... me alegro que ya lo tengas solucionado y comprendido.
Cuidado con los textos, son más difíciles de controlar que los procesos xD
Bienvenido a la programación orientada a objetos :D :D :D
BUenas de nuevo!
tengo un problemon...
Acabo de ver que no se pueden hacer colisions con diferentes types en un mismo proceso...eso es un gran problema que no se como solucion...
recordais el proceso rata()? lo uso para eso.. marcar a los diferentes enemigos como cualquier juego de rol... el caso esque todas las pruebas las he echo con 1 solo proceso...
Ahora al tener mas procesos a los que marcar "un total de 3 enemigos" me sale el problema...
Hoy lo he visto y llevo liado con eso pues toda la tarde... no hay manera...
Osea mi objetivo es.. con la rata si esta colisionando con enemigo1, al pichar me ejecute focus_enemigo1();
si la rata esta colisionando con enemigo2, al pichar me tiene de ejecutar focus_enemigo2();
La cosa esque solo funciona un colision por proceso...
ideas?
Os dejo el codigo de rata.. con algun comentario de pruebas...
[code language="bennu"]process rata()//el mouse normal y corriente
private
int col;
int col_1;
BEGIN
graph=4;
ctype=c_scroll;
z=mouse.z;
//escritos orientativos.
write(0,300,90,4,"movimiento rata x,y");
write_var(0,300,100,4,x);//coordenadas de la rata
write_var(0,300,110,4,y);
write_var(0,100,100,4,id_2.x);// referencias enemigo 1 los de izkierda
write_var(0,100,110,4,id_2.y);
write_var(0,600,100,4,id_22.x);// referencia de enemigo2 los de derecha
write_var(0,600,110,4,id_22.y);
LOOP
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);
IF (key(_esc)) exit(); END
ctype=c_scroll;
//PRUEBAS
//----------------
//he intentado hacer 2 if... diciendole al proceso rata que si esta cercano a las coordenadas de id_2"enemigo1"
//que haga la colision con ese proceso.
//pero si esta mas cercano a id_22 "enemigo 2" pues que la colision la haga con el..
//esta en comentario porque no me funciona tampoco
/*if ((((x-id_2.x)<=10 and (x-id_2.x)>=0)) or (((id_2.x-x)<=10 and (id_2.x-x)>=0)) and ((y-id_2.y)<=10 and (y-id_2.y)>=0) or ((id_2.y-y)<=10 and (id_2.y-y)>=0))
col = collision (id_2);
end
if ((((x-id_22.x)<=10 and (x-id_22.x)>=0)) or (((id_22.x-x)<=10 and (id_22.x-x)>=0)) and ((y-id_22.y)<=10 and (y-id_22.y)>=0) or ((id_22.y-y)<=10 and (id_22.y-y)>=0))
debug;
col_1 = collision (id_22);
end*/
//------------------
col = collision (id_2);
col_1 = collision (id_22);
ctype=c_screen; x=(mouse.x); y=(mouse.y);
IF (col) //si hay colision con proceso1, " es la unica que hay ya que es el 1r colision"
IF (mouse.left) while (mouse.left)frame;end
IF ( exists ( type focus) );
else
focus();
marca(id_2.x,id_2.y);
end
end
else
IF (mouse.left) while (mouse.left) frame;end
IF ( exists ( type focus) )
signal(type focus,s_kill);
signal(type marca,s_kill);
end
end
END
IF (col_1) //si hubiera colision con el enemigo2.
IF (mouse.left) while (mouse.left)frame;end
IF ( exists ( type focus) );
else
focus();
marca(id_22.x,id_22.y);
end
end
else
IF (mouse.left) while (mouse.left) frame;end
IF ( exists ( type focus) )
signal(type focus,s_kill);
signal(type marca,s_kill);
end
end
END
FRAME;
END
END[/code]
PD:si necesitais que os ponga un prg para ejecutarlo y tal decidmelo.. pero dios todo el esfuerzo para verme en esta situacion.
si necesitas hacer mas de 1 collision por frame, necesitas recoger todos los collision de un tipo y luego todos los de otro, y luego otro, y asi sucesivamente.
No te acabado de entender...
ya esta en 2 if.. es 1 o otro..
nose a que te refieres con los frames a las colisions _S
De momento la solucion que tengo..es super fea...si tengo 3 enemigos.. hacer 3 procesos de rata, uno encima de otro...
asi solo necesito hacer 1 colision por proceso.. PERO ES HORRIBLE! Xd
espero no tener de quedarse asi...
prefiero entender lo que me dices :D
a ver...
leiste esto? http://wiki.bennugd.org/index.php?title=Collision
si aun asi no queda claro volve a preguntar.
realmente sigo sin entender...
es el ejemplo de colision con 1 proceso... me lo he mirado y nose.. no me abierto los ojos
bien, explico... (aunque veo que no es el problema, el problema lo describo abajo)
collision es una funcion que recorre todos los procesos que estan colisionando contra el proceso actual, esta lista se reinicia por 2 motivos:
1) instruccion frame
2) collision a otro tipo de proceso u otro proceso o proceso 0 (ALL)
este es tu problema:
por otro lado, si vos en el else del primer collision haces una espera hasta que se suelte el boton izquierdo del mouse y luego en el if de la colision siguiente pretendes que para que se active la logica de la 2da colision este el boton izquierdo pulsado, entonces estamos en un gran problema ya que el boton dejo de estar pulsado para seguir.
Mmm...
cierto la collision veo que funciona "entre comillas"
si justo hacer la collision llamo a los procesos que deseo llamar sin pichar la tecla del mouse. y funciona...
claro nose al quitar el colision con la rata para matar los procesos creados.. se me sale el juego..
Aunque no acabo de entender porque lo de pichar con la rata no funciona? y que solucion podria haber?:S
No sé si esos dos procesos con los que colisiona la rata son del mismo tipo o no, pero yo siempre uso collision con tipos, no con IDs:
id_colisionado=COLLISION (TYPE nombre_proceso_a_colisionar);
Esto te devuelve cada vez que lo llamas la ID de cada proceso "nombre_proceso_a_colisionar" con la que choca. Si tienes, por ejemplo, tres procesos "rata" y sólo choca con una, te devuelve su ID y no necesitas comprobar las demás, porque ya lo ha hecho. Si lo metes en un bucle, puedes obtener las diversas ID hasta que te de 0.
Ya he solucionado el problema.. al menos creo...
Pensando en lo que me habeis dicho...
lo he echo me ha funcionado...
Os pongo el trozo de codigo que he modificado
[code language="bennu"]IF (col) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
IF (mouse.left) while (mouse.left)frame;end
IF ( va_focus==1 );
else
if(txt)
delete_text(txt);
end
signal(type focus,s_kill);
signal(type marca,s_kill);
va_focus=1;
focus();
marca(id_2.x,id_2.y);
end
end
else
IF (mouse.left) //while (mouse.left) frame;end
IF ( exists ( type focus) and va_focus==1 )
delete_text(txt);
signal(type focus,s_kill);
signal(type marca,s_kill);
va_focus=0;
end
end
END
if( (col = collision(type proceso2)))
text2 = "collision 2: " + col;
text22 = " no collision 22: " + col_1;
elseif((col_1 = collision(type proceso22)))
text2 = "no collision 2: " + col;
text22 = "collision 22: " + col_1;
else
text2 = "no collision 2: " + col;
text22 = " no collision 22: " + col_1;
text = "no collision";
end
IF (col_1) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
IF (mouse.left) while (mouse.left)frame;end
IF ( va_focus==2 );
else
if(txt)
delete_text(txt);
end
signal(type focus,s_kill);
signal(type marca,s_kill);
va_focus=2;
focus();
marca(id_22.x,id_22.y);
end
end
else
IF (mouse.left) //while (mouse.left) frame;end
IF ( exists ( type focus) and va_focus==2)
delete_text(txt);
signal(type focus,s_kill);
signal(type marca,s_kill);
va_focus=0;
end
end
END[/code]
Vamos resumiendo.. he puesto la variable va_focus "es simplemente una variable que determina a quien estoy focuseando"
La cosa es.. simplemente del codigo anterior a este solo he modificado la tonteria de los else.. osea cuando no hya colision le he quitado el while... de frames....
realmente asi me funciona al menos eso parece...haciendo referencia a lo que me has dicho de los frames con las colisiones...
La cosa es.. me funciona muy bonito, pero...porque? no lo entiendo porque quitando esa parte me funciona? osea me gustaria saber como funciona el rollo de colisions con los frames, no lo acabado de entender y no he entendido porque quitando los whiles [code language="bennu"]//while (mouse.left) frame;end [/code] del else me funciona... me gustaria saberlo :D
gracias:D
por que con eso, estas esperando a que se suelte el boton para continuar, y paso seguido a eso (una vez soltado el boton), para que la siguiente condicion se cumpla tenes que tener el boton presionado, pero como va a estar presionado si vos hiciste una pausa hasta que el boton se suelte?
juas.. debo ser un poco tonto..
xD
mm si es cierto lo que dices pero.. cuando lo suelto... se acaba el while y todo vuelve a la normalidad... asta que no lo vuelva a apretar...
Porque se mantiene pulsado mientras este en el while, osea mientras lo pulse...
no entiendo lo que me quieres decir porque yo lo veo asi.. no se que tiene que ver este while.. con el problema.. porque ala que lo suelto se quita la pausa..entonces puede volver a pulsarse.S:
A ver, cuando llamas a collision, internamente se genera una lista de procesos con los que choca el que lo llama. Pero claro, collision no te puede devolver todos los IDs de golpe, sólo te puede devolver un valor, como todas las funciones.
Entonces, lo que hace es que cada vez que lo llamas, te devuelve un valor distinto de esa lista, hasta que se acaba y te devuelve cero.
Lo que pasa, es que la lista se genera dependiendo del valor que le pases: si le pasas la ID de un proceso, la lista tendrá un único elemento, si usas TYPE la lista contendrá todos los procesos existentes con ese nombre que colisionen con tu proceso, y si le pasas cero, pues no tendrá un filtro.
Pero esta lista la mira en orden, y no se puede volver atrás. La única forma de leer la lista desde el principio es que el proceso haga un frame o cambies de TYPE para que genere una nueva lista.
Otra cosa: no veo claro usar TYPE con SIGNAL, se supone que las señales se mandan a un proceso determinado, y TYPE indica "a un proceso cualquiera con ese nombre" (supongo que sabes que se pueden generar diversos procesos con el mismo nombre, por ejemplo, "rata" ¿no?). Si tienes un único proceso, bien, pero a poco que tengas más de uno, no sabes a cuál va a ir dirigido.
drumpi, estas mezclando las cosas...
aca no entiende el while... a ver... ya no se como explicarlo... voy a intertar de nuevo... con pseudocodigo...
- si colisiono1 entonces,
- me fijo si tengo pulsado el boton del mouse
- lo tengo, asi que espero a que lo suelte para continuar
- creo proceso focus
- si no colisiona1 (else del if anterior)
- me fijo si tengo pulsado el boton del mouse
- lo tengo, asi que espero a que lo suelte para continuar
- elimino el proceso focus
(para este entonces ya el boton del mouse esta sin pulsar, porque de eso me encargue con los whiles del if y else anterior)
- si colisiono2 entonces,
- me fijo si tengo pulsado el boton del mouse (no lo voy a tener porque en el if y else anterior me asegure de que no este pulsado para seguir)
- lo tengo, asi que espero a que lo suelte para continuar
- creo proceso focus
- si no colisiona2 (else del if anterior)
- me fijo si tengo pulsado el boton del mouse (no lo voy a tener porque en el if y else anterior me asegure de que no este pulsado para seguir)
- lo tengo, asi que espero a que lo suelte para continuar
- elimino el proceso focus
---
si no se entiende ahi, yo me doy por vencido... a ver si algun otro lo puede explicar...
Vale veo que no se reinicia digamos... okis..
luego lo que hago es matar todos los procesos de focus.. si se lo que me hago.. xD
Mas o menos ya os estoy entendiendo.
Realmente con lo que me dices Drumpi de hacer collision con el proceso o con su id.. realmente noto que me da los mismo valores..
BUeno el caso esque noto que la idea de hacer una rata normal y corriente me da muchos problemas...
SI... no esta del todo resuelto como dije antes.. parecia que iva bien pero no.
Vamos por partes...
Tal y como lo tengo ahora.. osea como lo mostre anteriormente que dije que me iva...tiene pequeños problemas bastante raros a mi entender.
Todo funciona correctamente... hace sus 2 colisiones con los 2 procesos diferentes, estos procesos se mueven.. y al canviar de posicion sigue funcionando... PROBLEMA...
Cuando el que se mueve soy yo osea mi proceso estando en un scroll que la camara le sigue.
La colision varia...Haber si me explico: me explicare refiriendome a 1 proceso al que se le pueda hacer focus.. realmente me pasa con los 2.
enemigo"para hacer el focus": tiene las coordenadas x=10 y=10
prota: "el proceso que la cara le sigue por el mapa..."
a primeras.. hago el colision con la rata a proceso enemigo, correctamente...
prota se mueve quedandose en la coordenada y=y+20
Una vez me he movida he perdido la referencia a la colision con enemigo...
ahora si quiero hacer colision enemigo tiene de ser en la coordenada x=10 y=30
osea.. la colision con los enemigos se mueve junto con el personaje...
Una vez pasa esto.. muevo el enemigo... pues su colision se mueve tmb quedandose siempre perdida como pongo arriba.
------------------------
Esto es un problema que nose porque me lo da.. con el codigo que puse arriba espero que se entienda.
---
2n problema...
--
Dado este problema.. se me ocurrio una grandiosa idea...
Envez de hacerlo tan lioso con las colisiones en el proceso rata...hacerlo al reves los procesos de enemigo tuvieran el colision con la rata...
una vez colisionara se pusiera una variable a true/false que en el proceso rata.. hiciera que creara el respectivo proceso de focus...
Esto a papel era una gran idea.. y la implemente...y salio un problema ..
La colision no funcionaba...
El codigo importante de la rata en este caso es el siguiente:
[code language="bennu"]
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);
ctype=c_scroll;
ctype=c_screen;
x=(mouse.x); y=(mouse.y);[/code]
Visto esto que me enseñastes tu SplinterGU pasa algo que haciendo las colisions en el proceso rata no pasaba..
que el los otros procesos no detecta la colision con la rata...
haciendo pruebas quito la linea [code language="bennu"]type=c_screen;
x=(mouse.x); y=(mouse.y);[/code]
Asi si que funciona el colision...osea vamos no lo detecta por el canvio a c_screen dado que antes si funcionaba..
Con esto pasa el problema de.. la rata se queda por debajo de los procesos que he de poner en c_screen.
No entiendo porque desde rata funciona y de los otros no funciona...
SI lo se, es un puto lio....Espero que este laberinto de hacer la rata llegue a buen puerto :( xD
jejeje... se te esta complicando un poco la cosa...
los 2 ctype seguidos no tiene sentido, lo que yo te mostre es un truco sucio que lleva entre medio un frame, cuando va al frame tiene que tener c_screen, en la logica tiene c_scroll.
Lo puse asi porque.. antes ahi en medio antes de volver a llamar a c_screen habia la colision...
pero claro en ese problema la colision la hago con el proceso enemigo.. y no lo detecta porque siempre da con que rata es c_screen y no estan por tanto en el mismo ctype.. ahi es donde hay el problema :S
claro... pero si usas el doble proceso, el rata con c_screen para dibujarlo y un rata c_scroll para las colisiones no vas a tener problema.
ostias cierto que tonto.. no me acordaba de eso xD
mas que nada porque la semana pasada se me revento la particion de linux y perdi todos los datos que tenia y claro me tuve d eponer hacerlo todo xD
es otra historia..
si con el doble proceso lo he provado y funciona perfectamente...
aunque claro la idea era hacer una rata bien echa no una chapuza..xD
POrque mi juego es de pocos procesos.. pero imagino que en un juego tocho la chapuza de hacer 2 procesos para una rata estaria bastante mal no? ja que carga inutilmente la memoria y nose si seria bueno hacerlo asi...
o estoy exagerando y esta forma de hacer la rata la puedo usar siempre?
es 1 solo proceso el que va arriba de los textos, el resto no.
eso no significa mucha carga.
bueno es rata(); rata_screen(); pero si por 1 mas...
bueno ahora me tengo de dedicar a unir todo el codigo que espero que no me de mas problemas por favor xD y ya la semana que viene lo tengo de tener finitikao...y ya os lo subire para que lo veais!