Después de un par de días, he conseguido descifrar gran parte del código, pero sigo sin comprender como funciona el array s[ ]. Ésto es lo que tengo por ahora:
Código :
createTextField("tfPuntos", 1, 0, 300, 239, 24);
function controlBloque4x4(posX, posY, ficha, color) {
// 4x4 bloques
for (i=0; i<16; i++) {
// no acabo de entender como funciona, pero si es distinto a 0, hay bloque
if (s[i] & (1 << ficha)) {
if (q == 300) {
bloquesOcupados[posX+(i%4)+(posY+(i >> 2))*15] = -color;
continue;
}
// control de colisión con límites y fichas
if (colisionFicha(posX, posY) or colisionParedInferior(posY) or colisionParedIzquierda(posX) or colisionParedDerecha(posX)) {
return 1;
}
if (q<-1) {
// al estar quieta, convertiremos la ficha (bloque x bloque) a un valor positivo
bloquesOcupados[posX+(i%4)+(posY+(i >> 2))*15] = color;
// si éste bloque toca el techo
if (colisionParedSuperior(posY)) {
juegoTerminado();
}
}
}
}
}
function juegoTerminado() {
delete onEnterFrame;
tfPuntos.text = puntos+"\tPress a key";
}
function colisionParedSuperior(posicionY:Number):Boolean {
return posicionY+(i >> 2)<0;
}
function colisionParedInferior(posicionY:Number):Boolean {
return posicionY+(i >> 2)>19;
}
function colisionParedIzquierda(posicionX:Number):Boolean {
return posicionX+(i%4)<0;
}
function colisionParedDerecha(posicionX:Number):Boolean {
return posicionX+(i%4)>9;
}
function colisionFicha(posicionX:Number, posicionY:Number):Boolean {
return bloquesOcupados[posicionX+(i%4)+(posicionY+(i >> 2))*15]>0;
}
function dibujarTablero() {
beginFill(0xeeeeee);
lineStyle(0);
lineTo(151, 0);
lineTo(151, 301);
lineTo(0, 301);
endFill();
}
function ajustesIniciales() {
controlCaida = 0;
puntos = 0;
// el array raro
s = [4325376, 178954464, 8653312, null, 89458032, 268435455, 89520863, 83886080, 2183168, 178937791, 1615119, null, null, 167772160];
// se registra el color para saber si hay o no
bloquesOcupados = [];
ficha = random(28);
siguienteFicha = random(28);
color = random(16777215);
posY = -3;
posX = 3;
}
function borrarPantalla() {
clear();
}
tfPuntos.onKeyDown = function() {
q = Key.getCode();
if (!onEnterFrame) {
ajustesIniciales();
onEnterFrame = function () {
tfPuntos.text = puntos;
// izquierda
if (q == 37) {
posX--;
// si colisiona, lo dejamos donde estaba
if (controlBloque4x4(posX, posY, ficha, color)) {
posX++;
}
}
// arriba (rotación)
if (q == 38) {
q = ficha++;
if (!(ficha%4)) {
ficha -= 4;
}
// si colisiona con algo, volvemos donde estábamos
if (controlBloque4x4(posX, posY, ficha, color)) {
ficha = q;
}
}
// derecha
if (q == 39) {
posX++;
if (controlBloque4x4(posX, posY, ficha, color)) {
posX--;
}
}
q = 300;
borrarPantalla();
// ficha siguiente
controlBloque4x4(11, 3, siguienteFicha, 0xeeeeee);
// actual
controlBloque4x4(posX, posY, ficha, color);
dibujarTablero();
lineStyle(1);
// movemos, dibujamos y borramos el anterior (si existe)
while (q--) {
// si hay bloque
if (bloquesOcupados[q]){
// pintamos estando parado
beginFill(bloquesOcupados[q]);
// si es un bloque en movimiento (valor negativo)
if (bloquesOcupados[q]<0) {
beginFill(-bloquesOcupados[q]);
// nos cargamos el anterior
delete bloquesOcupados[q];
}
// y movemos
moveTo(1+(q%15)*15, 1+Math.floor(q/15)*15);
lineTo(15+1+(q%15)*15, 1+Math.floor(q/15)*15);
lineTo(15+1+(q%15)*15, 15+1+Math.floor(q/15)*15);
lineTo(1+(q%15)*15, 15+1+Math.floor(q/15)*15);
endFill();
}
}
controlCaida++;
// cae cada 3 fotogramas o si pulsamos abajo
if (controlCaida%3 == 0 || Key.isDown(40)) {
posY++;
// si el bloque colisiona por la parte inferior
if (controlBloque4x4(posX, posY, ficha, color)) {
posY--;
q--;
controlBloque4x4(posX, posY, ficha, color);
for (var cont:Number = 0; cont<20; cont++) {
// si es distinto a 0 (tiene el color), le sumamos 1 a x (con 10 hay linea)
for (x=0; bloquesOcupados[x+cont*15]; x++) {
}
// si hay linea
if (x == 10) {
bloquesOcupados.splice(cont*15, 15);
bloquesOcupados.unshift(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
puntos += x;
}
}
// pasaremos a la siguiente ficha
ficha = siguienteFicha;
siguienteFicha = random(28);
color = random(16777215);
posY = -3;
posX = 3;
}
}
};
}
};
tfPuntos.onKeyDown();
Key.addListener(tfPuntos);
Sé que los números del array s[ ] se utilizan solamente para comprobar (en la función controlBloque4x4, anteriormente conocida como "c"), si hay bloque en la ficha pasada como parámetro, pero no entiendo el funcionamiento... ¿qué representan?
A ver si esta vez se atreve alguien más