Noviembre 15, 2017, 10:00:55 PM Ultima modificación: Noviembre 21, 2017, 12:53:34 PM por Big_Smoke
Hola a todos! Queria comentar que estaba tratando de hacer el tipico clon del tetris, cuando me tope con cierto inconveniente.
Estoy tratando de hacer el hard drop con su respectiva pieza fantasma para saber donde iría a caer.. Hasta ahora para no detenerme ahi y poder seguir sin problemas lo " simule " haciendo descender la pieza mas rápido de lo habitual.
Estoy tratando de crear el clon del tetris siguiendo algunos tips de esta pagina
https://gamedevelopment.tutsplus.com/tutorials/implementing-tetris-collision-detection--gamedev-852

Con eso en mente paso a explicar que separe los tableros en 2 uno dinamico y el otro de aterrizaje y los estoy almacenando en un grilla ds_grid y mis piezas tambien las almaceno en una ds_grid de 4x4
Trate haciendo lo siguiente:

/* Aca trato de obtener la ultima linea donde hay bloques /*
for(j=0; j < 4; j++){
   if (piece[# j, potential[1]] > 0){
      if (get_line[j] == 0) {
           get_line[j]= piece[# j, potential[1]];
         }else{
           get_line[j+1] = piece[# j, potential[1]];
      }
   }
}

/*Una vez que se cual fue la ultima fila. Trato de buscar la primera y la ultima columna que contengan bloque*/
for(i=0; i < 4; i++){
     if (get_line > 0){
        last_value = i;
        if(first_value==-1) then first_value = i;
     }
  }

/*Con todos esos datos trato de " trazar " una vertical hacia abajo para saber cual de todos los bloques colisiona primero y asi poder aterrizar arriba*/
for(i= potential[1]; i < ds_grid_height(landed_board); i++){
  for(j=first_value; j < last_value ; j++){
    if (landed_board[# j, i] > 0){
        return i-1;
    }
  }
}

Obviamente este codigo no me funciono trate un par de cosas mas y nada.. Queria saber si ustedes encontraron alguna solución o tienen algo en mente que pueda funcionar, o tal vez la idea que tenia no estaba mal pero falle en el metodo al aplicarla.
Quisiera escuchar sus comentarios al respecto y si tienen alguna idea que tal vez podamos llevar a cabo para encontrar una solucion!  ;D

No se a que te referis con lo de pieza fantasma, podras poner un video o imagen ?

Seguro! http://tetris.wikia.com/wiki/Ghost_piece
Es la una pieza transparente que muestra donde va a terminar cayendo nuestro bloque

#3 Noviembre 16, 2017, 05:09:19 AM Ultima modificación: Noviembre 16, 2017, 05:13:29 AM por Naitsabes0
Creo que el se refiere a que tenga un clon con opacidad que le muestre como encaja la pieza antes de impartar, visualmente es algo como esto.



Aunque el tetris de toda la vida carece de este elemento, es una ayuda que nuevos desarrolladores crearon para facilitar la jugabilidad  :).

Por otro lado no puedo ayudar en términos de código sobre este tema  :(.

Exactamente!
Estoy trabajando con la ds_grid como si fueran matrices. Lo tengo bastante resuelto al juego pero me está haciendo dar muchas vueltas este inconveniente   :-[
Les dejo un adjunto para que lo puedan probar un poco y si tienen un tiempito chequear si limpia bien las lineas porque creo que a veces lo hace mal  XD
Las teclas son las flechas: Hacia arriba rota, a los lados se mueve, hacia abajo desciende mas rápido y con la tecla Space hace el " hard drop " simulado.

Si alguno tiene alguna idea de como se podria abordar el problema bienvenido sea

No he visto tu archivo adjunto, pero lo que puedes hacer es un ciclo for que vaya desde el fondo del tablero hasta arriba. En él, vas analizando si la pieza colisiona con algún bloque. Si colisiona, sigues con el ciclo. Si no, ya encontraste la posición deseada.

En otras palabras, es ir probando a colocar la pieza en el fondo y si no cabe, ir subiendo 1 bloque.
Vota nuestro proyecto en Steam Greenlight:

Estudios Naicura Ltda

#6 Noviembre 17, 2017, 03:10:25 PM Ultima modificación: Noviembre 17, 2017, 07:35:59 PM por Big_Smoke
Exacto! Es lo que venia tratando de hacer pero no podía abstraer la idea para plasmarla en código
Ya quedo! Me falta el ghost y ya estaria solucionado
El codigo para el hard drop me quedo así

for(i=0; i < 4; i++){  // <-- J e I iteran en dentro de la pieza
for(j=0; j < 4; j++){
for(h=0; h < ds_grid_height(board); h++){ // Mientras que H recorre la altura del tablero
                        if (i+1 < 4) then offset = 3; //<-- Esto lo necesite porque mis piezas estaban descentradas
if(piece[# j, i] > 0){ // Cuando se topa con un bloque que compone la pieza comienza a buscar hacia abajo
if (board[# xx+j, h] > 0){ // Si encuentra algun bloque en el camino
if (free_space > h-1) { // Almacena la posicion anterior de menor valor.
free_space = h-1;

}

}
}
}
}
}

return (free_space-offset);