AngelMan
Usuario
| Mensajes: 1 |   | Karma: 0
|
POWERPOINT 3D - 2007/09/14 14:40
PRESENTACION
Buenas, mi nombre en RL es Angel Manuel y en SL AngelMan McMillan aunque tanto en RL como en SL todos me llaman Angel.
DESCRIPCION DEL PROYECTO
El proyecto consiste en construir un PowerPoint 3D. Bueno dicho así asusta un poco, realmente se trata de un browser para mostrar texturas, letras formadas con prims y objetos. El proyecto contará con una aplicación en Java (portable Linux-Windows) con licencia GNU para editar las presentaciones esta aplicación soltara un fichero en formato XML que será interpretado por el browser en SL.
MOTIVOS
Los motivos para acometer este proyecto son varios: - Las aplicaciones con RPC necesitan de un servidor. - Las aplicaciones con RPC necesitan cambiar el formato de las presentaciones a video. - Las aplicaciones con texturas son lentas. - Las aplicaciones con texturas son caras.
La solución pasa por introducir la presentación en una notecard que puede copiarse-pegarse desde el exterior de SL.
DESCRIPCIÓN FUNCIONAL
El script del objeto: 1º recupera el texto de la notecard 2º Interpreta el texto de la notecard que esta en formato XML 3º Muestra una textura de fondo si el usuario lo ha seleccionado 4º Pinta los textos 5º Muestra los objetos 6º Hace llDie() de todo el conjunto y pasa a la página siguiente.
DESCRIPCION DE LA NOTECARD
La notecard contiene un texto en formato XML que describe página a página la presentación.
| Code: | <BLOCK>
<TEXT>
<COOR>
0,0,0
</COOR>
ABCDEFGHIJKL
MNOPQRSTUVWXYZ
</TEXT>
</BLOCK> |
NOVEDADES DE ESTE PROYECTO CON RESPECTO A OTROS DE SU MISMA NATURALEZA
1º Las letras están construidas con prims
2º El objeto debería poder usarse en cualquier parte
3º No necesita de aplicaciones RPC
4º No necesita de aplicaciones en ISP
5º No necesita de programas complejos para crear las presentaciones
6º Es muy barato puesto que no necesita subir ninguna textura (salvo excepciones).
7º Es rápido.
INCONVENIENTES
1º El número de prims es limitado y algunas presentaciones pueden consumir muchos de éstos.
2º Dibujar las letras es lento y debe hacerse usando el menor número de prims posible.
PARTICIPANTES ACTUALES DEL PROYECTO
- Dedalo Mayo (scripter)
- Zenitram Jester (Designer)
- Pantano Boa (Designer)
- AngelMan McMillan (scripter)
¿QUE NECESITAMOS?
Principalmente gente que participe:
- Aportando ideas.
- Dibujando letras según las especificaciones.
- Scripters que quieran implicarse solucionando problemas del Browser in-world.
- Programadores Java que quieran participar en el generador de aplicaciones.
LISTA DE //TO DO:
1º Ubicar las letras de forma correcta
- Editar el conjunto de letras exitentes colocando el pivote en el lugar correcto.
- Desde el script hacer que las letras queden en su sitio según un sistema de coordenadas dado.
2º Añadir las opciones al notecard XML de:
- <FACTOR></FACTOR> para determinar el tamaño de las letras.
- COLOR para determinar el color de las letras.
3º Añadir objetos de otras personas a la presentación
- Hemos pensado que la mejor opción es linkarlos a un objeto existente dentro del browser para poder hacer llDie().
4º Controlar que las cosas no salgan del browser de forma poco amigable, es decir, simplemente no pintandolas.
EJEMPLO DEL CODIGO
| Code: |
///////////////////////////////////////////////////////////////////////////////////////
//
// GRUPO:
// CreaSL 2007
//
// PARTICIPANTES:
// Pantano Boa
// Dedalo Mayo
// Zenitram Jester
// AngelMan McMillan
///////////////////////////////////////////////////////////////////////////////////////
// Borwser de presentaciones
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
// Nombre del Notecard que contiene la presentación
string LaNota = "Estructura";
// Lista que contiene toda la presentación
list LaLista;
// Lista de símbolos que se pueden pintar (es ampliable)
// HACER: Introducir el resto de simbolos
list Simbolos=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","
W","X","Y","Z"];
// Variables globales que controlan el numero de bloques
list IndBloques; // Indice del inicio de cada bloque
integer NumBloques=0; // Número total de bloques en la notecard
integer BloqueActual; // El bloque que estamos mostrando en cada momento
// Variables globales para pintar textos
vector posic; // Posición en la que se esta pintando el texto
// Variables para la escritura de las letras
vector posic_rel; // Posición relativa para pintar la letra actual (desde el origen)
integer LaLinea; // Número de la linea dentro del mismo <TEXT></TEXT>
float espacio=.5; // tamaño medio en horizontal para las letras
// Contador de canales de comunicación para letras
integer LetraCanal; // Entero que guarda el número actual de canal a asignar a la letra
list CanalesLetras; // Lista con todos los canales activos (uno por letra)
// VARIABLES GLOBALES OBLIGADAS POR EL TIPO DE PROGRAMACION
// Contador de lineas de la lectura de la NOTECARD
integer lineas=0;
// Identificador para la llamada a llGetNotecardLine
key F_NC_Get_Line;
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES
PintaFrase(string cadena)
{
//...
}
// Parseamos la cadena que contiene la posición inicial del texto
TomaPosicion(integer contar)
{
//...
}
// Pintar un bloque de texto
PintarTexto(integer contar)
{
string cadena="";
integer contador=contar;
// Recorremos el apartado de texto
while (cadena!="</TEXT>"«»)
{
cadena = llList2String(LaLista,contador);
contador++;
if (cadena=="<COOR>"«»)
{
TomaPosicion(contador);
}
if (cadena=="</COOR>"«»)
{
// esta es la primera linea de esta porción de texto
LaLinea = 0;
// Pintamos todas las lineas del texto
while (cadena!="</TEXT>"«»)
{
cadena = llList2String(LaLista,contador);
contador++;
if (cadena!="</TEXT>"«»)
{
PintaFrase(cadena);
LaLinea++;
}
}
}
}
}
PintarArea(integer contar)
{
//...
}
///////////////////////////////////////////////////////////////////////////////////////
// Pintamos el bloque "n" (página) de la presentación
PintaBloque(integer idBlock)
{
// Recorrer la parte de la lista que contiene el bloque
integer salida=0;
integer contador=llList2Integer(IndBloques,idBlock);
string cadena;
// Vamos recorriendo todo el bloque levantando tokens
while (salida==0)
{
cadena = llList2String(LaLista,contador);
contador++;
// Si el bloque no ha terminado
if (cadena!="</BLOCK>"«»)
{
// Si encontramos un texto
if (cadena=="<TEXT>"«»)
PintarTexto(contador);
// Si encontramos un area
if (cadena=="<AREA>"«»)
PintarArea(contador);
}
else
{
salida=1;
}
}
}
//Borramos el Bloque actual
BorraBloque()
{
integer Longitud = llGetListLength(CanalesLetras);
integer i;
for (i=0;i<Longitud;i++)
{
llSay(llList2Integer(CanalesLetras,i),"BORRAR"«»);
}
}
// recorremos la lista para buscar los bloques (páginas)
RecorreLista()
{
integer Longitud = llGetListLength(LaLista);
integer i;
string cadena;
for (i=0;i<Longitud;i++)
{
cadena = llList2String(LaLista,i);
// Cada vez que encontremos un bloque guardamos su indice en la lista de indices de bloque
if (cadena=="<BLOCK>"«»)
{
NumBloques++;
IndBloques+=i;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////
// Comportamiento por defecto del objeto
default
{
// Constructor
state_entry()
{
// Establecemos el Bloque actual en proceso
BloqueActual = 0;
// Leemos toda la nota sin parar
lineas = 0;
F_NC_Get_Line = llGetNotecardLine(LaNota,lineas);
// Aqui no podemos recorrer la lista generada
// Establecemos el canal de inicio
LetraCanal=99999;
}
// Controlamos cuando se haga take o borrar para que se eliminen las letras
changed(integer evento)
{
llSay(0,"Evento"«»);
if (evento & CHANGED_INVENTORY)
{
BorraBloque();
}
}
// Evento que se produce al tocar el objeto.
touch_start(integer total_number)
{
// Si hay algun bloque en pantalla lo borramos.
if (BloqueActual>=0 && NumBloques>0)
{
BorraBloque();
CanalesLetras=[];
LetraCanal=99999;
}
// Si no nos hemos pasado
if (BloqueActual<NumBloques)
{
PintaBloque(BloqueActual);
}
else
{
BloqueActual=0;
PintaBloque(BloqueActual);
}
BloqueActual++;
}
//Leemos la notecard completita
dataserver(key Iden, string dato)
{
// Si el evento lo ha disparado llGetNotecardLine
if (Iden==F_NC_Get_Line)
{
if (dato!=EOF)
{
LaLista+=dato;
lineas++;
F_NC_Get_Line=llGetNotecardLine(LaNota,lineas);
}
else
{
RecorreLista();
}
}
}
}
|
|