<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Javier Carrasco on Documentación</title>
    <link>https://documentation.javiercarrasco.es/</link>
    <description>Recent content in Javier Carrasco on Documentación</description>
    <generator>Hugo</generator>
    <language>es-es</language>
    <atom:link href="https://documentation.javiercarrasco.es/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Tema 1A. Kotlin para Android — Repaso acelerado</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1a_Kotlin_Repaso/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1a_Kotlin_Repaso/</guid>
      <description>&lt;h1 id=&#34;tema-1a-kotlin-para-android--repaso-acelerado&#34;&gt;Tema 1A. Kotlin para Android — Repaso acelerado&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 4 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado las tecnologías de desarrollo de aplicaciones para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha analizado la estructura de aplicaciones existentes para dispositivos móviles identificando las clases utilizadas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado modificaciones sobre aplicaciones existentes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;introducción&#34;&gt;Introducción&lt;a class=&#34;anchor&#34; href=&#34;#introducci%c3%b3n&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Kotlin es el lenguaje oficial de Android desde 2017 y el único recomendado por Google para el desarrollo de aplicaciones modernas con Jetpack Compose. Esta sección asume que ya conoces los fundamentos de programación orientada a objetos, idealmente en Java, y se centra en los aspectos de Kotlin que son distintos, más potentes o especialmente relevantes para el desarrollo Android.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 2. Arquitectura MVVM y ViewModel</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B2/B2-T2_MVVM_ViewModel/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B2/B2-T2_MVVM_ViewModel/</guid>
      <description>&lt;h1 id=&#34;tema-2-arquitectura-mvvm-y-viewmodel&#34;&gt;Tema 2. Arquitectura MVVM y ViewModel&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B2 — Arquitectura MVVM y desarrollo de aplicaciones Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 14 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha generado la estructura de clases necesaria para la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado y utilizado las clases que modelan ventanas, menús, alertas y controles para el desarrollo de aplicaciones gráficas sencillas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de interacción usuario-aplicación para optimizar las aplicaciones desarrolladas a partir de emuladores.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado los procesos necesarios para el desarrollo de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Gradle&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gradle&#34; data-lang=&#34;gradle&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (app) — añadir a las del Bloque 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;dependencies &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ViewModel y Lifecycle&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.lifecycle:lifecycle-runtime-compose:2.10.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Corrutinas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Testing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    testImplementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint important&#39;&gt;&#xA;&lt;p&gt;Todos los artefactos &lt;code&gt;lifecycle-*&lt;/code&gt; deben compartir la misma versión. Consulta &lt;a href=&#34;https://developer.android.com/jetpack/androidx/releases/lifecycle&#34;&gt;la página de releases de Lifecycle&lt;/a&gt; para verificar la última versión estable antes de iniciar un nuevo proyecto.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 4. ROOM: Persistencia local</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B3/B3-T4_Room_Persistencia/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B3/B3-T4_Room_Persistencia/</guid>
      <description>&lt;h1 id=&#34;tema-4-room-persistencia-local&#34;&gt;Tema 4. ROOM: Persistencia local&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B3 — Persistencia y comunicación: ROOM + Retrofit2&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 12 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha generado la estructura de clases necesaria para la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado y utilizado las clases que modelan ventanas, menús, alertas y controles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han almacenado y recuperado datos utilizando algún mecanismo de persistencia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de interacción usuario-aplicación para optimizar las aplicaciones desarrolladas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado los procesos necesarios para el desarrollo de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para la conversión de datos multimedia de un formato a otro.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para procesar datos multimedia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para el control de eventos, tipos de media y excepciones, entre otros.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han depurado y documentado los programas desarrollados.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Room utiliza &lt;strong&gt;KSP&lt;/strong&gt; (Kotlin Symbol Processing) como procesador de anotaciones para generar código en tiempo de compilación. A partir de Kotlin 2.0, &lt;strong&gt;KAPT queda obsoleto&lt;/strong&gt; para Room; siempre se debe usar KSP.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 7. Multimedia: Cámara, Galería, Audio y Vídeo</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B4/B4-T7_Multimedia/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B4/B4-T7_Multimedia/</guid>
      <description>&lt;h1 id=&#34;tema-7-multimedia-cámara-galería-audio-y-vídeo&#34;&gt;Tema 7. Multimedia: Cámara, Galería, Audio y Vídeo&lt;a class=&#34;anchor&#34; href=&#34;#tema-7-multimedia-c%c3%a1mara-galer%c3%ada-audio-y-v%c3%addeo&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B4 — Multimedia en Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 9 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado las herramientas y entornos de desarrollo para aplicaciones multimedia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado las herramientas disponibles para el tratamiento de imágenes y vídeo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han incorporado procedimientos para la captura de imágenes y grabación de vídeo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para la reproducción de audio y vídeo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han gestionado los permisos de acceso al hardware multimedia del dispositivo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Gradle&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gradle&#34; data-lang=&#34;gradle&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (módulo app)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;dependencies &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── CameraX ───────────────────────────────────────────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    val cameraxVersion &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;1.4.2&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.camera:camera-core:$cameraxVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.camera:camera-camera2:$cameraxVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// backend Camera2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.camera:camera-lifecycle:$cameraxVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// integración con Lifecycle&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.camera:camera-view:$cameraxVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;       &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// PreviewView&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.camera:camera-extensions:$cameraxVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// HDR, Bokeh, etc. (opcional)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── Media3 / ExoPlayer (reproducción de audio y vídeo) ───────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    val media3Version &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;1.5.1&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.media3:media3-exoplayer:$media3Version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.media3:media3-ui:$media3Version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;          &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// PlayerView&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.media3:media3-common:$media3Version&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── Coil (ya incluido en B3, necesario para mostrar imágenes de la galería) ──&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// io.coil-kt.coil3:coil-compose:3.2.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Permisos en &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 9. Introducción a LibGDX</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_T9_Intro_LibGDX_AST/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_T9_Intro_LibGDX_AST/</guid>
      <description>&lt;!-- Versión Asteriodes --&gt;&#xA;&lt;h1 id=&#34;tema-9-introducción-a-libgdx&#34;&gt;Tema 9. Introducción a LibGDX&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 3 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA4 — Selecciona y prueba motores de juegos analizando la arquitectura de juegos 2D y 3D.&lt;/li&gt;&#xA;&lt;li&gt;RA5 — Desarrolla juegos 2D y 3D sencillos utilizando motores de juegos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado los elementos que componen la arquitectura de un juego 2D y 3D.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado los componentes de un motor de juegos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado entornos de desarrollo de juegos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado diferentes motores de juegos, sus características y funcionalidades.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado los bloques funcionales de un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha reconocido la representación lógica y espacial de una escena gráfica sobre un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha establecido la lógica de un nuevo juego.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado los objetos necesarios para el juego y definido sus características.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado las escenas del juego y distribuido los objetos en las mismas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han establecido las propiedades físicas de los objetos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado cámaras y configurado la iluminación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-introducción-motores-de-juego-y-libgdx&#34;&gt;1. Introducción: motores de juego y LibGDX&lt;a class=&#34;anchor&#34; href=&#34;#1-introducci%c3%b3n-motores-de-juego-y-libgdx&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-por-qué-un-motor-de-juego&#34;&gt;1.1. ¿Por qué un motor de juego?&lt;a class=&#34;anchor&#34; href=&#34;#11-por-qu%c3%a9-un-motor-de-juego&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Cuando desarrollamos una aplicación Android convencional con Jetpack Compose, delegamos en el sistema operativo la gestión del ciclo de renderizado: el sistema decide cuándo redibujar la interfaz en respuesta a cambios de estado. Este modelo, eficiente para formularios, listas o navegación, resulta inadecuado para videojuegos, donde la pantalla debe actualizarse de forma continua —típicamente entre 30 y 60 veces por segundo— independientemente de si ha cambiado algún dato.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 9. Introducción a LibGDX</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_T9_Intro_LibGDX_PLT/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_T9_Intro_LibGDX_PLT/</guid>
      <description>&lt;!-- Versión Plataformas --&gt;&#xA;&lt;h1 id=&#34;tema-9-introducción-a-libgdx&#34;&gt;Tema 9. Introducción a LibGDX&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 3 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA4 — Selecciona y prueba motores de juegos analizando la arquitectura de juegos 2D y 3D.&lt;/li&gt;&#xA;&lt;li&gt;RA5 — Desarrolla juegos 2D y 3D sencillos utilizando motores de juegos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado los elementos que componen la arquitectura de un juego 2D y 3D.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado los componentes de un motor de juegos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado entornos de desarrollo de juegos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado diferentes motores de juegos, sus características y funcionalidades.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado los bloques funcionales de un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha reconocido la representación lógica y espacial de una escena gráfica sobre un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha establecido la lógica de un nuevo juego.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado los objetos necesarios para el juego y definido sus características.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado las escenas del juego y distribuido los objetos en las mismas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han establecido las propiedades físicas de los objetos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado cámaras y configurado la iluminación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-introducción-motores-de-juego-y-libgdx&#34;&gt;1. Introducción: motores de juego y LibGDX&lt;a class=&#34;anchor&#34; href=&#34;#1-introducci%c3%b3n-motores-de-juego-y-libgdx&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-por-qué-un-motor-de-juego&#34;&gt;1.1. ¿Por qué un motor de juego?&lt;a class=&#34;anchor&#34; href=&#34;#11-por-qu%c3%a9-un-motor-de-juego&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Cuando desarrollamos una aplicación Android convencional con Jetpack Compose, el sistema operativo decide cuándo redibujar la interfaz en respuesta a cambios de estado. Este modelo, eficiente para formularios y listas, resulta inadecuado para videojuegos, donde la pantalla debe actualizarse de forma continua —típicamente entre 30 y 60 veces por segundo— independientemente de si ha cambiado algún dato.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 10. KotlinAsteroids — Juego de asteroides 2D completo</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_T10_Juego_Completo_AST/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_T10_Juego_Completo_AST/</guid>
      <description>&lt;!-- Versión Asteroides --&gt;&#xA;&lt;h1 id=&#34;tema-10-kotlinasteroids--juego-de-asteroides-2d-completo&#34;&gt;Tema 10: KotlinAsteroids — Juego de asteroides 2D completo&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 4 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint info&#39;&gt;&#xA;&lt;p&gt;Este tema desarrolla un proyecto guiado completo que integra todos los conceptos del Tema 9 aplicados a un juego top-down sin gravedad: Box2D con cuerpo libre, partículas, audio y múltiples pantallas. El juego sirve como referencia de arquitectura para el proyecto propio de evaluación.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 10. KotlinPlatformer — Juego 2D completo</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_T10_Juego_Completo_PLT/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_T10_Juego_Completo_PLT/</guid>
      <description>&lt;!-- Versión Plataformas --&gt;&#xA;&lt;h1 id=&#34;tema-10-kotlinplatformer--juego-2d-completo&#34;&gt;Tema 10. KotlinPlatformer — Juego 2D completo&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 4 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint info&#39;&gt;&#xA;&lt;p&gt;Este tema desarrolla un proyecto guiado completo que integra todos los conceptos del Tema 9: Box2D, TiledMap, partículas, animaciones, audio y múltiples pantallas. El juego sirve como referencia de arquitectura para el proyecto propio de evaluación.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA4 — Selecciona y prueba motores de juegos analizando la arquitectura de juegos 2D y 3D.&lt;/li&gt;&#xA;&lt;li&gt;RA5 — Desarrolla juegos 2D y 3D sencillos utilizando motores de juegos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado los bloques funcionales de un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA4-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha reconocido la representación lógica y espacial de una escena gráfica sobre un juego existente.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha establecido la lógica de un nuevo juego.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado los objetos necesarios para el juego y definido sus características.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado las escenas del juego y distribuido los objetos en las mismas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han creado materiales para determinar las propiedades finales de la superficie de un objeto.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han establecido las propiedades físicas de los objetos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha incorporado sonido a los diferentes eventos del juego.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado cámaras y configurado la iluminación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han desarrollado e implantado juegos para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de funcionamiento y optimización de los juegos desarrollados.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA5-j&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado las fases de diseño y desarrollo de los juegos creados.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-diseño-del-juego-kotlinplatformer&#34;&gt;1. Diseño del juego: KotlinPlatformer&lt;a class=&#34;anchor&#34; href=&#34;#1-dise%c3%b1o-del-juego-kotlinplatformer&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;KotlinPlatformer&lt;/strong&gt; es un juego de plataformas lateral 2D en el que el jugador controla un personaje que corre y salta sobre plataformas, recoge monedas y evita trampas. El objetivo es alcanzar el final del nivel con el mayor número de monedas posible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 1B. Introducción a Jetpack Compose</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1b_JetpackCompose/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1b_JetpackCompose/</guid>
      <description>&lt;h1 id=&#34;tema-1b-introducción-a-jetpack-compose&#34;&gt;Tema 1B. Introducción a Jetpack Compose&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 6 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado las tecnologías de desarrollo de aplicaciones para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han instalado, configurado y utilizado entornos de trabajo para el desarrollo de aplicaciones para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha analizado la estructura de aplicaciones existentes para dispositivos móviles identificando las clases utilizadas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado modificaciones sobre aplicaciones existentes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado emuladores para comprobar el funcionamiento de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-qué-es-jetpack-compose&#34;&gt;1. ¿Qué es Jetpack Compose?&lt;a class=&#34;anchor&#34; href=&#34;#1-qu%c3%a9-es-jetpack-compose&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Jetpack Compose es el &lt;strong&gt;framework moderno de Android para construir interfaces de usuario de forma declarativa&lt;/strong&gt;. Fue publicado de forma estable por Google en 2021 y se ha convertido en la forma oficial y recomendada de desarrollar interfaces en Android, sustituyendo progresivamente al sistema clásico basado en archivos XML.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 3. Navigation Compose</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B2/B2-T3_Navigation_Compose/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B2/B2-T3_Navigation_Compose/</guid>
      <description>&lt;h1 id=&#34;tema-3-navigation-compose&#34;&gt;Tema 3. Navigation Compose&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B2 — Arquitectura MVVM y desarrollo de aplicaciones Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 10 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha generado la estructura de clases necesaria para la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado las clases necesarias para la conexión y comunicación con dispositivos inalámbricos.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de interacción usuario-aplicación para optimizar las aplicaciones desarrolladas a partir de emuladores.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado los procesos necesarios para el desarrollo de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Gradle&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gradle&#34; data-lang=&#34;gradle&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts — plugins (nivel de proyecto o settings.gradle.kts)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;plugins &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    id&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;org.jetbrains.kotlin.plugin.serialization&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt; version &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;2.3.10&amp;#34;&lt;/span&gt; apply &lt;span style=&#34;color:#fe640b&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (app) — plugins del módulo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;plugins &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    id&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;org.jetbrains.kotlin.plugin.serialization&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (app) — dependencias&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;dependencies &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Navigation Compose (API tipada disponible desde 2.8.0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.navigation:navigation-compose:2.9.7&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Kotlin Serialization — imprescindible para las rutas @Serializable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=&#39;book-hint important&#39;&gt;&#xA;&lt;p&gt;&lt;strong&gt;Compatibilidad de versiones:&lt;/strong&gt; El plugin &lt;code&gt;kotlin.plugin.serialization&lt;/code&gt; debe tener &lt;strong&gt;exactamente la misma versión&lt;/strong&gt; que Kotlin. Si tu proyecto usa Kotlin 2.1.20, el plugin debe ser también 2.1.20. Una discrepancia producirá errores de compilación difíciles de diagnosticar.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 5. Retrofit2: Consumo de APIs REST</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B3/B3-T5_Retrofit_TMDB/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B3/B3-T5_Retrofit_TMDB/</guid>
      <description>&lt;h1 id=&#34;tema-5-retrofit2-consumo-de-apis-rest&#34;&gt;Tema 5. Retrofit2: Consumo de APIs REST&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B3 — Persistencia y comunicación: ROOM + Retrofit2&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 12 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha generado la estructura de clases necesaria para la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado y utilizado las clases que modelan ventanas, menús, alertas y controles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado las técnicas de acceso a servicios de comunicación en red disponibles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de interacción usuario-aplicación para optimizar las aplicaciones desarrolladas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado los procesos necesarios para el desarrollo de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para la conversión de datos multimedia de un formato a otro.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para procesar datos multimedia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para el control de eventos, tipos de media y excepciones, entre otros.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han depurado y documentado los programas desarrollados.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Gradle&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-gradle&#34; data-lang=&#34;gradle&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (módulo app) — añadir a las dependencias de T4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;dependencies &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Retrofit — cliente HTTP con soporte nativo a corrutinas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.squareup.retrofit2:retrofit:2.11.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.squareup.retrofit2:converter-gson:2.11.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// OkHttp — cliente HTTP subyacente + interceptor de logs para desarrollo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.squareup.okhttp3:okhttp:4.12.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.squareup.okhttp3:logging-interceptor:4.12.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Gson — deserialización de JSON a objetos Kotlin/Java&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.google.code.gson:gson:2.11.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Coil — carga asíncrona de imágenes en Compose&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.coil-kt.coil3:coil-compose:3.2.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;    implementation&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.coil-kt.coil3:coil-network-okhttp:3.2.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Añadir el permiso de Internet en &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 8. Sensores, GPS y Notificaciones</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B4/B4-T8_Sensores_Notificaciones/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B4/B4-T8_Sensores_Notificaciones/</guid>
      <description>&lt;h1 id=&#34;tema-8-sensores-gps-y-notificaciones&#34;&gt;Tema 8. Sensores, GPS y Notificaciones&lt;a class=&#34;anchor&#34; href=&#34;#tema-8-sensores-gps-y-notificaciones&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B4 — Multimedia en Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 6 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado las herramientas y entornos de desarrollo para aplicaciones multimedia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han gestionado los permisos de acceso al hardware multimedia del dispositivo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado los servicios de localización del dispositivo.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han incorporado mecanismos de notificación y comunicación con el usuario.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dependencias-necesarias&#34;&gt;Dependencias necesarias&lt;a class=&#34;anchor&#34; href=&#34;#dependencias-necesarias&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// build.gradle.kts (módulo app)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;dependencies {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Localización con FusedLocationProviderClient&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// (Requiere Google Play Services — presente en la mayoría de dispositivos Android)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    implementation(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.google.android.gms:play-services-location:21.3.0&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// WorkManager — tareas en segundo plano y notificaciones programadas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    implementation(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.work:work-runtime-ktx:2.10.1&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Core KTX — NotificationCompat y utilidades de compatibilidad&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// (Ya incluido transitivamente, pero conviene declararlo explícitamente)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    implementation(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;androidx.core:core-ktx:1.16.0&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Permisos en &lt;code&gt;AndroidManifest.xml&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 3. Referencia: StateFlow, corrutinas y arquitectura MVVM</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B2/B2-A3_Referencia_MVVM_StateFlow/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B2/B2-A3_Referencia_MVVM_StateFlow/</guid>
      <description>&lt;h1 id=&#34;anexo-3-referencia-stateflow-corrutinas-y-arquitectura-mvvm&#34;&gt;Anexo 3. Referencia: StateFlow, corrutinas y arquitectura MVVM&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B2 — Arquitectura MVVM y desarrollo de aplicaciones Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-corrutinas-de-kotlin-referencia-completa-para-viewmodel&#34;&gt;1. Corrutinas de Kotlin: referencia completa para ViewModel&lt;a class=&#34;anchor&#34; href=&#34;#1-corrutinas-de-kotlin-referencia-completa-para-viewmodel&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;qué-es-una-corrutina&#34;&gt;Qué es una corrutina&lt;a class=&#34;anchor&#34; href=&#34;#qu%c3%a9-es-una-corrutina&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Una &lt;strong&gt;corrutina&lt;/strong&gt; es una unidad de trabajo que puede suspenderse y reanudarse sin bloquear el hilo en el que se ejecuta. Cuando una función &lt;code&gt;suspend&lt;/code&gt; espera un resultado (una respuesta de red, una consulta a la base de datos), libera el hilo para que otras tareas lo usen, y lo recupera cuando el resultado está disponible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 5. Referencia: Permisos en Android moderno, FileProvider y WorkManager avanzado</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B4/B4-A5_Referencia_Permisos_FileProvider/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B4/B4-A5_Referencia_Permisos_FileProvider/</guid>
      <description>&lt;h1 id=&#34;anexo-5-referencia-permisos-en-android-moderno-fileprovider-y-workmanager-avanzado&#34;&gt;Anexo 5. Referencia: Permisos en Android moderno, FileProvider y WorkManager avanzado&lt;a class=&#34;anchor&#34; href=&#34;#anexo-5-referencia-permisos-en-android-moderno-fileprovider-y-workmanager-avanzado&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B4 — Multimedia en Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-mapa-completo-de-permisos-en-android&#34;&gt;1. Mapa completo de permisos en Android&lt;a class=&#34;anchor&#34; href=&#34;#1-mapa-completo-de-permisos-en-android&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;permisos-peligrosos-más-habituales-solicitar-en-tiempo-de-ejecución&#34;&gt;Permisos peligrosos más habituales (solicitar en tiempo de ejecución)&lt;a class=&#34;anchor&#34; href=&#34;#permisos-peligrosos-m%c3%a1s-habituales-solicitar-en-tiempo-de-ejecuci%c3%b3n&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Grupo&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Permiso&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;API&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Cuándo es necesario&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Cámara&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;CAMERA&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Usar CameraX / Camera2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Almacenamiento&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;READ_MEDIA_IMAGES&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;33+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Leer imágenes sin Photo Picker&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Almacenamiento&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;READ_MEDIA_VIDEO&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;33+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Leer vídeos sin Photo Picker&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Almacenamiento&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;READ_EXTERNAL_STORAGE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;≤32&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Leer medios en API ≤ 32&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Almacenamiento&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;WRITE_EXTERNAL_STORAGE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;≤28&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Escribir fuera de MediaStore&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Micrófono&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;RECORD_AUDIO&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Grabar audio / vídeo con sonido&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Localización&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ACCESS_COARSE_LOCATION&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Red (~300m)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Localización&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ACCESS_FINE_LOCATION&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;GPS (~10m)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Localización&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ACCESS_BACKGROUND_LOCATION&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;29+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;GPS con app en segundo plano&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Notificaciones&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;POST_NOTIFICATIONS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;33+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Publicar cualquier notificación&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Actividad física&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ACTIVITY_RECOGNITION&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;29+&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Contador de pasos (&lt;code&gt;TYPE_STEP_COUNTER&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Sensores corporales&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;BODY_SENSORS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Frecuencia cardíaca&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Teléfono&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;READ_PHONE_STATE&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Estado de la llamada&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Contactos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;READ_CONTACTS&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Todos&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Leer la agenda&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;permisos-normales-solo-declarar-en-manifest-no-solicitar-en-runtime&#34;&gt;Permisos normales (solo declarar en Manifest, no solicitar en runtime)&lt;a class=&#34;anchor&#34; href=&#34;#permisos-normales-solo-declarar-en-manifest-no-solicitar-en-runtime&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;XML&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.permission.INTERNET&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.permission.ACCESS_NETWORK_STATE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.permission.VIBRATE&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;uses-permission&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.permission.RECEIVE_BOOT_COMPLETED&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;flujo-correcto-para-solicitar-un-permiso-peligroso&#34;&gt;Flujo correcto para solicitar un permiso peligroso&lt;a class=&#34;anchor&#34; href=&#34;#flujo-correcto-para-solicitar-un-permiso-peligroso&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1. Comprobar si ya está concedido (ContextCompat.checkSelfPermission)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       ├── GRANTED → Ejecutar la función directamente&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       └── DENIED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             ├── shouldShowRequestPermissionRationale() == true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             │    → Mostrar explicación al usuario ANTES del diálogo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;             └── Lanzar launcher.launch(permiso)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       ├── Usuario acepta → GRANTED → ejecutar función&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       └── Usuario deniega&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             ├── Primera denegación → puede volver a solicitar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                             └── &amp;#34;No volver a preguntar&amp;#34; → redirigir a Ajustes del sistema&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;redirigir-al-usuario-a-los-ajustes-si-deniega-permanentemente&#34;&gt;Redirigir al usuario a los Ajustes si deniega permanentemente&lt;a class=&#34;anchor&#34; href=&#34;#redirigir-al-usuario-a-los-ajustes-si-deniega-permanentemente&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#1e66f5;font-weight:bold&#34;&gt;@Composable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;MensajePermisoDenegadoPermanentemente&lt;/span&gt;(permiso: String) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;context&lt;/span&gt; = &lt;span style=&#34;color:#df8e1d&#34;&gt;LocalContext&lt;/span&gt;.current&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    Column(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;        horizontalAlignment = &lt;span style=&#34;color:#df8e1d&#34;&gt;Alignment&lt;/span&gt;.CenterHorizontally,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;        modifier = &lt;span style=&#34;color:#df8e1d&#34;&gt;Modifier&lt;/span&gt;.padding(&lt;span style=&#34;color:#fe640b&#34;&gt;24&lt;/span&gt;.dp)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    ) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;        Icon(&lt;span style=&#34;color:#df8e1d&#34;&gt;Icons&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;Default&lt;/span&gt;.Block, contentDescription = &lt;span style=&#34;color:#8839ef&#34;&gt;null&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;            modifier = &lt;span style=&#34;color:#df8e1d&#34;&gt;Modifier&lt;/span&gt;.size(&lt;span style=&#34;color:#fe640b&#34;&gt;64&lt;/span&gt;.dp),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;            tint = &lt;span style=&#34;color:#df8e1d&#34;&gt;MaterialTheme&lt;/span&gt;.colorScheme.error)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;        Spacer(&lt;span style=&#34;color:#df8e1d&#34;&gt;Modifier&lt;/span&gt;.height(&lt;span style=&#34;color:#fe640b&#34;&gt;16&lt;/span&gt;.dp))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;        Text(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;El permiso ha sido denegado permanentemente. &amp;#34;&lt;/span&gt; +&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Ve a Ajustes → Aplicaciones → AppFlix → Permisos para activarlo.&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;            textAlign = &lt;span style=&#34;color:#df8e1d&#34;&gt;TextAlign&lt;/span&gt;.Center&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;        Spacer(&lt;span style=&#34;color:#df8e1d&#34;&gt;Modifier&lt;/span&gt;.height(&lt;span style=&#34;color:#fe640b&#34;&gt;24&lt;/span&gt;.dp))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;        Button(onClick = {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Abrir la pantalla de permisos de la app en los ajustes del sistema&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;intent&lt;/span&gt; = Intent(&lt;span style=&#34;color:#df8e1d&#34;&gt;Settings&lt;/span&gt;.ACTION_APPLICATION_DETAILS_SETTINGS).apply {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#8839ef&#34;&gt;data&lt;/span&gt; = &lt;span style=&#34;color:#df8e1d&#34;&gt;Uri&lt;/span&gt;.fromParts(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;package&amp;#34;&lt;/span&gt;, context.packageName, &lt;span style=&#34;color:#8839ef&#34;&gt;null&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;            context.startActivity(intent)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;        }) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;            Text(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Ir a Ajustes&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-fileprovider-compartir-archivos-entre-apps&#34;&gt;2. FileProvider: compartir archivos entre apps&lt;a class=&#34;anchor&#34; href=&#34;#2-fileprovider-compartir-archivos-entre-apps&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Cuando una app necesita compartir un archivo (foto tomada con CameraX, documento generado) con otra app (WhatsApp, email, Google Drive), &lt;strong&gt;no puede pasar una ruta de archivo directa&lt;/strong&gt; (&lt;code&gt;file:///&lt;/code&gt;) desde Android 7.0 (API 24). En su lugar, debe usar un &lt;code&gt;FileProvider&lt;/code&gt; que genera una URI de contenido segura (&lt;code&gt;content://&lt;/code&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 6. Referencia rápida de LibGDX</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_A6_LibGDX_AST/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_A6_LibGDX_AST/</guid>
      <description>&lt;!-- Versión Asteroides --&gt;&#xA;&lt;h1 id=&#34;anexo-6-referencia-rápida-de-libgdx&#34;&gt;Anexo 6: Referencia rápida de LibGDX&lt;a class=&#34;anchor&#34; href=&#34;#anexo-6-referencia-r%c3%a1pida-de-libgdx&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint info&#39;&gt;&#xA;&lt;p&gt;Este anexo actúa como hoja de consulta rápida durante el desarrollo del proyecto. Recoge las clases, métodos y patrones más usados del Tema 9 y el Tema 10 (KotlinAsteroids), organizados por área temática. Las secciones de física están adaptadas a juegos top-down sin gravedad.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 6. Referencia rápida de LibGDX</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B5/B5_A6_LibGDX_PLT/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B5/B5_A6_LibGDX_PLT/</guid>
      <description>&lt;!-- Versión Plataformas --&gt;&#xA;&lt;h1 id=&#34;anexo-6-referencia-rápida-de-libgdx&#34;&gt;Anexo 6: Referencia rápida de LibGDX&lt;a class=&#34;anchor&#34; href=&#34;#anexo-6-referencia-r%c3%a1pida-de-libgdx&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B5 — Motores de juego: análisis e introducción a LibGDX&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#39;book-hint info&#39;&gt;&#xA;&lt;p&gt;Este anexo actúa como hoja de consulta rápida durante el desarrollo del proyecto. Recoge las clases, métodos y patrones más usados del Tema 9 y el Tema 10 (KotlinPlatformer), organizados por área temática.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA4 — Selecciona y prueba motores de juegos analizando la arquitectura de juegos 2D y 3D.&lt;/li&gt;&#xA;&lt;li&gt;RA5 — Desarrolla juegos 2D y 3D sencillos utilizando motores de juegos.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-versiones-y-dependencias-de-referencia&#34;&gt;1. Versiones y dependencias de referencia&lt;a class=&#34;anchor&#34; href=&#34;#1-versiones-y-dependencias-de-referencia&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;gradleproperties&#34;&gt;gradle.properties&lt;a class=&#34;anchor&#34; href=&#34;#gradleproperties&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1e66f5&#34;&gt;gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;1.13.1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1e66f5&#34;&gt;ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;1.13.1-rc1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1e66f5&#34;&gt;kotlinVersion&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;2.2.20&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;corebuildgradlekts--dependencias-completas&#34;&gt;core/build.gradle.kts — dependencias completas&lt;a class=&#34;anchor&#34; href=&#34;#corebuildgradlekts--dependencias-completas&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;dependencies {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-box2d:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-freetype:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// fuentes TTF (opcional)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-app:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-graphics:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-assets:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-math:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-box2d:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    api(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;io.github.libktx:ktx-tiled:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$ktxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;androidbuildgradlekts--nativas-box2d-y-freetype&#34;&gt;android/build.gradle.kts — nativas Box2D y FreeType&lt;a class=&#34;anchor&#34; href=&#34;#androidbuildgradlekts--nativas-box2d-y-freetype&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;dependencies {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    implementation(project(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;:core&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Box2D nativas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-box2d-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-arm64-v8a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-box2d-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-armeabi-v7a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-box2d-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-x86&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-box2d-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-x86_64&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// FreeType nativas (si se usa gdx-freetype)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-freetype-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-arm64-v8a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-freetype-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-armeabi-v7a&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-freetype-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-x86&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    natives(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;com.badlogicgames.gdx:gdx-freetype-platform:&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;$gdxVersion&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;:natives-x86_64&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-ciclo-de-vida--resumen-visual&#34;&gt;2. Ciclo de vida — resumen visual&lt;a class=&#34;anchor&#34; href=&#34;#2-ciclo-de-vida--resumen-visual&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AndroidLauncher.onCreate()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        └─► initialize(MiJuego(), config)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        KtxGame.create()           ← inicializar batch, viewport, assets, primera pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ├─► resize(w, h)   ← justo después de create() y en cada cambio de tamaño&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   ┌─────────────────────────────────────────┐&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   │  BUCLE PRINCIPAL (~60 fps)              │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   │  render(delta)                          │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   │    ├── world.step(...)   [Box2D]        │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   │    ├── update entidades                 │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   │    └── draw()                           │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │   └─────────────────────────────────────────┘&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ├─► pause()        ← Home / llamada / bloqueo de pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                ├─► resume()       ← volver a la app&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                └─► dispose()      ← cerrar app (puede no ejecutarse si el SO mata el proceso)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       └── liberar: batch, assets, world, debugRenderer, particles, stage...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;métodos-del-ciclo-de-vida-de-ktxscreen&#34;&gt;Métodos del ciclo de vida de KtxScreen&lt;a class=&#34;anchor&#34; href=&#34;#m%c3%a9todos-del-ciclo-de-vida-de-ktxscreen&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Método&lt;/th&gt;&#xA;          &lt;th&gt;Se llama cuando&lt;/th&gt;&#xA;          &lt;th&gt;Acción típica&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;show()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;La pantalla se activa&lt;/td&gt;&#xA;          &lt;td&gt;Configurar InputProcessor, iniciar música&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;render(delta)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cada fotograma&lt;/td&gt;&#xA;          &lt;td&gt;update + draw&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;resize(w, h)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Cambio de tamaño&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;viewport.update(w, h, true)&lt;/code&gt;, &lt;code&gt;hud.resize(w, h)&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;pause()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Pérdida de foco&lt;/td&gt;&#xA;          &lt;td&gt;Pausar música&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;resume()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Recuperar foco&lt;/td&gt;&#xA;          &lt;td&gt;Reanudar música&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;hide()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;La pantalla se desactiva&lt;/td&gt;&#xA;          &lt;td&gt;(vacío en la mayoría de casos)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;dispose()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Liberación explícita&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;dispose()&lt;/code&gt; en todos los recursos propios de esta pantalla&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;3-renderizado--patrones-de-uso&#34;&gt;3. Renderizado — patrones de uso&lt;a class=&#34;anchor&#34; href=&#34;#3-renderizado--patrones-de-uso&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;spritebatch-con-ktx&#34;&gt;SpriteBatch con KTX&lt;a class=&#34;anchor&#34; href=&#34;#spritebatch-con-ktx&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Patrón recomendado: use {} garantiza que end() siempre se llama&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;batch.use { b &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    b.draw(textura, x, y, ancho, alto)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    b.draw(region, x, y, ancho, alto)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// TextureRegion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    fuente.draw(b, &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Texto&amp;#34;&lt;/span&gt;, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    particula.draw(b, delta)            &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ParticleEffect&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Sin KTX&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;batch.begin()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;batch.draw(textura, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;batch.end()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;shaperenderer&#34;&gt;ShapeRenderer&lt;a class=&#34;anchor&#34; href=&#34;#shaperenderer&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// IMPORTANTE: batch debe estar cerrado (end()) antes de abrir ShapeRenderer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;shapeRenderer.projectionMatrix = camera.combined&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Líneas (contornos, debug)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;shapeRenderer.begin(&lt;span style=&#34;color:#df8e1d&#34;&gt;ShapeRenderer&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;ShapeType&lt;/span&gt;.Line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;shapeRenderer.color = &lt;span style=&#34;color:#df8e1d&#34;&gt;Color&lt;/span&gt;.RED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;shapeRenderer.rect(x, y, w, h)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;shapeRenderer.circle(cx, cy, radio, &lt;span style=&#34;color:#fe640b&#34;&gt;32&lt;/span&gt;)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// 32 = segmentos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;shapeRenderer.line(x1, y1, x2, y2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;shapeRenderer.end()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Relleno&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;shapeRenderer.begin(&lt;span style=&#34;color:#df8e1d&#34;&gt;ShapeRenderer&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;ShapeType&lt;/span&gt;.Filled)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;shapeRenderer.setColor(r, g, b, a)    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// RGBA entre 0.0 y 1.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;shapeRenderer.rect(x, y, w, h)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;shapeRenderer.end()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;orthogonaltiledmaprenderer&#34;&gt;OrthogonalTiledMapRenderer&lt;a class=&#34;anchor&#34; href=&#34;#orthogonaltiledmaprenderer&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Crear con el mismo unitScale que el viewport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;renderer&lt;/span&gt; = OrthogonalTiledMapRenderer(tiledMap, unitScale, batch)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En render() — siempre DENTRO del mismo batch que el juego&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;5&lt;/span&gt;&lt;span&gt;renderer.setView(camera)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;6&lt;/span&gt;&lt;span&gt;renderer.render()                      &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// todas las capas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;7&lt;/span&gt;&lt;span&gt;renderer.render(intArrayOf(&lt;span style=&#34;color:#fe640b&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#fe640b&#34;&gt;1&lt;/span&gt;))      &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// solo capas 0 y 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;8&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;9&lt;/span&gt;&lt;span&gt;renderer.dispose()   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// dispose() al cerrar la pantalla&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;4-cámara-y-viewport--referencia-rápida&#34;&gt;4. Cámara y Viewport — referencia rápida&lt;a class=&#34;anchor&#34; href=&#34;#4-c%c3%a1mara-y-viewport--referencia-r%c3%a1pida&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Crear viewport (elegir uno)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;viewport&lt;/span&gt; = FitViewport(WORLD_W, WORLD_H)       &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// barras negras, misma área siempre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;viewport&lt;/span&gt; = ExtendViewport(WORLD_W, WORLD_H)    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// extiende el mundo, sin barras&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;viewport&lt;/span&gt; = ScreenViewport()                    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// 1:1 píxeles de pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// La cámara del viewport&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;camera&lt;/span&gt; = viewport.camera &lt;span style=&#34;color:#8839ef&#34;&gt;as&lt;/span&gt; OrthographicCamera&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;camera.setToOrtho(&lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;, WORLD_W, WORLD_H)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// false = Y crece hacia arriba&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En cada render()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;viewport.apply()           &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// aplica las bandas negras si procede&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;camera.update()            &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// recalcula la matriz de proyección&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;batch.projectionMatrix = camera.combined&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En resize()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;viewport.update(width, height, &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true = centrar cámara&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Seguir al jugador (con suavizado lerp)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;camera.position.x = &lt;span style=&#34;color:#df8e1d&#34;&gt;MathUtils&lt;/span&gt;.lerp(camera.position.x, target.x, &lt;span style=&#34;color:#fe640b&#34;&gt;5f&lt;/span&gt; * delta)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;camera.position.y = &lt;span style=&#34;color:#df8e1d&#34;&gt;MathUtils&lt;/span&gt;.lerp(camera.position.y, target.y, &lt;span style=&#34;color:#fe640b&#34;&gt;5f&lt;/span&gt; * delta)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Convertir toque de pantalla a coordenadas del mundo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;touchVec&lt;/span&gt; = Vector3(&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.x.toFloat(), &lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.y.toFloat(), &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;viewport.unproject(touchVec)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// modifica touchVec in-place&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Ahora: touchVec.x, touchVec.y = coordenadas del mundo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;5-assetmanager--carga-y-acceso&#34;&gt;5. AssetManager — carga y acceso&lt;a class=&#34;anchor&#34; href=&#34;#5-assetmanager--carga-y-acceso&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;assets&lt;/span&gt; = AssetManager()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Registrar loader de TiledMap (ANTES de encolar .tmx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;assets.setLoader(TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java, TmxMapLoader(InternalFileHandleResolver()))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Encolar assets para carga asíncrona&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;assets.load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;atlas/juego.atlas&amp;#34;&lt;/span&gt;,      TextureAtlas&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;assets.load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;mapas/nivel1.tmx&amp;#34;&lt;/span&gt;,       TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;assets.load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;audio/musica.ogg&amp;#34;&lt;/span&gt;,       Music&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;assets.load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;audio/salto.wav&amp;#34;&lt;/span&gt;,        Sound&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Carga asíncrona (en LoadingScreen.render())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (assets.update()) { &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;/* carga completa */&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;progreso&lt;/span&gt;: Float = assets.progress   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// 0.0 a 1.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Carga síncrona (bloquea)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;assets.finishLoading()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Acceso a assets ya cargados&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;atlas&lt;/span&gt;: TextureAtlas = assets.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;atlas/juego.atlas&amp;#34;&lt;/span&gt;, TextureAtlas&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;mapa&lt;/span&gt;:  TiledMap     = assets.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;mapas/nivel1.tmx&amp;#34;&lt;/span&gt;,  TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Liberación (libera TODOS los assets cargados)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;assets.dispose()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;6-textureatlas-y-animation&#34;&gt;6. TextureAtlas y Animation&lt;a class=&#34;anchor&#34; href=&#34;#6-textureatlas-y-animation&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Cargar atlas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;atlas&lt;/span&gt; = TextureAtlas(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;atlas/juego.atlas&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Acceso por nombre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;region&lt;/span&gt;:  TextureRegion              = atlas.findRegion(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;moneda&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;regiones&lt;/span&gt;: Array&amp;lt;&lt;span style=&#34;color:#df8e1d&#34;&gt;TextureAtlas&lt;/span&gt;.AtlasRegion&amp;gt; = atlas.findRegions(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;jugador_correr&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Crear animación&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;frames&lt;/span&gt; = atlas.findRegions(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;jugador_correr&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;animacion&lt;/span&gt; = Animation(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe640b&#34;&gt;0.1f&lt;/span&gt;,              &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// duración de cada fotograma en segundos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    *frames.toArray(), &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// spread operator para vararg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#df8e1d&#34;&gt;Animation&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;PlayMode&lt;/span&gt;.LOOP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Obtener fotograma actual en render()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;tiempoAnim &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;+=&lt;/span&gt; delta&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;fotograma&lt;/span&gt;: TextureRegion = animacion.getKeyFrame(tiempoAnim)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;batch.draw(fotograma, x, y, w, h)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Voltear sprite horizontalmente (sin crear nueva región)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;batch.draw(region, x + w, y, -w, h)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// x desplazado + ancho negativo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;7-entrada-del-usuario&#34;&gt;7. Entrada del usuario&lt;a class=&#34;anchor&#34; href=&#34;#7-entrada-del-usuario&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── Polling (consultar cada frame) ────────────────────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.isTouched                    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true mientras el dedo esté presionado&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.justTouched()                &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true solo el PRIMER fotograma del toque&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.x / &lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.y             &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// posición del toque en píxeles de pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.isKeyPressed(&lt;span style=&#34;color:#df8e1d&#34;&gt;Input&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;Keys&lt;/span&gt;.A)       &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// tecla mantenida&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.isKeyJustPressed(&lt;span style=&#34;color:#df8e1d&#34;&gt;Input&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;Keys&lt;/span&gt;.SPACE)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// tecla pulsada este fotograma&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.accelerometerX              &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// inclinación izquierda-derecha (-10..10)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.accelerometerY              &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// inclinación adelante-atrás&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── InputAdapter (eventos discretos) ─────────────────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.inputProcessor = &lt;span style=&#34;color:#8839ef&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#d20f39&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;InputAdapter&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;touchDown&lt;/span&gt;(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true = evento consumido&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;keyDown&lt;/span&gt;(keycode: Int): Boolean {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (keycode &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#df8e1d&#34;&gt;Input&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;Keys&lt;/span&gt;.BACK) { &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;/* botón atrás Android */&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── InputMultiplexer (varios receptores) ─────────────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;multiplexer&lt;/span&gt; = InputMultiplexer(stage, gameInput)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// stage tiene prioridad&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.inputProcessor = multiplexer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;8-audio&#34;&gt;8. Audio&lt;a class=&#34;anchor&#34; href=&#34;#8-audio&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── Sound: efectos cortos (&amp;lt; 5 s, cargados en memoria) ──────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;sfx&lt;/span&gt;: Sound = &lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.audio.newSound(&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.files.&lt;span style=&#34;color:#8839ef&#34;&gt;internal&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;audio/salto.wav&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// o via AssetManager:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;sfx&lt;/span&gt;: Sound = assets.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;audio/salto.wav&amp;#34;&lt;/span&gt;, Sound&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;id&lt;/span&gt;: Long = sfx.play(volume = &lt;span style=&#34;color:#fe640b&#34;&gt;1.0f&lt;/span&gt;)             &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// devuelve ID de instancia&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;sfx.play(volume = &lt;span style=&#34;color:#fe640b&#34;&gt;0.8f&lt;/span&gt;, pitch = &lt;span style=&#34;color:#fe640b&#34;&gt;1.2f&lt;/span&gt;, pan = &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// pitch: 0.5 (lento) a 2.0 (rápido)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;sfx.stop(id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;sfx.setLooping(id, &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;sfx.dispose()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── Music: pistas largas (streaming desde disco) ─────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;musica&lt;/span&gt;: Music = assets.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;audio/musica.ogg&amp;#34;&lt;/span&gt;, Music&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;musica.isLooping = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;musica.volume    = &lt;span style=&#34;color:#fe640b&#34;&gt;0.6f&lt;/span&gt;      &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// 0.0 a 1.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;musica.play()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;musica.pause()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;musica.stop()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;musica.isPlaying              &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Boolean&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// NO llamar dispose() si es gestionada por AssetManager&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;9-box2d--referencia-completa&#34;&gt;9. Box2D — referencia completa&lt;a class=&#34;anchor&#34; href=&#34;#9-box2d--referencia-completa&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;crear-el-world&#34;&gt;Crear el World&lt;a class=&#34;anchor&#34; href=&#34;#crear-el-world&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;world&lt;/span&gt; = World(Vector2(&lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;, -&lt;span style=&#34;color:#fe640b&#34;&gt;20f&lt;/span&gt;), &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// gravedad, dormir inactivos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;world.setContactListener(miListener)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Paso de simulación con tiempo fijo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;TIME&lt;/span&gt;_STEP = &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt; / &lt;span style=&#34;color:#fe640b&#34;&gt;60f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;accumulator&lt;/span&gt; = &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;step&lt;/span&gt;(delta: Float) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    accumulator &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;+=&lt;/span&gt; delta.coerceAtMost(&lt;span style=&#34;color:#fe640b&#34;&gt;0.25f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;while&lt;/span&gt; (accumulator &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;gt;=&lt;/span&gt; TIME_STEP) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;        world.step(TIME_STEP, &lt;span style=&#34;color:#fe640b&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#fe640b&#34;&gt;3&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;        accumulator &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;-=&lt;/span&gt; TIME_STEP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;world.dispose()  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// siempre en dispose()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;crear-cuerpos-con-ktx-box2d&#34;&gt;Crear cuerpos con KTX-Box2D&lt;a class=&#34;anchor&#34; href=&#34;#crear-cuerpos-con-ktx-box2d&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Cuerpo estático (plataforma)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;plataforma&lt;/span&gt;: Body = world.body {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    position.&lt;span style=&#34;color:#8839ef&#34;&gt;set&lt;/span&gt;(cx, cy)               &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// CENTRO del body&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// type = StaticBody por defecto en ktx-box2d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    box(halfWidth = w/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;, halfHeight = h/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;        friction    = &lt;span style=&#34;color:#fe640b&#34;&gt;0.6f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;        restitution = &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;        userData    = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;          &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// identificador en ContactListener&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Cuerpo dinámico (jugador)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;jugador&lt;/span&gt;: Body = world.body(&lt;span style=&#34;color:#df8e1d&#34;&gt;BodyDef&lt;/span&gt;.&lt;span style=&#34;color:#df8e1d&#34;&gt;BodyType&lt;/span&gt;.DynamicBody) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    position.&lt;span style=&#34;color:#8839ef&#34;&gt;set&lt;/span&gt;(spawnX, spawnY)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;    fixedRotation = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;               &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// evitar rotación al chocar con esquinas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Fixture principal del cuerpo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;    box(halfWidth = &lt;span style=&#34;color:#fe640b&#34;&gt;0.4f&lt;/span&gt;, halfHeight = &lt;span style=&#34;color:#fe640b&#34;&gt;0.55f&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;        density     = &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;        friction    = &lt;span style=&#34;color:#fe640b&#34;&gt;0.1f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;        restitution = &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;        userData    = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;jugador&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Sensor de pies (detecta suelo sin respuesta física)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;    box(halfWidth = &lt;span style=&#34;color:#fe640b&#34;&gt;0.35f&lt;/span&gt;, halfHeight = &lt;span style=&#34;color:#fe640b&#34;&gt;0.1f&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;        position   = Vector2(&lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;, -&lt;span style=&#34;color:#fe640b&#34;&gt;0.65f&lt;/span&gt;)) {  &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// justo debajo del cuerpo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;        isSensor = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;        userData = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;pies_jugador&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;30&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;31&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;32&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;33&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Sensor circular (moneda)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;34&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;moneda&lt;/span&gt;: Body = world.body {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;35&lt;/span&gt;&lt;span&gt;    position.&lt;span style=&#34;color:#8839ef&#34;&gt;set&lt;/span&gt;(x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;36&lt;/span&gt;&lt;span&gt;    circle(radius = &lt;span style=&#34;color:#fe640b&#34;&gt;0.3f&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;37&lt;/span&gt;&lt;span&gt;        isSensor = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;38&lt;/span&gt;&lt;span&gt;        userData = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;moneda&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;39&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;40&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;aplicar-movimiento-al-jugador-patrón-plataformas&#34;&gt;Aplicar movimiento al jugador (patrón plataformas)&lt;a class=&#34;anchor&#34; href=&#34;#aplicar-movimiento-al-jugador-patr%c3%b3n-plataformas&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Movimiento horizontal: impulso para respuesta inmediata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;moverHorizontal&lt;/span&gt;(body: Body, direccion: Float, velocidadMax: Float) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;velActual&lt;/span&gt;  = body.linearVelocity.x&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;velDeseada&lt;/span&gt; = direccion * velocidadMax&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;impulso&lt;/span&gt;    = body.mass * (velDeseada - velActual)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    body.applyLinearImpulse(impulso, &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;        body.worldCenter.x, body.worldCenter.y, wake = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Salto: impulso vertical instantáneo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;saltar&lt;/span&gt;(body: Body, fuerzaSalto: Float) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;impulso&lt;/span&gt; = body.mass * fuerzaSalto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    body.applyLinearImpulse(&lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;, impulso,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;        body.worldCenter.x, body.worldCenter.y, wake = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Limitar velocidad vertical máxima (evitar velocidades infinitas en caída)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;maxCaida&lt;/span&gt; = -&lt;span style=&#34;color:#fe640b&#34;&gt;20f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (body.linearVelocity.y &amp;lt; maxCaida) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;    body.setLinearVelocity(body.linearVelocity.x, maxCaida)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;contactlistener&#34;&gt;ContactListener&lt;a class=&#34;anchor&#34; href=&#34;#contactlistener&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;world.setContactListener(&lt;span style=&#34;color:#8839ef&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#d20f39&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;ContactListener&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;beginContact&lt;/span&gt;(contact: Contact) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;datA&lt;/span&gt; = contact.fixtureA.userData &lt;span style=&#34;color:#8839ef&#34;&gt;as&lt;/span&gt;? String&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;datB&lt;/span&gt; = contact.fixtureB.userData &lt;span style=&#34;color:#8839ef&#34;&gt;as&lt;/span&gt;? String&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ¿Pies del jugador tocan suelo?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;piesEnSuelo&lt;/span&gt; = (datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;pies_jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;||&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;                          (datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;pies_jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (piesEnSuelo) jugadorEnSuelo = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ¿Jugador recoge moneda?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;moneda&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;            accionesPendientes &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;+=&lt;/span&gt; { world.destroyBody(contact.fixtureB.body) }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;moneda&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;            accionesPendientes &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;+=&lt;/span&gt; { world.destroyBody(contact.fixtureA.body) }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;endContact&lt;/span&gt;(contact: Contact) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;datA&lt;/span&gt; = contact.fixtureA.userData &lt;span style=&#34;color:#8839ef&#34;&gt;as&lt;/span&gt;? String&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;datB&lt;/span&gt; = contact.fixtureB.userData &lt;span style=&#34;color:#8839ef&#34;&gt;as&lt;/span&gt;? String&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; ((datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;pies_jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;||&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;            (datB &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;pies_jugador&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; datA &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;            jugadorEnSuelo = &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// OBLIGATORIOS aunque estén vacíos:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;preSolve&lt;/span&gt;(contact: Contact, oldManifold: Manifold) {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;postSolve&lt;/span&gt;(contact: Contact, impulse: ContactImpulse) {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;30&lt;/span&gt;&lt;span&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;31&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;32&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Ejecutar acciones diferidas DESPUÉS de world.step()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;33&lt;/span&gt;&lt;span&gt;accionesPendientes.forEach { &lt;span style=&#34;color:#8839ef&#34;&gt;it&lt;/span&gt;() }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;34&lt;/span&gt;&lt;span&gt;accionesPendientes.clear()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;box2ddebugrenderer&#34;&gt;Box2DDebugRenderer&lt;a class=&#34;anchor&#34; href=&#34;#box2ddebugrenderer&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;debugRenderer&lt;/span&gt; = Box2DDebugRenderer()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En render(), después de dibujar el juego&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;if&lt;/span&gt; (modoDebug) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;5&lt;/span&gt;&lt;span&gt;    debugRenderer.render(world, camera.combined)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;6&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;7&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;8&lt;/span&gt;&lt;span&gt;debugRenderer.dispose()   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// en dispose()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;10-tiledmap--referencia-rápida&#34;&gt;10. TiledMap — referencia rápida&lt;a class=&#34;anchor&#34; href=&#34;#10-tiledmap--referencia-r%c3%a1pida&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;cargar-mapa&#34;&gt;Cargar mapa&lt;a class=&#34;anchor&#34; href=&#34;#cargar-mapa&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Con AssetManager (recomendado)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;assets.setLoader(TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java, TmxMapLoader(InternalFileHandleResolver()))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;assets.load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;mapas/nivel1.tmx&amp;#34;&lt;/span&gt;, TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;map&lt;/span&gt;: TiledMap = assets.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;mapas/nivel1.tmx&amp;#34;&lt;/span&gt;, TiledMap&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Sin AssetManager&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;map&lt;/span&gt;: TiledMap = TmxMapLoader().load(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;mapas/nivel1.tmx&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;renderizar-mapa&#34;&gt;Renderizar mapa&lt;a class=&#34;anchor&#34; href=&#34;#renderizar-mapa&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// El unitScale debe ser 1f / tamañoTileEnPíxeles&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;renderer&lt;/span&gt; = OrthogonalTiledMapRenderer(map, &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt; / &lt;span style=&#34;color:#fe640b&#34;&gt;32f&lt;/span&gt;, batch)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En render()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;5&lt;/span&gt;&lt;span&gt;renderer.setView(camera)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;6&lt;/span&gt;&lt;span&gt;renderer.render()                      &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// todas las capas visibles&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;7&lt;/span&gt;&lt;span&gt;renderer.render(intArrayOf(&lt;span style=&#34;color:#fe640b&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#fe640b&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#fe640b&#34;&gt;3&lt;/span&gt;))   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// capas específicas por índice&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;8&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;9&lt;/span&gt;&lt;span&gt;renderer.dispose()   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// dispose() en la pantalla, NO en el mapa (el mapa lo gestiona AssetManager)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;extraer-objetos-y-crear-bodies-box2d&#34;&gt;Extraer objetos y crear bodies Box2D&lt;a class=&#34;anchor&#34; href=&#34;#extraer-objetos-y-crear-bodies-box2d&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;unitScale&lt;/span&gt; = &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt; / &lt;span style=&#34;color:#fe640b&#34;&gt;32f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Capa de rectángulos → bodies estáticos de suelo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;capaColisiones&lt;/span&gt; = map.layers.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;colisiones&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;for&lt;/span&gt; (obj &lt;span style=&#34;color:#8839ef&#34;&gt;in&lt;/span&gt; capaColisiones.objects.getByType(RectangleMapObject&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;r&lt;/span&gt; = obj.rectangle&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;x&lt;/span&gt; = r.x * unitScale;  &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;y&lt;/span&gt; = r.y * unitScale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;w&lt;/span&gt; = r.width * unitScale;  &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;h&lt;/span&gt; = r.height * unitScale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;    world.body {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;        position.&lt;span style=&#34;color:#8839ef&#34;&gt;set&lt;/span&gt;(x + w/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;, y + h/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;        box(halfWidth = w/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;, halfHeight = h/&lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;            friction = &lt;span style=&#34;color:#fe640b&#34;&gt;0.6f&lt;/span&gt;; userData = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;suelo&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Extraer posiciones de entidades por nombre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;capaEntidades&lt;/span&gt; = map.layers.&lt;span style=&#34;color:#8839ef&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;entidades&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;capaEntidades.objects.getByType(RectangleMapObject&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt;.java)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;    .filter { &lt;span style=&#34;color:#8839ef&#34;&gt;it&lt;/span&gt;.name &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;moneda&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;    .map    { Vector2(&lt;span style=&#34;color:#8839ef&#34;&gt;it&lt;/span&gt;.rectangle.x * unitScale, &lt;span style=&#34;color:#8839ef&#34;&gt;it&lt;/span&gt;.rectangle.y * unitScale) }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;    .forEach { pos &lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; crearMoneda(pos) }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;propiedades-personalizadas-con-ktx-tiled&#34;&gt;Propiedades personalizadas (con ktx-tiled)&lt;a class=&#34;anchor&#34; href=&#34;#propiedades-personalizadas-con-ktx-tiled&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En un objeto de la capa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;velocidad&lt;/span&gt;: Float  = objeto.&lt;span style=&#34;color:#8839ef&#34;&gt;property&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;velocidad&amp;#34;&lt;/span&gt;, defaultValue = &lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;esDanino&lt;/span&gt;: Boolean = objeto.&lt;span style=&#34;color:#8839ef&#34;&gt;property&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;danino&amp;#34;&lt;/span&gt;,    defaultValue = &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;tipo&lt;/span&gt;: String      = objeto.&lt;span style=&#34;color:#8839ef&#34;&gt;property&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;tipo&amp;#34;&lt;/span&gt;,      defaultValue = &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;normal&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;11-partículas--referencia-rápida&#34;&gt;11. Partículas — referencia rápida&lt;a class=&#34;anchor&#34; href=&#34;#11-part%c3%adculas--referencia-r%c3%a1pida&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Cargar efecto (en create() o show(), no en render())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;efecto&lt;/span&gt; = ParticleEffect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;efecto.load(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.files.&lt;span style=&#34;color:#8839ef&#34;&gt;internal&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;particles/polvo_salto.p&amp;#34;&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.files.&lt;span style=&#34;color:#8839ef&#34;&gt;internal&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;particles&amp;#34;&lt;/span&gt;)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// carpeta de la imagen de partícula&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;efecto.scaleEffect(&lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt; / &lt;span style=&#34;color:#fe640b&#34;&gt;32f&lt;/span&gt;)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ajustar escala al mundo del juego&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Posicionar y activar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;efecto.setPosition(x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;efecto.start()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En render(), DENTRO de batch.use {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;efecto.draw(batch, delta)   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// actualiza Y dibuja en un solo paso&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Estado&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;efecto.isComplete    &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true cuando todas las partículas han muerto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;efecto.isStarted     &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// true si está activo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;efecto.reset()       &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// reiniciar para reutilizar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;efecto.dispose()     &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// en dispose() de la pantalla&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;12-fuentes--bitmapfont-y-freetype&#34;&gt;12. Fuentes — BitmapFont y FreeType&lt;a class=&#34;anchor&#34; href=&#34;#12-fuentes--bitmapfont-y-freetype&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── BitmapFont (fuente por defecto incluida en LibGDX) ───────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;fuente&lt;/span&gt; = BitmapFont()           &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Arial 15px&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;fuente.color = &lt;span style=&#34;color:#df8e1d&#34;&gt;Color&lt;/span&gt;.WHITE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;fuente.&lt;span style=&#34;color:#8839ef&#34;&gt;data&lt;/span&gt;.setScale(&lt;span style=&#34;color:#fe640b&#34;&gt;1.5f&lt;/span&gt;)         &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// escala (permanente; resetear después si es necesario)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Dentro de batch.use {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;fuente.draw(batch, &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Texto&amp;#34;&lt;/span&gt;, x, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// GlyphLayout: para medir dimensiones antes de dibujar (centrar texto)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;layout&lt;/span&gt; = GlyphLayout(fuente, &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;¡GAME OVER!&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;textX&lt;/span&gt;  = (WORLD_W - layout.width) / &lt;span style=&#34;color:#fe640b&#34;&gt;2f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;fuente.draw(batch, layout, textX, y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;fuente.dispose()   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// en dispose()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// ── FreeType (fuentes TTF personalizadas) ────────────────────────────────&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;generator&lt;/span&gt; = FreeTypeFontGenerator(&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.files.&lt;span style=&#34;color:#8839ef&#34;&gt;internal&lt;/span&gt;(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;fuentes/roboto.ttf&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;params&lt;/span&gt; = &lt;span style=&#34;color:#df8e1d&#34;&gt;FreeTypeFontGenerator&lt;/span&gt;.FreeTypeFontParameter().apply {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;    size        = &lt;span style=&#34;color:#fe640b&#34;&gt;32&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;    color       = &lt;span style=&#34;color:#df8e1d&#34;&gt;Color&lt;/span&gt;.WHITE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;    borderWidth = &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;    borderColor = &lt;span style=&#34;color:#df8e1d&#34;&gt;Color&lt;/span&gt;.BLACK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;    characters  = &lt;span style=&#34;color:#df8e1d&#34;&gt;FreeTypeFontGenerator&lt;/span&gt;.DEFAULT_CHARS + &lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;áéíóúÁÉÍÓÚñÑ¡¿&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;fuenteTTF&lt;/span&gt;: BitmapFont = generator.generateFont(params)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;generator.dispose()     &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// liberar el generador (la fuente resultante sigue siendo válida)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// fuenteTTF.dispose() en dispose() de la pantalla&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;13-scene2d--stage-y-table-para-hud&#34;&gt;13. Scene2D — Stage y Table para HUD&lt;a class=&#34;anchor&#34; href=&#34;#13-scene2d--stage-y-table-para-hud&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Stage con viewport propio (independiente de la cámara del juego)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;stage&lt;/span&gt; = Stage(ScreenViewport(), batch)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Conectar al InputMultiplexer si se necesita entrada en el HUD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#df8e1d&#34;&gt;Gdx&lt;/span&gt;.input.inputProcessor = InputMultiplexer(stage, gameInput)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Table: layout declarativo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;tabla&lt;/span&gt; = Table()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;tabla.top().setFillParent(&lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)     &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// anclar al borde superior, tamaño de pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;estilo&lt;/span&gt; = &lt;span style=&#34;color:#df8e1d&#34;&gt;Label&lt;/span&gt;.LabelStyle(fuente, &lt;span style=&#34;color:#df8e1d&#34;&gt;Color&lt;/span&gt;.WHITE)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;labelMonedas&lt;/span&gt; = Label(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Monedas: 0&amp;#34;&lt;/span&gt;, estilo)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;labelVidas&lt;/span&gt;   = Label(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Vidas: 3&amp;#34;&lt;/span&gt;,   estilo)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;tabla.add(labelMonedas).expandX().left().pad(&lt;span style=&#34;color:#fe640b&#34;&gt;10f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;tabla.add(labelVidas).expandX().right().pad(&lt;span style=&#34;color:#fe640b&#34;&gt;10f&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;stage.addActor(tabla)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// Actualizar texto de las etiquetas&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;labelMonedas.setText(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Monedas: &lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;${game.monedasRecogidas}&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En render() — DESPUÉS de dibujar el juego&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;stage.act(delta)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;stage.draw()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// En resize()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;stage.viewport.update(width, height, &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;30&lt;/span&gt;&lt;span&gt;stage.dispose()   &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// en dispose()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;14-launcher-android--androidmanifestxml&#34;&gt;14. Launcher Android — AndroidManifest.xml&lt;a class=&#34;anchor&#34; href=&#34;#14-launcher-android--androidmanifestxml&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;XML&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;&amp;lt;!-- AndroidManifest.xml --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;manifest&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;xmlns:android=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;application&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#1e66f5&#34;&gt;android:icon=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;@drawable/ic_launcher&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#1e66f5&#34;&gt;android:label=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;@string/app_name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;activity&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;.android.AndroidLauncher&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1e66f5&#34;&gt;android:label=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;@string/app_name&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1e66f5&#34;&gt;android:screenOrientation=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;landscape&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1e66f5&#34;&gt;android:configChanges=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#1e66f5&#34;&gt;android:exported=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;action&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.intent.action.MAIN&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;category&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;android:name=&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;android.intent.category.LAUNCHER&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;/application&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// AndroidLauncher.kt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#df8e1d&#34;&gt;AndroidLauncher&lt;/span&gt; : AndroidApplication() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;onCreate&lt;/span&gt;(savedInstanceState: Bundle?) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;super&lt;/span&gt;.onCreate(savedInstanceState)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;config&lt;/span&gt; = AndroidApplicationConfiguration().apply {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;            useAccelerometer = &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;            useCompass       = &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;            useGyroscope     = &lt;span style=&#34;color:#8839ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;            useWakelock      = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;          &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// evitar apagado de pantalla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;            useImmersiveMode = &lt;span style=&#34;color:#8839ef&#34;&gt;true&lt;/span&gt;          &lt;span style=&#34;color:#9ca0b0;font-style:italic&#34;&gt;// pantalla completa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;        initialize(KotlinPlatformGame(), config)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;15-tabla-de-errores-comunes-y-soluciones&#34;&gt;15. Tabla de errores comunes y soluciones&lt;a class=&#34;anchor&#34; href=&#34;#15-tabla-de-errores-comunes-y-soluciones&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Error&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Causa&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Solución&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;OpenGLException&lt;/code&gt; al arrancar&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;Texture&lt;/code&gt; / &lt;code&gt;SpriteBatch&lt;/code&gt; creados antes de &lt;code&gt;create()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Moverlos al cuerpo de &lt;code&gt;create()&lt;/code&gt; o usar &lt;code&gt;lateinit&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;IllegalStateException: called begin()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;begin()&lt;/code&gt; sin &lt;code&gt;end()&lt;/code&gt; anterior, o SpriteBatch + ShapeRenderer activos a la vez&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Asegurarse de que cada &lt;code&gt;begin()&lt;/code&gt; tiene su &lt;code&gt;end()&lt;/code&gt; antes del siguiente&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Jugador rota al golpear esquinas&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;fixedRotation = false&lt;/code&gt; (valor por defecto)&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Poner &lt;code&gt;fixedRotation = true&lt;/code&gt; en el BodyDef del jugador&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Sensor de pies nunca detecta suelo&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;La fixture sensor tiene el mismo &lt;code&gt;userData&lt;/code&gt; que la principal&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Asignar &lt;code&gt;userData = &amp;quot;pies_jugador&amp;quot;&lt;/code&gt; solo al sensor, &lt;code&gt;&amp;quot;jugador&amp;quot;&lt;/code&gt; al cuerpo&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Crash &lt;code&gt;Box2D: assertion&lt;/code&gt; al destruir body&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;destroyBody()&lt;/code&gt; llamado dentro de &lt;code&gt;ContactListener&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Encolar la destrucción en una lista; ejecutar después de &lt;code&gt;world.step()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Mapa y bodies Box2D con escala diferente&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;unitScale&lt;/code&gt; distinto en &lt;code&gt;MapLoader&lt;/code&gt; y &lt;code&gt;OrthogonalTiledMapRenderer&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Usar la misma constante &lt;code&gt;UNIT_SCALE = 1f / 32f&lt;/code&gt; en ambos&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Mapa no se ve / pantalla negra&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;mapRenderer.setView(camera)&lt;/code&gt; no llamado antes de &lt;code&gt;render()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Llamar a &lt;code&gt;setView()&lt;/code&gt; en cada fotograma&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;El atlas no carga&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;El archivo &lt;code&gt;.atlas&lt;/code&gt; o &lt;code&gt;.png&lt;/code&gt; no está en &lt;code&gt;android/assets/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Verificar ruta y copiar ambos archivos al directorio correcto&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Fugas de memoria en GPU&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Assets no liberados con &lt;code&gt;dispose()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Revisar que todos los &lt;code&gt;Texture&lt;/code&gt;, &lt;code&gt;SpriteBatch&lt;/code&gt;, &lt;code&gt;ShapeRenderer&lt;/code&gt;, &lt;code&gt;Sound&lt;/code&gt;, &lt;code&gt;TiledMap&lt;/code&gt; y &lt;code&gt;ParticleEffect&lt;/code&gt; tienen su &lt;code&gt;dispose()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Movimiento dependiente de framerate&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Velocidades fijas sin multiplicar por &lt;code&gt;delta&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Siempre: &lt;code&gt;posicion += velocidad * delta&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Coordenadas de toque incorrectas&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Usar &lt;code&gt;Gdx.input.x/y&lt;/code&gt; directamente sin &lt;code&gt;unproject&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;viewport.unproject(Vector3(x.toFloat(), y.toFloat(), 0f))&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Partículas demasiado grandes&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ParticleEffect&lt;/code&gt; creado en píxeles; mundo en unidades&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;efecto.scaleEffect(1f / 32f)&lt;/code&gt; después de cargar&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Música no se pausa al minimizar&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;pause()&lt;/code&gt; de Screen no gestiona la música&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Sobreescribir &lt;code&gt;pause()&lt;/code&gt; y llamar a &lt;code&gt;musica.pause()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;16-checklist-de-entrega-del-proyecto&#34;&gt;16. Checklist de entrega del proyecto&lt;a class=&#34;anchor&#34; href=&#34;#16-checklist-de-entrega-del-proyecto&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Antes de presentar el proyecto, verificar que:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 1C. Interfaz de usuario avanzada en Compose</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1c_UI_Avanzada/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1c_UI_Avanzada/</guid>
      <description>&lt;h1 id=&#34;tema-1c-interfaz-de-usuario-avanzada-en-compose&#34;&gt;Tema 1C. Interfaz de usuario avanzada en Compose&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 4 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-b&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado las tecnologías de desarrollo de aplicaciones para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado configuraciones que clasifican los dispositivos móviles en base a sus características.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado modificaciones sobre aplicaciones existentes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado emuladores para comprobar el funcionamiento de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-ecosistema-android-y-limitaciones-del-dispositivo-móvil&#34;&gt;1. Ecosistema Android y limitaciones del dispositivo móvil&lt;a class=&#34;anchor&#34; href=&#34;#1-ecosistema-android-y-limitaciones-del-dispositivo-m%c3%b3vil&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Antes de profundizar en la UI, es importante entender el entorno en el que se ejecutan las aplicaciones Android y las restricciones que impone.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 6. Integración Room &#43; Retrofit2: Arquitectura offline-first</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B3/B3-T6_Integracion_OfflineFirst/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B3/B3-T6_Integracion_OfflineFirst/</guid>
      <description>&lt;h1 id=&#34;tema-6-integración-room--retrofit2-arquitectura-offline-first&#34;&gt;Tema 6. Integración Room + Retrofit2: Arquitectura offline-first&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B3 — Persistencia y comunicación: ROOM + Retrofit2&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 10 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha generado la estructura de clases necesaria para la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado las técnicas de acceso a servicios de comunicación en red disponibles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han almacenado y recuperado datos utilizando algún mecanismo de persistencia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado pruebas de interacción usuario-aplicación para optimizar las aplicaciones desarrolladas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA2-i&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han documentado los procesos necesarios para el desarrollo de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para la conversión de datos multimedia de un formato a otro.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para procesar datos multimedia.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado clases para el control de eventos, tipos de media y excepciones, entre otros.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA3-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han depurado y documentado los programas desarrollados.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-el-problema-de-combinar-dos-fuentes-de-datos&#34;&gt;1. El problema de combinar dos fuentes de datos&lt;a class=&#34;anchor&#34; href=&#34;#1-el-problema-de-combinar-dos-fuentes-de-datos&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;En T4 la app guardaba películas en Room. En T5 se consumió la API de TMDB. Ahora hay que resolver la pregunta más importante de la capa de datos: &lt;strong&gt;¿cuándo mostramos datos locales y cuándo datos de la red? ¿Qué pasa si no hay conexión?&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 4. Referencia: Room avanzado, migraciones, testing y API Key segura</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B3/B3-A4_Referencia_Room_Retrofit/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B3/B3-A4_Referencia_Room_Retrofit/</guid>
      <description>&lt;h1 id=&#34;anexo-4-referencia-room-avanzado-migraciones-testing-y-api-key-segura&#34;&gt;Anexo 4. Referencia: Room avanzado, migraciones, testing y API Key segura&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B3 — Persistencia y comunicación: ROOM + Retrofit2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA2 — Desarrolla aplicaciones para dispositivos móviles analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;li&gt;RA3 — Desarrolla programas que integran contenidos multimedia analizando y empleando las tecnologías y librerías específicas.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-almacenar-la-api-key-de-forma-segura&#34;&gt;1. Almacenar la API Key de forma segura&lt;a class=&#34;anchor&#34; href=&#34;#1-almacenar-la-api-key-de-forma-segura&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;La API Key de &lt;a href=&#34;https://www.themoviedb.org/documentation/api&#34;&gt;TMDB&lt;/a&gt; nunca debe aparecer directamente en el código fuente ni subirse a un repositorio de control de versiones. El método estándar en Android es almacenarla en &lt;code&gt;local.properties&lt;/code&gt; y acceder a ella a través de &lt;code&gt;BuildConfig&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tema 1D. Intents, permisos y entorno Android</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1d_Intents_Permisos/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-T1d_Intents_Permisos/</guid>
      <description>&lt;h1 id=&#34;tema-1d-intents-permisos-y-entorno-android&#34;&gt;Tema 1D. Intents, permisos y entorno Android&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del tema&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Duración aproximada:&lt;/strong&gt; 4 horas&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-2&#34;  /&gt;&lt;label for=&#34;tabs-0-2&#34;&gt;Criterios de Evaluación&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: center&#34;&gt;Código&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Criterio&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-a&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han analizado las limitaciones que plantea la ejecución de aplicaciones en los dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-c&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han instalado, configurado y utilizado entornos de trabajo para el desarrollo de aplicaciones para dispositivos móviles.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-d&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han identificado configuraciones que clasifican los dispositivos móviles en base a sus características.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-e&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han descrito perfiles que establecen la relación entre el dispositivo y la aplicación.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-f&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se ha analizado la estructura de aplicaciones existentes para dispositivos móviles identificando las clases utilizadas.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-g&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han realizado modificaciones sobre aplicaciones existentes.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: center&#34;&gt;RA1-h&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Se han utilizado emuladores para comprobar el funcionamiento de las aplicaciones.&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-el-ciclo-de-vida-de-una-activity&#34;&gt;1. El ciclo de vida de una Activity&lt;a class=&#34;anchor&#34; href=&#34;#1-el-ciclo-de-vida-de-una-activity&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Antes de estudiar los Intents, es esencial comprender el ciclo de vida de una &lt;code&gt;Activity&lt;/code&gt;, porque determina cuándo se crean, pausan, reanudan y destruyen las pantallas de una app.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 1. Kotlin — Referencia Completa</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-A1_Kotlin_Referencia_Anexo/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-A1_Kotlin_Referencia_Anexo/</guid>
      <description>&lt;h1 id=&#34;anexo-1-kotlin-para-android&#34;&gt;Anexo 1. Kotlin para Android&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;sobre-este-anexo&#34;&gt;Sobre este anexo&lt;a class=&#34;anchor&#34; href=&#34;#sobre-este-anexo&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Este documento es una referencia completa del lenguaje Kotlin orientada al desarrollo Android. Su objetivo es doble: servir como material de consulta durante el curso cuando necesites recordar la sintaxis o el comportamiento de un elemento del lenguaje, y como recurso de profundización para quien quiera ir más allá del repaso acelerado.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anexo 2. Remember en Jetpack Compose</title>
      <link>https://documentation.javiercarrasco.es/pmdm/B1/B1-A2_Remembers/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/pmdm/B1/B1-A2_Remembers/</guid>
      <description>&lt;h1 id=&#34;anexo-2-funciones-remember-en-jetpack-compose&#34;&gt;Anexo 2: Funciones &lt;code&gt;remember&lt;/code&gt; en Jetpack Compose&lt;/h1&gt;&#xA;&lt;div class=&#34;book-tabs&#34;&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-0&#34; checked=&#34;checked&#34; /&gt;&lt;label for=&#34;tabs-0-0&#34;&gt;Información del anexo&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Anexo de apoyo — material de consulta y profundización&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bloque:&lt;/strong&gt; B1 — Fundamentos: Kotlin, Compose y entorno Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;input type=&#34;radio&#34; class=&#34;toggle&#34; name=&#34;tabs-0&#34; id=&#34;tabs-0-1&#34;  /&gt;&lt;label for=&#34;tabs-0-1&#34;&gt;Resultados de Aprendizaje&lt;/label&gt;&lt;div class=&#34;book-tabs-content markdown-inner&#34;&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RA1 — Aplica tecnologías de desarrollo para dispositivos móviles evaluando sus características y capacidades.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-básicos-de-estado&#34;&gt;1. Básicos de estado&lt;a class=&#34;anchor&#34; href=&#34;#1-b%c3%a1sicos-de-estado&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;remember {…}&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Guarda el estado &lt;strong&gt;en recomposición&lt;/strong&gt; mientras el &lt;em&gt;composable&lt;/em&gt; esté en el árbol.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val count = remember { mutableStateOf(0) }&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberSaveable {…}&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Igual que &lt;code&gt;remember&lt;/code&gt;, pero &lt;strong&gt;persiste en recreaciones&lt;/strong&gt; de actividad (rotación, proceso).&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val count = rememberSaveable { mutableStateOf(0) }&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-corutinas-y-lambdas&#34;&gt;2. Corutinas y lambdas&lt;a class=&#34;anchor&#34; href=&#34;#2-corutinas-y-lambdas&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberCoroutineScope()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Devuelve un &lt;code&gt;CoroutineScope&lt;/code&gt; ligado al ciclo de vida del &lt;em&gt;composable&lt;/em&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val scope = rememberCoroutineScope()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberUpdatedState(value)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Mantiene siempre la &lt;strong&gt;última versión de un valor&lt;/strong&gt; dentro de efectos (&lt;code&gt;LaunchedEffect&lt;/code&gt;, etc.).&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val onClick by rememberUpdatedState(newValue = action)&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;3-animaciones&#34;&gt;3. Animaciones&lt;a class=&#34;anchor&#34; href=&#34;#3-animaciones&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberInfiniteTransition()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Animaciones que se repiten indefinidamente.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val alpha by infinite.animateFloat(... )&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberTransition(state)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Transiciones entre &lt;strong&gt;estados definidos&lt;/strong&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val transition = updateTransition(targetState, label=&amp;quot;&amp;quot;)&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberSplineBasedDecay()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Animación tipo &lt;strong&gt;fling&lt;/strong&gt; con decaimiento.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val decay = rememberSplineBasedDecay&amp;lt;Float&amp;gt;()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;4-scroll-y-listas&#34;&gt;4. Scroll y listas&lt;a class=&#34;anchor&#34; href=&#34;#4-scroll-y-listas&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberScrollState()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Guarda la posición de &lt;em&gt;scroll&lt;/em&gt; en &lt;code&gt;Column&lt;/code&gt; / &lt;code&gt;Row&lt;/code&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val scroll = rememberScrollState()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberLazyListState()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Guarda el estado de &lt;em&gt;scroll&lt;/em&gt; en &lt;code&gt;LazyColumn&lt;/code&gt;/&lt;code&gt;LazyRow&lt;/code&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val listState = rememberLazyListState()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberLazyGridState()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Estado de &lt;em&gt;scroll&lt;/em&gt; en &lt;code&gt;LazyVerticalGrid&lt;/code&gt; o &lt;code&gt;LazyHorizontalGrid&lt;/code&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val gridState = rememberLazyGridState()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberPagerState()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Estado de un &lt;em&gt;pager&lt;/em&gt; (&lt;code&gt;HorizontalPager&lt;/code&gt; / &lt;code&gt;VerticalPager&lt;/code&gt;).&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val pagerState = rememberPagerState()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;5-gestos-e-interacción&#34;&gt;5. Gestos e interacción&lt;a class=&#34;anchor&#34; href=&#34;#5-gestos-e-interacci%c3%b3n&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberDraggableState(onDelta)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Controla los desplazamientos en gestos de arrastre.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val dragState = rememberDraggableState { delta -&amp;gt; … }&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberSwipeableState(initialValue)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Estado de un componente deslizable (ej: &lt;code&gt;BottomSheet&lt;/code&gt;).&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val sheetState = rememberSwipeableState(0)&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberPullRefreshState(refreshing, onRefresh)&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Estado para &lt;strong&gt;pull-to-refresh&lt;/strong&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val refreshState = rememberPullRefreshState(refreshing, { … })&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberNestedScrollInteropConnection()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Conexión de &lt;em&gt;scroll&lt;/em&gt; con vistas clásicas Android.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val connection = rememberNestedScrollInteropConnection()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;6-otros-especializados&#34;&gt;6. Otros especializados&lt;a class=&#34;anchor&#34; href=&#34;#6-otros-especializados&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Función&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Descripción&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Ejemplo rápido&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberSystemUiController()&lt;/code&gt; &lt;em&gt;(Accompanist)&lt;/em&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Controla &lt;em&gt;status bar&lt;/em&gt; y &lt;em&gt;nav bar&lt;/em&gt;.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val controller = rememberSystemUiController()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberInsetsPaddingValues()&lt;/code&gt; &lt;em&gt;(Accompanist, deprecated)&lt;/em&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;em&gt;Padding&lt;/em&gt; según insets del sistema.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val padding = rememberInsetsPaddingValues()&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberHapticFeedback()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Acceso al motor de vibración/háptica.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val haptic = LocalHapticFeedback.current&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;rememberClipboardManager()&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Acceso al portapapeles del sistema.&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;val clipboard = LocalClipboardManager.current&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;ejemplo-práctico-integrando-varios-remember&#34;&gt;Ejemplo práctico integrando varios &lt;code&gt;remember&lt;/code&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ejemplo-pr%c3%a1ctico-integrando-varios-remember&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34; title=&#34;Kotlin&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#4c4f69;background-color:#eff1f5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-kotlin&#34; data-lang=&#34;kotlin&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#1e66f5;font-weight:bold&#34;&gt;@Composable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#8839ef&#34;&gt;fun&lt;/span&gt; &lt;span style=&#34;color:#1e66f5&#34;&gt;DemoRememberScreen&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;count&lt;/span&gt; = rememberSaveable { mutableStateOf(&lt;span style=&#34;color:#fe640b&#34;&gt;0&lt;/span&gt;) }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;scrollState&lt;/span&gt; = rememberScrollState()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;scope&lt;/span&gt; = rememberCoroutineScope()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;transition&lt;/span&gt; = rememberInfiniteTransition()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#8839ef&#34;&gt;val&lt;/span&gt; &lt;span style=&#34;color:#fe640b&#34;&gt;alpha&lt;/span&gt; &lt;span style=&#34;color:#8839ef&#34;&gt;by&lt;/span&gt; transition.animateFloat(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt; 9&lt;/span&gt;&lt;span&gt;        initialValue = &lt;span style=&#34;color:#fe640b&#34;&gt;0f&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;10&lt;/span&gt;&lt;span&gt;        targetValue = &lt;span style=&#34;color:#fe640b&#34;&gt;1f&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;11&lt;/span&gt;&lt;span&gt;        animationSpec = infiniteRepeatable(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;12&lt;/span&gt;&lt;span&gt;            animation = tween(&lt;span style=&#34;color:#fe640b&#34;&gt;1000&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;13&lt;/span&gt;&lt;span&gt;            repeatMode = &lt;span style=&#34;color:#df8e1d&#34;&gt;RepeatMode&lt;/span&gt;.Reverse&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;14&lt;/span&gt;&lt;span&gt;        )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;15&lt;/span&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;16&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;17&lt;/span&gt;&lt;span&gt;    Column(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;18&lt;/span&gt;&lt;span&gt;        modifier = Modifier&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;19&lt;/span&gt;&lt;span&gt;            .fillMaxSize()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;20&lt;/span&gt;&lt;span&gt;            .verticalScroll(scrollState),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;21&lt;/span&gt;&lt;span&gt;        horizontalAlignment = &lt;span style=&#34;color:#df8e1d&#34;&gt;Alignment&lt;/span&gt;.CenterHorizontally&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;22&lt;/span&gt;&lt;span&gt;    ) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;23&lt;/span&gt;&lt;span&gt;        Text(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Contador: &lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;${count.value}&lt;/span&gt;&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;&lt;/span&gt;, modifier = &lt;span style=&#34;color:#df8e1d&#34;&gt;Modifier&lt;/span&gt;.alpha(alpha))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;24&lt;/span&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;25&lt;/span&gt;&lt;span&gt;        Button(onClick = {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;26&lt;/span&gt;&lt;span&gt;            scope.launch { count.&lt;span style=&#34;color:#8839ef&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#04a5e5;font-weight:bold&#34;&gt;++&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;27&lt;/span&gt;&lt;span&gt;        }) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;28&lt;/span&gt;&lt;span&gt;            Text(&lt;span style=&#34;color:#40a02b&#34;&gt;&amp;#34;Incrementar&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;29&lt;/span&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;30&lt;/span&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8c8fa1&#34;&gt;31&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;h2 id=&#34;referencias-y-recursos&#34;&gt;Referencias y recursos&lt;a class=&#34;anchor&#34; href=&#34;#referencias-y-recursos&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kotlinlang.org/docs/home.html&#34;&gt;Documentación oficial de Kotlin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.android.com/jetpack/compose/documentation&#34;&gt;Documentación oficial de Jetpack Compose&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developer.android.com/jetpack/compose/state#remember&#34;&gt;Remember en Jetpack Compose&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Showcases</title>
      <link>https://documentation.javiercarrasco.es/showcases/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://documentation.javiercarrasco.es/showcases/</guid>
      <description>&lt;div class=&#34;book-hero text-center&#34;&gt;&#xA;&lt;h1 id=&#34;at-the-moment-this-page-is-empty&#34;&gt;At the moment this page is empty&lt;a class=&#34;anchor&#34; href=&#34;#at-the-moment-this-page-is-empty&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;div&gt;</description>
    </item>
  </channel>
</rss>
