PDA

Ver la versión completa : Dudas y preguntas.



fagotero
30/06/2004, 13:11
Hola a todos!

Os voy a plantear unas preguntas, PREPARAOS :D

1-Crear un salto: Yo intenté hacer lo primero que se me ocurrió, es decir, si apretas la tecla "b" la y del peronaje sube y cuando llegase a cierta altura, la y del personaje volvería a el mismo sitio que al principio.......

Pero al final se me ocurrió que sería más práctico hacer un personaje que sólo se se moviese de derecha a izquierda y que al apretar "b" iniciase una animación hacia arriba y luego hacia abajo (salto).

¿Qué me reomendais? (es para un juego tipo voley ;)

2-Tengo un proceso que se llama pelota, el problema es que quiero que "pelota" siempre que se presione "a" (con el personaje) haga un movimiento hacia arriba y que luego baje hasta que toque con otro proceso y que una vez detecte la colisión, haga el mismo movimiento de forma inversa, según el lugar en donde colisione así la pelota estará más alta o más baja, (vamos como en el voley playa) .

3-(Esto ya es pedir demasiado), la IA del contrincante se pondría en funcionamiento una vez "pelota" estubiese el el centro de la pantalla, para seguir el proceso "pelota" e intentar tocarlo, para así devolvernosla.



P.D. Me he leido (bastantes cosas) del manual de referencia de fénix (que está muy bien) pero...como no estoy muy acostumbrado a usar fénix, agradecería MUCHO que alguien me pudiera ayudar.


P.D.1 El proyecto que tengo va en serio ;)

Segata Sanshiro
30/06/2004, 16:45
Buenas, fagotero... Si has programado en DIV antes, no deberías tener muchos problemas en Fenix.

Si me das más detalles del juego (sobre todo cómo será la vista) te podremos ayudar mejor.

fagotero
30/06/2004, 17:15
Pues, te puedo decir que nunca he trabajado con DIV/DIV2 , sólamente he trasteado un poco con Blitz 3D....

La vista será lateral tipo Super Volleyball, aunque con el campo ocupando toda la pantalla, es decir:


Personaje........ Red......... Enemigo


La pelota (bastante grande) está justo encima del personaje, y al apretar "b" tendría que salir en dirección al "enemigo", entonces cuando la pelota se situase por encima de la "red" el enemigo iría en dirección a la "pelota" a la velocidad marcada por mi, corriendo hacia delante y caminando más lentamente hacia atrás.

(Esto ya está implementado en el "personaje", pero dado que no sé cómo añadir IA al "enemigo", aun no le he metido las coordenadas correspondientes, para el movimiento).

Por ahora lo que más me interesa es saber como dar física a la pelota, es decir que haga los movimientos "reales" de una pelota, tipo Pong pero de manera distinta .

Si tienes alguna pregunta no dudes en ponerlo ;)


P.D. Gracias, y a ver si esto tira "pa lante" que creo que va a ser un juego entretenido.

fagotero
01/07/2004, 14:33
Si algún alma caritativa me puede ayudar, le estaré eternamente agradecido :brindis:

Segata Sanshiro
05/07/2004, 17:08
Perdón, creí que te contesté hace tiempo :D Pero debió pasarme algo y no respondí.

El caso es que no debes utiliar colisiones.

Cuando con un jugador pulses el botón de golpear a la pelota, comprueba la distancia a la que está la pelota y si está cerca como para darle y en la posición correcta, altera el ángulo y la velocidad.

El movimiento de la pelota puedes controlarlo, por ejemplo, así:

-La velocidad en horizontal se guarda en velx, y en cada frame, pones en el proceso de la pelota: x+=velx. Puede ser negativa o positiva.

-El tipo de movimiento puede ser directo o parabólico, para eso pones otra variable que se ponga a 1 o -1.

-Etc. Te podría seguir describiendo el sistema que me he inventado hace unos minutos xDDD Pero es mejor que cada uno idee el suyo a su manera.

Qué más cosas quieres saber?

Aiken
05/07/2004, 17:14
pues yo tampoco le he puesto nunca a gravedad a un personaje ... pero tengo que probarlo ... pues es interesante.

supongo que con decir que la y = y + gravedad - empuje

asi cuando hay empuje subira para arriba, y si el empuje es 0 pues bajara sola.

luego es cuestion de jugar con el valor de la gravedad y el empuje para que el movimiento sea mas realista.

Aiken

Segata Sanshiro
05/07/2004, 17:29
Es algo más complicado, aunque el caso es experimentar.

Lo que yo hacía era:

-> Si se pulsaba salto con estado=0 (en el suelo) estado se ponía en 1 (saltando).

-> Un contador manejaba cuántos frames llevaba el personaje subiendo. En los primeros sube deprisa, en los últimos va decelerando.

-> Cuando el contador llega a cierto punto empieza a bajar. En vez de restar a 'y' los valores de antes, se le suman.

-> Cuando el personaje toca el suelo, estado vuelve a '0'.

Pero cada uno utiliza su propio sistema, ahí está lo bueno de la programación.

fagotero
05/07/2004, 20:12
Gracias por contestar!!

A ver si me las puedo apañar para hacer el proceso de la pelota.

La primera duda que tengo es la siguiente:

Yo le digo al proceso "pelota"

Process pelota()

Private
velocidad=0;
id_prota; //para detectar si colisiona con algún personaje
Begin
graph=4;
Loop

(Y aquí la información para que la bola se mueva y detecte las colisiones)
Frame;
End
End

Pues es precisamente donde tengo que poner la información de la bola, donde no sé como hacerlo, sería algo como:

If(x<25)x=25;End
If(x=25)x=35;End
(Y así sucesivamente)
If(y=182)y=182;End
If(y=182)y=170;End
(Lo pongo así como ejemplo, no está bien escrito)

Pero entonces, la velocidad como la controlaría?

Si y disminuye x aumenta , y si y=punto máximo) y aumenta y x aumenta ralentizándose. Añadiendo a esto el tema de la desaceleración.

No sé si es algo disparatado, aun no estoy muy puesto (como nadie me contestaba, pensaba que ya no habría solución) :rolleyes:

Gracias

P.D. Si digo muchas burradas (seguro que sí) corrígeme.

Darumo
05/07/2004, 21:00
lo mismo que se puede hacer una leve simulacion de la gravedad deberias de añadir una resistencia a la pelota, asi cuando un muñeco le diera Tal velocidad a la pelota esta fuera perdiendo velocidad a mayor distancia recorrida, en conjunto con la variable de la gravedad la pelota seguiria una Parabola medianamente correcta y mas realista, solo te tendrias que preocupar en como insertar la fuerzaX e Y (velocidad del golpe hacia el lado y hacia arriba) cuando a la vez que la pelota colisionara con la parte superior del muñeco (supuestamente el brazo o mano) se presionara el boton de disparo.

pienso que lo mejor es crear el proceso de pelota simplemente con la fisica de la pelota, y mediante variables globales (por ejemplo FuerzaPelotaX y FuerzaPelotaY, lo de Globales es que se pueden modificar desde cualquier parte del programa, no es unicamente una variable del proceso) se manejara el golpe del muñeco a la pelota. El golpe a la pelota se haria simplemente cambiando el valor a esas variables.

lo que no se es si el Fenix maneja numeros decimales.

fagotero
05/07/2004, 21:05
Darumo todo lo que estás diciendo es "más o menos" lo que yo había comentado anteriormente, y que no sé como hacerlo en Fénix, quiero decir, seguro que lo sé hacer (a mi modo) pero me gustaría que alguien con más exeriencia me enseñase algún ejemplo con "números" , "letras", etc. me he vuelto a mirar el manual de referencia y lo poco que se me ocurre es lo que ya había dicho.

Sé que es mucho pedir.....

Segata Sanshiro
05/07/2004, 21:16
Bueno verás yo había pensado algo totalmente diferente.

Los jugadores cambian unas variables globales que contienen todo lo referente al movimiento de la pelota.

El proceso de pelota, sin detectar colisiones con nada (excepto el salirse de la pantalla) simplemente actualiza su posición según esas variables.

Ejemplo:

//dentro del bucle principal del proceso de un jugador

if(key(_z) and get_dist(id_pelota)<25);
//si se pulsa tecla de golpear a lo bestia (no de hacer un globo) y si
//hay una distancia de menos de 25pix se realiza el golpe
velocidad=10; //se mueve deprisa hacia la derecha
globo=0; //no se realiza globo, va "a toda leche"
incy=2; //como no es globo, la pelota simplemente va bajando un
//poco a cada frame, 2pix en este caso, pero dependiendo
//de como la pille el jugador se puede cambiar un poquito
end

//dentro del bucle del proceso de la pelota
x+=velocidad:
y+=incy

//Esto se complicaría bastante, y este es el sistema que he creado yo, y que seguramente sólo entenderé yo por no saber explicarlo.

Darumo -> Te me has adelantado xDDDD Has explicado justo lo mismo que yo, será que he tenido una buena idea xDDDDDDDD

DIV tenía una cosa llamada resolution, pero Fenix admite float (vamos, con decimales).

fagotero
05/07/2004, 21:21
OK gracias, voy a ir probando.

(Como veo que me estás ayudando, ahora me voy a poner más las pilas con Fénix)

;)

fagotero
05/07/2004, 21:34
Vale, testeado y no me funciona.

Tendría que cambiar/quitar cosas en la variable privada?

He probado muchas combinaciones con tu ejemplo pero, siempre me dá errores.

Segata Sanshiro
05/07/2004, 21:41
Pero postéanos aquí el código fuente :D

fagotero
05/07/2004, 21:44
Hola, debido a cosas "raras" tuve que borrar el proceso de la pelota, pero lo gracioso es que lo he vuelto a crear, y me sale un mensaje:

Mapa 1 no disponible en el fichero 0


Este mensaje ya lo había visto en otras ocasiones, pero lo raro es que el proceso está supuestamente bien creado, y la imagen "MAP" está en su sitio.....alguna sugerencia?

fagotero
05/07/2004, 21:45
CÓDIGO FUENTE "tras unos retoques" (por ciertos fenómenos extraños) ;)

Program Voley_playa;
Global graficos;
Begin
set_title("Voley playa");
Full_screen = false;
set_mode (320,240,16);
set_fps(25,1);
graficos=load_fpg("images.fpg");
put_screen(graficos,1);
player1();
red();
Loop
player2();
If(key(_tab))Break;End
Frame;
End
unload_fpg(graficos);
let_me_alone();
End

Process player1 ()
Begin
graph=3;
x=72;
y=184;
Loop
Frame;
If(key(_left))x=x-4;End
If(key(_right))x=x+6;End
If(x<25)x=25;End
If(x>124)x=124;End
End
End

Process player2()
Begin
graph=4;
x=295;
y=184;
Loop
Frame;
End
End

Process red()
Begin
graph=2;
x=150;
y=184;
Loop
Frame;
End
End

Process pelota()
Begin
graph=5;
x=80;
y=160;
Loop
Frame;
End
End




EDITADO: ¡¡¡¡Pero qué c*ojones haces ahí player 2????? que te crees que por estar dentro de un loop vas a conquistar el mundo????

fagotero
05/07/2004, 21:47
A por cierto, he puesto el proceso "pelota" porque....pues no sé por qué, porque si lo dejo puesto, fénix me "lanza" ese error.

Segata Sanshiro
06/07/2004, 16:54
Entonces qué problemas tienes con eso?

Por cierto, creo que no deberías utilizar colisiones, y que la red no haría falta que fuera un proceso, a no ser que quieras que se bambolee con los golpes de la pelota.

fagotero
14/07/2004, 22:50
A ver si alguien me puede comentar qué pasa con este código, en un principio a mi no me parece que esté mal escrito, pero el Firebird me da un mensaje de error (ya me ha salido varias veces, y normalmente me empieza a salir cuando voy añadiendo lineas de código) :rolleyes: aquí os dejo el ejemplo sin terminar, ya que le quería poner "límites" del estilo:

If (x>320) x=320; End

Pero tampoco me funciona, así que si por ahora me podeis ayudar con esto (es algo vital) os lo agradecería mucho :brindis:



Program ZONADEPRUEVASDEALTOSECRETO; EVIDENTEMENTE ESTO NO SE LLAMA ASÍ........
Global
graficos;

Begin
Full_screen = false;
set_mode(320,240,16);
set_fps(30,3);
graficos=load_fpg("imagenes.fpg");
put_screen(graficos,1);
bola();
Loop
If(key(_tab)) Break; End
Frame;
End
unload_fpg(graficos);
let_me_alone();
End

Process bola()
Private;
velocidadx=0;
velocidady=0;
Begin
graph=2;
x=80;
y=170;
Loop
If (key(_up)) velocidady-=1; End
If (key(_down)) velocidady+=1; End
If (key(_left)) velocidadx-=1; End
If (key(_right)) velocidadx+=1; End
If (velocidady>15) velocidady=15; End
If (velocidady<-15) velocidady=-15; End
If (velocidadx>15) velocidadx=15; End
If (velocidadx<-15) velocidadx=15; End
If (velocidady>0) velocidady-=1; End
If (velocidady<0) velocidady+=1; End
If (velocidadx>0) velocidadx-=1; End
If (velocidadx<0) velocidadx+=1; End
x+=velocidadx;
y+=velocidady;
Frame;
End
End

fagotero
15/07/2004, 09:43
:arriba:


Si elimino estas lineas:

If (velocidady>15) velocidady=15; End
If (velocidady<-15) velocidady=-15; End
If (velocidadx>15) velocidadx=15; End
If (velocidadx<-15) velocidadx=15; End
If (velocidady>0) velocidady-=1; End
If (velocidady<0) velocidady+=1; End
If (velocidadx>0) velocidadx-=1; End
If (velocidadx<0) velocidadx+=1; End

El ejemplo me funciona...pero QUIERO que esas lineas estén ahí :rolleyes:

Mientras tanto he estado creando "límites" de pantalla para que la "bola" no se fuera al quinto pino, pero cual es mi sorpresa que a la hora de crear esos "límites de pantalla" a parte de que la bola se queda como "pegada" y cuesta un poco volver a moverla (ya lo arreglaré con algo) si pongo un "límite" de pantalla en la parte de arriba de la pantalla, al compilar, me dá error, aquí os pongo el proceso actual (las variables privadas ahora estan en GLOBAL)

Process bola()

Begin
graph=2;
x=150;
y=120;
Loop
If (key(_up)) velocidady-=1; End
If (key(_down)) velocidady+=1; End
If (key(_left)) velocidadx-=1; End
If (key(_right)) velocidadx+=1; End
x+=velocidadx;
y+=velocidady;
If (x>310) x=310; End
If (y<20) x=20; End ----Si dejo esta linea puesta. el ejemplo no me compila :confused:
If (x<10) x=10; End
If (y>230) y=230; End

Frame;
End
End

fagotero
15/07/2004, 14:45
ARRIBA

Segata Sanshiro
15/07/2004, 18:44
Fagotero, es de mala educación ser de su propio fanclub xDDDDD
El código así a simple vista parece estar correcto, pero yo no utilizo ningún IDE, sino que compilo desde la línea de comandos, inténtalo y después nos dices qué tal.

Y bueno, si especificas el error exacto que sale, casi que mucho mejor :D

fagotero
15/07/2004, 19:26
Hola Segata.....¿quieres ser de mi Fan Club? xDDD

Pues te explico en un momentín los errors que me dá.

1- Si dejo el código con las lineas:

If (velocidady>15) velocidady=15; End
If (velocidady<-15) velocidady=-15; End
If (velocidadx>15) velocidadx=15; End
If (velocidadx<-15) velocidadx=15; End
If (velocidady>0) velocidady-=1; End
If (velocidady<0) velocidady+=1; End
If (velocidadx>0) velocidadx-=1; End
If (velocidadx<0) velocidadx+=1; End
_______________________________

Es decir igual que como está en el post que tiene el código COMPLETO, la "bola" se queda bloqueada en la posición que se le asigna, es decir:

x=150;
y=120;
_____________________________

2-Si además le añado a ese código los "límites" para que la bola no sobrepase los "límites de la pantalla, la pantalla (joer cómo me repito) se queda de color negro, aunque le elimine la segunda función empezando por arriba:

If (x>310) x=310; End
If (y<20) x=20; End -----aunque elimine esta función con el código completo, la pantalla se sigue quedando en negro
If (x<10) x=10; End
If (y>230) y=230; End
__________________________


3-Luego está lo de que la "bola" se queda como pegada, cuando toca los "límites" de la pantalla asignados aunque me imagino que añadiendo un par de funciones más (tipo rebote) pues se solucionará.

______________________________


Yo hice caso a Wonder_Boy y creé dos ficheros bat, uno que compila y otro que ejecuta el fichero compilado, pero aun así, sigue habiendo esos errores, te agradecería enormemente que testeases el código tú mismo (tranquilo no tendrias que dibujar mucho) ya que estoy muy mosqueado, y como te digo, el código aparentemente está correcto.

El único mensaje en algunas ocasiones pero NO CON ESTE CÓDIGO el error que me sale es el típico:

Mapa 1 no disponible en el fichero 0

Y te puedo decir que no hay ningún fichero de gráficos mal colocado ni nada de eso, simplemente aparece cuando le añanado pues por ejemplo, un par de lineas de código como la de los "límites" de la pantalla......paranoias inexplicables.

______________________________

Ayudame :D que si soluciono esto y un par de cosillas más......ya tendré algo importante.

GRACIAS!!

Segata Sanshiro
15/07/2004, 19:39
Mañana miro a ver :D que tengo sueño, mucho sueño...

La tensión la tengo en 5-9...

fagotero
16/07/2004, 09:42
Bueno Segata...tranquilo ya no hace falta que compiles ni dibujes nada :D SOLUCIONADO ESTÁ :D

Ahora tengo un mini problema y luego ya será cosa de añadir algún proceso para crear 3 vidas, y un contador de tiempo, y por supuesto más pantallas.

Te cuento mi problema es muy tonto pero si me puedes ayudar en un momentín mejor que mejor.

Resulta que tengo esto puesto en el loop de "bola"

If (collision(Type laberinto))
x=20;
y=140;

(Lo que te voy a preguntar, creo que lo podría solucionar yo, pero ya que estoy, jejeej)

Bueno pues eso, que la bola al colisionar, se coloca en esa posición, EL PROBLEMA es que continua con la misma trayectoria que con la que había colisionado, si cuando colisionó, la bola se dirigía a la derecha, la bola se coloca en el punto

x=20;
y=140;

Pero continua hacia la derecha, o hacia la dirección en la que hubiese colisionado.

Pues lo que quiero hacer es que cuando colisione, se quede un segundín quieta en ese punto:

x=20;
y=140;

Eso es todo

:D

Saludos......YA FALTA MENOS PARA LA SALIDA DEL JUEGO!!!

Segata Sanshiro
16/07/2004, 16:05
Coñe, y por qué no pones la velocidad a 0? xDDD O es eso o no lo he entendido.

fagotero
16/07/2004, 16:29
Si es que tengo que actualizar..o por lo menos editar....

Ya lo solucioné por la mañana lo de que la bola se seguía moviendo en la dirección en la que había colisionado.

Gracias igualmente ;)

Ahora sólo me falta añadirle 3 vidas a la bola y cada vez que colisione que pierda una..


Seguro que mañana ya lo tendré...


Aunque...si tú......ejem.....pudieras....decirme.....ejem....

:D

Segata Sanshiro
16/07/2004, 16:36
Nah, te lo curras con tus cohone xDDDD