miércoles, 6 de julio de 2016

Shortcode que detecta el dispositivo que visita mi blog desde una entrada (Móvil, tablet, ordenador)

Ayudando a diseñar el blog de un amigo desde wordpress, nos surgió la duda de cómo bloquear o mostrar contenido dentro de una entrada según el tipo de dispositivo que este visitando el blog.

Esa misma noche me puse a buscar información por internet y rápidamente di con la siguiente página donde encontré un artículo escrito por Ruadhán O'Donoghue.  En el árticulo en cuestión encontré un código en php que realizaba esa tarea en cuestión.

Mi idea después de probarlo fue convertirlo en un shortcode que me permitiera introducirlo dentro de cualquier post  así poder bloquear o mostrar contenido, de manera sencilla, teniendo en cuenta el dispositivo.

Así que manos a la obra me dispuse a crear un pequeño plugin para comprobar si esto me sería posible (Teniendo en cuenta que no soy un diestro en la materia)

Dentro de mi curiosidad empecé creando la carpeta de mi plugin al que decidí llamarle which_device. Después dentro de ella creé el archivo principal de mi plugin llamado "index.php". Dentro de el cree por así decirlo, o como yo lo entiendo, la cabecera de mi plugin, que quedó de la siguiente manera.

<?php
    /*
        Plugin Name: which_device
        Plugin URI:www.voyaprendiendoytu.esy.es
        Description:Adivina desde que dispositivo nos están visitando
        Author:Jesús Hernández Paredes
        Version:0.1
        Author URI:
www.voyaprendiendoytu.esy.es    
*/

Dentro de lo que yo entiendo, es necesario introducir siempre esta cabecera dentro de cualquier plugin que uno quiera realizar, si no wordpress, después no detectará el plugin creado.

Lo siguiente fue coger el código encontrado en el artículo de  Ruadhán O'Donoghue y convertirlo en una función escrita dentro del mismo archivo.

function is_device()
{
    /*
    * Adivina desde que dispositivo nos están visitando
    * Fuente original de este código:https://mobiforge.com/design-development/tablet-and-mobile-device-detection-php
    */
    $tablet_browser = 0;
    $mobile_browser = 0;

    if (preg_match('/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
        $tablet_browser++;
    }

    if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android|iemobile)/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
        $mobile_browser++;
    }

    if ((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') > 0) or ((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))) {
        $mobile_browser++;
    }

    $mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'], 0, 4));
    $mobile_agents = array(
        'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
        'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
        'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
        'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
        'newt','noki','palm','pana','pant','phil','play','port','prox',
        'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
        'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
        'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
        'wapr','webc','winw','winw','xda ','xda-');

    if (in_array($mobile_ua,$mobile_agents))
    {
        $mobile_browser++;
    }

    if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'opera mini') > 0)
    {
        $mobile_browser++;

        $stock_ua = strtolower(isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])?$_SERVER['HTTP_X_OPERAMINI_PHONE_UA']:(isset($_SERVER['HTTP_DEVICE_STOCK_UA'])?$_SERVER['HTTP_DEVICE_STOCK_UA']:''));
    }
    if (preg_match('/(tablet|ipad|playbook)|(android(?!.*mobile))/i', $stock_ua))
    {
        $tablet_browser++;
    }

    if ($tablet_browser > 0)
    {
        //if tablet
       return 2;
    }
    else if ($mobile_browser > 0)
    {
       //if mobile
       return 1;
    }
    else
    {
        //if desktop
       return 0;
    }
}  



Como se puede observar, aquí el código es idéntico al del artículo de Ruadhán.
En el código sólo cambio la parte final, donde yo retorno un número para identificar el dispositivo que visita la web:

  • 0: Ordenador
  • 1: Móvil
  • 3: Tablet

Con esto ya creado, me dispuse a generar el código de la función que haría al shortcode funcionar. La función tendría la siguiente llamada:

function which_device($atts,$content)

Donde:
    $atts: Contendría la lista de dispositivos que admitirán el contenido a mostrar
    
   $content: Es el contenido a bloquear o a mostrar.

La función en cuestión, al final quedó de la siguiente manera:

function which_device($atts,$content)
{

    //si $atts no contiene argumentos iniciamos device a desktop
    extract( shortcode_atts(array(
       'device'=>'desktop'
    ),$atts));
    

   
    $listTotalDecives=array("desktop","mobile","tablet");
    

     //Lista de dispositivos que soportarán el contenido a mostrar
    $listDevice=split(",",$device);
   
    $numberMaxDevice=count($listDevice);
    $numberTotalDevice=count($listTotalDecives);
    if($numberMaxDevice==0)
    {
        $numberMaxDevice=1;
        $listDevice=array($device);
    }
    $resultDevice=is_device();






    //En este doble for es donde de verdad compruebo el tipo de dispositivo
    for ($c=0;$c<$numberMaxDevice;$c++)
    {
       
        for($i=0;$i<$numberTotalDevice;$i++)
        {
            if ((strcmp($listDevice[$c],$listTotalDecives[$i])==0)and($resultDevice==$i))
            {
                return $content;
            }       
        }
    }
    return    "";
}

//Esta función enlaza, la función escrita con el nombre que le queremos dar al shortcode y que en este caso es el mismo.
add_shortcode("which_device","which_device");


Después de todo esto, lo único que me quedó por hacer, fue comprimir la carpeta con mi código en un archivo comprimido .zip y subirlo y instalarlo en wordpress como cualquier otro plugin más.

Después de activarlo su uso quedo bastante sencillo. Dentro de cualquier post escribimos lo siguiente:


 [which_device device='mobile,tablet']

      Contenido para móviles y tablet.

[/which_device]

[which_device device='desktop']

       Contenido para ordenadores.

[/which_device]

Como veis así de sencillo fue y de paso aprendí a crear un plugin y un shortcode que, aunque sencillos, ahora me son de grata utilidad.

dejo aquí un enlace al archivo .zip con el plugin, para al que le interese probarlo y para que el código quede más claro.

 which_device.zip



¿Podríamos mejorarlo? ¿Qué crees?



jueves, 31 de marzo de 2016

Duelo de círculos mini juego en love2d (Primer contacto)


Buenas, ¿Qué tal? Pues regresando al tema de mini juego “Duelo de círculos”, pues por fin me decido a empezar por algún lado.

Comenzaré este pequeño desarrollo creando una nueva carpeta llamada “dueloDeCirculo” y dentro de ella otra, más llamada “base” Dentro de base vamos a incluir todos los archivos que fui generando en entradas anteriores. Estos son: ControlDeColisiones.lua, gestorDeEscenas.lua y escena.lua.

martes, 29 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (Cruce entre segmentos de recta)




¿Acaso no sabes como hacer que el héroe de tu juego sea capaz de golpear a ese maldito enemigo?

¿Como demonios hago para que mi ratón pulse es bonito botón?


Pues poco a poco voy a explicar lo que yo descubrí sobre como detectar varios tipos de colisiones.

Esta vez, vamos a comprobar si dos segmentos de recta están en contacto.

Para hacerlo, vamos a recuperar nuestro archivo ControlDeColisiones.lua y en el vamos a incluir una nueva función

  • se_cruzan_los_segmentos(rA,rB): Recibe la estructura de dos segmentos de recta y retorna true si estos están en contacto

La función hace uso exhaustivo de las funciones max y min de la biblioteca math, para realizar varias comprobaciones entre las posiciones de los segmentos de recta. A mi gusto esta ya es un tanto liosa de explicar, mucho más que escribirla o aprenderla.

--[[Función que recibe dos sementos de recta y retorna true si estos se cruzan en algún punto]]--
function ControlDeColisiones.se_cruzan_los_segmentos(rA,rB)
     --[[Usamos las funciónes max y min de la biblioteca math
      para realizar varias comprobaciones entre las posiciones de la recta A]]--
     --retornamos el mayor valor entre xI y XF de la rA
      maxXA=math.max(rA.xI,rA.xF)
     --retornamos el menor valor entre xI y XF de la rA
     minXA=math.min(rA.xI,rA.xF)
    --retornamos el mayor valor entre yI y yF de la rA
     maxYA=math.max(rA.yI,rA.yF)
    --retornamos el menor valor entre yI y yF de la rA
     minYA=math.min(rA.yI,rA.yF)
    --retornamos el mayor valor entre xI y XF de la rB
     maxXB=math.max(rB.xI,rB.xF)
    --retornamos el menor valor entre xI y XF de la rB
     minXB=math.min(rB.xI,rB.xF)
    --retornamos el mayor valor entre yI y yF de la rB
     maxYB=math.max(rB.yI,rB.yF)
    --retornamos el menor valor entre yI y yF de la rB
    minYB=math.min(rB.yI,rB.yF)
   --Usamos los valores arrojados de las funciones anteriores para la siguiente comprobación
   --Si la misma retorna true sera que los dos segmentos de recta se cruzan en algún punto
   if (maxXA>=minXB) and (maxXB>=minXA) and (maxYA>=minYB) and (maxYB>=minYA) then
       return true
  end
  return false
end

Vamos ahora a comprobar el uso de esta función. Vamos a generar un ejemplo en el que un segmento de recta controlado por el cursor del ratón va a cruzarse con otro segmento fijo en pantalla.

Como siempre generamos un nuevo proyecto creando la carpeta el main.lua y incluyendo dentro de la carpeta nuestro archivo ControlDeColisiones.lua. Escribimos la estructura básica del ejemplo.

function love.load()
     --Aquí crearemos las variables y cargaremos los recursos
end

function love.update(dt)
     --Aquí realizaremos la actualización lógica de la aplicación
end

function love.draw()
     --Aqui se realizará todo el proceso de dibujar la pantalla
end

Incluimos nuestro archivo, creamos los segmentos y la variable de control dentro de la función love.load

function love.load()
     --Incluimos nuestro controlador de colisiones
     controlChoques=require("ControlDeColisiones")
     --Generamos nuestro segmento de recta
     segmentoA=controlChoques.crear_segmento_de_recta(40,40,100,40)
     segmentoB=controlChoques.crear_segmento_de_recta(400,100,400,300)
     texto="no están en colisión"
end

Como siempre en love.update(dt) vamos a comprobar la colisión y a cambiar el texto de control según sea necesario.

function love.update(dt)
     --Recogemos las posiciones del cursor
     mX=love.mouse.getX()
     mY=love.mouse.getY()
     --actualizamos las posiciones del segmento de recta A
     segmentoA.xI=mX
     segmentoA.yI=mY
     segmentoA.xF=mX+60
     segmentoA.yF=mY

     --Llamamos a lafunción para comprobar la colisión
    if (controlChoques.se_cruzan_los_segmentos(segmentoA,segmentoB)) then
         texto="Están en colisión"
   else
         texto="no están en colisión"
   end
end

Dibujamols todo en pantalla usando love.draw

function love.draw()
     --dibujamos los segmentos de recta
     love.graphics.line(segmentoA.xI,segmentoA.yI,segmentoA.xF,segmentoA.yF)
     love.graphics.line(segmentoB.xI,segmentoB.yI,segmentoB.xF,segmentoB.yF)
     --dibujamos el texto de control en pantalla
     love.graphics.print(texto,10,10)
end

El resultado del ejemplo (no sale la primera recta en la captura, pero no se por qué, el caso es por estar aseguro que está):


Y hasta aquí todo lo que sé, sobre como detectar colisiones entre segmentos.

martes, 22 de marzo de 2016

Duelo de círculos (Nos veremos al amanecer)


Que tal, me gustaría empezar a contar mediante una sucesión de post, como se puede crear un jueguecillo muy simple usando Love2d todo lo ya creado en anteriores entradas. El juego en si, por ahora lleva el nombre, “Duelo de círculos” y no pretende ser un gran juego si no un pequeño ejemplo.

sábado, 19 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (punto en segmento de recta)


¿Acaso no sabes como hacer que el héroe de tu juego sea capaz de golpear a ese maldito enemigo?

¿Como demonios hago para que mi ratón pulse es bonito botón?


Pues poco a poco voy a explicar lo que yo descubrí sobre como detectar varios tipos de colisiones.

Esta vez, vamos a comprobar si unas coordenadas x,y se encuentran dentro de un segmento de recta dibujado en pantalla.