<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Animacions</id>
	<title>LIBGDX Animacions - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=LIBGDX_Animacions"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=LIBGDX_Animacions&amp;action=history"/>
	<updated>2026-10-24T09:49:28Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=LIBGDX_Animacions&amp;diff=48848&amp;oldid=prev</id>
		<title>Angelfg: /* Introdución */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=LIBGDX_Animacions&amp;diff=48848&amp;oldid=prev"/>
		<updated>2014-10-07T14:25:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Introdución&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;span style=&amp;quot;font-size:150%;&amp;quot;&amp;gt;UNIDADE 3: Animacións&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introdución==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt; Esta explicación está  Esta explicación está [http://manuais.iessanclemente.net/index.php?title=LIBGDX_Movendo_os_graficos relacionada coa sección de Movendo os gráficos].&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Información na wiki: https://github.com/libgdx/libgdx/wiki/2D-Animation&lt;br /&gt;
Clase que se utiliza: [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/Animation.html Clase Animation].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
O idea é moi sinxela. Consiste en debuxar de forma continuada un conxunto de [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/TextureRegion.html TextureRegion] que conforman a animación.&lt;br /&gt;
&lt;br /&gt;
Despois mediante unha clase faremos que esas rexións vaian cambiando no método render a medida que pasa o tempo.&lt;br /&gt;
&lt;br /&gt;
==Proceso==&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Imos animar un peixe utilizando este gráfico:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_peixeanimado.png|300px|center]]&lt;br /&gt;
&lt;br /&gt;
O proceso é o seguinte:&lt;br /&gt;
&lt;br /&gt;
* Cargamos nun obxecto Texture ou TextureRegion as imaxes que conforman a nosa animación.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Lembrar que dita carga a podemos facer utilizando un TextureAtlas como [http://manuais.iessanclemente.net/index.php?title=LIBGDX_TextureAtlas explicamos neste punto]. Nese caso o que obteremos será unha TextureRegion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
private Texture texturePeixe;&lt;br /&gt;
...............&lt;br /&gt;
texturePeixe = new Texture(&amp;quot;LIBGDX_peixeanimado.png&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Agora necesitamos dividir dita imaxe en anacos máis pequenos. Cada peixe ten un tamaño de 96x96 polo tanto imos dividir dita imaxe en 4 anacos. Isto o facemos có método split que devolve un array bidimensional de TextureRegion, no noso caso devolverá un array de 1 fila e 4 columnas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
TextureRegion[][] tmp = TextureRegion.split(texturePeixe,96,96);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
No caso de ter como referencia do noso gráfico a TextureRegion o faríamos así:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
TextureRegion[][] tmp = textureRegionPeixe.split(96,96);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD3_Animacions_2.jpg|300px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Poderíamos ter máis imaxes (máis filas) e o método split ó chegar ó final pasaría a seguinte&lt;br /&gt;
fila deixando unha altura de 96 píxeles (o indicado no método).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A continuación temos que crear unha textureregion dunha dimensión (agora temos un array bidimensional) que sexa igual ó número de frames a amosar. No noso caso son 1x4 = 4 (unha fila e catro columnas).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
		int num_columnas = tmp[0].length;&lt;br /&gt;
		int num_filas = tmp.length;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
Outra forma de facelo:&lt;br /&gt;
&lt;br /&gt;
Para calcular o número de filas e columnas mediante programación podemos utilizar este código:&lt;br /&gt;
NUM_FILAS = ALTURA_TEXTURAREGION_CON_ANIMACION / 96 = 96 / 96 = 1&lt;br /&gt;
NUM_COLUMNA = ANCHURA_TEXTURAREGION_CON_ANIMACION / 96 = 384 / 96 = 4&lt;br /&gt;
&lt;br /&gt;
Isto só é aplicable ás TextureRegion.&lt;br /&gt;
&lt;br /&gt;
No noso caso:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
int num_filas = textureRegionPeixe.getRegionHeight() / 96;&lt;br /&gt;
int num_columnas = textureRegionPeixe.getRegionWidth() / 96;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Nota:&amp;lt;/u&amp;gt; Para pasar dunha Texture a unha TextureRegion só temos que facer o new pasándolle como parámetro a Texture. Por exemplo: TextureRegion tr = new TextureRegion(texturePeixe);&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Agora percorremos o array bidimensional e o pasamos a un array unidimensional:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
		TextureRegion[] framesanimacion = new TextureRegion[num_columnas*num_filas];&lt;br /&gt;
&lt;br /&gt;
		for(int fila=0; fila&amp;lt;num_filas;fila++){&lt;br /&gt;
			for(int col=0; col&amp;lt;num_columnas;col++){&lt;br /&gt;
				framesanimacion[fila*num_columnas+col]=tmp[fila][col];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Unha vez pasado a un array unidimensional definimos un obxecto de clase Animation. A dito obxecto hai que pasarlle como parámetros as TextureRegion que van conformar a animación e o tempo que ten que pasar entre cada frame da animación:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
import com.badlogic.gdx.graphics.g2d.Animation;&lt;br /&gt;
&lt;br /&gt;
        .............&lt;br /&gt;
	private Animation animPeixe;&lt;br /&gt;
        .............&lt;br /&gt;
	animPeixe = new Animation(0.15f, framesanimacion);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Agora no método render debemos de obter cada un dos frames da animación e debuxalo como o facemos sempre.&lt;br /&gt;
&lt;br /&gt;
Para obter ese frame debemos utilizar un cronómetro (calquera contador de tempo que utilicemos no xogo) e debemos chamar ó [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g2d/Animation.html#getKeyFrame-float- método getKeyFrame], pasándolle como parámetro ese contador e unha variable booleana indicando se queremos que a animación se repita ou non.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
	private float crono;&lt;br /&gt;
        .............  &lt;br /&gt;
	@Override&lt;br /&gt;
	public void render () {&lt;br /&gt;
		Gdx.gl.glClearColor(1, 0, 0, 1);&lt;br /&gt;
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);&lt;br /&gt;
		&lt;br /&gt;
		crono+=Gdx.graphics.getDeltaTime();&lt;br /&gt;
		&lt;br /&gt;
		batch.begin();&lt;br /&gt;
		batch.draw(animPeixe.getKeyFrame(crono, true),0f,0f,96f,96f);&lt;br /&gt;
		batch.end();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplo de código==&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Deberedes de cambiar a clase co que inician as diferentes plataformas pola seguinte:&lt;br /&gt;
&lt;br /&gt;
* Deberedes copiar o gráfico dos peixes animados ó cartafol assets do proxecto Android.&lt;br /&gt;
* Crear unha nova clase.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Código da clase Animacions&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Obxectivo: Exemplo de animación&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; line enclose=&amp;quot;div&amp;quot; highlight=&amp;quot;&amp;quot; &amp;gt;&lt;br /&gt;
package com.plategaxogo2davanz.angel;&lt;br /&gt;
&lt;br /&gt;
import com.badlogic.gdx.ApplicationAdapter;&lt;br /&gt;
import com.badlogic.gdx.Gdx;&lt;br /&gt;
import com.badlogic.gdx.graphics.GL20;&lt;br /&gt;
import com.badlogic.gdx.graphics.Texture;&lt;br /&gt;
import com.badlogic.gdx.graphics.g2d.Animation;&lt;br /&gt;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;&lt;br /&gt;
import com.badlogic.gdx.graphics.g2d.TextureRegion;&lt;br /&gt;
&lt;br /&gt;
public class Animacions extends ApplicationAdapter {&lt;br /&gt;
	private SpriteBatch batch;&lt;br /&gt;
	private Animation animPeixe;&lt;br /&gt;
	private float crono;&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void create () {&lt;br /&gt;
		batch = new SpriteBatch();&lt;br /&gt;
		Texture texturePeixe = new Texture(&amp;quot;LIBGDX_peixeanimado.png&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		TextureRegion[][] tmp = TextureRegion.split(texturePeixe,96,96);	&lt;br /&gt;
		&lt;br /&gt;
		int num_columnas = tmp[0].length;&lt;br /&gt;
		int num_filas = tmp.length;&lt;br /&gt;
		TextureRegion[] framesanimacion = new TextureRegion[num_columnas*num_filas];&lt;br /&gt;
&lt;br /&gt;
		for(int fila=0; fila&amp;lt;num_filas;fila++){&lt;br /&gt;
			for(int col=0; col&amp;lt;num_columnas;col++){&lt;br /&gt;
				framesanimacion[fila*num_columnas+col]=tmp[fila][col];&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
		}&lt;br /&gt;
			&lt;br /&gt;
		animPeixe = new Animation(0.15f, framesanimacion);&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void render () {&lt;br /&gt;
		Gdx.gl.glClearColor(1, 0, 0, 1);&lt;br /&gt;
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);&lt;br /&gt;
		&lt;br /&gt;
		crono+=Gdx.graphics.getDeltaTime();&lt;br /&gt;
		&lt;br /&gt;
		batch.begin();&lt;br /&gt;
		batch.draw(animPeixe.getKeyFrame(crono, true),0f,0f,96f,96f);&lt;br /&gt;
		batch.end();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	@Override&lt;br /&gt;
	public void dispose() {&lt;br /&gt;
		batch.dispose();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==TAREFA OPTATIVA A FACER==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TAREFA 1 OPTATIVA A FACER:&amp;#039;&amp;#039;&amp;#039; Modifica a clase AssetsXogo e referencia a nave mediante a clase Animated utilizando os seguintes gráficos de tamaño 200x110 pixeles:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_spaceship.png | 300px | center]]&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;Nota:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt; &lt;br /&gt;
* Se mirastes o punto [http://manuais.iessanclemente.net/index.php?title=LIBGDX_TextureAtlas TextureAtlas] deberedes crear outra vez o atlas engadindo a animación da nave.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TAREFA 2 OPTATIVA A FACER:&amp;#039;&amp;#039;&amp;#039; Modifica a clase AssetsXogo e referencia o alien mediante a clase Animated utilizando os seguintes gráficos de tamaño 32x32 pixeles:&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_alienanimado.png | 100px | center]]&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;Nota:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt; &lt;br /&gt;
* Se mirastes o punto [http://manuais.iessanclemente.net/index.php?title=LIBGDX_TextureAtlas TextureAtlas] deberedes crear outra vez o atlas engadindo a animación do alien.&lt;br /&gt;
* Este gráfico consta de dous frames por cada dirección do alien. Polo tanto para debuxalo ides ter que, no método render, en función da dirección do alien, obter o frame da animación correspondente (esquerda, dereita, arriba ou abaixo). Para saber cara onde vai o alien podedes facer uso da velocidade (x,y).&lt;br /&gt;
* A forma máis sinxela é crear catro animacións, unha por cada movemento.&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; -- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2014).&lt;/div&gt;</summary>
		<author><name>Angelfg</name></author>
	</entry>
</feed>