Arkanoid Game

Arkanoid

Arkanoid es un videojuego de arcade desarrollado por Taito en 1986. Está basado en los Breakout de Atari de los años 70

A causa de la popularidad del juego, cuatro versiones se desarrollaron para el mercado de las máquinas arcade: Arkanoid, Tournament Arkanoid y Revenge of Doh (Arkanoid II), ambas en 1987, y Arkanoid Returns en 1997.

La mayoría de computadores de 8 bits (ZX Spectrum, Amstrad CPC 464, Commodore 64, MSX, Atari 8-bit, Apple II…) eran muy populares en Europa en los 80. Un puerto de consola en la NES también era popular, así que el juego fue portado para computadoras de 16 bits como Commodore Amiga, Atari ST, Apple IIGS o IBM-PC. También se desarrolló una conversión para TRS-80 Color Computer en 1989.

Una versión para SNES, llamada Arkanoid: Doh it Again, se lanzó en 1997. Arkanoid Returns y su secuela, Arkanoid Returns 2000, se lanzaron en Japón para PlayStation. Las versiones de 16 bits tenían exactamente los mismos gráficos que el juego original. La conversión de Arkanoid para Commodore 64 es conocida por ser el primer juego para dicho sistema que incluía música que usaba samples digitalizados (compuestos por Martin Galway).

Los controles usados difieren entre las máquinas, y algunas conversiones permitían múltiples métodos de control. Los dos métodos básicos de control eran digital y analógico. Los controles digitales (muchos joysticks y teclados) son considerados menos convenientes que los analógicos (como ratones y trackballs): mientras que los digitales limitan al jugador a una única velocidad, los analógicos permiten mover la Vaus casi a cualquier velocidad deseada a través del a pantalla.

La versión de Arkanoid para NES era inicialmente empaquetada con el que se considera uno de los mandos menos comunes de dicha consola: el Vaus Controller, un pequeño mando con un único botón, una pequeña rueda (con ángulo de giro limitado), un puerto y el logo de Taito. Aunque podía jugarse con el mando digital estándar de NES, el juego óptimo se conseguía con el Vaus Controller.

Arkanoid continúa siendo un juego muy popular, y es clonado frecuentemente para títulos de freeware y shareware. La mayoría de empresas también lo han clonado habitualmente para sus máquinas. Sin embargo, Arkanoid o sus secuelas no aparecen en ninguna de las recientes recopilaciones Taito Memories o Taito Legends, posiblemente debido a acciones legales de Atari.

4fbOxCE.png

Para el desarrollo de este Juego se crearon diferentes proyectos incluidos para mantener un orden:

* barra_controlador.prj
* barra_de_despazamiento.prj
* barra.prj
* Barra1_inferior.prj
* bloques1.prj
* Imagen.prj
* position.prj
* top_vga.prj

Esta fué la estructura que se trabajó para simular la posición de los objetos dentro del juego :

module position(clk, clk2,posx, posy, posbarrax,existencia1,existencia2,existencia3);
input clk;
output reg [9:0] posx=300;
output reg [9:0] posy=160;
output reg existencia1=0;
output reg existencia2=0;
output reg existencia3=0;
output reg clk2;
//output reg existencia4=0;,existencia4,existencia5,existencia6,existencia7,existencia8,existencia9
//output reg existencia5=0;
//output reg existencia6=0;
//output reg existencia7=0;
//output reg existencia8=0;
//output reg existencia9=0;
input [9:0] posbarrax;
reg [17:0] temp=0;
reg dirx=0;
reg diry=0;
always @(posedge clk) begin
temp=temp+1;
clk2=temp[17];
end

always @(posedge clk2) begin

//iniciadores.
if (dirx==0 & diry==0) begin
//if ((posy==410)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
//else diry=0;
if (posx>=610) dirx=1;
else dirx=0;
if (posy>=460) diry=1; //desactivar mas no borrar
else diry=0; //desactivar mas no borrar
/*if(posx+20>=0 & posx<=620 & posy>=470 & posy<=480) begin
posx=posx-posx;
posy=posy-posy;
end
else begin
posx=posx;
posy=posy;
end*/
end
else if (dirx==0 & diry==1) begin
if (posx>=610) dirx=1;
else dirx=0;
if (posy<=10) diry=0;
else diry=1;
if(posx+20>=0 & posx<=620 & posy>=470 & posy<=480) begin
posx=posx-posx;
posy=posy-posy;
end
else begin
posx=posx;
posy=posy;
end
end
if (dirx==1 & diry==1) begin
if (posx<=10) dirx=0;
else dirx=1;
if (posy<=10) diry=0;
else diry=1;
end
else if (dirx==1 & diry==0) begin
//if ((posy==410)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
//else diry=0;
if (posx<=10) dirx=0;
else dirx=1;
if (posy>=460) diry=1; //desactivar mas no borrar
else diry=0; //desactivar mas no borrar
end
//Esto evita que choque con los border.

diagonal derecha descendente///7
if (dirx==0 & diry==0) begin
posx=posx+1;
posy=posy+1;
if (posx>=610) dirx=1;
else dirx=0;
if (posy>=460) diry=1; //desactivar, no borrar
else diry=0; //desactivar, no borrar
//choque con el borde de la barra
if(posx+20==posbarrax)
if(posy>=430 & posy<=440) dirx=1;
else dirx=0;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
// barra de desplazamiento
//if (((posy>=410& & posy<=410)&(posx>=posbarrax))&()) diry=1;
//else diry=0;
// choque con el borde de la barra
if ((posy+20>=410 & posy<=430)&(posx==posbarrax-20)) dirx=1;
else dirx=0;

// choque diagonal derecha decendente con bloque 1
if(existencia1==0)
if(posx+20>=30 & posx<=150)
if(posy==30)begin
diry=1;
existencia1=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
diry=0;
existencia1=0;
end

// choque diagonal derecha decendente con bloque 1-1
if(existencia1==0)
if(posx+20==150)
if(posy>=30 & posy<=120)begin
dirx=1;
existencia1=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
dirx=0;
existencia1=0;
end
// choque diagonal derecha decendente con bloque 2
if(existencia2==0)
if(posx+20>=160 & posx<=280)
if(posy+20==30)begin
diry=1;
existencia2=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
diry=0;
existencia2=0;
end
// choque diagonal derecha decendente con bloque 2-2
if(existencia2==0)
if(posx+20==160)
if(posy>=30 & posy<=120)begin
dirx=1;
existencia2=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
dirx=0;
existencia2=0;
end
// choque diagonal derecha decendente con bloque 3
if(existencia3==0)
if(posx+20>=290 & posx<=410)
if(posy+20==30)begin
diry=1;
existencia3=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
diry=0;
existencia3=0;
end
// choque diagonal derecha decendente con bloque 3-3
if(existencia3==0)
if(posx+20==290)
if(posy>=30 & posy<=120)begin
dirx=1;
existencia3=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
end
else begin
dirx=0;
existencia3=0;
end
end //End sin saber por que

diagonal izquierda decendente
else if (dirx==1 & diry==0) begin
posx=posx-1;
posy=posy+1;
if (posx<=10) dirx=0;
else dirx=1;
if (posy>=460) diry=1; //desactivar mas no borrar
else diry=0; //desactivar mas no borrar
//choque con el borde de la barra
if(posx==posbarrax+100)
if(posy>=430 & posy<=440)dirx=0;
else dirx=1;
// barra de desplazamiento
if ((posy>=410 & posy<=413)&(posx>=posbarrax)& (posx<=posbarrax+100)) diry=1;
else diry=0;
// choque con el borde de la barra
if ((posy+20>=410 & posy<=430)&(posx==posbarrax+100)) dirx=0;
else dirx=1;

// choque diagonal izquierda decendente con bloque 1
if(existencia1==0)
if(posx+20>=30 & posx<=150)
if(posy+20==30)begin
dirx=0;diry=1;
existencia1=1;
end
else begin
dirx=1;
diry=0;
existencia1=0;
end

// choque diagonal izquierda decendente con bloque 1-1
if(existencia1==0)
if(posx>=30 & posx<=150 )
if(posy>=30 & posy<=120)begin
dirx=0;
existencia1=1;
end
else begin
dirx=1;
existencia1=0;
end
// choque diagonal izquierda decendente con bloque 2
if(existencia2==0)
if(posx+20>=160 & posx<=280)
if(posy+20==30)begin
diry=1;
existencia2=1;
end
else begin
diry=0;
existencia2=0;
end

// choque diagonal izquierda decendente con bloque 2_2
if(existencia2==0)
if(posx+20==280)
if(posy>=30 & posy<=120)begin
dirx=0;
existencia2=1;
end
else begin
dirx=1;
existencia2=0;
end
// choque diagonal izquierda decendente con bloque 3
if(existencia3==0)
if(posx+20>=290 & posx<=410)
if(posy+20==30)begin
dirx=0;diry=1;
existencia3=1;
existencia1=1;
end
else begin
dirx=1;diry=0;
existencia3=0;
existencia1=0;
end

// choque diagonal izquierda decendente con bloque 3_3
if(existencia3==0)
if(posx+20==410)
if(posy>=30 & posy<=120)begin
diry=1;dirx=0;
existencia3=1;
existencia1=1;
end
else begin
diry=0;dirx=1;
existencia3=0;
existencia1=0;
end
end

diagonal derecha ascendente
else if (dirx==0 & diry==1) begin
posx=posx+1;
posy=posy-1;
if (posx>=610) dirx=1;
else dirx=0;
if (posy<=10) diry=0;
else diry=1;
/*if(posx+20>=0 & posx<=620 & posy>=470 & posy<=480) begin
posx=posx-posx;
posy=posy-posy;
end
else begin
posx=posx;
posy=posy;
end*/
// choque diagonal derecha ascendente con bloque 1
if(existencia1==0)
if(posx+20>=30 & posx<=150)
if(posy==120)begin
//dirx=1;
diry=0;
existencia1=1;
existencia1=1;
end
else begin
dirx=0;
diry=1;
existencia1=0;
existencia1=0;
end

// choque diagonal derecha ascendente con bloque 1_1
if(existencia1==0)
if(posx==150)
if(posy>=30 & posy<=120)begin
diry=0;
dirx=1;
existencia1=1;
existencia1=1;
end
else begin
diry=1;
dirx=0;
existencia1=0;
existencia1=0;
end
// choque diagonal derecha ascendente con bloque 2
if(existencia2==0)
if(posx>=160 & posx<=280)
if(posy==120)begin
//dirx=1;
diry=0;
existencia2=1;
end
else begin
//dirx=0;
diry=1;
existencia2=0;
end
// choque diagonal derecha ascendente con bloque 2_2
if(existencia2==0)
if(posx==280)
if(posy>=30 & posy<=120)begin
//diry=0;
dirx=1;
existencia2=1;
end
else begin
//diry=1;
dirx=0;
existencia2=0;
end

// choque diagonal derecha ascendente con bloque 3
if(existencia3==0)
if(posx+20==290)
if(posy>=30 & posy<=120)begin
dirx=1;diry=0;
existencia3=1;
existencia1=1;
end
else begin
dirx=0;diry=1;
existencia3=0;
existencia1=0;
end

// choque diagonal derecha ascendente con bloque 3_3
if(existencia3==0)
if(posx+20>=290 & posx<=410)
if(posy==120)begin
diry=0;dirx=1;
existencia3=1;
existencia1=1;
end
else begin
diry=1;dirx=0;
existencia3=0;
existencia1=0;
end

end
//diagonal izquierda ascendente
if (dirx==1 & diry==1) begin
posx=posx-1;
posy=posy-1;
if (posx<=10) dirx=0;
else dirx=1;
if (posy<=10) diry=0;
else diry=1;
// choque diagonal izquierda ascendente con bloque 1
if(existencia1==0)
if(posx+20>=30 & posx<=150)
if(posy==120)begin
diry=0;
existencia1=1;
end
else begin
diry=1;
existencia1=0;
end

// choque diagonal izquierda ascendente con bloque 1_1
if(existencia1==0)
if(posx+20==30)
if(posy>=30 & posy<=120)begin
dirx=0;
existencia1=1;
end
else begin
dirx=1;
existencia1=0;
end
// choque diagonal izquierda ascendente con bloque 2
if(existencia2==0)
if(posx+20>=160 & posx<=280)
if(posy+20==120)begin
diry=0;
existencia2=1;
end
else begin
diry=1;
existencia2=0;
end

// choque diagonal izquierda ascendente con bloque 2_2
if(existencia2==0)
if(posx+20==160)
if(posy>=30 & posy<=120)begin
dirx=0;
existencia2=1;
end
else begin
dirx=1;
existencia2=0;
end
// choque diagonal izquierda ascendente con bloque 3
if(existencia3==0)
if(posx+20>=290 & posx<=410)
if(posy>=30 & posy<=120)begin
diry=0;
existencia3=1;
end
else begin
diry=1;
existencia3=0;
end
// choque diagonal izquierda ascendente con bloque 3_3
if(existencia3==0)
if(posx+20==410)
if(posy>=30 & posy<=120)begin
dirx=0;
existencia3=1;
end
else begin
dirx=1;
existencia3=0;
end
end
end
endmodule

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License