El Rincón de LibGDX

SlayerEXE

#30 Que chulada! No lo conocía y da la casualidad que estoy liado ahora mismo con un juegecillo de naves ;) Como mola. TY.

11 días después
SlayerEXE

Vale, voy a mover esto con una preguntilla sobre 3D.

Tenemos aquí esta fantástica clase ModelInstance:
http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/ModelInstance.html

Ahora bien, mi pregunta es la siguiente. Si quisiéramos hacer uso del patrón Flyweight para ahorrar algo de memoria... como sería más correcto?
Pongamos un ejemplo. Tenemos en escena unos cuantos coches y unos cuantos arboles. Los árboles son todos iguales, pero están rotados en y para que no sean clavaditos xD, pero los coches unos tienen un color y otros otro.
Así que para renderizar esta escena solo necesito un modelo de coche y un modelo de árbol. Esto nos lo hace automáticamente libGdx con su ModelInstance (Que cada ModelInstance apunta a un mismo Model, ahorrando cargar 200 coches, con uno le basta), pero claro... Model solo almacena la malla, es ModelInstance quien almacena el material, para los coches es correcto supongo, ya que tendrán diferentes colores, pero en el caso de los arboles, que lo único que cambia es su orientación... no es esto un mal uso de la memoria?

Tendría que hacerme un Flyweight para extraerlo aún más?

Si además alguien tiene algún consejo o método que lo ponga, toda información es buena ;) y gracias de antebrazo.

1 respuesta
KoRMuZ

Buenas compañeros.

Estoy empezando con libgdx + box2d.

Estoy seteando el mundo, creando un suelo y un cuerpo, y haciéndolo saltar. Pero la gravedad me sale demasiado "lunar" por así decirlo. Saltos demasiado grandes y muy suaves.

Estoy haciendo todo como pone en el tutorial de la web de libgdx.

Sabéis como implementar una gravedad más "terrenal" ?

Un saludo.

2 respuestas
DaRk-eXe

#33 yo uso de gravity -100 y me va bien y de iterations

private int velocityIterations = 8; //how strongly to correct velocity
private int positionIterations = 3; //how strongly to correct position

1 respuesta
KoRMuZ

#34 lo que he podido comprobar es que si cambio el step, al ponerlo en 1/24f me hace una gravedad mucho más real que en 1/45f (que es como lo tenía cuando escribí #33).

Si pongo el fpslogger, me da 61-62 fps. ¿No debería ser lo ideal con 1/60f en el step para que fuera correcta?

Creo que no he pillado muy bien como va el sistema MKS y por eso tengo algo mal puesto.

1 respuesta
DaRk-eXe

#35 el timestep que uso es 1 / la escala, si mi escala es 32f pues 1/32f

cabron

#33

¿estás tenido en cuenta la masa de los cuerpos?

Una gravedad de 10 debería darte el efecto parecido a la gravedad de la tierra, que es 9,8 de media, si con ese valor los cuerpos van medio flotando, probablemente será por que tienen una masa muy pequeña.

Ten cuidado al cambiar los valores de iteraciones y timestep por que puedes acabar con resultados extraños, no es buena idea que toques esto para cambiar los resultados, es mejor que ajustes los valores de masa de cada cuerpo. Al final lo mejor que puedes hacer es calcular sobre papel, y comprobar que lo que ocurre en tu mundo coincide con los cálculos, por ejemplo calcula el tiempo que tarda en caer N metros un cuerpo de masa M con gravedad 10, y luego en tu juego situa a N metros del suelo un cuerpo con una masa parecida y comprueba que más o menos tarda el mismo tiempo en llegar al suelo.

1 respuesta
KoRMuZ

Creo que el problema era ese #37. No estaba teniendo en cuenta el sistema MKS sino por pixeles y listo.

Estoy siguiendo ahora un tutorial y estoy esperando a llegar a las físicas para ver como se resuelve. Si sigo teniendo problemas, o sin entenderlo, ya volveré para daros la lata :)

1 respuesta
cabron

#38

De todas formas releyendo lo que te he dicho, no es así, se me ha ido un poco la pinza, ya que la masa de un cuerpo no cambia la aceleración de la gravedad que es la misma independientemente de la masa

DaRk-eXe

Estoy intentando hacer un parallax scroller con tiled.

¿Como puedo cargar un tiledMap en unas coordenadas dadas?

YaW

Os dejo un tutorial que he visto sobre varios aspectos de LibGDX, no tiene mala pinta.

http://www.gamefromscratch.com/page/LibGDX-Tutorial-series.aspx

3 2 respuestas
KoRMuZ

Gracias #41. Habrá que echarle un ojo durante el fin de semana :D

E

#41 grande

abraracurcix

#32 respuesta corta: si. Respuesta larga: si, porque Flyweight es simplemente una generalización de atributos usando una factoría.

Si vas a tener distintos tipos de modelos de árboles y coches, pasa y haz factorías simples.

13 días después
BRaDoLH

#15 yo me compré el libro que comenta #16 y estoy encantado, te explica desde cero como crear un engine (700 páginas de libro :)! )

1
autlos

Chicos, hace poco descubrí este canal, tiene series de box2d, scene2d y TiledMaps:

http://www.youtube.com/user/dermetfan/videos

Lo pongo por si a alguno le sirve, yo voy a darle a los de box2d, las otras dos series no me aportarán mucho que no sepa ya.

1 respuesta
SlayerEXE

#46 No lo conocía y tiene pintaza. Gracias.

autlos

Para el que quiera usar intelliJ con libgdx:
http://www.gamefromscratch.com/post/2013/12/01/Using-LibGDX-with-IntelliJ-with-Gradle.aspx

Edito:

Interesante... Aunque yo mejoraría unas cuantas cosas de su editor de niveles para ahorrar aún más trabajo. Como un checkBox para poder elegir directamente que un elemento sea un Body y así no tener que añadir a mano las propiedades density, type, friction, etc... Y poder guardarlo como "prefab" o algo así, tipo unity, y no tener que estar con el copy paste xD.

1
8 días después
Lecherito

Tengo un json con un arraylist de files (entre otras cosas), esos archivos son .atlas que estarán en la carpeta ./resources/ (aunque sea un poquito irrelevante)

1- Cual sería la mejor forma de cargar esos .atlas en libgdx para luego usarlos en el juego?

2- Cual sería la mejor forma de pintar el mapa, el mapa está en un Array[][] con toda la información necesaria para pintar y me molaría como poder pintar encima (teniendo en cuenta que puede ser más grande que la pantalla y molaria que se pudiera mover con el dedo, no sé si me explico). Luego las torretas irían del tipo clickas en una torreta que está pintada en la parte de abajo, click en un cuadradito de los del array de antes y se construye.

1 respuesta
YaW

#49 1) Siempre la mejor forma de cargar assets y en especial los atlas es usar un AssetManager. Con esto conseguirás que las cosas se carguen en segundo plano mientras vas actualizando una barra (por ejemplo para hacer una pantalla de Loading). En el Oh My Goat es lo que usamos para cargar todo lo del juego básicamente (atlas, música, niveles, etc).

Aquí tienes info del AssetManager aunque es bastante simple siempre que no cargues cosas raras (por ejemplo nosotros para los niveles tuvimos que montar un festival enorme): https://github.com/libgdx/libgdx/wiki/Managing-your-assets

Aquí tienes un ejemplo de montar un Loading Screen con una barra que se va actualizando a medida que el AssetManager va cargando sus cosas. Sobre esta base de código hemos montado nosotros todos los loading del OMG: https://github.com/Matsemann/libgdx-loading-screen

2) Lo único que tienes que hacer es crear la relación entre los tiles que tendrás en un Matriz y el tamaño en pantalla. Por ejemplo si decides que cada cuadrado ocupa 100px x 100px pues para rellenar el mapa te tendrías que recorrer la Matriz e ir pintando en esas direcciones. Te pongo un pseudocódigo de como sería más o menos:

private Array<Sprite>[][] mapSprites;
public static final int MAP_MAX_WIDTH = 10; //10 o las que sean
public static final int MAP_MAX_HEIGHT = 10;
public static final int TILE_WIDTH = 100;
public static final int TILE_HEIGHT = 100;

...
//Supongo que ya tienes la Matriz rellena con los Sprites o lo que sea que lleva y que quieras pintar.

for(int i=0; i<MAP_MAX_WIDTH; i++){
	for(int k=0; k<MAP_MAX_HEIGHT; k++){
		//Posición donde hay que ponerlo
		mapSprites[i][k].setPosition(i * TILE_WIDTH, k * TILE_HEIGHT);
		mapSprites[i][k].draw();
	}
}

Luego para mover el mapa con el dedo y tal tendrías que jugar con la cámara. Lo mejor es pintar los sprites en posiciones fijas y que la cámara sea la encargada de representar la parte correspondiente en base a los gestos que hagas sobre la pantalla...

1 respuesta
Lecherito

#50 Al AssetManager se la pasa una String que convierte en un FileHandle internal? No me mola mucho ya que necesito que sea external ya que ahora mismo me dice que FileNotFound (Internal) pero donde existe es en el externo.

YaW

Ah, eso es otro tema. Puedes crear tu propioasasset mánager, aunque es un poco más complicado que usarlo tal cual claro.

Pero vamos, el assetmanager debería ser obligatorio para cualquier proyecto libgdx.

1 respuesta
Lecherito

#52 Buah, acabo de mirarlo y hay una clase

AssetManager manager = new AssetManager(new ExternalFileHandleResolver());

Que hace que en vez de internal sean external y ahora funciona de lujo, guay, ahora todo parece funcionar, a ver ahora como puedo cargar las imágenes de ahí

Edit: Uee, aunque me tuve que inventar para sacar el TextureAtlas teniendo el nombre de la región xD

Lecherito

Con esto en el método draw cargo los sprites

mapSprites = new Sprite[game.getMapSize().width][game.getMapSize().height];
for(int i=0; i<mapSprites.length; i++){
    for(int k=0; k<mapSprites[i].length; k++){
        mapSprites[i][k] = new Sprite(findTextureFromMapObject(game.getTerrain()[i][k]));
        mapSprites[i][k].setPosition(i * game.getTileSize().width, k * game.getTileSize().height);
   }
}

El método render de la Screen del juego en sí

@Override
public void render(float delta) {
   super.render(delta);
   batch.begin();
   for(int i=0; i<mapSprites.length; i++){
   for(int k=0; k<mapSprites[i].length; k++){
         mapSprites[i][k].draw(batch);
      }
   }
   batch.end();
   camera.update();
}

Ahora el caso es que no sé como hacer que se pueda mover la cámara libremente con el dedo (o con el ratón en el pc, obvio)

En la clase GameScreen he implementado la interfaz InputProcessor y he puesto el Gdx.input.setInputProcessor(this); en el método show de esa clase. Y en el siguiente método para que se mueva la cámara:

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
   System.out.println("here");
   camera.position.set(screenX, screenY, 0);
   camera.update();
   return true;
}

El "here" es impreso pero la cámara no se mueve

La cámara es inicializada en AbstractScreen que es una clase que pillé por internet y el sobre cómo manejar las diferentes pantallas que tendrá el juego como el menú y eso: http://pastebin.com/iNCLRKDh

Qué estoy haciendo mal?

YaW

Así sin mirarlo mucho te falta aplicar la cámara al batch antes de hacer el begin.

batch.setProjectionMatrix(camera.combined);
1 1 respuesta
Lecherito

#55 Lulz, sí que era eso, gracias! Ahora me falta que creo que lo he dibujado x en y e y en x xD y que cuando clickea siempre vuelve al 0,0

1 respuesta
autlos

#56 Otra cosa es que en los métodos touch de InputListener screenY está invertido y tendrás que hacer height - screenY

1 respuesta
Lecherito

#57 Jaja, si, es lo que estaba viendo, pero vamos, que ahora he de ir echando chispas hacia el autobús, este finde supongo que dejaré eso de la cámara finiquitado y ver que puedo dibujar distintos mapas etc sin ningún problema.

Lecherito

No encuentro a cómo limitar la visión de una cámara. Le hice para que pudieras mover la cámara con el ratón (o dedo en el móvil). Pero la puedo mover por donde me de la gana, y por donde no pinto encima, pues se queda en negro (ya que limpio la pantalla con el color negro).

Por lo que la pregunta es, cómo limitar la visión con una OrthographicCamera? He buscado por bounds etc pero salen cosas del tipo Fustrum o nosequé y me pierdo.

1 respuesta
YaW

No estoy seguro de que se pueda, pero lo que puedes hacer es cuando hagas el touch para mover la cámara, comprueba si la cámara ya está en el límite de la posición y entonces no la muevas, ¿no?

1 respuesta
Tema cerrado