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.

viernes, 18 de marzo de 2016

Sobre como mantener diferentes escenas en love2d (Un ejemplo sencillo)


Que tal amigos, hoy tengo la intención de mostrar un pequeño ejemplo mostrando el uso del gestor de escenas. El ejemplo no será nada en especial, pero para no hacer demasiado largas las entradas del blog he preferido hacerlo en un post aparte. Tampoco voy a entrar en demasiados detalles con el código, lo dejo aquí esta vez mínimamente comentado pues es muy sencillo.

miércoles, 16 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (Colisión entre círculos)


¿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.

En este caso amos a crear un nuevo par de funciones para el archivo ControlDeColisiones.lua que nos servirán junto con la función medir_distancia, escrita en un post anterior, para detectar colisiones entre círculos.

lunes, 14 de marzo de 2016

Sobre como mantener diferentes escenas en love2d (El gestor de escenas)



Bueno,retomando el tema del manejo de escenas,ahora le toca el turno al gestor de escenas

Gestor de escenas

El gestor será el encargado de guardar las escenas de nuestro juego y también de mantener el ciclo de vida de las mismas. Nuestro pequeño gestor será capaz de mantener una y sólo una escena en pantalla, quedando el resto de escenas guardadas dentro del gestor para un posterior uso.

Retomando nuestro archivo Escena.lua, creado en un post anterior, podremos ver como el ejemplo de escena, que os mostré, contenía varias funciones a sobre escribir y que la mayoría dejamos en desuso. Esto fue así, porque será ahora cuando el gestor use todas estas funciones para mantenerlas en pantalla.

viernes, 11 de marzo de 2016

Sobre como mantener diferentes escenas en love2d (Las escenas)


Si ya lo has intentado, te habrás dado cuenta, como yo, que para un juego en el que se ha de gestionar un mínimo de elementos, con un load, un update y un draw no es suficiente. Si nos ponemos en el supuesto de un juego con pantalla inicial, menú de opciones y la pantalla del juego en si, nos podemos dar cuenta de lo descalabrado que puede resultar incluir todo esto dentro del main.lua; tanto por orden, como por control. Yo no soy un diestro en la materia, pero voy a intentar contar lo que yo aprendí sobre estos aspectos.

miércoles, 9 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d ( Rectángulo VS rectángulo y rectángulo de intersección)




¿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.

Pues en esta entrada paso a explicar tres nuevas funciones a incluir en nuestro archivo ControlDeColisiones.lua. Esta vez las funciones nos valdrán para detectar colisiones entre rectángulos y si es así generar el rectángulo de intersección que se crea mediante la colisión.

lunes, 7 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (punto en círculo)




¿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 círculo dibujado en pantalla.

domingo, 6 de marzo de 2016

Lo que sé sobre: Como detectar colisiones en Love2d (punto en rectángulo, el caso de un botón)



Lo que se sobre: Como detectar colisiones en Love2d (punto en rectángulo, el caso de un botón)



¿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 voy aprendiendo sobre como detectar varios tipos de colisiones en love2d. 

En este caso la más sencilla, como descubrir si unas coordenadas están dentro de un rectángulo.

viernes, 4 de marzo de 2016

Sobre como animar personajes(Sprites) en Love2d


Este es un pequeño ejemplo creado de la manera más fácil que supe, sobre como animar personajes(Sprites) en Love2d.

Dejo el código tal cual lo escribí, totalmente comentado. Me puedo equivocar en muchas cosas pues este ejemplo está creado a partir de mi propia exploración.

Y aquí va un archivo con todo el ejemplo listo para ejecutarse en Love2d. Al pulsar sobre el enlace, este os llevará hasta la página de safecreative.org, a la izquierda veréis un botón que dice, descargar esta obra, desde ese botón el ejemplo comenzará a ser descargado. Por ahora no tengo un lugar mejor donde colgarlo.