VIDEOJUEGOS I (21038)
Perfilado de sección
-
-
Acceso privado (Youtube)
- Usad la cuenta asociada a Google que disteis al crear los grupos.
- No descargues ni difundas los vídeos: son privados exclusivamente para ti.
Clases por fecha
Incluyen Videojuegos 2 y Videojuegos 1
VIDEOJUEGOS 2
-
27 / feb
- 📹 5.1 Cuestionario Entrenamiento: review. Cómo mejorar las planificaciones.
- Conocimiento básico: el más importante. Cuestionario de entrenamiento y feedback. Generador procedimental con autómata celular. Planificar correctamente tareas concretas. Cómo evitar tareas generales. Por qué planificar máximo 30-40% del tiempo disponible. Cómo influye una planificación que se cumple en la moral del equipo y su autopercepción.
- 📹 5.2 C++ Punteros, objetos, tipos de datos y su lugar en memoria. Acceso usando punteros. New y delete. Leaks y destructores.
- Diferencia entre objeto puntero y cadena de caracteres (array de char). Objetos y variables. Direcciones de memoria. Decaimiento de arrays en punteros. Visualizando el objeto "puntero a carácter". Mapa de memoria en Linux. Segmentos de datos: .data, .rodata, .bss. El Program Break. Entendiendo el warning "ISO C++ forbids converting a string constant to 'char*'". Cadenas, objdump y sección .rodata. ¿Por qué en .rodata? Diferencia entre globales y locales. El Stack. ¿Qué es la sección .data.rel.ro. Relocalización, ASLR (Address Space Layout Randomization) y el debugger. ¿Cómo guardamos punteros en un binario? Cómo funciona el operador corchete. Problemas de punteros y accesos a memoria. ¿Qué es exactamente un Segmentation Fault? Usando punteros para modificar objetos de memoria. Aritmética de punteros. Entendiendo el uso de new y delete y por qué no se hace en C++ moderno. Ejemplo de corrupción del Heap y por qué sucede. Memory leaks, excepciones y evolución del código. Destructores y liberar recursos de memoria. Smart pointers. Objetos sin nombre y punteros para acceder a ellos.
-
20 / feb
- 📹 4.1 Planifica correctamente, obtén resultados. Diferencia features y tareas
- Features vs tareas del presupuesto. PROBLEMA: Items genéricos. Cómo concretar tareas. PROBLEMA: Planificar por planificar. Nunca poner tareas que no se van a cumplir. Comprometerse con la planificación. Poner pocas tareas, que se cumplirán (Contrato de mínimos). ¿POR QUÉ PLANIFICAR ASÍ? Para construir disciplina, sentirse mejor y avanzar más. Planifica extremadamente realista: mejor muy poco que se cumple, que mucho que no. Sé un profesional, planifica como un profesional..
- 📹 4.2 C++ Ejecutables y memoria: ELF, .bss .data .rodata, stack, heap, protección
- ¿Qué es un programa? ¿Cuánto ocupa el ejecutable compilado? Librerías y ldd. ¿Qué son los archivos / ficheros? ¿Dónde están? IMPORTANTE: La CPU sólo puede leer de RAM (no de disco). ¿Cómo se ejecuta un programa? Mapa de la Memoria del Sistema Operativo Linux. ¿Qué es la memoria "mapeable"? ¿Dónde se carga el código del programa? Utilidades en Linux: readelf, pipes (|), most, hexdump, objdump, strace. Entendiendo los ejecutables: secciones y permisos (RWE), .init, .text, .fini, .data, .rodata .bss. ¿Qué ocurre cuando hacemos new en un programa?. Enlazado estático de las librerías con -static. ¿Qué ocurre cuando hacemos new en un programa? ¿Qué cambia cuando creo una variable global o local? Identificando si algo está en el HEAP, STACK o en .data / .rodata / .bss. ¿En qué consiste realmente reservar? ¿Cómo funciona el stack y cómo reserva memoria automáticamente?
-
13 / feb
- 📹 3.1 Documentos, integrar ya, aclarar juego, planificación y próximos eventos
- Calendario y planificación. Documentos útiles: cómo hacerlos. Idea clara del videojuego. Eventos futuros: Hito3, UAGames DevCon, Valencia Indie Summit. Motor gráfico y tecnología: ¡Integrar ya! Plantilla de evaluación y orden de grupos.
- 📹 3.2 C++ Objetos, Variables, Tipos, Punteros y Lifetime
- Qué son realmente variables, objetos y tipos. Qué es el tiempo de vida (lifetime). Tipos de lifetime (automático o local, estático o global, dinámico, temporal y local al thread). Objetos temporales. Entender los punteros: objetos que se refieren a otros objetos. Operadores dirección e in-dirección. Mirar el código ensamblador y entender lo que sucede (MOV, corchetes, BYTE, WORD, DWORD y código máquina)
-
06 / feb
- 📹 2.1 Enfocando el ABP
- Entregas primer día. Proyecto, Producto y Vosotros. Prácticas: 25/minutos por grupo por turnos (Release cada semana). Producto: Importante que evolucione todas las semanas. Teoría: C++ e IA, 1 concepto a la semana + Ejercicios. Eventos: Valencia Indie Summit, UAGames DevCon. Cómo aprovechar todo en clase para mejorar, incluído si el profesor no te cae bien.
- 📹 2.2.1 Ejercicio IA percepcional y pista
- 📹 2.2.2 Solución Ejercicio IA percepcional
- Concepto de Atención percepcional. Una IA no puede ir a 60 fps. IA: 1.PERCEPCÍON - 2.PROCESADO - 3.ACCIÓN. Limitando la PERCEPCIÓN.
VIDEOJUEGOS 1
-
12 / dic
- 📹 6.1. Introducción a la Máquina Restrictiva y cómo crear releases.
- ¿Para qué sirve y qué es la máquina restrictiva? ¿Qué es una release? Condiciones de la máquina restrictiva y las releases. Librerías, código máquina y ejecutables. Cómo distribuir un juego. ¿Por qué usar un ZIP para poder copiar la release?. Cómo hacer la release y probarla. Usar -Wl,-rpath y LD_LIBRARY_PATH para que los ejecutables encuentren sus librerías
- 📹 6.2. Planificación y desarrollo guiado por el juego: experimental y development.
- Conseguir tener un juego: diferencias entre interactuable, jugable y juego. Cómo organizar el trabajo en torno al juego. La rama experimental debe estar dedicada al juego. No reutilizar código de experimental. "Si no está, no existe". Priorizar el juego para poder disponer de diseño y feedback para la tecnología. Tecnología no es copiar código: no sigáis recetas sólo. El equipo de Development desarrolla tecnología nueva para que Experimental pueda usarla dentro de 2 semanas.
- 📹 6.3. Programando el GameEngine por Componentes en C++23. Parte 4. (+ Diseño)
- ¿Para qué sirve y cómo usar correctamente un Diagrama de Clases? Entendiendo lo básico. Datos públicos versus datos privados en objetos: ¿Por qué elegir uno u otro? Invariantes de un objeto: datos e interfaz. Problemas de añadir nuevos componentes: duplicidad de código. Declarar versus Definir. Entendiendo mejor referencias, punteros, lvalues y temporales: entendiendo errores del compilador. Entendiendo qué son expresiones y cómo se evalúan a un resultado. Problemas, ventajas e inconvenientes de usar punteros y referencias y cautelas al desreferenciar punteros. ¿Por qué no se puede crear una referencia a un temporal y cómo hacer las cosas bien? ¿Qué es un LifeComponent*&? Atributo [[maybe_unused]]. Métodos y funciones: ¿Cuándo crearlas dentro de una clase, cuándo no y por qué? Detalles sobre constexpr e inline. Acoplamiento entre partes del código y por qué es un problema. Cómo automatizar la generación de código: Templates. Usando cppinsights.io para explorar lo que genera el compilador. Especialización de templates. Uso de "if constexpr" para distintas opciones de compilación. Type traits y std::is_same_v. Deducción automática de tipos y parámetros implícitos (autodeducidos) para templates
-
05 / dic
- 📹 5.1. Guiar al jugador. Sesión de Game Design con Gala.
- 📹 5.2. Programando el GameEngine por Componentes en C++23. Parte 3.
- Nota importante: las primeras 2 partes de la grabación sufrieron cortes a mitad. Subiré los audios grabados por si queréis escucharlas, pero las imágenes se han perdido. Disculpad las molestias.
- Analizar interfaz para mejorarla. Cómo numerar tipos de componente automáticamente. Variables globales, definición y declaración: extern. funciones miembro static = globales. variable static = globales (no se grabó). Implementando addComponent / getComponent. Referencias versus Punteros como parámetros: ventajas e inconvenientes. unoredered_map no tiene orden definido. Sobrecarga de funciones. tag dispatch. static_cast versus dynamic_cast para convertir tipos de una misma jerarquía de herencia. Constructores y constructor por defecto = delete. Error: anonymous type / incomplete type : problemas de forward declarations. Usando el depurador CGDB para encontrar errores rápidamente: breakpoints, backtrace, frames, print, next, step, continue, run. Corrigiendo usos incorrectos de operator[] en unordered_map. at() y contains()
-
28 / nov
- 📹 4.1. Planificación, Presupuesos y Entrega del Presupuesto
- 📹 4.2. Programando el GameEngine por Componentes en C++23. Parte 2.
- Separación del código en múltiples ficheros y compilación. Uso de flags para #includes y búsqueda de ficheros con angle-brackets. Compilación incremental: qué es y ventajas. Separación en ficheros cpp y hpp: unidades de tracducción. Uso correcto de #includes: dónde deben ir y por qué. Automatización de múltiples ficheros con el Makefile. Problemas al crear Makefiles más complejos. Macros de Makefiles para evitar repeticiones y errores. Dependencias Order-Only en Makefiles para directorios. Uso de forward declarations para evitar #includes innecesarios. Punteros, referencias y declaraciones. Actualización de un componente desde otro en un motor Por Componentes. Cómo pasar los datos de Física a Render (de un componente a otro). Usando referencias para simplificar el código. El puntero this y el paso del argumento implícito. Entendiendo que es "binding reference" en C++ en el paso de parámetros. Detalles importantes de uso de const y métodos de sólo lectura. Sobrecarga de métodos y funciones en C++. El problema de los IFs y el branch missprediction del procesador. Agrupar componentes en contenedores y recorrerlos. Herencia en C++: funciones virtuales y virtuales puras. Clases abstractas, implementación de interfaces heredadas: override y final. Destructores virtuales en clases base. Implementación por defecto con = default. Problema de inicialización agregada con herencia. Uso del patrón Datos para recuperar inicialización agregada. Uso de std::unordered_map ( contenedor asociativo clave-valor ). Identificadores de tipo de componente. Uso de dynamic_cast y static_cast en herencia. Uso de structured bindings al recibir std::pair.
-
21 / nov
- 📹 3.1. Planificación, Presupuesos y Elecciones de Diseño para la IA
- Documentos y entregables que cambian en el tiempo y deben entregarse en todos los hitos. Entender en detalle los items del presupuesto y cómo seleccionarlos. Modelo y referentes: cómo extender el modelo. Seleccionar referentes de ideas de IA: juegos deportivos, juegos competitivos, RTSs, FPSs, infiltración, mundos abiertos. Juegos donde la IA es una necesidad. Ejemplos de mecánicas en otros juegos: usarlas como referentes. No lanzar ideas al aire. Etapas de desarrollo del Motor y el Juego: 4 próximas semanas. ¿Qué debe ser el prototipo del hito 1? ¿Qué mecánicas debe incluir y cómo deben ser los niveles?
- 📹 3.2. Programando el GameEngine por Componentes en C++23. Parte 1.
- Componentes, ¿Qué son?. Ideas básicas de cómo funcionan Unity3D y Godot. Diseñar un tipo Entity que contenga componentes opcionales. Tipos de datos en C++ y objetos. Componentes opcionales usando bools. ¿Cuánto ocupa un entity en memoria? Alineamiento y padding. Visualizándolo. Componentes opcionales usando std::optional. Componentes opcionales usando punteros: ventajas e inconvenientes. Entendiendo los punteros, comprendiendo siempre hay 2 cosas, puntero y objeto apuntado. Referencias en C++ versus punteros: las referencias son un alias. Creando entidades y asignándoles componentes. Asignando referencias como valor de retorno de una función: entendiendo los pasos y cómo funcionan las referencias. Entendiendo el operador direcccion ( & ) y su diferencia con las referencias. Obtener direcciones de memoria: se obtienen punteros. Objetos en memoria versus valores temporales. Tiempo de vida de los objetos y ámbitos en C++. Problemas de apuntar a objetos que dejen de existir. Uso de new y delete: qué hace new y diferencias con la pila. Detalles exactos de new y delete. Prohibición de usar new y delete. Designated initializers en C++ y orden de inicialización. Renderizando entidades que tienen render. Ranged-based for loop. Uso de referencias para simplificar el código. ¿Qué es una violación de segmento? Herramientas para detectar violaciones de segmento: el address sanitizer. Uso de símbolos de depuración al compilar. Simulando problemas de tiempo de vida de objetos y punteros. Entendiendo cómo usar bien el address sanitizer. Actualización de componentes en funciones update.
- 📹 3.3. Miembros del grupo Ocacho (credores de No Gas Racing) cuentan su experiencia ABP y dan consejos.
-
14 / nov
- 📹 2. Presupuesos ABP, entrega y organización. C++: Clase-Reto Mini-Game-Engine. 2ª Parte
- Revisión de librerías. Uso de compiladores g++ y clang++. Makefiles básicos. Warnings del compilador. Casts de C y C++. Cppreference. Preferencia de operadores. Números mágicos, constantes y constexpr. Evitar uso de #define. Ámbitos. Uso de static. Crear y gestionar entidades vivas. Uso de assert. Sufijos de literales numéricos. Entendiendo y visualizando las referencias. Rangos en C++: begin(), end(), iteradores y range-based for loop. Uso de std::span para crear una vista sobre un rango. Métodos const: sólo-lectura.
-
07 / nov
- 📹 1.1. Comienzo ABP: presupuestos, entregas y organización. Demo Batman Forever.
- 📹 1.2. C++: Clase-Reto Mini-Game-Engine. 1ª Parte
- Cómo instalar software en Manjaro. Cómo compilar en C++`. Uso básico de Raylib. Entendiendo librerías e includes. Dibujando píxeles en pantalla. Arrays con std::array. Qué son las referencias en C++ y cómo funcionan. Paso por referencia y paso por puntero.
-