PDA

Ver la versión completa : ¿Animaciones que desaparecen o con parkinson? y de postre duda idiota



jean la montard
26/03/2008, 12:13
Dejo las respuestas y preguntas porque podria ayudar a alguien las siguientes iran mas adelante
______________
Buenas

Pues tras mucho tardar sigo con mi proyectillo del joust y bueno , los tutos que encuentro o no me son de mucha ayuda o no me entero de nada , la cuestion; con el codigo que pongo aqui las animaciones se realizan en el sitio y despues se desplaza el personaje los pixeles que el pongas


if(key(_left))
x=x-5;
flags=1;
for(cont=3;cont>=1;cont=cont-1)
graph=cont;
frame;
end
end


como no sabia que hacer tire por el camino de en medio para probar si mis animaciones estaban mal o lo que fuera con este codigo




if (key(_left))
x=x-5;///disminuir posicion de x
flags=1;///idem
graph=graph+1;



Evidentemente no vale porque cuando se acaban los 4 frames desaparece , pero me vale para ver claramente que durante esos 4 frames se desplaza tal y como yo queria...

Ahora la duda , ¿Como lo hago?

Duda de regalo , ¿es posible determinar en el BEGIN del comienzo una condicion de salida que permanezca durante todo el codigo ?actualmente lo estoy haciendo con un If (key(_esc)) exit() etc etc... pero como tengo un par de breaks he de ir especificandola en cada proceso lo cual son mas lineas y mas recursos ...

Saludos y gracias por las respuestas

Aiken
26/03/2008, 12:18
pues creo que lo mas correcto es tu segunda opcion, pero poniendo "rodeandolo" un while. Todo proceso lleva un while "grande" que hace que se repita infinitamente.

Aiken

juanvvc
26/03/2008, 14:35
Recuerda que lo ideal es que solo haya una llamada a frame en todo el bucle. La idea es que el tipillo entre en el estado 'moviendose' cuando se detecte la pulsación de la tecla _left, y haga todo el bucle en ese estado mientras _left esté pulsada.

Además vamos a independizar grah de cont, para que puedas tener distintas animaciones en un solo fpg. inicio_anim apunta al primer gráfico, y max_anim al número de gráficos de la animación. En tu caso, inicio_anim=1; max_anim=3;



if(key(_left)) // inicia y mantiene el estado 'moviendose'
moviendose = true;
if cont == 0 // así dejamos que siga la animación si ya está en marcha
graph = inicio_anim; // solo cambia el gráfico si no había anmación en marcha
end
cont = 3;
flags = 1;
end
if moviendose // estado moviéndose
cont -= 1;
if cont < 1 // salida del estado moviendose
moviendose = false;
graph = graph_quieto;
flags = 0;
else // seguimos dentro del estado
graph = (graph + 1) &#37; max_anim + inicio_anim;
end
end
/* resto del c&#243;digo del tipo, que se ejecutar&#225; incluso cuando se est&#225; moviendo */
frame; // solo una llamada a frame en todo el bucle


Tambi&#233;n puedes mover solo un pixel por animaci&#243;n, pero mientras se mueva no responder&#225; al resto de eventos y por eso esta opci&#243;n aunque m&#225;s sencilla probablemente no te valdr&#225;:



if(key(_left))
flags=1;
for(cont=3;cont>=1;cont=cont-1)
graph=cont;
x -= 1;
frame;
end
end
/* resto de c&#243;digo del tipo, que no se ejecuta mientras se est&#225; moviendo */


Recuerda que hace a&#241;os que no programo en Fenix, as&#237; que quiz&#225; el c&#243;digo que propongo est&#225; fatal :D

En cuanto a la "condici&#243;n de salida" que buscas, quiz&#225; te valga con un let_me_alone(): en el bucle principal pones


if(key(_esc))
let_me_alone(); // matas a todos los dem&#225;s procesos y te quedas t&#250; solo
frame; // creo recordar que necesitas una llamada a frame para que se env&#237;e la se&#241;al de muerte
/* te despides del jugador */
exit();
end

y ya est&#225;, no necesitas capturar la tecla _esc en los dem&#225;s procesos proque estar&#225;n muertos antes de poder hacerlo :D

Drumpi
26/03/2008, 17:27
Bueno, pues mira, yo har&#237;a lo siguiente:

if (key(_left))
x-=lo_que_sea;
graph++; //es lo mismo que graph=graph+1;
if (graph>ultimo_grafico) graph=primer_grafico; end
(...)
end
frame;

Con el if comprobamos si nos hemos salido del rango de gr&#225;ficos de la animaci&#243;n, si nos hemos pasado del &#250;ltimo, simplemente volvemos al primero, y listo. Adem&#225;s, como dice juanvvc, si primer_grafico y ultimo_grafico las defines como variables podr&#225;s cambiar la animacion en tiempo real si est&#225; en el mismo fpg.
Respecto a salir del proceso, es lo que dicen: debes tener un bucle principal, puedes usar un while, puedes usar un loop+break... pero a las malas, puedes hacer que el proceso se autodestruya con las signals:

signal(id,s_kill);

Es esto LITERALMENTE, ya que id es una variable local predefinida en la que se guarda la ID del propio proceso, as&#237; le mandamos una se&#241;al de eliminar a s&#237; mismo. No es muy elegante, pero te puede servir si quieres huir del bucle principal. Adem&#225;s, recuerda que break solo afecta a bucles, no a ifs ni a switchs.
Y por si acaso, en las &#250;ltimas versiones de Fenix se a&#241;adi&#243; la clausula ONEXIT, es una seccion del c&#243;digo que s&#243;lo se ejecuta al matar al proceso, muy util para descargar recursos, y poner a cero variables que dependan del propio proceso, pero por eso mismo se recomienda usar un bucle principal, porque al salir de &#233;l, se puede hacer lo mismo.

Espero que se entienda con suficiente claridad :)

juanvvc
26/03/2008, 18:19
la soluci&#243;n de Drumpi tambi&#233;n vale, claro, y es mucho m&#225;s corta que la m&#237;a. &#191;En qu&#233; estoy pensando? Solo cambiar&#237;a que el cambio de gr&#225;fico fuese con aritm&#233;tica modular, y as&#237; ganas unos milisegundillos: en vez de graph++; if(graph>max_graph)...


graph=(graph+1)&#37;num_graphs+first_graph;

De todas maneras, mi soluci&#243;n permite moverse con inercia, cosa que la de Drumpi no hace :)

jean la montard
26/03/2008, 23:55
ya me funciona con el metodo de Drumpi...

Juanvvc podrias detallar tu formula no tengo ni idea de como iria :loco: , una de las ideas era que al parar o girar derraparan un poquito asi que para un poquito mas adelante me interesaria que tuviera un pelin de inercia :P

ahora a pelearse con el vuelo , en el original en funcion de que pulsaras el salto se elevaba un poco mas con la inercia que llevara de la carrera y ademas rebotaba con todas las plataformas en plan bola de billar (angulo de salida= angulo de entrada) y la gravedad y el que salga por un lado y aparezca por otro y los enemigos y los impactos...y y y y y

Dios cuanto curro pendiente :loco:

chipan
27/03/2008, 00:20
Vaya! he llegado tarde XDDDD. Pero bueno, podría ser peor.

jean la montard
27/03/2008, 00:31
Tranqui chipan no tienes mas que ver en el mensaje anterior , que estoy repleto de dudas alguna te tocara XD

NOTICION DE &#218;LTIMA HORA , ya desaparece por un extremo y aparece por el otro XD algo que he arreglado sin ayuda :wei1: fiesta :brindis: birras para todo

juanvvc
27/03/2008, 06:38
Juanvvc podrias detallar tu formula (...) para un poquito mas adelante me interesaria que tuviera un pelin de inercia :P

Pues exactamente como pongo arriba :): manejando un estado 'moviéndose'. Aunque veas mucha literatura la mayoría son comentarios. Cuanto más alto pongas el contador 'cont' al entrar en el estado, más inercia tendrá a mantenerlo (más tiempo estará moviéndose después de dejar de pulsar _esc).

Si lo que te pierde es la aritmética del módulo, déjalo correr y utiliza graph+=1; if graph>graph_max) graph=graph_min; y ya está.

Drumpi
28/03/2008, 01:51
Una vez m&#225;s, se me adelantan con la respuesta XD
De todas formas, esto hay muchas formas de hacerlo, no te voy a decir cual es mejor ao no, porque eso s&#243;lo lo sabes t&#250;, yo s&#243;lo te dir&#233; c&#243;mo lo har&#237;a yo (que no quiere decir, ni mucho menos, que sea la mejor).
En un juego de submarinos hace tiempo (que por cierto, espero portar alg&#250;n d&#237;a) utilic&#233; para la inercia un sistema similar al de la gravedad del "Castle of Dr Malvado": b&#225;sicamente era declarar una variable llamada "velocidad", que al pulsar derecha se incrementase en 1 unidad, y si no pulsas nada, se decrementase solo.
Esta variable, una vez calculada, se la sumas a la posici&#243;n. As&#237;, cuando pulsas derecha, el primer frame el personaje se mover&#225; 1 pixel, en el segundo 2, en el tercero 3, dando la sensacion de que acelera, y cuando sueltas, primero tres, luego dos, luego uno, y finalmente cero.
Obviamente debes controlar los l&#237;mites de esta variable para que no vaya muy r&#225;pido o que al no pulsar nada se mueva hacia atr&#225;s. Tambien puedes usar valores negativos para la tecla izquierda, pero te adelanto que tendr&#225;s que comprobar:
a) que se pulsa derecha.
b) que se pulsa izquierda.
c) que no se pulsa ninguna (para que se vaya frenando solo)
Y eso contando con que ser&#237;a imposible pulsar ambas a la vez (que ser&#237;a un caso a tener en cuenta en a y b)

Puede parecer un poco complicado, pero sabiendo hacerlo y con los valores adecuados se pueden lograr cosas muy curiosas. Ya digo que as&#237; simul&#233; el movimiento del submarino y aun me gusta verlo en movimiento.
Lo &#250;nico que me impide hacer el port ya es que no consigo hacer funcionar mi nuevo motor de scroll tileado :P

jean la montard
30/03/2008, 21:51
Gracias a todos por vuestras ayudas sigo aqui porque el tema es el mismo , para la gravedad ya creare otro :P



if (key(_right))
velocidad+=5;
flags=0;
x=x+velocidad;
If (x>320) x=pospantx_1;end

End
if (key(_left))
velocidad+=5;
flags=1;
x=x-velocidad;
If (x<0) x=pospantx_2;end
End
If (velocidad<0)
velocidad-=1;
End

If (velocidad>0)
velocidad+=1;
End

If (velocidad<>0)
graph++;
graph=(graph+1)&#37;num_graphs+graph_1;//idem
End

If (velocidad=0)
graph=4;
End



Si no entiendo mal , con este codigo deberia de tener un poquito de inercia y al detenerse aparecer la posicion inicial (graph=4) , pero ni lo uno ni lo otro aunque lo curioso es que funciona bien todo lo demas (desplazamiento y desaparicion por un lado y aparecer por otro) ... esta basado en lo que entendi del codigo del doctor malvado respecto al movimiento

juanvvc
30/03/2008, 22:40
Tienes que sacar el cálculo de las x fuera de los ifs, para que se sigan calculando al dejar de pulsar el botón. Mi propuesta (nota que cambio algunos signos):



if (key(_right) && abs(velocidad)<MAX_VELOCIDAD)
velocidad+=5;
flags=0;
end
if (key(_left) && abs(velocidad)<MAX_VELOCIDAD)
velocidad-=5;
flags=1;
End

If (velocidad<>0)
x=x+velocidad;
If (x>320) x=pospantx_1; end
If (x<0) x=pospantx_2; end
If (velocidad<0)
velocidad+=1;
End
If (velocidad>0)
velocidad-=1;
End

graph++; // ¿Por qué aumentas dos veces el gráfico?
graph=(graph+1)%num_graphs+graph_1;//idem
else
graph=4;
End

jean la montard
31/03/2008, 01:23
Ok Juanvvc , solo dos cuestiones

-&#191;Los &&, el abs y el &#37; son operadores o algo asi y concretamente para que valen ? mas que nada para saberlo y ahorrarme el tener que preguntar estas cosas y poder hacer el codigo yo :P no me gusta depender de las respuestas
- Respecto a :
graph++; // &#191;Por qu&#233; aumentas dos veces el gr&#225;fico?
graph=(graph+1)%num_graphs+graph_1;//idem
si quito alguna linea de estas dos el grafico no avanza y no se porque ... :s

Drumpi
31/03/2008, 01:36
Voy con un poquillo de prisa, as&#237; que contesto lo que puedo sin mirar el c&#243;digo:
&& es lo mismo que AND.
abs devuelve el valor absoluto de un n&#250;mero.
&#37; es el operador resto: devuelve el resto de dividir el n&#250;mero de la izquierda por el de la derecha.

Y respecto a los dos grpahs, creo que lo que quer&#237;a hacer era quitar el graph++ nada m&#225;s, deber&#237;a funcionar... creo.

juanvvc
31/03/2008, 03:15
Completando lo que dice Drumpi:

&& es totalmente equivalente a AND. Los que estamos acostumbrados a otros lenguajes utilizamos && por costumbre y porque nunca sabemos si AND es una palabra del lenguaje :D

abs() devuelve el valor absoluto sin signo. As&#237;, abs(-5) es 5 y abs(5) tambi&#233;n.

Si MAX_VELOCIDAD=15, la expresi&#243;n if(key(_left) && abs(velocidad)<MAX_VELOCIDAD) quiere decir "si se est&#225; pulsando la tecla izquierda y la velocidad est&#225; entre -15 y 15" Aqu&#237; la operaci&#243;n abs() sirve para no aumentar indefinidamente la velocidad. Ten en cuenta que si la velocidad es negativa te mueves a la izquierda y si es positiva a la derecha.

&#37; es la operaci&#243;n m&#243;dulo. Como lo de AND, en algunos lenguajes es equivalente a MOD pero no recuerdo si Fenix tiene la palabra MOD. El m&#243;dulo es el resto de una divisi&#243;n: 5%4 vale 1 porque 5 entre 4 son 1 y de resto 1. 6%4 son 2, 8%4 son cero y 9%4 vuelve a ser 1. Es muy &#250;til cuando necesitas contadores que dan la vuelta, como graph que va desde graph_1 hasta graph_1+num_graphs y de all&#237; vuelve a graph_1

Que sumes dos veces uno a graph en esas dos l&#237;neas parece un error, a menos que tus gr&#225;ficos est&#233;n separados por dos unidades. Por ejemplo 2, 4, 6 y 8. Si los gr&#225;ficos son 2, 3, 4 y 5, efectivamente sobra graph++ (porque es "el que no da la vuelta")

Drumpi
31/03/2008, 04:29
Si, MOD es una palabra del lenguaje y equivale a &#37; (m&#243;dulo) :)

jean la montard
31/03/2008, 12:54
Muchisimas gracias por vuestras sabias explicaciones , ya tiene inercia y se frena , en seguida me metere con "la gravedad" pero sigo sin conseguir hacer funcionar lo de los graphs si no pongo los dos la animacion no se mueve pero va de dos en dos frames y si pongo los dos va a trompicones , intente poner la primera idea de Drumpi pero cuelga el programa , asi que ni idea :loco: os pongo el codigo completo del juego haber si veis el problema


// --------------------------------------------------------------------------
// Ultimate Fenix Joust by jeanmontarde
// Created on 18:25 - 27/02/08
// --------------------------------------------------------------------------

Program Joust;

Global

Puntos=0;
Vidas=3;

BEGIN

Full_screen=false; ///pantalla completa si o no
set_mode(320,240,16);///modo de pantalla y color
set_fps (30,0);///Establecer frameado
load_fpg("graficos.fpg");//carga el archivo de graficos
put_screen(0,001);///pone grafico en pantalla
From z=0 to 49;frame; End///retrasa la desaparicion en pantalla
fade(0,0,0,2);///fundido en negro
While(fading) frame; End///fundido en negro
fade_on();///encender pantalla
clear_screen();///limpiar pantalla
Menu();///llamada proceso menu


END


Process menu()///Regula el menu y lo pone en pantalla

Begin

write (0, 160, 10, 1, "Joust-Prueba de control") ;///escribir "" con coordenadas
write (0, 160, 30, 1, "Original por Williams en 1982");///escribir "" con coordenadas
write (0, 160, 40, 1, "Remake por Lokura Entertaiment");///escribir "" con coordenadas
write (0, 160, 50, 1, "Codigo y graficos por");///escribir "" con coordenadas
write (0, 160, 60, 1, "Jean La Montard");///escribir "" con coordenadas
write (0, 160, 140, 1, "Pulsa A para salir") ;///escribir "" con coordenadas
write (0, 160, 150, 1, "Pulsa B para prueba de movimiento");///escribir "" con coordenadas
write (0, 160, 200, 1, "29-2-2008");///escribir "" con coordenadas

Loop///inicia bucle
If (key(_control)) ///Si pulsa control...
fade(0,0,0,2);///fundido en negro
while (fading) frame; end///fundido en negro
exit() ; end///condicion de ruptura
If (key(_space))///si pulsa espacio...
fade(0,0,0,2);///fundido en negro
While(fading) frame; End///fundido en negro
fade_on();///encender pantalla
clear_screen();///limpiar pantalla
prueba();break;end///llamada al proceso prueba e interrupcion de los demas procesos
Frame;///poner en pantalla
END
END

Process Prueba()///regula la carga y arranque del escenario

Begin
delete_text(ALL_TEXT);///elimina todo lo de la pantalla
Put_screen(0,3);///pone el fondo
write (0,160,10,1, "Joust-Prueba de control");
Prota();///llama al prota
End

Process Prota()///protagonista, movimiento, salto,etc...

Private

graph_1=4;
pospantx_1=0;
pospantx_2=320;
num_graphs=5;
velocidad=0;
max_vel=10;

Begin
x=160;///situacion respecto de x
y=120;///situacion respecto de y
graph=004;///grafico usado

loop///bucle

If (key(_esc))
fade(0,0,0,2);///fundido en negro
While(fading) frame; End///fundido en negro
fade_on();
exit();
end

if (key(_right) && abs (velocidad)<max_vel);
velocidad+=5;
flags=0;
End
if (key(_left) && abs (velocidad)<max_vel);
velocidad-=5;
flags=1;
End
If(velocidad<>0)
x=x+velocidad;
if(x>320)
x=pospantx_1;
end
if(x<0)
x=pospantx_2;
end
if(velocidad<0)
velocidad+=1;
End
If(velocidad>0)
velocidad-=1;
End

Graph++
Graph=(graph+1)&#37;num_graphs+graph_1;
else
graph=4;
end

frame;

End

End

juanvvc
31/03/2008, 14:59
Lo de Drumpi no deber&#237;a colgar el programa. En tu caso con tus variables:



graph++;
if(graph>=graph_1+num_graphs) graph=graph_1; end


Que es en todo equivalente a graph=(graph+1)&#37;num_graphs+graph_1;

jean la montard
31/03/2008, 15:11
pues asi si va , supongo que me colaria con algun signo o alguna variable mal puesta , gracias juanvvc , aunque sigo sin saber porque no iba solo con tu propuesta sin el Graph++ , es muy raro :loco: de todos modos gracias y mas gracias por seguir ayudando con lo pesado que soy :P

PharaOnyx
31/03/2008, 15:15
&& es totalmente equivalente a AND. Los que estamos acostumbrados a otros lenguajes utilizamos && por costumbre y porque nunca sabemos si AND es una palabra del lenguaje :D
En Fenix no tengo ni idea (:D), pero en otro lenguajes no son totalmente equivalentes:

falso || verdadero = verdadero
falso or verdadero = falso

verdadero && falso = falso
verdadero and falso = verdadero

Saludos, Alex

juanvvc
31/03/2008, 15:35
PharaOnix, no consigo imaginar qu&#233; mente enferma habr&#225; ideado un lenguaje en el que "verdadero and falso = verdadero". &#191;De cu&#225;l hablas?

Lo que no es realmente igual en C es "5 && 5" y "5 & 5", pero la diferencia en la condici&#243;n de un if es tan sutil...

PharaOnyx
31/03/2008, 15:46
PharaOnix, no consigo imaginar qu&#233; mente enferma habr&#225; ideado un lenguaje en el que "verdadero and falso = verdadero". &#191;De cu&#225;l hablas?
Realmente es que tiene truco... :D, pero no quer&#237;a dejarlo pasar porque lo mismo se encuentra con problemas m&#225;s adelante

Los operadores como tal y de forma aislada s&#237; son equivalentes (es decir, dan el mismo resultado), pero a la hora de mezclarse con otros la cosa cambia. Al tener diferente precedencia empiezan a aparecer resultados 'raros':

$a = true && false ($a vale false)
$b = true and false ($b vale true)

El 'misterio' est&#225; en que la precedencia del '=' est&#225; justamente entre la precedencia del '&&' y la precedencia del 'and', con lo cual los resultados no son los que deber&#237;an ser a simple vista :)

Saludos, Alex

pd: hablo de php. Lo mismo en Fenix no es as&#237;, pero m&#225;s vale prevenir...

Drumpi
31/03/2008, 19:30
:S
Desde luego, ni en fenix, ni en C, incluso ni en matlab hab&#237;a visto semejante cosa. Solo voy a decir una cosa al respecto: dios bendiga a los par&#233;ntesis :S:S:S

jean la montard
01/04/2008, 22:01
Haber chicos , vuelta a las dudas XD




La gravedad va con valor 5 prefijada

If(gravedad<>0)
Repeat
y=y+gravedad;
frame;
until(map_get_pixel(0,3,x,y+16)==rgb(255,0,0))
gravedad=0;
frame;
End



Con este codigo consigo un efecto de gravedad , es decir , que caiga el mu&#241;eco hasta la plataforma dibujada como dureza

Pero tengo dos problemicas:
- No me deja moverme en el aire , es decir cuando cae es una piedra no me deja desplazarme mientras cae
-Al llegar a la plataforma digamos que es como si desactivara ya que no se cae m&#225;s , aunque no halla suelo
&#191;Alguna idea?

juanvvc
02/04/2008, 01:00
no s&#233; a qu&#233; te refieres con lo de la plataforma. Para el resto, puedes hacer lo mismo que ya has hecho con la inercia pero con una velocidad_y. Esta vez te lo pongo en pseudoc&#243;digo:




MAX_VEL_Y=-10;
GRAVEDAD=2;

/* aqu&#237; todo el c&#243;digo que hemos hablado hasta ahora */
if(key(_left)
...
end
if(velocidad)
...
end

if(velocidad_y<>0)
/* el mu&#241;eco est&#225; cayendo */
/* si hay plataforma, deja de caer */
if(map_get_pixel(0,3,x,y+16)==rgb(255,0,0))
velocidad_y=0;
else
/* no hay plataforma: continua cayendo */
/* velocidad terminal: suele ser &#250;til ponerla */
if(velocidad_y>MAX_VEL_Y)
velocidad_y-=gravedad;
end
/* movemos el mu&#241;ecajo */
y+=velocidad_y;
end
else
/* el mu&#241;eco no est&#225; cayendo */
/* Un salto */
if(key(_spc))
velocidad_y=10;
else
/* no hay salto. Si tampoco hay plataforma, cae */
if(map_get_pixel(0,3,x,y+16)<>rgb(255,0,0))
velocidad_y=-GRAVEDAD;
end
end
end

/* el resto del c&#243;digo del mu&#241;ecajo */

frame;

jean la montard
02/04/2008, 13:16
Buenas juanvvc , al final tu pseudocodigo ha sido de ayuda aunque no me salia , asi que tome cosas de aqui y de alla y de momento me da lo que queria , tal vez no sea la manera mas ortodoxa pero da resultados aqui te lo pongo por si te interesa hecharle un vistazo

este es el bucle del protagonista , falta a&#241;adir animaciones para el salto , el rebote con las plataformas y los toques con los enemigos espero no necesitar muchas mas ayuda y gracias por todo (otra vez :P)


loop

If (key(_esc))
fade(0,0,0,2);///fundido en negro
While(fading) frame; End///fundido en negro
fade_on();
exit();
end

if(map_get_pixel(0,3,x,y+18)<>rgb(255,0,0));
velocidad_y=5;
end

if (key(_right) && abs (velocidad_x)<max_vel);
velocidad_x+=5;
flags=0;
End
if (key(_left) && abs (velocidad_x)<max_vel);
velocidad_x-=5;
flags=1;
End

if(key(_space)&& abs(velocidad_y)<max_vel);
velocidad_y-=10;
End

if(map_get_pixel(0,3,x,y+18)==rgb(255,0,0));
velocidad_y=0;
if(key(_space)&& abs(velocidad_y)<max_vel);
velocidad_y-=10;
end
End

if(velocidad_y<>0)
y=y+velocidad_y;
if(velocidad_y<0)
velocidad_y+=1;
end
end

If(velocidad_x<>0)
x=x+velocidad_x;
if(x>320)
x=pospantx_1;
end
if(x<0)
x=pospantx_2;
end
if(velocidad_x<0)
velocidad_x+=1;
End
If(velocidad_x>0)
velocidad_x-=1;
End

graph++;
if(graph>=graph_1+num_graphs) graph=graph_1; end
else
graph=4;
end

frame;

End

Por cierto &#191;Alguien sabe como hay que especificar el pulsado de una tecla para que su funcion no se active manteniendola pulsada, sino por cada pulsacion (desactivar el autofire, vamos :P)?

chipan
02/04/2008, 13:35
lo del "autofire" es simple... creas una variable que cuando pulses la tecla en cuesti&#243;n aumente de uno en uno y cuando la dejes de pulsar se ponga a 0.


int pitruski;
...
if(key(_control)) pitruski+=1; else pitruski=0; end
y en lugar de tomar como evento la pulsaci&#243;n de la tecla toca como evento un valor de la variable en cuestion.

En lugar de:


if(key(_control)) disparo(x,y); end
hacer algo como:


nt pitruski;
...
if(key(_control)) pitruski+=1; else pitruski=0; end
if(pitruski==1) disparo(x,y); end
Creo que se entiende el concepto.

juanvvc
02/04/2008, 13:56
En vez de usar pitruski como contador, yo lo har&#237;a as&#237; con l&#243;gica booleana que queda muy elegante y te evitas saltos condicionales:



pitruski=false; /* al inicio del juego, no dentro del bucle */
...
pitruski=not pitruski and key(_control);
if(pitruski) disparo(x,y); end


Jean, tu c&#243;digo lo veo bien y has corregido el signo negativo de las y que ten&#237;a mal puesto :)

chipan
02/04/2008, 14:16
no entiendo ese c&#243;digo.

juanvvc
02/04/2008, 14:29
No lo entiendes porque est&#225; mal :D Jean no me hagas caso, haz lo que dice Chipan.

chipan
02/04/2008, 14:36
LOL, ya me extrañaba, pero bueno, nunca se sabe

jean la montard
02/04/2008, 15:30
tengo un problema , el contador dura demasiado poco , asi que pense estirarlo con una variable que lo reseteara con valor 0 cuando alcanzara un determinado valor pero , no me va :S



salto=0;
cont_salto=0;

Aqui la pulsacion
if(key(_space)&& abs(velocidad_y)<max_vel);
salto+=1;
if(salto=10)
salto=cont_salto;
end
end

Aqui el contador
if(salto=10)
velocidad_y-=10;
end



el salto es como si no funcionara :loco:

Drumpi
02/04/2008, 17:09
&#191;Cuando dices


if (salto=10)

no querrias decir


if (salto==10)

?

jean la montard
02/04/2008, 19:32
da igual cual ponga no me va indistintamente :loco:

Drumpi
02/04/2008, 23:26
Bueno, mirando m&#225;s tranquilamente el c&#243;digo que has puesto (y suponiendo que no hay nada m&#225;s que afecte a esa parte) cuando haces el primer if (el de key(_space)) asignas a salto el valor de cont_salto que, supuestamente, vale cero, as&#237; que, cuando llegas al segundo if, salto no vale 10... a menos que en alguna parte del c&#243;digo hayas puesto que cont_salto valga 10 (directamente o incrementando su valor, algo que no te puedo decir sin ver m&#225;s c&#243;digo)
Pero insisto en lo del ==, = es una asignaci&#243;n y == una comparaci&#243;n. No recuerdo bien en esta versi&#243;n, pero en las primeras de Fenix, cualquier valor par se toma como FALSE y los impares como TRUE. En las &#250;ltimas versiones s&#243;lo el 0 se toma como false, y los dem&#225;s valores como true, pero no se a partir de qu&#233; version.