viernes, 19 de octubre de 2012

Comandos de mercurial


HG INIT
Crea un repositorio.

HG ADD
Programa los ficheros que seran añadidos al repositorio. Estos no seran añadidos
hasta que se haga commit.

HG COMMIT
Guarda el estado actual de todos los ficheros al repositorio.

HG STATUS
Indica cuales son los ficheros de los que mercurial no sabe nada o ha
habido alguna modificacion depues del ultimo commit.


HG LOG
Muestra la historia de los cambios enviados al repositorio.

HG REVERT
Devuelve los ficheros al estado de la ultima version de commit.

HG UPDATE
Actualiza el directorio de trabajo a una revision en particular.

HG ROLLBACK
Deshace un commit si no se ha empujado("push") a nadie mas.

HG CLONE
Hace una copia de un repositorio completo.

HG PATHS
Da la lista de repositorios remotos conocidos.

HG PARENT
Muestra el change set padre del que estas trabajando.

HG BACKOUT
Sirve para borrar los cambios de un changeset.
Se asegura de que el directorio de trabajo esta limpio es decir que el output de
"HG status" esté limpio.
Va al changeset que hemos indicado en el parametro de backout y hace revert al
changeset anterior, luego hace commit.
   
HG HEADS
Muestra el ultimo changeset del respositorio actual.

HG INCOMING
Lista todos las diferenceia entre nuestra copia y el repositorio de que haremos pull.

HG OUTGOING
Lista los cambios del repositorio actual esperando a ser empujados.

HG PULL
Trae a nuestro repositorio los cambios desde otro repositorio.

HG PUSH
Empuja los nuevos cambios de este repositorio.

HG PATHS
Muestra una lista de los repositorios remotos conocidos.

jueves, 2 de agosto de 2012

Como pintar el fondo y los objetos. Cámaras.

Me ha pasado que tengo un fondo de 480 x 320 pixeles que muestro en los menus.
Sin embargo en la parte jugable, la cámara solo muestra 30x20. Y claro me salia
el fondo mal.
Despues de leer esto :
http://www.badlogicgames.com/wordpress/?p=1550
y esto (que está anticuado)
http://code.google.com/p/libgdx-users/wiki/Sprites
y esto:
http://androidnirvana.comule.com/wordpress/category/libgdx/

He llegado a la conclusion de  que usando dos cámaras la cosa funciona.
Al principio habia intentado cambiar los valores de una sola cámara y no me
funcionaba.

backgroundCamera = new OrthographicCamera(
ANCHOTOTAL,
ALTOTOTAL);
backgroundCamera.position.set(
CENTROANCHOTOTAL,
CENTROALTOTOTAL,
0f);

objectsCamera  = new OrthographicCamera(World.SCREEN_VIEW_WIDTH,World.SCREEN_VIEW_HEIGHT);
objectsCamera.position.set(
SCREEN_VIEW_WIDTH / 2f,
SCREEN_VIEW_HEIGHT / 2f,
0f);

Luego, a la hora de pintar cada vez que el spritebatch vaya a actuar se le aplica la
cámara.

batcher.begin()
backgroundCamera.update();
batcher.setProjectionMatrix(backgroundCamera.combined);
batcher.draw(
fondogeneral,
0f,
0f);
objectsCamera.position.x += 10f;
objectsCamera.update();
objetos,
batcher.setProjectionMatrix(objectsCamera.combined);
batcher.draw(
0f,
0f);
batcher.end()


martes, 31 de julio de 2012

Error generating final archive: Debug Certificate expired

Me ha salido esto hoy, mira tú, un error que todavia no habia visto.
La solución es cargarse el certificado que se usa para debug.
En mi caso (Windows 7) estaba en:
C:\Users\fran\.android\debug.keystore

lunes, 30 de julio de 2012

Acceder a una imagen pixel por pixel.


Para cargar la imagen y comprobar el color de cada pixel he usado un pixmap. Hay que tener cuidado 
con el formato de la imagen ya que si es RGB8888 tenemos tres bytes por pixel y si es RGBA8888 hay cuatro.


Este es el codigo:

public static void loadTexture (String levelfile)
{
try
{
Pixmap pixmap = new Pixmap(Gdx.files.internal(levelfile));

altura = pixmap.getHeight();
anchura = pixmap.getWidth();
tilefactory = new TileFactory();
tiles = new Tile[anchura][altura];

java.nio.ByteBuffer bb =  ByteBuffer.allocateDirect(altura * anchura * 3);
Pixmap.Format format = pixmap.getFormat();
  bb = pixmap.getPixels();

for (int i = 0; i < altura * anchura; i++)
{
int  r = (bb.get() & 0xff) / 255;
int  g = (bb.get() & 0xff) / 255;
int  b = (bb.get() & 0xff) / 255;
//bb.get();
if (format == Pixmap.Format.RGBA8888)
{
int  a = (bb.get() & 0xff) / 255;
}
if ((r != 0 && g != 0 && b != 0)); // es negro puro
procesaSegunColor(r,  g,  b, i, anchura, altura);
}
pixmap.dispose();
}
catch(Exception ex)
{
Gdx.app.log("error", ex.toString());
}
}

Ejemplo de nivel:


jueves, 26 de julio de 2012

Tile Maps (mapas de mosaicos) y cargadores de niveles III


El método para crear los niveles del juego que estoy usando al final no es ninguno de los anteriores :P

La idea es crear una imagen en la que cada pixel de ella represente un mosaico en el juego.
Compruebo el color de cada pixel y con un switch creo el tile correspondiente a ese color.
La gracia de esto es que echando un vistazo al la imagen que representa el nivel sabes como esta
estructurado. Lo malo que tiene es que es mas laborioso crear los niveles con el programa de dibujo pixel a pixel.













domingo, 22 de julio de 2012

Tile Maps (mapas de mosaicos) y cargadores de niveles II



Se me ocurrío meter cada nivel entre dos caracteres '<' y '>' y dentro meter
las tiles especiales.
Ejemplo:
<10,1,0; 20,1,0; 30,2,1>
Esto sería en la posición (x=10, y =1) hay una tile de tipo 0
Esto sería en la posición (x=20, y =1) hay una tile de tipo 0
Esto sería en la posición (x=30, y =1) hay una tile de tipo 1
Meter en cada linea de un fichero de texto un nivel de estos y luego parsearlo.
¿Como? Algo así(el codigo esta mal y ya no lo uso):

// Devuelve un array de strings con los todos los niveles
  private void  ParseFichero(String nivel)
  {
  char[] canivel = nivel.toCharArray();
char[] ca_aux = new char[World.WORLD_WIDTH];
  int indexca_aux = 0;
  int estado = 1;
 
listaniveles = new ArrayList<String>();
 
for (int i = 0; i < World.WORLD_WIDTH; i)
  {
  char c = canivel[i];
switch (c)
  {
  case ST_BEGIN_LEVEL:
  {
  estado = ST_IN_LEVEL;
ca_aux = new char[World.WORLD_WIDTH];
  indexca_aux = 0;
  }
  break;
  case ST_END_LEVEL:
  {
  ca_aux[indexca_aux] = '\0';
listaniveles.add(new String(ca_aux));
  }
  break;
  case ST_IN_LEVEL:
  break;
  }
  }
}

  public void ParseLevel (int numnivel)
  {
String nivel = listaniveles.get(numnivel).toLowerCase().trim();
  String[] astrtiles = nivel.split("\\;");
obstaculos = new ObstaculoNormal[astrtiles.length];
 
  for (int i = 0; i < astrtiles.length ; i)
  {
int x = Integer.parseInt(tiledataseparado[0]);
  int y = Integer.parseInt(tiledataseparado[1]);
  int type = Integer.parseInt(tiledataseparado[2]);
 
ObstaculoNormal obstaculo = new ObstaculoNormal(x, y, type);
obstaculos[i] = obstaculo;
  }
}