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.

abaray

Primero daros la enorabuena  por el foro y paginas web tanto oficiales como no de bennu.

Llevo sin intentar programar desde epocas de div1 y tampoco es q hiciera mucho.

El problema es q estoy intentando hacer un rpg algo estilo ff(de los viejos) o lufia

1er problema no se como poner q si aprieto los cursores arriba e izquierda u derecha a la vez me ponga la animacion de arriba y mas de lo mismo con abajo. y a parte q cuando tenga la diagonal pulsada q me avance mas lento por q va mas rapido puesto q esta moviendo los 5 d x y los 5 d y  osea mueve 10 pixel en vez de 5

2º problema no se como crear mas niveles (otros mapeados , combates etc) vi algo en un antiguo tutorial sobre fenix de OSK con un switch y tantos case como mapeados pero no consigo hacer nada asi q si podeis ayudarme os lo agradeceria mucho

PDTA: sorry x las molestias y gracias x la ayuda q espero me deis :)

DjSonyk

Buenas:

En cuando tu primera pregunta creo que te refieres a pulsar las diagonalesque se vea la animacion del personaje en diagonal,no?
Me imagino que tendras todas las animaciones en las 8 direcciones...Intenta algo asi...

IF ((Key(_UP))&&(Key(_Left)))
   graph=Animaciones diagonal arriba-izquierda;
   x-=5;y-=5;
end
IF ((Key(_UP))&&(Key(_Rigth)))
   graph=Animaciones diagonal arriba-derecha;
   x-=5;y+=5;
end
ect..
En cuando a tu segunda pregunta existe en el Pack 1.7 de Bennu un editor llamado TilesAndMap buenisimo y muy facil,en los que ademas puedes dar efecto de sombras,efectos de luz ,ect y queda muy bien ,y como he dicho facilisimo..
Saludos y Suerte...

Prg

el punto uno se puede hacer de muchísimas formas diferentes

if (key(_right) and key(_up))
     animacion=a; x+=5; y-=5;

     elseif (key(_right))
     animacion=b; x+=5;

     elseif (key(_up))
     animacion=c; y-=5;
end
o cosas asi, usando el else y elseif :)

lo de los niveles lo puedes hacer de muchas formas distintas, el más cómodo es como lo hace osk:

switch (nivel);
     case 1: //lo que pasa en el nivel uno
            cargaa();
            cargab();
            cargac();
     end
     case 2: //lo que pasa en el nivel dos
            carga1();
            carga0();
            cargac();
     end
end

esto lo pondrias en una funcion o proceso que llamarías cada ves que quieres cargar un nivel y lo pondrias en el begin, fuera de bucles.
es un ejemplo, seguro luego te darán más :) bienvenido al foro :)
edito:
je je
ya se me adelantaron :) je je
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DjSonyk

Por cierto en cuando los combates estilo FF , no es muy complicado.
Deves decidir cuantos enemigos podrian salir previo al combate, y seria crear los precesos de tantos enemigos salieran,les pones una variable por ejemplo "Tiempo de Ataque=100", cuando el proceso enemigo llegara a ese 100 ,podria atacar,lanzar magias,curarse ,ect.
Eso si la variable mejor Local o Privada , y no se te olvide que tiene que estar a 0 de nuevo independientemente de la accion que realizara.

Saludos.

Drumpi

Abaray, no deberías preocuparte por que avance el personaje más en diagonal o no, los FF no hacen esa diferenciación: si pulsas izquierda se mueve x pixels a la izquierda, independientemente de si se pulsa arriba o no.
De todas formas, si quieres hacer cosas diferentes según la dirección, aqui va un truco:

-Observa el teclado numérico que tienes a la derecha del teclado ¿ves los números?
-Vale, crea una variable y ponla a 5: esta será nuestra posición neutral, sin movimiento. El centro de dicho teclado.
-Comprueba si se pulsa derecha, si se hace, sumale a la variable 1: valdría 6, búscalo en el teclado numérico.
-Comprueba si se pulsa izquierda, si se hace, réstale 1: valdría 4 si no se pulsaba derecha y se movería a la derecha (mira el teclado). Si hubiese estado pulsada derecha, valdría 5 al sumar 1 y restar 1 y no se movería.
-¿Vas pillando por donde voy? Comprueba arriba, si está pulsado, suma 3.
-Comprueba abajo, si está pulsado resta 3.
-Ahora la variable tendrá un valor que indica la dirección de movimiento, y tienes el teclado numérico como referencia. Usa un switch y actúa en consecuencia :)
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)

abaray

#5
Creo q mas o menos lo he pillao asi q muchas gracias x todo
otra duda existencial en bennu para hacer una animacion de un movimiento hago esto

IF (key(_left))         
         x=x-5;
        if (graph<=10 or graph>=12) graph=10; end;
            flags=1;
         graph=graph+1;

               end
y en div 1 creo recordar q en vez de ese "if (graph...end"  ponia

graph=10 to 12;

hay alguna solucion x el estilo o x lo menos mas abreviada q la mia???
Gracias por toda la ayuda otra vez mas

Windgate

En DIV quizás hubiese algún FROM graph=1 TO 12; Pero el método que dices es igual de válido.

Para animaciones más complejas, con diferentes "estados" de animación, por ejemplo quieto, andar, salto, patada, agachar, etc. Yo uso una struct donde guardo graph_ini, graph_fin y latencia (Para animar cada N FRAMES).

La estructura anterior conviene usarla con animaciones complejas, 3 estados distintos o más, si te ves en esa situación puedo pasarte animacion.prg, un fichero de código que incluyo siempre en mis juegos para gestionar la animación, lo podrás encontrar en casi todos ellos, Just Fantasy por ejemplo que está en el foro.

Ánimo!
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

Buenas :

Yo coincido con WindGate hacer una Structura,que aparte si por cualquier motivo quisieras cambiar los codigos o aumentar el numeros de graficos para una animacion ,solo tendrias que actualizar la estrucuta y no estar buscando el codigo del proceso y modificar casi todo,si las estructuras no es lo tuyo podrias utilizar tablas que tambien bienen muy bien,puedes usar el indice 0 para que te guarde el numero de graficos que utilizara por ejemplo "Ir hacia la derecha",y al igual que con la estructruras con cambiar las tablas podrias modificar las animaciones,aqui te dejo un ejemplo:
Ani_Personaje[0]=8,100,101,102,103,104,105,106,107; // 7 Es el numero de Graficos digamos para Derecha,los otro numero son el cofigo del grafico en el fichero
Ani_Personaje[1]=6,110,111,112,113,114,115; //Animacion Izquierda si te fijas tiene menos animaciones pero con la siguiente parte ...
If (Ani_Personaje[N].0==Anima);               // Donde N seria la tabla de la direccion en la que mira el personaje
   Anima=1;Graph=Ani_Personaje[Anima];   // y Anima el numero actual de la posicion en la tabla
Else
    ++Anima;Graph=Ani_Personaje[Anima]; 
Con esta sencilla comparacion podrias crear distintas animaciones del personaje,teniendo diferentes animaciones para cada direcion si fuera el caso.

DjSonyk

Perdon,corrijo una cosilla:

Eso seria con una Structura no con tablas ^^...

Con las tablas seria igual solo que en cada If (Key)) dereiras poner el nombre de la tabla de la direcciòn...
Y solo compensa para animaciones derecha e izquierda y usando el flag para invertir el grafico horizontalmente...
Solucion usa una structura como te recomienda MUY BIEN Wind...

Suerte.

Windgate

Recomiendo miréis mi animaciones.prg, si la recupero os pego un trozo aquí, es la BOMBAZA
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

Drumpi

Lo suyo es que dejeis el bloque de animaciones aparte, fuera de las comprobaciones de teclas. Lo ideal sería tener un vector por cada secuencia de animación, y seleccionar el vector mediante una variable de "estado" que podría ser:
-0: Quieto
-1: Andando
-2: Saltando...

Por cierto, DjSonyk, haz el incremento del gráfico ANTES de comprobar si está fuera de rango, se puede dar el caso de que valga 11 y después del incremento valga 12, que es un valor "no deseado" según tu código.
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)

Windgate

Eso es, yo para indexar el vector además me saco unas CONST y así es más intuitivo aún.
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

Cierto Drumpi  ^^ ...
Gracias por la correción , mi escusa esque tengo al peque de 2 años por aqui correteando y me distrae mucho y a veces me pierdo,
perdon por si asido la causa de algun error . ^^

Saludos.

abaray

#13
viendo q sige con vida el post aprovecho pa seguir pidiendo ayuda sobre lo mismo (ya se que parezco un lammer pero os aseguro q lo intento pero no encuentro la forma)

sigo con el problema de las animaciones en las diagonales ya se q me dijisteis algo de hacer unas structuras pero soy tan noob q necesitaria un ejemplo pa ir plagiando un poco y asi terminar aprendiendo.

paso a explicar el problema/s
de momento solo quiero usar 4 animaciones(arriba,abajo,derecha,izquierda)
y quiero q si muevo una diagonal hacia arriba me ponga la animacion "arriba" y si muevo una diagonal de abajo me ponga la animacion "abajo" pero cuando hago eso en vez de ponerme animacion se me queda simplemente un frame pillao y si no me equivoco se debera a algun conflicto q aya x medio.
las 4 direcciones normales van bien (arriba, abajo , derecha e izquierda)
asi q os voy a poner el codigo y si podeis me comentais q esta mal o como solucionarlo.
        if (key(_left)and key (_up)and obs==false)     //diagonal arriba izquierda
x=x-5;y=y-5;
if (graph<=7 or graph>=12) graph=7; end; //animacion de movimiento hacia arriba
graph=graph+1;
end
if (key(_right)and key (_up)and obs==false) //diagonal arriba derecha
x=x+5;y=y-5;
if (graph<=7 or graph>=12) graph=7; end; //animacion de movimiento hacia arriba
graph=graph+1;
end
if (key(_left)and key (_down)and obs==false)   //diagonal izquierda abajo
x=x-5;y=y+5;
if (graph<=1 or graph>=6) graph=1; end; //animacion de movimiento hacia abajo
graph=graph+1;
end
if (key(_right)and key (_down)and obs==false) //diagonal derecha abajo
x=x+5;y=y+5;
if (graph<=1 or graph>=6) graph=1; end; //animacion de movimiento hacia abajo
graph=graph+1;
end

IF (key(_left)and obs==false) //izquierda
x=x-5;
  if (graph<=13 or graph>=18) graph=13; end; //animacion izquierda
flags=1;
graph=graph+1;
END        
IF (key(_right)and obs==false) //derecha
x=x+5;
  if (graph<=13 or graph>=18) graph=13; end; //animacion derecha
flags=0;
graph=graph+1;
END
IF (key(_up)and obs==false) //arriba
y=y-5;
  if (graph<=7 or graph>=12) graph=7; end; //animacion arriba
graph=graph+1;
END        
IF (key(_down)and obs==false) //abajo
y=y+5;
  if (graph<=1 or graph>=6) graph=1; end; //animacion abajo
graph=graph+1;
END      
 
IF (key(_esc))    
exit(0);    
END    
FRAME;    
END    
END    

(obs=obstaculo; una variable para las durezas x lo demas todo legible mas o menos creo yo)
ay ta el toston de codigo ya me direis algo
y ya q tamos como se puede hacer  para q la animacion vaya mas lenta a parte de la version cutre q se me ocurrio a mi de meterle sprites repetidos (1,1,2,2,3,3 ....)y asi hacer q se vea un poco mas lenta x q bajarle los fps no lo veo como una opcion factible y hacer 20 sprites x movimimiento de momento como q no sobretodo x q primero quiero meterme mas bien  con el codigo y los graficos ya los hare bonitos cuando tenga el codigo echo si es q algun dia esto llega a buen puerto.
si quereis el codigo completo de lo q llevo (poco mas de lo q veis)con el fpg y demas avisadme x pribado y os lo paso encantado
PDTA:toda critica constructiva sera bien recibida :)
PDTA2: poor milesima vez gracias de un noob q no lamer aunque lo parezca.

DCelso

#14
uff, muchos ifs y  muchos ands, imposible controlar todos los casos, debes de separar más los condicionales por conceptos.
Además tal y como lo planteas no es necesario que muevas en diagonal ya que es simplemente hacer dos pasos en un mismo frame (por ejemplo subir e ir a la derecha) así que podrías simplificar a algo como esto

av_x = 5; // para poder luego ajustar  el avance en x de manera más facil
av_y = 5; // para poder luego ajustarlo el avance en y de manera más facil
gfx_max =1;
gfx_min = 6;
if (obs==false)
 if (key(_left)) x-=av_x; gfx_min=13;gfx_max=18; end // NOTA: x-=valor es lo mismo que x=x-valor;
 if (key(_right)) x+=av_x; gfx_min=13;gfx_max=18;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=graph+1;
 if ( graph  <  gfx_min OR graph > gfx_max ) graph=gfx_min; end;
else
//no se lo que haces, no lo pusiste :D.
end
frame;

Con este código si por ejemplo tienes pulsadas las flechas izquierda y arruba: se ejecutará el if del _left y también se ejecutará seguidamente el if del _up, por lo que la animación a ver será la de subir y "x" e "y" habrán disminunido.
Monstruos Diabólicos

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