noob necesito ayuda plz

Started by abaray, September 26, 2009, 11:57:09 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Yo lo que veo es que parece que te hayas dejado varios END para los IF, te recomiendo una cosa:

Siempre que habras un IF separa las instrucciones asociadas a la condición con un tabulador, y cuando terminen sitúa el END a la misma altura del IF que lo abre...

En otro caso es imposible mirar tu código ni ayudarte, ya que no sé si es que te has equivocado y te falta algún END o que pretendes hacer algo extraño para animar.

De verdad, sin poner tabuladores en ese código y situar los IF justo encima de los END es ilegible, mira cualquier ejemplo del tutorial y fíjate cómo lo hago.

También se agradece mucho tener los IF, LOOP, END en mayúsculas, las etiquetas que se ven azules en general en el Notepad++

Haz eso y verás como te ayudamos con mucha más facilidad, en cualquier caso deberías saber que el tema de la animación puede llegar a resultar MUY complejo. En ese sentido tengo los temas 22 y 23 casi listos y tratan ambos sobre la animación, tan compleja como la quieras hacer, vendrá con un módulo .prg te ayuda y con ello verás que animar puede suponer un intenso placer para el aparato reproductor humano :o

PD: La solución de DCelso es muy buena, al menos para resolver el tema de animación arriba,abajo,derecha,izquierda.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

abaray

#16
DCelso I LOVE YOU a partir de ahora te llamare "MR.RAR" x q encima de resolverme el problema me lo has pasao de unas 50 lineas a 10.
X cierto lo colgaste y lo edistaste despues o soy yo q corto y pego mal x q tube como 1 hora peleandome con el codigo x q la forma me molo muxisimo hasta q me di x vencido y volvi a mirar el post a ver si respondio alguien mas y me da q ese ultimo if era diferente la primera vez q lo mire.

el codigo lo entiendo bien ecepto x 2 cosas:
1ª he notao un efecto raro y es q la animacion me corre un poco bastante mas lenta (mejor iva muy rapida) y yo x lo menos segun el codigo no veo nada q le diga q corra mas lento x q sera?
2ª no entiendo x q si pulso izquierda y arriba a la vez el programa se decide x la animacion de arriba en vez de la de izquierda es justo lo q queria pero es q no entiendo x q.Si me lo pudierais esplicar me ayudaria a entender un poco mas como piensa la maquina y podria dar pie a q os de un poco menos la lata.

Lo del codigo pa la proxima intentare ponerlo como dices lo q paso es q los if q use pa las animaciones fue un corta pega del tutorial de osk y en vez de poner los end debajo de los if como en el resto en esas lineas lo tenia al final y con la impaciencia de solucionar el problema no me di cuenta de limpiarlo un poco para hacerlo mas legible pa la proxima intentare dejarlo mas lejible sorry .
gracias a todos y hasta la proxima q seguro sera dentro poco


Drumpi

Sólo le veo explicación a la segunda pregunta (demasiado sueño para la otra).
El que se decida por arriba y abajo tiene que ver por el orden que les ha cado a las sentencias IFs de las teclas: fíjate que en cada IF se le asigna un valor distinto a gfx_min y gfx_max, cuando termine con todas las comprobaciones, estas variables, obviamente, valdrán el último valor asignado, porque se habrá sobreescrito a las anteriores.
Dentro de un proceso, las instrucciones son secuenciales, una detrás de otra, y la última prevalece sobre la anterior siempre.
Si quieres que prevalezcan los lados respecto a las teclas verticales, basta con poner las comprobaciones de _left y _right despues de las de _up y _down.
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)

DCelso

Jurl entonces yo te llamaré "MR.EXPAND" :D.
Efectivamente cambié el código en ese último if, no porque me hubiera equivocado, que podría ser el caso pero esta vez fué por culpa del foro si pones los "mayoresque", "menoresque" y "OR" sin espacios por delante y por detrás los usa como carácteres especiales y no los representa en pantalla. Me dí cuenta al releer el post una vez enviado, pensé su p..madre si eso no es lo que puse, lo edité y ví el problema así que metí espacios por todos lados en el condicional y cruzé los dedos para que funcionara y funcionó, menos mal sino ni arj idea de como expresarlo.

En cuanto al segundo punto que pones, es exactamente lo que dice DRUMPI, el compilador va leyendo instrucción a instrucción al igual que nosotros leemos el código de arriba a abajo así que si pulsamos arriba e izquierda a la vez primero hace lo que pone el
if (key(_left)) x-=av_x; gfx_min=13;gfx_max=18; end así que decrementa "x" y cambia a los gráficos de ir a la izquierda, después sigue leyendo el código y no se cumplen los otros "if" pero al llegar al if  if (key(_up)) y-=av_y; gfx_min=7;gfx_max=12;end ve que se cumple y también lo ejecuta así que usa los gráficos de este último estado y decrementa "y"
El orden lo hice así a posta porque pusiste que querías que se viera la animación de ir hacia arriba, no fue casualidad eh.

Te respondí al segundo punto antes porque está relaccionado con lo que te pasa en el primero, si ahora entiendes cómo lee el procesador las instrucciones sabrá porqué te va a ti mas rápido en las diagonales asi que no leas esto, en el caso de pulsar arriba e izquierda en tu código el compilador ejecutaba el condicional que pusiste para tu diagonal , decrementando "x" e "y", pero después tambien ejecutaba el condicional para izquerda, decrementando "x" una vez mas, y luego después el condicional para arriba decrementando "y" una vez mas, el efecto es que va el doble de rápido, sino, selecciona estas lineas en blanco para ver qué te pasaba.
Monstruos Diabólicos

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

abaray

ya veo q tengo q practicar mi forma de expresarme textualmente no me entendiste el primer punto  lo q pasa es q exactamente solo cambiando mi codigo x el tuyo y añadiendo las variables nada mas:
paso de moverme los 6 frames de la animacion de (por decir numeros)0.5 segundos a 0.7 segundos o x lo menos me da esa impresion y el set_fps sigue igual q con el otro codigo a q se puede deber eso o son imaginaciones mias.
lo del movimiento extra en las diagonales ya me di cuenta al meter y releer tu codigo para pillar como funciona.

PDTA:gracias del pesao de turno.


DCelso

juas, ok, pues si lo dices por rendimiento, npi, yo se que los condicionales son lentos pero vamos para que se aprecie de tener 12 condicionales a 6 no creo.
Monstruos Diabólicos

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

Windgate

Aquí tienes el primero de los 2 temas dedicados a la animación compleja:

http://trinit.es/tutoriales/

El PDF es el último de todos, el tema 22, te recomiendo echarle un vistazo, es muy cortito.

Luego con el segundo tema (Que es el "obeso") lo tendrás todo en un fichero .prg separado, jamás deberás preocupar de los números de gráfico y te serviría para gestionar cualquier cambio de animación, por complicada sea, gracias a esa parte animé TODAS las animaciones de Ryu de Street Fighter (Andar, quieto, andar de espaldas, salto, 3 tipos de patada, 3 tipos de puñetazo y agacharse) e iba como la seda.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

abaray

Bueno seguimos con los problemas lo q pasa es q soy un inutil y no soy capaz de hacer q me cambie de nivel x asi decirlo
(en este caso es un juego de rol asi q en vez de cambiar de nivel seria de mapa)
Aqui os pongo el codigo q tengo de momento y despues os esplico q e intentado
PROGRAM videojuego;
INCLUDE "DLL\import.prg";           
GLOBAL
INT ID_protagonista;
INT file1;

BEGIN
set_mode(800,600,32,MODE_WINDOW);    
file1=load_fpg("images/rpg.fpg");
set_fps(15,0);
ID_protagonista = protagonista ( );            
start_scroll ( 0 , 0 , 21 , 0 , 0 , 12 );
scroll[0].camera = ID_protagonista;

END                    

PROCESS protagonista()
private
INT despega_x;                //variable del valor de la cordenada X para despegar de una dureza contra la q aya sacado
INT despega_y; //variable del valor de la cordenada Y para despegar de una dureza contra la q aya sacado
INT obs; //variable q nos avisara de cuando esta chocando con la dureza
INT av_x; //variable para ajustar el movimiento en pixeles de la cordenada X
INT av_y; //variable para ajustar el movimiento en pixeles de la cordenada Y
INT gfx_max ; //variable q indica el grafico max de la animacion de movimiento
INT gfx_min; //variable q indica el grafico minimo de la animacion de movimiento
INT cnt; //variable de Color No Transitable (dureza)

BEGIN
ctype = C_SCROLL;    
x = 1550; //cordenada X con la q empieza el primer mapa
y = 2980; //cordenada Y con la q empieza el primer mapa
size=180;
CNT=map_get_pixel(file1,22,100,100); //le indico el archivo y zona del color no transitable (dureza)     
LOOP
despega_Y=0;
despega_x=0;
IF (key(_right)) despega_x=5;
END
IF (key(_left)) despega_x=-5;
END
IF (key(_up)) despega_y=-5;
END
IF (key(_down)) despega_y=5;
END
IF (map_get_pixel(file1,22,x+despega_x,y+despega_y)==cnt) //condicional q nos indica si hay obstaculos
obs=true;
ELSE
obs=false;
END
av_x = 5;
av_y = 5;
gfx_min =23;
gfx_max =23;
IF (obs==false)

IF (key(_left)) x-=av_x; gfx_min=13;gfx_max=18;flags=1; //condicionales con los cuales movemos y animamos el personaje
END
IF (key(_right)) x+=av_x; gfx_min=13;gfx_max=18;flags=0;
END
IF (key(_down)) y+=av_y; gfx_min=1;gfx_max=6;
END
IF (key(_up)) y-=av_y; gfx_min=7;gfx_max=12;
END
graph+=1;
IF ( graph  <  gfx_min OR graph > gfx_max ) graph=gfx_min;
END

END
IF (key(_esc))     // condicional que al pulsar escape nos cierra el juego
exit(0);    
END    
FRAME;    
END    
END    

//Notas
//Casa 1 IF (map_get_pixel(file1,22,1570,1740))
// MAPA2
//Graficos Abajo: 1 a 6 ;Arriba: 7 a 12; Derecha: 13 a 18; Quieto: 23; Mapa1: 21;Dureza1: 22


Como puedes ver windgate esta vez ta un poco mejor colocado el codigo tal como me recomendaste ;D

Consegi hacerlo haciendo un proceso nuevo para el 2º mapa pero puesto q tengo intencion de hacerlo x lo menos con unos 100 mapas o mas no creo q sea buena solucion tb intente hacerlo con switch (level) como esplica el tutorial sobre FENIX de Osk pero no se si son incompativilidades con bennu o yo q me lio pero no soy capaz asi q si  me podeis orientar un poco sobre como hacerlo os lo agradeceria no os pido q me hagais el codigo x q si no no tendria gracia hacer el juego para eso usaria el rpgmaker o similares os agradecere toda ayuda

El codigo q os e puesto esta totalmente funcional aunq no es mas q un keko moviendose x un mapa inmenso con scroll y chocando con las cosas.

PDTA: otra vez gracias del pesado de turno ;D


DCelso

Pues no veo ningún control de cambio de fase, así que será dificil de ayudarte.
Si lo que quieres es que lo implementemos en el código que dejaste, el resultado podría ser algo como esto

PROGRAM videojuego;
INCLUDE "DLL\import.prg";           
GLOBAL
INT ID_protagonista;
INT file1;
int gfx_nivel;

BEGIN
    gfx_nivel = 21;
set_mode(800,600,32,MODE_WINDOW);    
file1=load_fpg("images/rpg.fpg");
set_fps(15,0);
ID_protagonista = protagonista ( );            
start_scroll ( 0 , file1 , gfx_nivel , 0 , 0 , 12 );
scroll[0].camera = ID_protagonista;
LOOP
    IF (key(_f))     // intercambiamos a pantalla completa o no
            while (key(_f)) frame; end      // hacemos bucle no bloqueante hasta que soltemos la F.        
        full_screen = !full_screen;
        set_mode(800,600,32);
END    
    IF (key(_1))     // intercambiamos a pantalla completa o no
            while (key(_1)) frame; end      // hacemos bucle no bloqueante hasta que soltemos la F.        
        if (gfx_nivel <> 21)
                gfx_nivel = 21;
                start_scroll ( 0 , file1 , gfx_nivel , 0 , 0 , 12 );
            end            
END    
    IF (key(_2))     // intercambiamos a pantalla completa o no
            while (key(_2)) frame; end      // hacemos bucle no bloqueante hasta que soltemos la F.        
        if (gfx_nivel <> 24)
                gfx_nivel = 24;
                start_scroll ( 0 , file1 , gfx_nivel , 0 , 0 , 12 );
            end            
END    
    IF (key(_esc))     // condicional que al pulsar escape nos cierra el juego
exit(0);    
END    
FRAME;    
END
END                    

PROCESS protagonista()
private
INT despega_x;                //variable del valor de la cordenada X para despegar de una dureza contra la q aya sacado
INT despega_y; //variable del valor de la cordenada Y para despegar de una dureza contra la q aya sacado
INT obs; //variable q nos avisara de cuando esta chocando con la dureza
INT av_x; //variable para ajustar el movimiento en pixeles de la cordenada X
INT av_y; //variable para ajustar el movimiento en pixeles de la cordenada Y
INT gfx_max ; //variable q indica el grafico max de la animacion de movimiento
INT gfx_min; //variable q indica el grafico minimo de la animacion de movimiento
INT cnt; //variable de Color No Transitable (dureza)

BEGIN
ctype = C_SCROLL;    
x = 1550; //cordenada X con la q empieza el primer mapa
y = 2980; //cordenada Y con la q empieza el primer mapa
size=180;
CNT=map_get_pixel(file1,gfx_nivel+1,100,100); //le indico el archivo y zona del color no transitable (dureza)
    //, el gráfico del mapa de durezas siempre será un número mayor al gráfico del mapa y el color del pixel 100,100 siempre será el no transitable en todos los mapas       
LOOP
despega_Y=0;
despega_x=0;
IF (key(_right)) despega_x=5;
END
IF (key(_left)) despega_x=-5;
END
IF (key(_up)) despega_y=-5;
END
IF (key(_down)) despega_y=5;
END
IF (map_get_pixel(file1,22,x+despega_x,y+despega_y)==cnt) //condicional q nos indica si hay obstaculos
obs=true;
ELSE
obs=false;
END
av_x = 5;
av_y = 5;
gfx_min =23;
gfx_max =23;
IF (obs==false)

IF (key(_left)) x-=av_x; gfx_min=13;gfx_max=18;flags=1; //condicionales con los cuales movemos y animamos el personaje
END
IF (key(_right)) x+=av_x; gfx_min=13;gfx_max=18;flags=0;
END
IF (key(_down)) y+=av_y; gfx_min=1;gfx_max=6;
END
IF (key(_up)) y-=av_y; gfx_min=7;gfx_max=12;
END
graph+=1;
IF ( graph  <  gfx_min OR graph > gfx_max ) graph=gfx_min;
END

END
IF (key(_esc))     // condicional que al pulsar escape nos cierra el juego
exit(0);    
END    
FRAME;    
END    
END    

//Notas
//Casa 1 IF (map_get_pixel(file1,22,1570,1740))
// MAPA2
//Graficos Abajo: 1 a 6 ;Arriba: 7 a 12; Derecha: 13 a 18; Quieto: 23; Mapa1: 21;Dureza1: 22;Mapa2: 24;Dureza2: 25
Monstruos Diabólicos

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

Windgate

Controlar el cambio de fase es complejo, yo suelo poner un proceso crear_escenario()

Se encarga de destruir todo bicho viviente y posteriormente generarlo. Hace uso de stop_scroll, delete_text y signal... Quizás cosas demasiado avanzadas si estás empezando...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DjSonyk

#25
Hola Abaray, si realmente eres muy nuevo te aconsejaria que practicaras con un arbol como te pongo en el ejemplo,solo es un ejemplo no muy elavorado pero que te puede servir de referencia,con unas horas que practiques seguro que te queda claro que deves comprobar y cuando y todas las cosas ya sea restar energia,cambio de nivel,pasar a una fase bonus...ect...
Por cierto no se como se ponen imagenes xD sin tener que poner a descargar :P.

DCelso

¿Arbol? Si tiene como ramas encadenadas, yo llamaría grafo a eso. ;D
Monstruos Diabólicos

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

Windgate

Para poner imágenes aquí las tienes que subir a un hosting o enlazarlas desde donde estén alojadas... Que yo sepa.

Para el cambio de fase si hago algún ejemplo mega-sencillo lo cuelgo...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

E insertas la url de la imagen entre [ img ] y [ /img ] sin espacios.
Monstruos Diabólicos

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

Windgate

Ciertamente, yo uso el botoncito del editor de mensajes que lo pone sólo, es que soy muy perezoso xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es