Meteorit 005

Intentando implementar un ContentManager me doy cuenta de que no es tan facil… hay que declarar servicios y cosas que desconozco por ahora.
He probado a hacer una clase estatica global con un parametro que recoge el Content creado por defecto y funciona, asi ya es visible globalmente ^^
Se me habia ocurrido tambien usar un puntero a Content y pasarlo a la clase estatica, asi cuando se solicite alguna operacion sobre la variable de mi clase estatica se estara haciendo sobre el Content. Para usar punteros se escribe «unsafe» delante del metodo/declaracion. ContentManager no permite que punteros apunten a el… asi que idea descartada.

Implementacion completa de la clase GestorContenidos:
using Microsoft.Xna.Framework.Content;

namespace Prueba
{
static class GestorContenidos
{
public static ContentManager contenido;
public static SpriteBatch spriteBatch;
}
}
Ejemplo de uso:
GestorContenidos.contenido = Content; //Esto se hara en el metodo Initialize de game, lo que hace es pasarle el Content a nuestra clase para k sea visible en todo el namespace (lo malo es que asi tenemos dos ContentManager)
fondo1a.Imagen = GestorContenidos.contenido.Load<Texture2D>(fondo.Source); //Esto se hara desde cualquier otra clase que quiera hacer algo en ese content

Actualizacion 2/04/2011:
He añadido un atributo estatico spriteBatch a la clase, modificando ligeramente tambien Game1. Game1 corresponde a un nivel/pantalla, nos viene muy bien que en ese nivel sea global el spritebatch y el contentmanager. En el siguiente nivel se volveria a instanciar spritebatch, por tanto se borraria todo rastro del anterior y se cargaria el nuevo content de ese nivel (cambiando tambien la carpeta fisica que almacena todos los datos del nivel con el atributo contenido.RootDirectory = «Content2»;)

Meteorit 004

Vector2 posicion es una estructura con int X e int Y. Su propiedad solo permite modificar elementos de tipo Vector2, pero no deja accesible X e Y. He encontrado 3 formas de hacer propiedades:
public Vector2 Posicion { get { return posicion; } set { posicion = value; } }
public Vector2 Posicion { get; set; }
public Vector2 Posicion { get { return posicion; } set { posicion = new Vector2(value.X, value.Y); } }

La primera seria la normal, la que enseñan en los manuales y todos deben saber.
La segunda parece que es una forma abreviada. No se si hace exactamente lo de arriba pero funciona igualmente, el problema es que sale warning porque «posicion» no se ha usado.
La tercera se parece a lo que buscamos pero no es, la he visto en codigos de ejemplo pero no la he testeado, en algun contexto podria ser util.

Me decanto por hacer un metodo set para X y para Y como toda la vida. Puede resultar un poco engorroso al usarlo pero la otra solucion seria hacerlo public…
public void setPosX(int X) { posicion.X = X; }
public void setPosY(int Y) { posicion.Y = Y; }
Y ejemplo de llamada: bala.setPosX(180); en lugar de bala.Posicion.X = 180; que NO funcionaria.

Meteorit 003

Hola mundo xna

Me ha costado 1 hora o asi pero ya he conseguido un hola mundo xD, aqui detallo los pasos
1. Crear un proyecto tipo Windows Phone Game (Framework 4.0)
2. Abrir el archivo Game1.cs y añadir la libreria Microsoft.Xna.Framework.Graphics; (con el using delante en el inicio del codigo) (esto es para poder llamar a SpriteBatch)
3. Ir a WindowsPhoneGame1Content y boton derecho, Add, New Item. Seleccionar Sprite Font y Add. (Es obligatorio cargar fuentes para todo lo que hagamos, por eso cargamos la default)
4. Ir al metodo draw en Game1.cs y crear un SpriteBatch con esta linea. SpriteBatch spriteBatch = new SpriteBatch(GraphicsDevice);
5. Iniciar el SpriteBatch con spriteBatch.Begin();
6. Mostrar la string por pantalla con spriteBatch.DrawString(Content.Load(«SpriteFont1»), «Hola mundo», new Vector2(0, 0), Color.White);
7. Finalizar el SpriteBatch con spriteBatch.End();

Explicacion de los parametros de DrawString
1. Fuente. No puede ser null ni hay fuentes ya cargadas, se tienen que cargar de los resources del proyecto, por eso se usa Content.Load(nombre) para cargar esa fuente.
2. String. La string que se mostrara.
3. Posicion. Posicion en pantalla desde donde empezara el texto, yo he creado un Vector2(0, 0) que posiciona el texto en la coordenada (0,0) empezando por la esquina superior izquierda.
4. Color. He puesto color de texto blanco; al poner Color os saldra la lista de los que podeis poner.

PD: Al final no estamos usando layouts en xml, aunque la descripcion de la fuente, por ejemplo, si que es con xml; asi que es probable que se pueda portar facilmente a xbox/win.
PD2: No es lo mismo phone game que phone app, en phone app se usan los layouts y en phone game no.

Meteorit 002

Ya he acabado de leer los pdfs, estas son las cosas mas importantes que he encontrado y difieren de lo que ya sabiamos:

– convert para castings (tambien funciona (int))
Ejemplo: double angulo = Convert.ToDouble(entero); //siendo int entero;
Ejemplo: Button buttonEmisor = (Button)emisor; //siendo Object emisor;

– foreach
Ejemplo: foreach(string disco in discosLogicos) { } //siendo discosLogicos un vector de strings
Ejemplo: int[10] vector; foreach(int a in vector) { } //recorrido del vector de principio a fin sin iteradores

– setters y getters (propiedades)
Ejemplo: public string Nombre { get{return nombre;} set{nombre = value;} } //siendo string nombre; un atributo privado, explicacion de value abajo
Ejemplo: a.Nombre = «yo»; string b = a.Nombre; //ejemplos de llamadas a set y get respectivamente. «yo» seria el objeto «value» asignado en el set

– herencia con :
Ejemplo: public class MiClase : ClaseBase { } //siendo public class ClaseBase { } la superclase

– interface con :
Ejemplo: public class MiClase : Interfaz { } //siendo interface Interfaz { } una clase interface

– namespaces (package en java). Se usa para acceder si se empaqueta en un .dll
Ejemplo: namespace Proyecto1{ public class Hola { } }
Ejemplo: using Proyecto1; Proyecto1.Hola a = new Proyecto1.Hola(); //ejemplos de carga del namespace y llamada al constructor (si no se ha cargado) respectivamente

– Console.WriteLine(«{0}», parametro); para salida estandar, similar a c; tambien funciona Console.WriteLine(cadena) siendo string cadena; tambien existe Console.Write, el cual no hace salto de linea
Ejemplo: Console.WriteLine(«Me llamo {0} y soy {1}», nombre, caracteristica); //siendo {0} el primer parametro (nombre) y {1} el segundo (caracteristica)
Ejemplo: «Me llamo Cerb y soy osom» //ejemplo de ejecucion con nombre = «Cerb» y caracteristica = «osom»

– para sobreescribir metodos si a priori no se sabe k se van a redefinir -> usar «new» entre public y el tipo en la cabecera de la funcion (clase derivada)
Ejemplo: public new metodo () { } //siendo metodo() un metodo heredado que se definio normal en su clase

– si se sabe entonces -> declarar metodos como «virtual» para marcar k seran redefinidos (clase base), al sobreescribir se pondra «override», siempre entre public y el tipo en la cabecera
Ejemplo: public virtual metodo() { } //implementacion del metodo metodo() en la clase base
Ejemplo: public override metodo() { } //sobreescritura del metodo metodo() heredado de la clase base, el cual se sabia que se podia sobreescribir

– palabra reservada «base» para hacer referencia a la clase base (como el this hace referencia a la clase en uso) (equivalente a super en java)
Ejemplo: public class ClaseBase { string atrib; } //estructura de la clase base
Ejemplo: public class MiClase : ClaseBase { MiClase() { string a = base.atrib; } } //llamada al atributo atrib de la clase base

– eventos: cada componente(button, textbox, etc) tendra una propiedad para asignarle un manejador de eventos
Ejemplo: buttonAceptar.Click += new EventHandler(ButtonAceptarClick); //siendo Button buttonAceptar; se le asigna un manejador al evento click

– eventos: en la misma clase habra un metodo que maneje el evento generado
Ejemplo: static void ButtonAceptarClick(object sender, EventArgs e) { } //implementacion del evento click, puede llamarse desde varios componentes

– palabra reservada «partial» en la cabecera de la clase para implementar la clase en varios archivos, se usa para dividir diseño de componentes de la logica
Ejemplo: public partial class MiClase { MiClase() { Button a = new Button(); } } //parte que genera componentes y propiedades (como los layouts en xml)
Ejemplo: public partial class MiClase { } //parte que implementa la logica de dichos componentes y otras funciones

Meteorit 001

Aun sigo leyendo los pdfs para aprender c#, algunas cosas son distintas pero en general es como c++ y java
Despues tengo que leer http://create.msdn.com/en-us/education/quickstarts para app dev en windows phone o la docu completa http://create.msdn.com/en-us/education/documentation
Al mismo tiempo ire probando como scrollear el fondo de la pantalla, mirando ejemplos y probando yo mismo.
Aun no se si se usaran layouts xml o eso es solo para apps, si no se usan tendriamos mejor portabilidad a xbox360

Script de notificacion mail

Cuando tenia el otro movil me solia activar bluetooth para notificarme con mensajes ciertos eventos importantes, como cuando logea Angela o cuando habia tareas interesantes en el trabajo. Ahora con el nuevo movil como tengo internet everywhere 😀 he pensado que seria mejor tener notificaciones por mail. Se ejecuta pasandole por parametro el mensaje que se quiere enviar. Primero se prueba a enviar un txt con dicho mensaje por bluetooth a una MAC concreta por un canal concreto, y si falla se envia por mail a user@mail.con con el subject Notify. Lo malo es que la notificacion por mail tarda mucho… si no recuerdo mal de 2 a 3min ya que el movil no esta cada segundo monitorizando si tiene mail y el propio programa tarda mucho en enviar el mail. Tuve que editar la configuracion de sendmail y poner el smtp de gmail que es donde envio notificaciones… Por ahora no he encontrado ninguna utilidad a esta notificacion por mail XDDD

#!/bin/bash

#Enviamos notificacion por bluetooth
echo $1 > ~/mensaje.txt
obexftp -b 00:00:00:00:00:00 -B 12 -p ~/mensaje.txt

#Si falla la enviamos por mail
if [ $? != 0 ]; then
echo $1 | mail -s "Notify" user@mail.com
fi

Ampliacion iptables

El otro dia me dio por poner firewall mas serio con iptables. Ya que usaba iptables para enrutar la conexion haciendo de router lo aproveche para tambien poner politicas a drop y aceptar solo algunas concretas… La info la saque de alguna web, copie lineas y adapte a mi iptables. No se si realmente funciona el firewall pero esto es lo que tengo ahora ^^U


#### SCRIPT DE CONFIGURACION DE IPTABLES ####
#!/bin/bash

# Dispositivo de red de internet
EXIF=»eth3″
# Dispositivo de red local
INIF=»CASA»

fail=0

[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions

log_begin_msg «Aplicando Reglas de Firewall…»

## Borrado de reglas anteriores
iptables -F || fail=1
iptables -X || fail=1
iptables -Z || fail=1
iptables -t nat -F || fail=1

## Establecemos politica por defecto
iptables -P INPUT DROP || fail=1
iptables -P OUTPUT DROP || fail=1
iptables -P FORWARD DROP || fail=1
iptables -t nat -P PREROUTING ACCEPT || fail=1
iptables -t nat -P POSTROUTING ACCEPT || fail=1

# Marcar paquetes salientes con su ip de origen
iptables -t nat -A POSTROUTING -o $EXIF -j MASQUERADE || fail=1

############################SCRIPT NUEVO############################
# Deshabilitar broadcast
echo «1» > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts || fail=1

# Deshabilitar la redirección del ping
echo «0» > /proc/sys/net/ipv4/conf/all/accept_redirects || fail=1

# Registrar los accesos extraños, paquetes falseados, etc..
echo «1» > /proc/sys/net/ipv4/conf/all/log_martians || fail=1

# Anti-flooding o inundación de tramas SYN.
iptables -N syn-flood || fail=1
iptables -A INPUT -i $INIF -p tcp –syn -j syn-flood || fail=1
iptables -A syn-flood -m limit –limit 1/s –limit-burst 4 -j RETURN || fail=1
iptables -A syn-flood -j DROP || fail=1

# Guardar los accesos con paquetes fragmentados, recurso utilizado para tirar
# servidores y otras maldades (bug en Apache por ejemplo)
iptables -A INPUT -i $INIF -f -j LOG –log-prefix «Fragmento! » || fail=1
iptables -A INPUT -i $INIF -f -j DROP || fail=1
############################SCRIPT NUEVO############################

# Reenvio de IP
echo 1 > /proc/sys/net/ipv4/ip_forward || fail=1

# Aceptar paquetes para reenviar procedentes de la red local
iptables -A FORWARD -i $INIF -o $EXIF -j ACCEPT || fail=1

# Aceptar paquetes para reenviar procedentes de internet de conexiones ya establecidas
iptables -A FORWARD -i $EXIF -o $INIF -m state –state RELATED,ESTABLISHED -j ACCEPT || fail=1

############################SCRIPT NUEVO############################
# Operar en localhost sin limitaciones
iptables -A INPUT -i lo -j ACCEPT || fail=1
iptables -A OUTPUT -o lo -j ACCEPT || fail=1

# Permitimos que la maquina pueda salir a la web
iptables -A INPUT -p tcp -m tcp –sport 80 -m state –state RELATED,ESTABLISHED -j ACCEPT || fail=1
iptables -A OUTPUT -p tcp -m tcp –dport 80 -j ACCEPT || fail=1

# Y tambien a webs seguras
iptables -A INPUT -p tcp -m tcp –sport 443 -m state –state RELATED,ESTABLISHED -j ACCEPT || fail=1
iptables -A OUTPUT -p tcp -m tcp –dport 443 -j ACCEPT || fail=1

# Reglas necesarias para FTP pasivo y activo y SSH. Se permiten conexiones entrantes YA establecidas
iptables -A INPUT -p tcp -m tcp –sport 20:22 -m state –state RELATED,ESTABLISHED -j ACCEPT || fail=1
iptables -A OUTPUT -p tcp -m tcp –dport 20:22 -j ACCEPT || fail=1
iptables -A INPUT -p tcp -m tcp –sport 1024:65535 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT || fail=1
iptables -A OUTPUT -p tcp -m tcp –dport 1024:65535 -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT || fail=1

# Permitimos la consulta a un primer DNS
iptables -A INPUT -s 62.42.63.52 -p udp -m udp –sport 53 -j ACCEPT || fail=1
iptables -A OUTPUT -d 62.42.63.52 -p udp -m udp –dport 53 -j ACCEPT || fail=1

#Ahora para el amsn
iptables -A INPUT -p tcp -m tcp –dport 6891:6895 -j ACCEPT || fail=1
iptables -A OUTPUT -p tcp -m tcp –sport 6891:6895 -j ACCEPT || fail=1

# Barrera de backup por si cambiamos a modo ACCEPT temporalmente
# Con esto protegemos los puertos reservados y otros well-known
iptables -A INPUT -p tcp -m tcp –dport 1:1024 -j DROP || fail=1
iptables -A INPUT -p udp -m udp –dport 1:1024 -j DROP || fail=1
iptables -A INPUT -p tcp -m tcp –dport 1723 -j DROP || fail=1
iptables -A INPUT -p tcp -m tcp –dport 3306 -j DROP || fail=1
iptables -A INPUT -p tcp -m tcp –dport 5432 -j DROP || fail=1
############################SCRIPT NUEVO############################

# Se muestran los resultados
log_end_msg $fail

if [ $fail -eq 0 ]
then
log_success_msg «Verifique que lo que se aplica con: iptables -L -n.»
else
log_warning_msg «Se ha producido un error al aplicar alguna de las reglas»
fi

#### FIN SCRIPT DE CONFIGURACION DE IPTABLES ####

Renombrar archivos

Ha llegado la hora de limpiar los pcs T_T Por ahora empiezo por lo facil, el portatil 😀 Revisando para guardar cosas he encontrado este script que creo que hice para mi padre, pero al final no lo usó.
Creo que simplemente accedia a una carpeta e iba renombrando todos los archivos al numero del contador
Creo que primero renombra los archivos de 1 a X sin añadir ceros a la izquierda, y luego cuando sabe el numero total de archivos los deja bien como: 001.jpg, 002.jpg, … 101.jpg
Lo hice rapido y mal, ahora que lo reviso se me ocurren formas mejores de hacerlo, y no se para que puede servir XD
@Ubuntu 9.04 y bash
Uso: ./script carpeta


#!/bin/bash
cd $1
j=1
for i in *
do
echo $i $j
mv «$i» $j
let j+=1
done
let j=j-1
k=1
for i in `seq -w 1 $j`
do
echo $k $i
mv «$k» $i
let k+=1
done

1 Noviembre FFDroid

0.28: Hoy estoy vago xD. Gracias a Martinez por darme los stats de str, agi, def, hp y mp de los personajes y mobs y la funcion de daño a partir de str y def. Me he mirado por curiosidad las librerias de los sensores para intentar hacer una app que monitoree el estado del acelerometro y magnetometro, pero no me he aclarado ^^U. Por la noche he hecho un regalo para Prats, que mañana dia 2 es su cumple. Es un proyecto con un cargador gif y un ejemplo de una tarta. El regalo en si es el codigo, no el gif animado xD. Supongo que le servira, es un buen ejemplo de uso de handler y runnable para sustituir a timer y de uso de contextos para obtener referencias de R a partir de strings.

31 Octubre FFDroid

0.23: No me acababa de gustar lo de tener que pasar por parametro el contexto asi que me he puesto a pensar como arreglarlo. No se como no se me habia ocurrido antes -.- , es tan simple como acceder a la variable poniendo su paquete y clase primero, asi -> droid.pkg.Prueba.appContext y luego .getresources y lo demas…

0.24: Por fin consigo cambiar el color de una progressbar, y ademas con gradient! xD. Aqui dejo una screen de como ha quedado la primera ejecucion, aun tengo que decidir que colores poner y aclararme con background, progress y secondaryprogress.

0.25: Ya me he aclarado con los colores. He puesto la barra de tiempo verde, hp rojo, mp azul. La barra del fondo de todas gris. Barra de tiempo va de inicio a fin degradando hacia oscuro. La barra de hp va de inicio a centro constante, y de centro a fin degradando a claro. La barra de mp va de inicio a centro constante y de centro a fin degradando a claro. Las barras de fondo de hp y mp van degradando de inicio a fin hacia oscuro. La barra de fondo de tiempo va degradando de inicio a fin hacia claro. Esto es porque las barras de HP y MP iran de 100% a menos, y el tiempo de 0% a mas. Adjunto imagen con shape=rectangular.

0.26: Prefiero que se vea «ovalado», asi que añado corners al shape de los progressbar. Adjunto screen:

0.27: Reestructuro la clase personaje y archer para dejar toda la carga sobre la superclase. Ahora la subclase solo llama a la superclase pasandole los parametros del user y del personaje propio de la subclase. Tambien he modificado la clase mob y cactilio y tomberi. Muchas lineas de codigo, me he mareao xD, no se si esta optimizado del todo, quisiera revisarlo otro dia. Adjunto video.