poly2tri y búsqueda de caminos

Hace algún tiempo, para el trabajo, empecé a hacer un port a ActionScript3 de la librería opensource poly2tri.
La idea era usarla para búsqueda de caminos en flash.
La búsqueda poligonal de caminos consta de tres partes:

  1. Triangulación (en este caso mediante la librería poly2tri)
  2. Búsqueda del camino más corto en nodos. (Usando A). En este caso no ha hecho falta dividir la búsqueda en varios nivels. Es un A sencillito con un nodo para cada triángulo que puede acceder a los triángulos contiguos.
  3. Algoritmo del embudo (Funnel algorithm). Implementación Simple Stupid Funnel Algorithm (De la cual también hice un port en Javascript).

Los pasos 2 y 3 son suficientemente rápidos como para hacerlos en tiempo real, al menos con escenas sencillitas. El paso uno posiblemente también, pero en este caso no hace falta.

Se puede acceder al código fuente de mercurial desde aquí.

Aquí una demo en funcionamiento (tras el salto):

Leer más...

header_register_callback() en PHP 5.4

Hace una semana vi que añadieron al trunk de PHP una nueva función llamada header_register_callback.

La función permite procesar, mediante un callback, todos los headers (los generados por el usuario explícitamente, más los que genera PHP internamente) inmediatamente antes de que se manden. Permitiendo utilizar las funciones relacionadas con los headers: headers_list, header_remove, header.

Leer más...

Charla sobre Shaders

Hacía ya tiempo que tenía pendiente grabar en vídeo la presentación de la charla de shaders de Pixel Bender que di en Softonic allá por noviembre de 2009.
La preparé a la vez que añadía soporte de shaders a mi librería phpMedia:
http://blog.cballesterosvelasco.es/category/proyectos/phpmedia/

DESCARGAR ARCHIVOS DE LA CHARLA - 

DEMO INTERACTIVA

 (8Mb)

Leer más...

Transmisión de paquetes con estructura flexible

Hace algún tiempo estuve investigando sobre la tranmisión de paquetes cliente <-> servidor en una plataforma de juegos flash.

La forma tradicional de mandar paquetes en las conexiones de flash es mediante sockets XML. Los paquetes XML son muy grandes para un intercambio continuado entre cliente y servidor.

Algunos servidores de sockets flexibles pensados para flash utilizan también JSON. Los JSON son mucho más compactos, pero siguen enviándose muchísimas redundancias. Especialmente sobre la estructura de los paquetes.

Y tanto los XML como los JSON se mandan sin encriptación alguna. Existen programas que facilitan la intercepción de paquetes, evitando mandarlos, modificar su contenido o inyectar paquetes nuevos. Esto en plataformas de juegos P2P donde el servidor no dirige las partidas es un problema mayor. Especialmente por la facilidad de hacer esto sin conocimientos avanzados.

Me puse a investigar sobre los dos problemas: tamaño de paquete y encriptación.

Leer más...

PHP: Descargar archivos, páginas o mandar formularios POST

He visto por ahí que todavía hay gente que no tiene claro cómo bajar archivos de Internet con PHP con cabeceras personalizadas y/o obtener las cabeceras de respuesta.

En versiones antiguas de PHP se solían usar las funciones fsockopen o la librería curl para hacer peticiones HTTP personalizadas. Sin embargo a partir de PHP4.3 y PHP5 empiezan a haber facilidades al respecto.

http_build_query + file_get_contents + stream_context_create + $http_response_header

**Para construir una query-string para usar en GET o en POST mediante un array asociativo:
**

// $str = 'a=1&b=test+2';  
$str = http_build_query(array(  
    'a' => 1,  
    'b' => 'test 2',  
));  

**Para hacer una petición POST a un formulario www-encodeado con un referer, cookies, simulando ser google chrome y obtener las cabeceras de respuesta:
**

unset($http_response_header);  

$http_response_body = file_get_contents('http://url/to/form', false, stream_context_create(array(  
    'http' => array(  
        'method' => "POST",  
        'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10',  
        'header' => implode("\r\n", array(  
            "Accept-language: en",  
            "Content-Type: application/x-www-form-urlencoded",  
            "Referer: http://url/to/form",  
            "Cookie: foo=bar",  
            "Connection: close",  
        )),  
        'content' => http_build_query(array(  
            'form_key'         => 'form_value',  
            'another_form_key' => '10',  
        )),  
    )  
)));  

if (!isset($http_response_header)) throw(new Exception("Can't connect"));  
print_r($http_response_header);  
echo $http_response_body;  

Leer más...

Suscribirse via RSS