¿mover hasta la y del player 1?

Started by Futu-block, August 22, 2010, 01:02:21 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

Imaginaos un simple pong, un solo jugador, que la paleta del jugador 2 o cpu (la maquina como le digo yo) pregunte la posición de la y de la bola y se desplace verticalmente hasta esa posición...

¿¿como c*ñ* se hace eso??
porque cada cierto tiempo (un contador o un random, por ejemplo) se dirija a la altura correspondien...
me repito porque no lo veo claro

pd: ya lo he buscado en el manual y nasti del plasti

Prg

la idea más sencilla se me hace con manipulación de vectores.

al colisionar la pelota en la pared, se genera un vector con un ángulo de dirección nuevo, hay que tomar el nuevo ángulo, y de acuerdo a la velocidad de la pelota y la distancia entre el punto de colisión entre la pelota y la pared, encontrar la coordenada "y" del vector cuando la coordenada "x" sea igual a la coordenada donde se encuetra la raqueta del cpu.

si ya tienes el algoritmo de rebote de la pelota no debería ser difícil conocer el ángulo. al fin y al cabo el vector de movimiento de la pelota es x=cos (ang)*vel  y=sin (ang)*vel con sus respectivos cambios por la forma en que la pantalla está, creo que y debe cambiar de signo, no recuerdo bien...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Noivern

a ver, yo lo haría así:
1. Pregunto la 'y' de la bola
2. Hago la resta entre la 'y' de la paleta y la 'y' de la bola
3. Si el resultado es positivo, es por que mi paleta esta más abajo que la bola, entonces tendrias que restarle 'y' a la paleta para que suba, si es negativo, pues sumarle 'y'. La cantidad a sumar debería ser incremental y gradualmente para que no se vea tan hija e'puta la maquina xD
Además puedes tomar en cuenta tambien la distancia entre las x de la bola y la paleta, cosa que si cada frame es menor, la velocidad de la paleta en vertical sea mayor, para que haga el intento de de llegar a una bola rápida. Lo de los ángulos ya es algo más elaborado :P

Futu-block

eso es justo lo que quiero, es mas, si le ponemos niveles de dificultad cuanto mas alto el nivel mas veces pregunta por la 'Y' de la pelota y mas corto será el movimiento...
pero claro, estoy buscando la parte del codigo correspondiente para preguntar por  'y' en un momento determinado, porque lo del movimiento no creo que haya polemas ya que en un momento dao uso hasta advance si hace falta...

echaré un vistaso a lo de get point que he visto en otro hilo a ver si es eso

Noivern

Es fácil si la pelota es un proceso: al momento de crearla, debes guardar su id en alguna variable.
Ej: crea una variable int global y le pones un nombre adhoc, id_pelota. Cuando crees la pelota, en vez de poner
pelota(<<aqui tus parametros>>);
escribe
id_pelota = pelota(<<aqui tus parametros>>);

Luego podrás acceder a todos los datos LOCALES de ese proceso de la forma:
id_pelota.x
id_pelota.y
id_pelota.graph
id_pelota.size
etc

¿Usas variables públicas? Si es asi, cambia un poco la historia. (espero tu respuesta)

Atención, que debes controlar que esa pelota EXISTA antes de preguntar por su 'y', si la bola muere (el proceso muere) y no actualizas la id_pelota, intentaras acceder a algo que ya no existe y el juego petará como dicen los españoles xD


Drumpi

Hay otro método, que no necesita guardar la id:
get_id(type pelota)
Así puedes obtener la id de la pelota (si existe, si no devuelve 0), incluso puedes hacer la consulta directamente: get_id(type pelota).y pero como el proceso no exista en ese momento te puede dar un error grave y salirse del programa de golpe.

Además, cada vez que escribas eso, te devolverá la id de un proceso existente con ese nombre distinto, y cuando no quede ninguno empezará a devolver 0 hasta que hagas frame, por lo que si existen dos procesos del mismo tipo tendrás que distinguirlos de algna forma.
Y aun que tengas 1 sólo es mejor que no hagas esto:

if (exists(get_id(type pelota)))
y=get_id(type pelota).y;
end

lo suyo sería:
id_pelota=get_id(type pelota)
if (id_pelota) y=id_pelota.y; end
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)

Futu-block

#6
Quote from: Drumpi on August 22, 2010, 12:29:29 PM
lo suyo sería:
id_pelota=get_id(type pelota)
if (id_pelota) y=id_pelota.y; end

vale, codigo demasiado complicado, estudiaré eso de id_pelota y lo de get_id...

es que si no lo comprendo no puedo usarlo ^^U



Quote from: Noivern on August 22, 2010, 09:15:22 AM
¿Usas variables públicas? Si es asi, cambia un poco la historia. (espero tu respuesta)


no, me dan miedo...

una vez la usé y no me salió bien, así que la convertí en globales

Mr Matsusaka

Pues mas vale que le pierdas el miedo a usar identificadores. Sino no seras capaz de programar ningun juego medianamente decente. Animo que cuando te pones es sencillo!

Prg

 :D

cada proceso retorna un codigo, este codigo se puede usar para acceder a las variables  locales del proceso.

coordenada x,y,z
angulo
id (el propio codigo)

http://wiki.bennugd.org/index.php?title=Local_variables

entonces si conocemos el id (codigo) de algun proceso, podemos conocer muchos de sus parametros (todos aquellos que no son privados).

para obtener el id de un proceso hay varios caminos:

-colisionar con él (collision retorna el id del proceso con que colisiona)
-obtenerlo al crear el proceso (como ya te lo dijeron puedes hacer prota = protagonista(); y ya tienes el id del proceso almacenado en la variable prota)
- Con get_id(type p). con esta función recorres toda la lista de ids de un determinado tipo de proceso, por ejemplo si hay muchos protagonistas, puedes conocer la id de todos.

http://wiki.bennugd.org/index.php?title=Get_id

una vez teniendo la id de un proceso, puedes conocer sus valores de la siguiente manera:

id.variable

ejemplo

prota.x
if (prota.y==7)
prota.angle+=1000;
etc...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Futu-block

hombre, con el wiski en ingles no me entero de mucho pero tu explicacion si

ahora me queda el ''move to'' el punto indicado, creo que le voy a meter un while...

JMP

Puedes usar este metodo, jugando con la latencia podra moverse mas rapido o mas despacio


GLOBAL
  int level = 1;
  int latencia = 3;
END

PROCESS pala_cpu ()
PRIVATE
  int tiempo;
END
BEGIN

graph = 1;

LOOP
  tiempo++;
  IF (tiempo % (level*latencia) == 0)
    IF (pelota.y < y )
      y = y - 3;
    ELSE
      y = y + 3;
    END
  END

  FRAME;
END

END


Noivern

Quote from: Drumpi on August 22, 2010, 12:29:29 PM
Hay otro método, que no necesita guardar la id:
get_id(type pelota)
Así puedes obtener la id de la pelota (si existe, si no devuelve 0), incluso puedes hacer la consulta directamente: get_id(type pelota).y pero como el proceso no exista en ese momento te puede dar un error grave y salirse del programa de golpe.

Además, cada vez que escribas eso, te devolverá la id de un proceso existente con ese nombre distinto, y cuando no quede ninguno empezará a devolver 0 hasta que hagas frame, por lo que si existen dos procesos del mismo tipo tendrás que distinguirlos de algna forma.
Y aun que tengas 1 sólo es mejor que no hagas esto:

if (exists(get_id(type pelota)))
y=get_id(type pelota).y;
end

lo suyo sería:
id_pelota=get_id(type pelota)
if (id_pelota) y=id_pelota.y; end

¿El exists() demanda más cpu me imagino?
Que normalmente el if(variable) me funciona, pero cuando he probado colisiones de varios disparos en un mismo enemigo (recorriendo los disparos con un while), no me iban bien, aunque creo que el problema es mi noobedad + código. Bueno hoy le hecharé una nueva mirada, quizás era cansancio :P



Y para el amigo Futublog, debes animarte a usar publicas, ya que si siempre usas globales, luego te armaras un lío para controlar cosas: imagina controlar la energia de 20 o más enemigos al mismo tiempo con variables globales X_x. Es básicamente una local, pero para procesos que tú especifícas, por lo que te proporciona acceso a esas variables desde otros procesos/funciones.

Y el get_id() que te mencionan es mejor que lo que te mencioné yo, puesto que si quieres agregar más pelotas al juego en algun momento, con esa función puedes conocer la 'y' de todas las bolas, pero para ello debes obtener la id de todos los procesos pelota, llamando al get_id() tantas veces como pelotas haya en juego. Si no planeas hacer esto, olvida lo que acabo de mencionar para que no te compliques xd

Futu-block

no voy a agregar mas pelotas, en mi procedimiento de aprendizaje he de razonar y comprender para poder trabajar, me ha costado todo el dia entero aprender el metodo de drumpi, mas que nada porque habia que razonarlo y usarlo en el sitio adecuado...
una vez que lo he sacado en claro me dedico a introducirlo en el codigo para la funcion deseada (o desempeño deseado) y a aprovecharlo

me estoy dando cuenta que programar un juego no tiene tanto, ni siquiera eso de ''local'' que es lo proximo que me voy a poner

Drumpi

El exists implica leerse las listas de procesos existentes (en ejecución, ejecutados, en espera, congelados y dormidos) buscando uno cuya ID coincida con el que buscamos, mientras que el if necesita previamente del get_id, cuyo procedimiento es igual, salvo que busca entre los procesos que tengan determinado valor en una variable reservada, computacionalmente puede ser algo más lento pero estamos hablando de 8-16 ciclos por proceso (hay 500.000.000 de ciclos en 500MHz).
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)

Noivern

Quote from: Futublog on August 22, 2010, 07:49:51 PM
(...)
me estoy dando cuenta que programar un juego no tiene tanto, ni siquiera eso de ''local'' que es lo proximo que me voy a poner

ajaj para mi, me es mucho más cansador y complicado buscar gráficos / ripear / dibujar yo mismo xD

-----o-----
QuoteEl exists implica leerse las listas de procesos existentes (en ejecución, ejecutados, en espera, congelados y dormidos) buscando uno cuya ID coincida con el que buscamos, mientras que el if necesita previamente del get_id, cuyo procedimiento es igual, salvo que busca entre los procesos que tengan determinado valor en una variable reservada, computacionalmente puede ser algo más lento pero estamos hablando de 8-16 ciclos por proceso (hay 500.000.000 de ciclos en 500MHz)

Gracias por la aclaracion Drumpi