Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Andoroid

Iniciado por AgeR, 04 de Marzo de 2006, 05:35:14 PM

« anterior - próximo »

AgeR

 Pues bueno, hace unos días llevamos entre manos un arkanoid y lo cierto es que no va mal del todo, pero antes de seguir nos gustaría escuchar cualquier crítica o sugerencia a lo que tenemos ahora.

Detalles conocidos:
- El bicho verde no tiene fondo transparente.
- La bola rebota mal a veces con los ladrillos.
- La bola se mueve "a golpes".

Si a alguien se le ocurre el por qué la bola se mueve tan mal no dude en decirmelo. He probado de todo, fijar los fps, probar distintas velocidades y movimiento basado en tiempo... Hay doble buffer y demás, así que no entiendo ese movimiento tan penoso.

Pues nada, no es mucho lo que hay de momento, pero cuanto antes se enseña algo, antes puede corregirse. Decir también que a la vez estoy diseñando un miniframework para hacer este tipo de jueguecillos, en cuanto sea usable lo haré público para que lo use quien quiera.

Descarga: Andoroid

[Vil]

 Pues el tema del movimiento de la pelota:

- Se mueve mas rápido cuanto mas alto es el valor de su incremento en X. No se si me explico. SI la bola se moviese totalmente vertical, lo haria mucho mas lento que si lo hiciese totalmente horizontal. Quiza tengas algun problema ahí con trigonometría o algo.

- A veces cuando le das con el "arkanoid" (no se como se llama lo que mueves, jejeej) no le transmite su velocidad de forma correcta y la acelera o decelera pal lao q no es. Aunque viendolo de nuevo no me pasa, quiza me he liao por el problema de la velocidad de la pelota

- Dependiendo de la vez q ejecute el juego, se me mueve mas rapido la pelota o menos (a parte de lo ya comentado).  Supuestamiento fijando fps o con movimiento "relativo al tiempo" como dices debiera de arreglarse. Asi q no lo entiendo. Debugea a saco viendo si los incrementos de movimiento de la pelota son los mismos cada intervalo igual de tiempo... no se.

- El movimiento, dentro de lo dicho es "suave"

Y otras cosillas

- Pondria un manejo por ratón, o q al moverse tuviera algo de aceleración. Se mueve demasiado monotono y lento.

- Las letras de los letreros no se leen nitidamente, y no te se decir porque

- El boton de activar/desactivar musica esta funcionando con un mousedown y no mouseclick (por decirlo de alguna forma. Es decir, cambia el valor mientras esta pulsado el boton, y no cuando se suelta el boton (del raton).

Espero ayudar un poco

Saludos!

Pogacha

 Ok ...
MAS DETALLES:
- Faltan los puntos y vidas tambien
- La pelota rebota en el suelo en vez de perder la vida

Esto no puede fallar:

float pelota_posicion_x, pelota_posicion_y, pelota_delta_x,  pelota_delta_y;
float ultimo_tiempo =Get_Tiempo();
while(NoSalir) // game loop
{
 float tiempo_actual = Get_Tiempo();
 delta_tiempo  = tiempo_actual - ultimo_tiempo;
 ultimo_tiempo = tiempo_actual;
 
 pelota_posicion_x += pelota_delta_x * delta_tiempo;
 pelota_posicion_y += pelota_delta_y * delta_tiempo;

 dibujar_pelota( int ( pelota_posicion_x ) , int ( pelota_posicion_y ));
};


La verdad es que deberas dar mas detalles para poder ayudarte en que por que anda a golpes ...
En algun lado estas haciendo un sleep()? para mostrar el gif?

Otros tips, de todo un poco ( la mayoria supongo que ya sabras ):
* Necesita bloques de distinto color.
* Items y power ups.
* movimiento suave de la paleta tambien, si puedes darle inercia mejor
* Que cuando rebote en la paleta cambie el angulo ( o sea que la paleta sea redondeada a efectos del rebote).
* Dar una idea de para que sirve el vicho ese que esta al costado ... es decorativo? pues me distrae ...
* La pelota es medio grande no ?
* Los guis funcionan bien, pero trataria de quitarles el pixelado con alguna tecnica de difumado ... inclusive todo el arte tiene ese aspecto, me centraria en quitar el pixelado tan solo.

Por lo demas parece ir bien ...  mucha suerte!!!

Saludos.

AgeR

 vil:
El movimiento varía, según hacia dónde te estés moviendo cuando le das a la pelota. A veces irá más rápido en x y otras en y.
El manejo con ratón lo pondremos más adelante casi seguro.
Lo del botón de la música lo sé, pero como ando liado con lo del movimiento no he cambiado el código aún XD.

Pogacha:
Ese código es el que uso, por eso no entiendo el problema. No hago ningún sleep en ningún lado tampoco.
Sobre los detalles, sí, iré añadiendo funcionalidades poco a poco en cuanto arregle este tema. Pasaré tus comentarios sobre los gráficos al grafo a ver qué hace.

Bueno, más detalles: uso SDL para el tema gráfico, la pelota tiene una velocidad de entre 1 y 4 por el tiempo delta. Para más inri tengo capados los fps a 60. Da igual que estén los fps capados o no, la pelota sigue viéndose igual de mal.

Gracias por los comentarios!

[Vil]

Cita de: "AgeR"El movimiento varía, según hacia dónde te estés moviendo cuando le das a la pelota. A veces irá más rápido en x y otras en y
Mmm, es posible, pero es q cuando se mueve muy horizontal (porq tu le has transmitido esa velocidad) siempre es muucho mayor q cuando se mueve verticalmente. Yo lo veo demasiado bestia, y de hecho no se si los antoguos arkanoid tenian estos cambios de velocidad.

Mars Attacks

 No tengo ni idea, pero me molaría que la paleta no estuviera restringida al fondo inferior de la pantalla y que pudiera ser algo más tipo "frontón" (que tuvieras libertad de mover también la paleta hacia delante, manejo por ratón y más puntuación cuanto más cerca de los ladrillos estés). Lalala  (ole)  

senior wapo

 La pelota no se comporta según las reglas del Arkanoid. No se si lo haces aposta o no, pero tradicionalmente el ángulo al rebotar con el pad no depende de la dirección sino del punto de rebote.
- El ángulo de la pelota al chocar con el pad es proporcional a la distancia al centro del pad y la dirección depende de si ha rebotado a la derecha o a la izquierda del centro del pad. Si no lo haces así, el jugador no puede hacer que la pelota vaya exactamente donde él quiere y se pierde la gracia del juego. Un arkanoid no consiste en tratar de que la pelota no caiga mientras va a donde le da la gana.

Al rebotar en el pad (de cabeza, supongo que está bien):

factor_rebote = (centro_pelota_x - centro_pad_x ) / ( ancho_pad / 2 ); // Normaliza a ( -1,1 )
angulo_radianes = factor_rebote * 3.1515926536;
delta_y = cos( angulo_radianes );  // Máximo cuando factor=0, en el centro
delta_x = sin( angulo_radianes );    // Maximo cuando factor=1, en los extremos

AgeR

 senior wapo:
No no, eso lo sé, sólo que para "ir tirando" decidí hacerlo como está ahora de modo que se pudieran probar los ángulos sin complicarme la vida al principio. De hecho espero hoy tener implementado el rebote con el pad como tú bien comentas, que es como se hace en todos los arkanoids.


Esto no es realmente problema, los mayores problemas que veo son el dichoso movimiento de la bola y el control de las colisiones, puesto que a veces hay fallos debido a que la bola traspasa un ladrillo entre frame y frame.

Ayer subí una versión que retoca el tema de los botones y el movimiento de la bola, aunque no he solucionado los problemas. Descarga

Gracias a todos por los comentarios!

ethernet

 Lo correcto entonces es que la nave del arcanoid fuera semiesférica no plana XD

Pogacha

Cita de: "ethernet"Lo correcto entonces es que la nave del arcanoid fuera semiesférica no plana XD
El breakquest toma en cuenta la forma fisica para el dibujo, pero el arkanoid original lo hacia bien igual!

CitarAyer subí una versión que retoca el tema de los botones y el movimiento de la bola, aunque no he solucionado los problemas. Descarga

Don Ager, el pixelado feo sigue ahí ... dile a tu grafista que haga todos los graficos al doble de la definivión y luego los baje a la mitad con un filtro bilineal.

La paleta se mueve bastante feo, estas usando enteros para los desplazamientos?. Usa todo en punto flotante y luego trunquealo a enteros para dibujar.

Saludos.

marcode

 Hice una replica del arkanoid hace ya bastante tiempo para ms-dos que funcionaba perfectamente, quizás te puedo echar una mano.

La forma de asignar los movimientos fue crear un array de 22 direcciones, para hallarlas se puede usar las formulas que puso anteriormente senior.


for (int i=0;i<22;i++)
{
      float a = (PI*2 / 22) * i;
      Dir[i].x = sin(a);
      Dir[i].y = cos(a);
}

La dirección de la pelota se establecerá a partir de ese array cuando sea golpeada por la raqueta. A cada zona de la raqueta le corresponde un índice de dirección.
     

 I=  18 | 19 | 20  |  21  |   0  |  1   |  2  | 3
    (=========================)

dx = Dir[I].x;
dy = Dir[I].y;

El incremento de posición será igual a la dirección por la velocidad;


px += dx * speed;
py += dy * speed;

la velocidad tendrá que ser multiplicada previamente por el tiempo delta (que también debería ser un float)

En las comprobaciones de colisiones el cambio de dirección dependerá del lado con el que rebote para muros y ladrillos. si golpea en un muro lateral o el lado lateral de un ladrillo se invierte el signo de dx, si golpea en la parte  superior o inferior se invierte dy.

Para hacer el golpeo correctamente hay que comprobar si el borde correspondiente de la pelota ha entrado en otro objeto. Si ha entrado se retrasa la posición de la pelota a la mitad de distancia con respecto a la posición anterior, y se vuelve a repetir este paso hasta que quede situada justo en el borde (hasta que no se detecte colisión).

Seguramente tendrás que asignar 2 puntos de comprobación de colisión como mínimo por cada lado de la bola, de manera que compruebas 2 por cada lado, arriba, abajo, derecha, izquierda.

Citar
       x     x
  x             x

  x             x
       x     x
Espero que te sirva algo.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

AgeR

 Bueno, he subido una nueva versión en la que la bola ya rebota bien en la barra. He usado el código que había posteado senior wapo con alguna modificación.

float factor_rebote = (vPosBola.x - vPos.x) / (Barra->GetWidth());
double angulo_radianes = factor_rebote * 3.141592;
vPosBola.y = vPos.y - 1 - Barra->GetHeight()/2 - Bola->GetHeight()/2;
vDirBola.y = -cos(angulo_radianes)*timeDelta;
vDirBola.x = sin(angulo_radianes)*timeDelta;


marcode, gracias por la explicación, tanto del rebote con la paleta, aunque no voy a usar precálculos, como con el de los ladrillos. Voy a probar esos 2 puntos de colisión por cada lado, ahora mismo sólo estaba calculando las 4 esquinas y el centro. Supongo que con 8 comprobaciones irán mejor las colisiones.

Pogacha lo del pixelado no lo había tocado, ya que no había hablado con el grafo, ahora se lo comento. Lo de los botones me refería al hacer click, que antes detectaba la simple pulsación, y ahora detecto el click (pulsación+release).

La verdad es que hacer un arkanoid parece una tontería, pero estoy aprendiendo un wevo con esto. Recomiendo a todo el mundo que haga juegos pequeños, siempre se aprende algo  (uoh) .

marcode

 El arkanoid original usa direcciones fijas, no se si 22, esas fueron las que usé yo. A lo primero pensé en hacerlas variables pero no me gustaba mucho, es más fácil al jugar conocer las direcciones que puede tomar la bola al golpear con la raqueta, tampoco me gusta que cuando da en el centro vaya recta y cuando da en el pico muy inclinada, eso ya no es el arkanoid.

Y la dirección de la bola solo se establece cuando pega en la raqueta (creo que también en los bichos). Cuando da en los ladrillos o en los muros solo se invierte el signo de dirección de x o de y. dependiendo de si da en un lado horizontal o vertical.

No es fácil que rebote siempre bien, ya veras cuando pongas ladrillos "duros" y la bola vaya a toda velocidad.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zwiTTeR

 
Bueno, yo no te puedo ayudar demasiado en la programación.... pero bueno, siempre me gusta probar este tipo de juegos :-D , ... molaria que le pusieras un poco de inercia a la paleta... para que el movimiento fuera más suave... y bueno, la bola sigue haciendo cosas raritas, bastante raritas xD.

¿Tienes pensado añadir más niveles? , quizá una cosa que estaría guapa para un arkanoid... sería hacer una especie de modo "panic" , ósea, un modo en el que no se pasará de nivel... si no que fueran viniendo nuevas líneas de ladrillos desde arriba de vez en cuando, al estilo "puzzle bubble" ... algo así estaría guay :-) ... con diferentes ladrillos, etc. Lo podrías hacer un poco "aleatorio" ... y tener un juego "infinito" ... así te ahorras de programar los niveles y "picas" a la gente para ver quien hace más puntos xD. Bueno solo es una idea, por "innovar" un poco en el concepto clásico xD.

Otra idea... podría ser que la "bola" cambiara de color cada vez que choca con la paleta... y solamente pudiera romper los ladrillos de dicho color... (por supuesto con una ventanita tipo tetris... donde pusiera el "siguiente color").

Jor, que ideas más chorras se me ocurren :-) ... una mezcla que siempre me habría gustado ... es la de mezclar las "paletas" y y la bola de un pinball...  con los ladrillos de un arkanoid xD

Tambien puedes fusionar el arkanoid con el space invaders... o cualquier cosa, para no hacer lo "típico".

:-(  , bueno, me voy a sobar... que ya he hecho bastante por hoy :-)

Por cierto Ager, ... realmente pienso como tú... haciendo juegos sencillos es como más se aprende :-D ... sobre todo cuando te das cuenta de que no son tan sencillos como parecen xDDD

Animo!

zwiTTeR

 Por cierto... utilizando PNG... podrías quitarle los bordes dentados... tal y como te comenta pogacha :-) , cuando se utiliza bmp o gif... que no permiten canales alpha con diferentes niveles... es normal que los gráficos queden así... pero utilizando png se pude sacar mucho más provecho y suavizar los pixels :-) . El bichito verde me gusta bastante... pero no pega con el resto de gráficos, para mi gusto ... quedarían mejor unos gráficos más en la línea "pixel art" del bichito... que los típicos que habéis puesto en el interface con los "biseles y relieves" de fotochop xD

Bueno, lo dicho... muchos animos y suerte con el juego :-D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.