<?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_Movendo_os_graficos_avanzado</id>
	<title>LIBGDX Movendo os graficos avanzado - 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_Movendo_os_graficos_avanzado"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=LIBGDX_Movendo_os_graficos_avanzado&amp;action=history"/>
	<updated>2026-10-27T18:59:15Z</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_Movendo_os_graficos_avanzado&amp;diff=47432&amp;oldid=prev</id>
		<title>Angelfg: Página creada con «===Movendo os gráficos. Vector dirección===  Normalmente en todos os xogo ides ter algún personaxe que se mova cara a algún outro personaxe. Por exemplo, cando dispared...»</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=LIBGDX_Movendo_os_graficos_avanzado&amp;diff=47432&amp;oldid=prev"/>
		<updated>2014-08-14T14:21:46Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «===Movendo os gráficos. Vector dirección===  Normalmente en todos os xogo ides ter algún personaxe que se mova cara a algún outro personaxe. Por exemplo, cando dispared...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Movendo os gráficos. Vector dirección===&lt;br /&gt;
&lt;br /&gt;
Normalmente en todos os xogo ides ter algún personaxe que se mova cara a algún outro personaxe. Por exemplo, cando disparedes queredes que as balas se movan cara o obxectivo.&lt;br /&gt;
&lt;br /&gt;
No noso caso imos facer que aleatoriamente as bolboretas ó aparecer vaian cara á bolboreta Candela, para obrigala a movela.&lt;br /&gt;
&lt;br /&gt;
Para conseguir isto imos facer uso do que se chama &amp;#039;&amp;#039;&amp;#039;Vector Dirección&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Primeiro imos temos que saber o que é un [http://es.wikipedia.org/wiki/Vector Vector]. De forma resumida para nós o Vector vai representar a dirección que ten que seguir un personaxe para chegar a un punto de destino.&lt;br /&gt;
&lt;br /&gt;
Se dito punto de destino non varía no tempo o vector de dirección ten que calcularse ó principio e non variará. Se queremos seguir a un personaxe que se move, cada certo tempo teremos que re-calcular dito vector dirección.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A forma máis sinxela de velo é cun exemplo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;b&amp;gt;Nota:&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt; Os concepto aprendidos serán igualmente aplicables a 3D introducindo a coordenada Z.&lt;br /&gt;
&lt;br /&gt;
Imaxinemos que estamos na coordenada (1,1) e queremos dirixirnos ata a coordenada (4,2).&lt;br /&gt;
O que teríamos que facer é calcular cal é o vector de dirección, é dicir, que números (x,y) sumados&lt;br /&gt;
a (1,1) nos levan ata o (4,2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Imagen:LIBGDX_UD2_7_graficos_4.jpg | center]]&lt;br /&gt;
&lt;br /&gt;
O máis lóxico é restar o punto de destino menos o punto de orixe, desta forma:&lt;br /&gt;
&lt;br /&gt;
:Vector Dirección = Punto_Destino – Punto_Orixe = (4,2)-(1,1) = (3,1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En libgdx o faremos utilizando os métodos &amp;#039;&amp;#039;&amp;#039;[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html#sub-float-float- sub]&amp;#039;&amp;#039;&amp;#039; (para restar dous vectores) e &amp;#039;&amp;#039;&amp;#039;[http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html#cpy-- cpy]&amp;#039;&amp;#039;&amp;#039; (para facer unha copia do vector) da clase Vector2 (con 3 coordenadas usamos un Vector3 e con dous Vector2):&lt;br /&gt;
&lt;br /&gt;
:Punto Orixe = Posición do personaxe = Vector2 posicion&lt;br /&gt;
:Punto Destino = Posición do punto de destino (no exemplo) = Vector2 (4,2)&lt;br /&gt;
&lt;br /&gt;
::direccion = posicion_destino.cpy().sub(posicion_orixe);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fixarse como usamos unha copia do vector de posición destino xa que o [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html#sub-float-float- método sub] modifica o&lt;br /&gt;
vector orixinal. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se queremos aumentar o rendemento (xa que estamos a facer new´s ó usar a función cpy) teríamos un vector temporal xa creado previamente (no constructor) e copiaríamos o contido chamando ó método set da forma:&lt;br /&gt;
&lt;br /&gt;
:temporal.set(posicion_destino);&lt;br /&gt;
:direccion = temporal.sub(posicion_orixe);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Nota:&amp;lt;/b&amp;gt; Isto só ten sentido se estamos a chamar ó método cpy de forma continua ou se necesitamos gardar o vector posicion_destino para algo. Se, por exemplo, non modificamos o vector dirección, isto só o temos que facer unha vez no constructor e polo tanto non necesitamos vector temporal para esta operación.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
No exemplo anterior teríamos un vector de dirección con valores (3,1).&lt;br /&gt;
Agora poderíamos chegar ó punto de destino dun único salto, xa que na primeira iteración sumaríamos o seu valor e xa chegaríamos. &lt;br /&gt;
&lt;br /&gt;
:posicion = posicion + vector_dirección = (1,1) + (3,1) = (4,2).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Isto é debido a que a súa lonxitude é moi grande.&lt;br /&gt;
Como o que queremos é que pouco a pouco vaia chegando podemos facer uso do [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html#nor-- método nor()] que normaliza o vector e fai que o seu valor sexa o vector unidade (para nos terá un valor &amp;lt;=1) pero os seus valores farán que ó sumalos á posición se vaia achegando ó punto de destino.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A forma de facer uso del sería a de normalizar o vector dirección antes de sumalo:&lt;br /&gt;
&lt;br /&gt;
:direccion.nor();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Nota:&amp;lt;/b&amp;gt; Loxicamente isto só o temos que facer unha vez xa que nor modifica o vector de dirección. Se volvemos aplicar dito método o faríamos sobre o vector xa previamente normalizado. Isto só será necesario facelo cada vez que modifiquemos o vector dirección.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora para mover o personaxe ó punto de destino teríamos que facer:&lt;br /&gt;
&lt;br /&gt;
:posicion.add(direccion.cpy().scl(velocidade*delta));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;b&amp;gt;Nota:&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt; Igual que no caso anterior podemos usar o mesmo vector temporal para asinarlle antes a dirección e non ter que facer un cpy de cada vez. Normalmente teremos que utilizalo nesta operación.&lt;br /&gt;
&lt;br /&gt;
O [http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Vector2.html#scl-float- método scl] multiplica o vector por un escalar (no exemplo o escalar velocidade*delta).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imos poñer en práctica os conceptos aprendidos.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Exercicio proposto:&amp;#039;&amp;#039;&amp;#039; Facer que as bolboretas se dirixan ó punto 500,300 do noso mundo (esquina superior dereita).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Preparación:&amp;#039;&amp;#039;&amp;#039; Agora ides facer unha copia da clase UD2_4_RendererXogo, xa que imos modificala para amosarvos como se poden mover os gráficos cara a un punto. Premede co rato sobre a clase, botón dereito e escollede a opción Copy. Despois repetides a operación pero escolledes a opción Paste. Vos preguntará un nome para a clase. Indicade &amp;#039;&amp;#039;&amp;#039;UD2_5_RendererXogo&amp;#039;&amp;#039;&amp;#039;. Modificade a clase PantallaXogo para que chame á nova clase.&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;Solución:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Primeiro definimos o vector dirección na clase bolboreta e o instanciamos no constructor. Tamén definimos e instaciamos un vector temporal polo visto anteriormente.&lt;br /&gt;
: O vector temporal o usaremos despois cando vexamos o modelo-vista-controlador.&lt;br /&gt;
&lt;br /&gt;
* Creamos un constructor novo para darlle o punto final ó que se ten que dirixir a bolboreta. Tamén creamos un &amp;#039;&amp;#039;&amp;#039;método setDireccion&amp;#039;&amp;#039;&amp;#039; que terá como parámetro un novo punto final para cambiar a dirección en caso necesario e un &amp;#039;&amp;#039;&amp;#039;método getDireccion&amp;#039;&amp;#039;&amp;#039; que devolva dito vector.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Clase Bolboreta:&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;7,17-32&amp;quot;&amp;gt;&lt;br /&gt;
public class Bolboreta extends Personaxe {&lt;br /&gt;
&lt;br /&gt;
	public static enum TIPOS_BOLBORETAS {CANDELA, INIMIGA1, INIMIGA2, INIMIGA3}&lt;br /&gt;
	&lt;br /&gt;
	private TIPOS_BOLBORETAS tipo_bolboreta;&lt;br /&gt;
	&lt;br /&gt;
	private Vector2 direccion,temporal;&lt;br /&gt;
	&lt;br /&gt;
	public Bolboreta(Vector2 posicion, Vector2 tamano, float velocidade_max,TIPOS_BOLBORETAS tipo_bolboreta) {&lt;br /&gt;
&lt;br /&gt;
		super(posicion, tamano, velocidade_max);&lt;br /&gt;
		this.tipo_bolboreta=tipo_bolboreta;&lt;br /&gt;
&lt;br /&gt;
		setVelocidade(velocidade_max);	// Facemos que por defecto todas as bolboretas se movan á velocidade indicada.&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public Bolboreta(Vector2 posicion, Vector2 tamano, float velocidade_max,TIPOS_BOLBORETAS tipo_bolboreta,Vector2 posfinal) {&lt;br /&gt;
&lt;br /&gt;
		this(posicion, tamano, velocidade_max,tipo_bolboreta);&lt;br /&gt;
		direccion = posfinal.sub(posicion).nor();&lt;br /&gt;
		temporal = new Vector2();&lt;br /&gt;
	}&lt;br /&gt;
         /**&lt;br /&gt;
	 * Modifica o vector dirección&lt;br /&gt;
	 * @param puntofinal: novo punto final&lt;br /&gt;
	 */&lt;br /&gt;
	public void setDireccion(Vector2 puntofinal){&lt;br /&gt;
		direccion.set(puntofinal.sub(posicion).nor());&lt;br /&gt;
	}&lt;br /&gt;
	public Vector2 getDireccion(){&lt;br /&gt;
		return direccion;&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;
* Modificamos a clase Mundo para crear as bolboretas dándolle o punto final onde ten que dirixirse (500,300)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Clase Mundo:&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;5,6&amp;quot;&amp;gt;&lt;br /&gt;
    public Mundo(){&lt;br /&gt;
    	candela = new Candela(new Vector2(30,30), new Vector2(15,15),100,Bolboreta.TIPOS_BOLBORETAS.CANDELA);&lt;br /&gt;
    	bolboretas = new Array&amp;lt;Bolboreta&amp;gt;();&lt;br /&gt;
    	&lt;br /&gt;
    	bolboretas.add(new Bolboreta(new Vector2(40,250),new Vector2(10,10),80,Bolboreta.TIPOS_BOLBORETAS.INIMIGA1, new Vector2(500,300)));&lt;br /&gt;
    	bolboretas.add(new Bolboreta(new Vector2(20,50),new Vector2(10,10),70,Bolboreta.TIPOS_BOLBORETAS.INIMIGA2,new Vector2(500,300)));&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;
* Despois modificamos o método debuxarBolboretas da clase UD_2_5_RendererXogo para que a bolboreta se mova segundo o indicado polo vector dirección.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Clase UD_2_5_RendererXogo:&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;13&amp;quot;&amp;gt;&lt;br /&gt;
	private void debuxarBolboretas(){&lt;br /&gt;
		Texture tempTextura=null;&lt;br /&gt;
		&lt;br /&gt;
		for (Bolboreta bolboreta : meumundo.getBolboretas()){&lt;br /&gt;
			if (bolboreta.getTipo_bolboreta()==Bolboreta.TIPOS_BOLBORETAS.INIMIGA1){&lt;br /&gt;
				tempTextura = AssetsXogo.mariposa_e1;&lt;br /&gt;
			}&lt;br /&gt;
			else if (bolboreta.getTipo_bolboreta()==Bolboreta.TIPOS_BOLBORETAS.INIMIGA2){&lt;br /&gt;
				tempTextura = AssetsXogo.mariposa_e2;&lt;br /&gt;
			}&lt;br /&gt;
			else tempTextura = AssetsXogo.mariposa_e3;&lt;br /&gt;
			&lt;br /&gt;
 			  bolboreta.getPosicion().add(bolboreta.getDireccion().cpy().scl(66*Gdx.graphics.getDeltaTime()));&lt;br /&gt;
			spritebatch.draw(tempTextura, &lt;br /&gt;
					bolboreta.getPosicion().x,bolboreta.getPosicion().y,&lt;br /&gt;
					bolboreta.getTamano().x, bolboreta.getTamano().x);&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;
Podedes probar agora como as bolboretas se dirixen ó punto indicado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cambiade a clase PantallaXogo para que volva a chamar á clase RendererXogo.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
-- [[Usuario:angelfg|Ángel D. Fernández González]] -- (2014).&lt;/div&gt;</summary>
		<author><name>Angelfg</name></author>
	</entry>
</feed>