Y3K-it | Solution Builders

Y3K-it | Solution Builders

sábado, 19 de marzo de 2011

Y3Kanoid

Implementamos un nuevo juego de ralidad aumentada, en esta oportunidad Y3Kanoid, una adaptación del clásico Arkanoid con la incorporación de realidad aumentada para el maejo de la paleta.



El juego fue desarrollado en Flex usando las librerías FlarToolkit. A continuación el código usado para el juego.

// ----- Lógica juego ARKANOID -----
private var NUM_BLOCK_ROWS:int=5;
private var NUM_BLOCK_COLS:int=10;
private var BALL_RADIUS:int=6;
private var INITIAL_BALL_SPEED:int=25;
private var BLOCK_FIELD_Y:int=50;
private var BLOCK_GUTTER_X:int=2;
private var BLOCK_GUTTER_Y:int=2;
private var PADDLE_HEIGHT:int=10;
private var PADDLE_WIDTH:int=50;
private var PADDLE_DIST_FROM_BOTTOM:int=10;
private var blocks:Array=new Array(0);
private var ball:Sprite=new Sprite();
private var paddle:Sprite=new Sprite();
 
// Variables del estado del juego private var ball_dx:Number;


private var ball_dy:Number;
private var ball_speed:Number;
private var lives:int=3;
 
Embed(source="./assets/azul.jpg")]
private var GoldBlock:Class;
 
Embed(source="/assets/rojo.jpg")]
private var RedBlock:Class;
 
Embed(source="/assets/verde.jpg")]
private var BlueBlock:Class;
 
private var allBlocks:Array=new Array(GoldBlock, RedBlock, BlueBlock);
 
public function initGame():void     // Bola
    ball.graphics.beginFill(0xee00ee);
    ball.graphics.drawCircle(0, 0, BALL_RADIUS);
    ball.graphics.endFill();
    addChild(ball);
    resetBall();

    // Paddle  
    paddle.graphics.beginFill(0x000000);
    paddle.graphics.drawRect(-PADDLE_WIDTH / 2, -PADDLE_HEIGHT / 2, PADDLE_WIDTH,     PADDLE_HEIGHT);
    paddle.graphics.endFill();
    paddle.y=VIDEO_HEIGHT - PADDLE_DIST_FROM_BOTTOM;
    addChild(paddle);

    // Bloques var reference_block:DisplayObject=new GoldBlock();
    sprite.x=block_field_x + x * (reference_block.width + BLOCK_GUTTER_X);
    sprite.y=BLOCK_FIELD_Y + y * (reference_block.height + BLOCK_GUTTER_Y);
    addChild(sprite);
    blocks.push(sprite);
    current_block_index++;
    current_block_index=0;

    ticker.addEventListener(TimerEvent.TIMER, onTick);
    ticker.start();
}

var block_field_width:int=NUM_BLOCK_COLS * reference_block.width + (NUM_BLOCK_COLS - 1) * BLOCK_GUTTER_X;
var block_field_x:int=(VIDEO_WIDTH - block_field_width) / 2;
var current_block_index:int=0;
for (var x:int=0; x < NUM_BLOCK_COLS; x++)
    for (var y:int=0; y < NUM_BLOCK_ROWS; y++)
        var current_image:Class=allBlocks[current_block_index];
        var sprite:DisplayObject=new current_image();
        if (current_block_index >= allBlocks.length)var ticker:Timer=new Timer(10);

public function onTick(event:TimerEvent):void
{
    detect(null);

    // Ajustar paleta al mouse (sin realidad aumentada)
    //paddle.x=mouseX;
   
    // Ajustar paleta al marcador (con realidad aumentada)
    paddle.x=actualX;

    // Verificar colisión
    if (ball.hitTestObject(paddle))
    // Ajustar el recorrido de la bola segun golpe en la paleta
    ball_dx=(ball_dx + new_ball_dx) / 2;
    ball_dy=-ball_dy;
var new_ball_dx:Number=(ball.x - paddle.x) / (PADDLE_WIDTH / 2.0) * INITIAL_BALL_SPEED;
// Colision con bloques
{
    for (var i:int=0; i < blocks.length; i++)
        var block:DisplayObject=blocks[i];
        if (block == null)continue; // Colisión
        {
                if (ball.hitTestObject(block)) // Borrar el tocado
                removeChild(block);
                blocks[i]=null;

                // Calcular rebote de bola
                var ball_distance_norm_x:int=(ball.x - block.x) / block.width;
                var ball_distance_norm_y:int=(ball.y - block.y) / block.height;// No volver a la misma direccion de rebote
                ball_dy=-ball_dy;
                ball_dx=-ball_dx;
                ball_dx=-ball_dx;
                if (ball_distance_norm_x * ball_dx > 0)
                else if (ball_distance_norm_y * ball_dy > 0)
                else if (ball_distance_norm_x > ball_distance_norm_y)
                else
                  ball_dy=-ball_dy;

                // Aumentar velocidad un 2.5%
                ball_dx*=1.025;
                ball_dy*=1.025;
            }
        }

    if (ball.x - BALL_RADIUS < 0)if (ball.x + BALL_RADIUS > VIDEO_WIDTH)if (ball.y - BALL_RADIUS < 0)// Se fue la pelotita al carajo
    {
        lives-=1;
    }

        resetBall();
        if (ball.y - BALL_RADIUS > VIDEO_HEIGHT)if (lives > 0) {// todo: GAME OVER
        }
        // Mover pelotita
        ball.x+=ball_dx;
        ball.y+=ball_dy;
}
public function resetBall():void
{
        ball.x=0.25 * VIDEO_WIDTH;
        ball.y=0.5 * VIDEO_HEIGHT;
        ball_dx=INITIAL_BALL_SPEED * 0.70;
        ball_dy=INITIAL_BALL_SPEED * 0.70;
}
´
El método para la detección del patrón y movimiento del paddle o paleta:

private function detect(aEvent:Event):void
{
    bitmapData.draw(video);
    flarRgbRaster_BitmapData=new FLARRgbRaster_BitmapData(bitmapData);try
    {
    if (detector.detectMarkerLite(flarRgbRaster_BitmapData, 80) && detector.getConfidence() > 0.3) {
        //Mover paleta del Arkanoid segun el marcador
    }
}

El marcador que usamos para jugar:


Finalmente les dejo un link al juego para que lo prueben después de imprimir el marcador y el link de descarga del proyecto Flex completo

Juego:
http://produccion.y3k-it.com/Y3Kanoid/Y3Kanoid.html
Fuentes:
http://produccion.y3k-it.com/download/Y3Kanoid.rar



Para más información dirigirse a http://www.y3k-it.com/ o escribir a info@y3k-it.com.
 
{

No hay comentarios:

Publicar un comentario