Writing 2D Games in C using SDL by Thomas Lively

Writing 2D Games in C using SDL by Thomas Lively

THOMAS ANIMADA: De acuerdo. Hola a todos. Estoy Thomas Lively. Este seminario va a serescribir juegos 2D en C utilizando SDL. Así que sé que eres todopreguntando, sí, realmente quieren jugar y hacer juegos,pero lo que es este negocio SDL? Así SDL es una biblioteca C. Se destaca por la sencillaDirectMedia Layer. Y es una plataforma cruzada,biblioteca de desarrollo de juegos. Funciona en Windows, Mac,Linux, incluso iOS y Android. Se ocupa de cosas comoel acceso a los sistemas de audio para el ordenador, el teclado, yratón, joystick, si están unidos. El móvil, incluso puede hacer loentrada táctil y todo eso. Y, por supuesto, que se encarga de los gráficos,dibujo cosas a la pantalla. >> Así que es muy ampliamente utilizado, a pesar de quepuede que no haya oído hablar de él antes. Está construido en, por ejemplo,Motor de fuente de Valve, que alimenta juegos comoPortal y Team Fortress 2. Está también en un gran númerode juegos indie que salen, así que estoy emocionado de ver lo quetodo estará haciendo con él. >> Los objetivos del seminario son para conseguir quese dispuso a ser en desarrollo con SDL. Vamos a aprenderpara crear una ventana de juego. Vamos a crear sprites,que son las imágenes de su juego que puede moverse. Vamos a aprenderay animar los sprites, así moverlos, hacerellos cambian con el tiempo. Y vamos a aprenderpara capturar teclado y el ratón de entrada de la computadora. Lo que no vamos a estar hablandohoy es gráficos en 3D, porque eso es muy complicadotema que no tenemos tiempo para. No vamos a aprender areproducir el audio en nuestros juegos. Y no vamos a estar construyendopara nada, pero Linux. >> Ahora las salvedades hay que,con suerte, al final del seminario, se sentirá cómodo conla documentación de SDL, por lo que será capaz de ir averiguarla forma de jugar de audio por ti mismo. También la construcción para Mac o PC debería funcionarexactamente la misma que la construcción para Linux, pero la configuración va aser un poco diferente. Por lo que debe ser capaz de entendercómo hacer estas cosas para el final del seminario de hoy. >> Así que para la puesta en marcha, vamosutilizar una máquina virtual. Queremos utilizar el IDE CS50, porquesólo vamos a estar escribiendo en C. Pero ya que el IDE no es un navegador, queno puede crear ventanas o pantalla nuevos gráficos en él. Así que tenemos una máquina virtual. Así que usted puede seguir las instruccionesaquí en manual.CS50.net/appliance/15 para instalar el aparato oficial CS50,que no es más que una virtual de Linux máquina. >> Y a continuación, una vez que tienesque todo ello se up-- podría tomar un poco de tiempo, porqueuna gran download-- vas para funcionar en la actualización de apt-get VM sudo. Y eso es realmente está pasandopara actualizar todo el software paquetes en su máquina virtual. >> Después de eso, usted va a ejecutarsudo apt-get install, libsdl2-2.0-0, libsdl2-dbg, libsdl2-dev, yadicionalmente libsdl2-image-2,0-0, libsdl2-image-dbg,y libsdl2-image-dev. Entonces, ¿qué hace eso? Eso simplemente instala la depuracióninformación, documentación, cabeceras, y los binarios para dos bibliotecas. Regular de edad, SDL 2.0,y otra biblioteca llamada Imagen SDL, quevamos a utilizar para cargar archivos de imagen en nuestro juego. >> Así que una vez que tenga que tambiénque, justo cuando se le pregunta, sólo tiene que teclear sí, presiona Enterpara instalar los paquetes, y entonces usted debe ser bueno para ir. Así que para obtener el código de distribución,can-- ¡Dios mío, esto no se actualiza. A menos que usted tenga un account-- GitHubsi usted tiene una cuenta de GitHub, usted puede hacer esto Gitcomando clon a la repo y que va a descargar el Gitrepo con todo el código en el mismo, de modo que usted tiene el código. >> Si usted no tiene un GitHubcuenta, lo que debe hacer es tipo wgithttps: //github.com/tlively/sdlseminar-- y aquí es diferente-- /archive/master.zip. Así que de nuevo, eso es exactamente el mismoURL, si no va a ser tlively / SDL_seminar / master.zip yestá utilizando wgit descargar eso. Y entonces usted puede simplementedescomprimir ese archivo y entonces tendrástodo el código fuente. Así que lo siento por eso. Y a continuación, el código también tendrá lugar enla página web del seminario CS50 en un par día. >> Correcto. Entonces, ¿cómo empecemosescribir nuestro propio juego? Bueno, lo primerovamos a querer hacer es mirar la documentación de SDL. Así que aquí está la máquina virtual. Y aquí está la página web. He navegado vivir libsdl.org. Lo que voy a hacer aquí es ir mása la barra lateral, en la documentación, y haga clic en el wiki. Esto me trae a la wiki quetiene la mayor parte de la documentación de SDL. Más en la barra lateral aquí, estamosva a hacer clic API por categoría, porque va a darnosotros una bonita vista categórico de toda la API para SDL. >> Así, por ejemplo, tenemosla inicialización básica y cerrado, toda la clase decosas administrativas para el uso de SDL, y luego tenemos la sección demostrar cosas a la pantalla. Eso es vídeo. Los eventos de entrada, que es conseguirentrada desde el teclado, conseguir la entrada del ratón, yel joystick, si lo tiene, incluso. Hay retroalimentación de fuerza para las cosascomo dispositivos de juego, que no vamos a hablar. Y aquí está el audio. Y luego hay un montón de otrasmateria que SDL puede hacer por usted. >> Pero hoy vamos a enfocaren la inicialización aquí, la visualización de imágenes en el vídeosección, y gastos de los eventos de entrada. Así que estos son los principalessecciones de la documentación que usted debe preocuparse. Sólo por diversión, si vamos másaquí y haga clic en el API por su nombre, podemos ver una lista de todos loscosa en la biblioteca SDL. Así que todas estas funciones, enumeraciones,estructuras, una increíble cantidad de cosas, orden alfabético. Y claramente, hastasabes que estás haciendo, esto no va a ser demasiado útil,es por ello que hacemos API por categoría. >> Así que vamos a empezar. Esperemos que ya tienesdescargado el código de distribución. Y así, lo que puede hacer es, a la derechaaquí en el aparato CS50, basta con abrir un terminal. Aquí vamos. Así que ya he descargado elcódigo de distribución mediante el .zip método. Y he abrió la cremallera. Así que aquí está en el maestro de seminario SDL. Así que voy a entrar en ese directorio. Y lo que vemos aquí esque tenemos siete archivos C. Y esto va a el códigovamos a estar buscando en la actualidad. Tenemos un makefile. Y tenemos un directorio de recursos,que simplemente tiene una imagen que usted va a ver muy pronto. >> Así que vamos a abrir estos archivosusando el editor de G-Edit. Así que quiero abrir todos los archivos quecomenzar con hola y terminar con .c. Aquí vamos. Así que eso es una pequeña ventana, así que estamosva a tratar de hacer que más grande. No, se fue. >> Correcto. Así que aquí está la primeraarchivo que vamos a ver. Se llama hello1_sdl.c. Y todo esto hace es inicializar el SDLbiblioteca para que podamos empezar a usarlo. ¿Cómo lo sabes por venircon este código a ti mismo? Bueno, si miramos másen la documentación y entramos en la inicializacióny apagar la sección, que va a decirnos todoacerca de cómo inicializar SDL. Así que definitivamente leer esto en otro momento. Se va a decir a todos ustedesacerca de lo que está pasando aquí. Pero el quid de la cuestión principal es quetenemos que llamar a esta función SDL en él y pasarlo qué tipo de cosasqueremos que la biblioteca para inicializar. Así que en nuestro caso, sólo vamospara inicializar el video por ahora, para que podamos empezar a mostrar las imágenes. >> Por aquí, se puede ver sihacemos clic en una SDL en él, nos puede obtener aún más información,incluyendo el valor de retorno. Así que vemos aquí quereturnes cero en caso de éxito. Así que en nuestro código, vamos aver si no vuelve a cero, y si no devuelvecero, por lo que no se ha realizado correctamente, a continuación, vamos a simplemente de impresiónun error usando esta otra función, Error get SDL, que devuelve una cadenaque describe el error que se ha producido. Vamos a imprimir esaerror y luego sólo somos va a salir del programacon un código de error. >> Luego otra cosa que necesitamosque hacer es, antes de programa se cierra, si inicializado correctamente SDL,sólo tenemos que llamarlo SDL dejar de fumar. Y eso va a manejar la limpiezatodos los recursos internos de SDL para nosotros. Así la documentación allí-- de nuevo,aquí estamos en la inicialización y apagar la secciónde la documentación. Usted sólo puede hacer clic en lafunción aquí, SDL dejar de fumar, y usted puede leer todo acerca de eso también. Y muchas de estas funcionespáginas de documentación tener ejemplo de código, por lo que estees muy buen recurso. Definitivamente pasar algún tiempoleer partes de esta wiki si vas a haceresto para un proyecto. >> Correcto. Así que eso es todo nuestro programa. Lo que podemos hacer ahora es-- estoyva a abrir el archivo MAKE aquí, así que me voy a tomar unver cómo funciona. Y es una muy simple makefile,similar a lo que has visto antes. Una de las principales diferenciases que, aquí, esto se va a insertar el resultado de la carreraeste comando, que ya ha instalado si ha instalado SDL. Y este es un comandoeso va a generar algunas banderas adicionales para el compilador. >> Además de eso, estamos dándoletodos los comandos habituales, así como estos dos comandos. Así que los mangos -lsdl2-imagenla vinculación de la biblioteca de imágenes SDL. Y el -lm en realidad se encarga de vinculaciónen la biblioteca matemática estándar C. Así que no vamos a necesitarlos de todos nuestros archivos de C, pero nosotros sólo ponemos en lo que podemosutilizar el mismo archivo MAKE para todo, sin modificaciones. >> Aquí en las fuentes,este es el lugar donde quiere poner los archivos que ibascompilar para su proyecto. Pero ya que cada uno de mis Carchivos de aquí tiene una función principal, que va a confundirsesi todos ponemos en. Así que voy a decir simplemente,por ahora, hello1_sdl.c, que es el que acabamos de ver. Así que si vuelvo másaquí, que puedo hacer hacer. Y lo que hizo es sólocompilado que primer archivo. Y entonces podemos escribir ./game, porqueque es el ejecutable que produjo. Y todo lo que hizo fue de impresióninicialización éxito. Así que hicimos algo bien. Pero eso fue un poco aburrido,porque no vemos una ventana, nada se movía. >> Tan grande, llegamos SDL inicializado. Ahora, vamos a pasar a algoun poco más interesante. Así que aquí tenemos hello2_window.c, yesto va a ser un poco más programa en C compleja queinicializa SDL al igual que antes, excepto que ahora también vamospara inicializar el temporizador SDL. Y esto nos va a permitiracceder al temporizador interno y funciones de uso en relación con el tiempo. >> Y luego vamos a ver aquí abajo. Lo que hacemos es que tenemos este punteroa una ventana struct SDL, que va a ser creado por la presente convocatoriaa la función, SDL crear ventana. Ahora, esto toma mucho de los argumentos,así que vamos a ir a buscar a la documentación. Así que de nuevo, voy aAPI por categoría, estoy bajar al video aquí, y la primerasección, que muestra la gestión de ventanas. Así que esta sección tieneun montón de cosas en ella, pero si se mira a travésestas funciones, se le ver que, probablemente, la quequieren que se llama SDL crear ventana, que pasa a ser justo en la cima. >> Y por lo que este es eldocumentación para esta función. La ventana va a tener un título,una posición xey en la pantalla, que va a tener una anchura, altura,y luego se va a tomar algunas banderas. Ahora, en realidad no importacualquiera de estas banderas en este momento, pero si quería hacer algocomo hacer una ventana de pantalla completa, usted puede echar un vistazo a eso. Por ahora, sólo vamospara utilizar estos valores especiales, Ventana de SDL, más centradapara x e y con el fin sólo crear la ventanaen el centro de nuestra pantalla. >> Así que eso es lo que está haciendo. Y si la ventana pasa a sernula, lo que significa que hay un error, luego otra vez sólo vamos aimprimir el error utilizando error get SDL. Y luego, ya hemos inicializadoSDL, ahora tenemos que cerrarla. Así que llamamos SDL renunció antesentrega de uno de principal. >> Así que tenemos esta ventana abierta con suerte. Y lo que vamosque hacer es que vamos llamar SDL para 5.000 milisegundos,que es el mismo que cinco segundos. Y cuando hayamos terminado con eso,que va a destruir la ventana, limpiar la biblioteca SDL,y salir del programa. Así que vamos a seguir adelante y darle que un tiro. >> Así que ahora en lugar de cambiarel makefile cada vez, Yo simplemente no puedo hacer, ya continuación, en la línea de comandos, dicen las fuentes es igual y despuésel archivo que estamos compilando. Así que es hello2_window.c. Fantástico. No hay erros. Ahora bien, si corremos nuestra ejecutable,vemos esta ventana. Ahora hay unos pocosproblemas con la ventana. Podemos moverlo, pero tieneesta basura de fondo dentro de la misma. Así que no hemos dibujadonada, y por lo que es sólo llena de basura, quees bastante más de lo que esperamos. >> Por otra parte, no podemos cerrar la ventana. Estoy presionando este X en laesquina y no pasa nada. Así que veremos cómo arreglarque en un poco. Así que vamos a arreglar la parte donde elventana está llena de basura en primer lugar. Así que si vamos a hello3_image.c, lopodemos ver es que hemos añadido unos cuantos más cosas aquí. Hemos añadido esta nueva cabecerapresentar para obtener las funciones de temporizador. Supongo que lo hicimos en el pasadouno, también, y yo no menciono. Pero ahora porque somostrabajar con imágenes, necesitamos incluir la SDLarchivo de cabecera de imagen también. Por lo que es lo mismo queantes, la inicialización de SDL aquí, mismo acuerdo con la creación de ventanas. Hemos visto que antes de ahora. >> Ahora tenemos que crear algo que se llamaun procesador, que tipo de va de la mano con la ventana. Pero es una especie deabstracto objeto que es a cargo de hacer todo estooperaciones de dibujo a la ventana. Y lo que realmente correspondea un programa cargado en el hardware de gráficos en suordenador o el teléfono o lo que sea. Así que las banderas que queremos pasar it--y se puede ver en la documentación para obtener más detalle aquí-- vanSDL que se rinda acelerado, que significa que va a serutilizando el hardware de gráficos y no sólo emulado en software. >> Y vamos a utilizarSDL RENDERER PRESENTVSYNC. VSYNC es una cosa que simplemente hacesus gráficos se ven mejor y evita esta pantalla cosa llamadaterror, donde la mitad de una trama y un medio de la siguientemarco se ven inmersos en el mismo tiempo y se ve horrible. Pero, de nuevo, usted puede ir a leerde eso por su cuenta. >> Así que tenemos algunas banderas aquí. Y por lo que sólo vamos a llamaresta función SDL crear render. Vamos a darle la ventanaasociar con ese procesador. Un aspecto negativo significa que no nos importa lo quecontrolador de gráficos que vamos a utilizar. Así que en caso de más o menossiempre ser uno negativo, a menos que sepa acerca de los controladores de gráficos. Y entonces sólo vamospasarlo nuestras banderas. Así que si eso devuelve null, entonces estamosva a imprimir el error, como de costumbre, pero entonces también vamospara destruir la ventana para limpiar esos recursos antesllamando SDL dejar de fumar y volver. >> Ahora, lo interesante aquíes donde nos cargamos nuestra imagen utilizar esta función IMG_load. Esta es la única función que vamosutilizar de la biblioteca de imágenes SDL. Es el único que necesitamos. Es una función que toma la cadenaese es el camino de cualquier recurso de imagen. Y puede ser un .png, un GIF,mapa de bits, ninguna de estas cosas. Y es por eso que esta función es tan agradable. Se puede manejar casi cualquier formato. Carga en la memoria y lo almacenacomo lo llama una superficie SDL. >> Ahora una superficie SDL es meramente una estructuraque representa los datos de imagen en la memoria. Así que usted puede leer más sobreque en la documentación de dos. Y si este error, entonces estamosvamos a hacer todo el asunto, donde imprimimos el error, cerramos nuestrarecursos y, a continuación, salir del programa. Ahora lo interesante es, antespodemos sacar esta imagen a la ventana, tenemos que hacer realmente una textura. Ahora una textura correspondea los datos de imagen cargados en la memoria del hardware del gráfico. >> Así que una superficie es en mainla memoria, la memoria normal que hemos estado usando todo el semestre,y una textura es en este VRAM separada memoria que los controles de la tarjeta gráfica. Así que llamamos a esta funciónSDL_CreateTextureFromSurface. Le damos nuestro procesador y nuestra superficie. Y entonces estamos realmentehecho con la superficie, así que sólo vamos a liberarlo. Nosotros no lo necesitamos más. Y entonces lo que si esta llamadacon error y volvió nula, entonces nosotros vamos a hacer todoinforme de errores cosa otra vez. >> Correcto. Aquí, nos metemos en algúnfunciones de renderizado reales. Así que llamar SDL_RenderCleary pasándolo el procesador asociado con la ventanasimplemente hace que la ventana ve negro. Por lo tanto, elimina esa basura que vio ennuestra ventana antes y hace que sea negro. Y luego vamosllamar SDL_RenderCopy, darle nuestro procesador, nuestra textura. Y vamos a hablar de lo queestos campos están en un poco. Pero eso va atomar los datos de textura y copiarlo en nuestraventana para dibujar la imagen. Así que después de lo que hemos hecho esta copialos datos en nuestra ventana, que tenemos que hacer esta función adicionalllamada SDL_RenderPresent. >> Y esto es interesanteporque esto se pone en un tema llamado doble buffer. Así que el búfer doble es una técnica quehace que sus gráficos se ven mucho mejor. Una vez más, impide que el desgarro de pantallaYo estaba hablando de antes, donde tiene dos buffers. Hay una memoria intermedia de vuelta enmemoria y un tampón frontal. El tampón frente es literalmentelo que está en la pantalla en el momento. Así que hacemos todas estas variaciones se basan,como SDL hacer copia o SDL_RenderClear a la memoria intermedia de vuelta. Así que se modifican las cosasen el búfer de reserva. Aquí podríamos estar dibujando estecuadrado verde en el búfer de espalda. >> Así que cuando terminemos haciendonuestros render operaciones, que podría tomar un tiempo muy largotiempo, ¿qué vamos a hacer es cambiar los amortiguadores. Así que, literalmente, sólo toma elbúfer frontal y el búfer de reserva y los interruptores, por loque, instantáneamente, en una sola operación, en lugar detal vez cientos o miles, todo nuestro recién prestadoscon objetos sobre la pantalla. Y esto impide que las cosascomo el refrescante pantalla medio cuando sólo hemos dibujadode nuestros objetos para el marco. Así que por eso tenemos que llamarSDL_RenderPresent, así como SDL_RenderCopy. >> Una vez más, sólo vamosque esperar cinco segundos. Entonces vamos alimpiar nuestros recursos. Tenemos unos cuantos más en esta ocasión. Y entonces sólo vamospara salir del programa. Así que vamos a hacer eso. Voy a escribir marca, y luego las fuenteses igual a hello-- esto es ahora 3image.c. Muy bien, que compila sin errores. Y se puede ver aquí tengo ahorasacado mi imagen, Hola, CS50! a nuestra ventana, quedesaparece después de cinco segundos. >> Ahora, esto todavía tiene problemas, ¿verdad? Esto no es una buena aplicación,porque cuando trato de cerrar la ventana, no pasa nada. Eso x todavía no responde. Así que echemos un vistazo a lasiguiente archivo, hello4animation. Así que este es el archivoeso va a introducir movimiento y movimiento a nuestra imagen. Así que vamos a hacer lolo mismo que antes, iniciar SDL, cree elventana, crear el procesador, cargar la imagen enmemoria, crear la textura. Hemos visto todo esto antes. Ahora, esto es nuevo. Vamos a tener una estructura llamadaun rect SDL, que es sólo un rectángulo. Si vamos por aquí, podemoshacer una búsqueda de SDL rect, y se puede ver que es unestructura muy simple. Cuenta con una x, a y parala posición, y tiene una anchura y una altura deel tamaño del rectángulo. >> Entonces, ¿qué vamos a hacer es que estamosva a definir esta SDL rect dest, para el destino. Y este es el lugaren la pantalla donde vamos a estar llegandonuestra imagen, a la derecha Así si vamos a sermoviendo la imagen alrededor, entonces el destino dondevamos a dibujar la imagen deberán moverse. Así que vamos a llamar a esteSDL_QueryTexture función. Y noto que estoy pasando la direcciónde dest.w, que es el ancho, y dest.h, que es la altura. Y así SDL_QueryTexture vaalmacenar en esos campos de la anchura y la altura de nuestra textura. >> Y entonces lo que voyque hacer es que voy para establecer dest.x ventana para serdest.w menos anchura, que es la anchura de la sprite, dividido por 2. Y esto va a configurarlo paraque la imagen está perfectamente centrada en nuestra ventana, ¿de acuerdo? Así que ahora tengo una posición y. Y esto va aser una variable que es cambiar, porque vamos a sermover la imagen en la dirección y. Y ahora tenemos algollamado un bucle de animación. >> Entonces, ¿cómo funciona la animación? Bueno, ojo humano puede detectar 12 distintaimágenes en cada segundo, ¿de acuerdo? Así que si usted flash 12 tarjetas de imagen de míen un segundo, vi a cada una de esas imágenes como su propia imagen individuo distinto. Ahora, si usted flash másimágenes a mí en un segundo, entonces mi ojo empezaríaa desdibujar juntos y me percibirlo como movimiento,en lugar de una imagen distinta. Así, por ejemplo, las películas y la televisión,parpadean imágenes en usted 24 veces un segundo. Así que eso es 24 fotogramas por segundo. Las pantallas de ordenador, por otro lado,a menudo son a 60 cuadros por segundo. Esa es su velocidad de refresco. Esa es la frecuencia con que se actualizanla imagen en la pantalla. Así que nuestro objetivo va a ser 60fotogramas por segundo para nuestros juegos. >> Así que vamos a ver que en el código. Así que para cada cuadro, estamos primerova a borrar la ventana. Este es el patrón general. Siempre se desactiva laventana de cada cuadro, y luego hacer todo de su dibujooperaciones, y luego, al final, Qué RenderPresent para mostrartodo en el marco. Y luego vas atener que esperar al final que esperar hasta la próximamarco debe comenzar. >> Así que si yo estaba haciendo una gran cantidad decomputación compleja aquí que tuvo más de 16 milisegundos,sería imposible para mí para conseguir que la velocidad de fotogramas de 60 queYo quería, porque cada cuadro es tomando demasiado tiempo para calcular. Además, realmente estamos haciendotipo de una cantidad insignificante de trabajo aquí, porque sólo hayuna cosa que estamos dibujando. Así que sólo espero 1/60 desegundo, que es la longitud de una trama en entre fotogramas. Así que estoy especie de pretender hacertodo mi trabajo requiere tiempo cero. Pero en un juego real,habría que restar la cantidad de tiempo que se tardó en hacerlotodo este trabajo de su tiempo de descanso. >> Así que de todos modos, ¿qué soy yorealmente hacer en este circuito? Me aclaro la ventana. Puse el dest.y, que es un int ami posición real y echado en un int. Ahora, quiero flotar resoluciónpara mi y posición en mi juego, pero entonces para realmentedibujar en la pantalla, que necesita enteros, porque es en unidades depíxeles, por lo que eso es lo que el elenco es para. Voy a dibujar la imagen. Así que este es el rectángulo de origen. Y este es el rectángulo de destino. Así que pasé nulo pararectángulo de origen para decir quiero llamar toda mi textura. Pero si había un montón detexturas en su juego y todos están en un gran mapa de texturaque se cargó en SDL como una sola textura, pudierasutilizar un rectángulo de origen para recoger una de las texturas más pequeñas,uno de los sprites más pequeñas, fuera de ese gran mapa de textura. >> Así que de nuevo, estoy pasando mi render, mitextura, y ahora el destino. Esto va a ser donde en elventana que va a ser dibujado. Y luego, porque me estoy animandoalgo, necesito movimiento, Voy a ser la actualización delposición de sprites en cada fotograma. Así que tengo esta llamada de desplazamiento constanteacelerar en unidades de píxeles por segundo. Ahora, cada vez que hacemos un movimiento,el marco es solamente 1/60 de segundo. Así que voy a dividir que por 60. Y luego, vamos a ver, yo soyrestando que a partir de la posición y. ¿Por qué estoy restando? Vamos a llegar a eso en un segundo. Así que puedo limpiar mis recursosy el programa ha terminado. >> Así que vamos a hacer eso. Así que vamos a ir a maquillaje MLRS = hello4animation.c, ¿de acuerdo? Juego. Hay que ir. Así que tengo que desplazarse hasta laventana, que es bastante ordenada. Pero espera, que estaba restandodesde la posición y cada vez. ¿Que esta pasando ahí? Bueno, resulta que en SDL, yde hecho, en la mayoría de los gráficos por ordenador, el origen del sistema de coordenadases la parte superior izquierda de la ventana. >> Así que la dirección x positiva vaa través de la ventana a la derecha. Y la dirección y positivaen realidad disminuye. Así que de nuevo, en el origenla parte superior izquierda de la ventana, dirección positiva es hacia abajo,yx positivo es hacia la derecha. Así que cuando le resto dela posición y, eso es va a hacer que se vaya en lo negativoy dirección, que es la ventana. Así que eso es lo que está pasando allí. Guay. >> Echemos un vistazo a la siguiente foto. Aquí está la parte de lamostrar donde finalmente conseguir que la X en la esquina de la ventanaque se supone para cerrar la ventana trabajar. Entonces, ¿qué está pasando? Inicializamos SDL, crear la ventana,crear el procesador, cargar la imagen, crear la texturacomo hemos visto antes. Tenemos el mismo rectángulo de destinocomo antes, misma llamada para consultar textura. Pero esta vez, estamos entoncesva a dividir el ancho y la altura de nuestro destino por 4. Esto sólo tiene el efecto deescalar nuestra imagen hacia abajo cuando mostramos en la ventana por cuatro. Así que eso es bastante ordenada. Sólo podemos escalar así como así. Vamos a empezar el spriteen el centro de la pantalla. Y ahora tenemos x y velocidad y, yque están tanto va a empezar de cero. >> Este es el archivo incorrecto. Lo siento. Así que eso es cierto. Eso es todo aún en este archivo. Tenemos el dividir por 4 y todo. Así que aquí tenemos nuestra xey posiciónpara el centro de la ventana. Y le damos una velocidad inicialde esta velocidad constante, lo cual Creo que es de 300 píxeles por segundo. Ahora, tenemos este int podríamos igual de bienser un booleano llamado cerca solicitada. Y en vez de hacer unabucle infinito en un temporizador aquí, vamos a ser como la animaciónsiempre y cuando cierre no se solicita. >> Entonces, ¿cómo procesamos eventos? Bueno, SDL pone en cola los eventos de unacola literal detrás de las escenas. Y entonces cada trama,podemos quitar de la cola de eventos desde esa cola utilizandoeste SDL_PullEvent llamada. Y de nuevo, sin duda ve a leersobre esto en la documentación. Hay mucho más detalle y un montónmás funciones que se pueden utilizar con este. Nos pasamos la direcciónde esta cosa, SDL_Event que tenemos aquí en la pila. >> Ahora, ¿qué es un SDL_Event? Debido a SDL, si nos fijamos enlos documentation-- vamos ver, API por categoría, de entradaeventos, manejo de eventos, podemos mirar el númerode diferentes eventos aquí y podemos ver que haytodo un montón de ellos. Entonces, ¿qué es esta cosa SDL_Event? SDL_Event es una unión. Wow, ¿qué es un sindicato? Tienes que probablemente nuncaoído hablar de eso antes. Y eso está bien. >> Un sindicato es una especie deuna estructura, a excepción de una estructura tiene un espacio para todossus campos y la memoria, mientras que un sindicato sólo tieneespacio suficiente para adaptarse a la mayor uno de sus campos, lo que significa quesólo puede almacenar uno de sus campos a la vez, qué tipo detiene sentido para eventos, ¿verdad? Podemos tener un tecladoevento o un evento de ventana, pero un solo evento no puede ser a la vez unevento de teclado y un evento de ventana, así que sería tonto tener espacio paratanto de los que están dentro de nuestra unión evento. Así que si usted queríacrear su propio sindicato, se ve exactamente el mismocomo la creación de una estructura, excepto que se utiliza la palabra clave unionen lugar de la palabra clave struct. Y recuerda, por la totalidad de lacosas dentro de su sindicato, la variable real que es la uniónsólo puede tener uno de esos valores a la vez. >> Entonces, ¿cómo podemos saber qué tipo de eventonos metimos fuera de esta cola? Bueno, podemos probar Event.type. Y si eso es iguala SDL_Quit, sabemos es el caso de quese generó cuando golpear esa X en la esquina de la ventana. Y podemos establecer estrecha solicitada es igual a 1. El resto es sólo un poco de animaciónque has visto antes. Así que vamos a seguir adelante y haceresto y ver lo bien que funciona. Así que voy a escribir marca yentonces MLRS = hello5_events.c. Allá vamos. Juegos. >> Ahora, podemos ver que erade hecho reducido por cuatro. Y ahora está rebotando. Tengo un poco de detección de colisionespasando con los lados de la ventana que podemos echar un vistazo a. ¿Y qué pasa cuando voy a cerrarla? Cierra. Fantástico. Recibimos ese evento. Y lo manejamos. >> Así que vamos a mirar hacia atrás en el código. Entonces, ¿cómo lo consigorebotando así? Recuerde me puse ambos xyy inicialmente a las velocidades. Y la velocidad es positivaconstante, por lo que es va a lograr que se está comenzandoir hacia abajo ya la derecha. >> Ahora, cada trama, además de la manipulacióncualquier evento que pueda haber ocurrido, Voy a detectar si mi spritesestá tratando de salir de la ventana. Por lo que podemos hacer eso con sólo comprobarx_pos con 0, pos_y 0, a continuación, también x_pos y pos_y conanchura de la ventana y altura de la ventana. Nótese que he restéel ancho del sprite. Y esto se debe a que si no lo hacíarestar la anchura del sprite, sólo sería comprobar queel origen del sprite no ir fuera de la ventana. Pero queremos que la totalidadancho del sprite para estar siempre dentro de la ventana ytoda la altura del sprite para estar siempre dentro de la ventana. Así que eso es lo que la resta es para. Una gran cantidad de geometría aquí puedeser de utilidad para sacarlo en papel con la coordenadasistema para ver lo que está pasando. >> Así que si me chocan, yo sólosimplemente restablecer la posición de manera que no se vafuera de la pantalla. Y yo voy a, si rebotaen una de las paredes laterales, Voy a negar lax velocidad de modo que comienza rebotando en la otra dirección. Y de manera similar, si golpeala parte superior o inferior, Voy a establecer la velocidad yigual a la velocidad y negativa, de manera que se va a recuperar. Así que eso es lo que tenemos eso aquí. >> Y las posiciones de actualizaciónal igual que hemos visto antes, dividir por 60, porque somossolamente el manejo de 1/60 de un segundo. Y entonces la representación,exactamente el mismo que antes. Y eso es todoque iba en este archivo. Así que eso es lo que hacemos eventos. Lo principal para llevar aquíEs esta función SDL_PullEvent. Y usted debería leer eldocumentación más sobre SDL_Event el sindicato, ya que este tipo de datos esmuy, muy importante, porque la usamos para todo tipo de eventos. >> Por ejemplo, la utilizamos para el tecladoeventos, que es lo que este archivo es para. ¿Entonces que tenemos? Tenemos el mismo que antes,inicializar SDL, crear una ventana, crear un render, cargar la imagenen la memoria, crear la textura. Una vez más, vamos atener este dest rectángulo, vamos a escalar la imagenpor cuatro, que sea un poco más pequeño. Ahora, vamos a iniciar elsprite en el centro de la pantalla. Pero esta vez, vamos a establecer elx y velocidades iniciales Y a cero, debido a que el teclado esva a controlar esos. Y, además, vamos arealizar un seguimiento de estas variables arriba, abajo, izquierda y derecha. Y eso va a seguirseguimiento de si nos hemos presiona los botones del teclado quecorresponden a arriba, abajo, izquierda, y la derecha. >> Ahora, esto es una especie de lujoporque podemos usar W, A, S, D aquí, o las teclas de flecha reales. Vamos a ver que en tan sólo un segundo. Así que vamos a procesarel evento al igual que antes. Tiramos el evento. Pero ahora vamos acambiar el tipo de evento. Si es SDL_Quit, estamosva a establecer cerca solicitado a uno, al igual que antes. Que se encarga de las x enla esquina de la ventana, de manera que nuestra ventana en realidad se cierra. >> De lo contrario, si conseguimos una clave SDL abajoacontecimiento, lo que significa que pulsa una tecla, entonces lo que vamos a hacer es que estamosva a cambiar en esta cosa aquí, que designa todas lo event.keysignifica tratar a nuestra unión evento, ir a buscar la llaveestructura de eventos en el mismo. Así que resulta que estaunión es una estructura evento clave. Y luego ir a la claveLa estructura del evento su campo llamada keysym y luego scancode. Y de nuevo, sin duda leerla documentación sobre esto. Entradas de palabras clave muy interesante. Usted puede obtener los códigos de exploración o códigos clave. Y es un poco sutil, perola documentación es bastante bueno. >> Así que si vemos el código de exploración paranuestra prensa clave es W o arriba, vamos a configurar igual a 1. Y entonces salimos de ese interruptor. Si se trata de una o de izquierda, que ajuste la izquierda a 1, etetc., etc., por abajo ya la derecha. Ahora, en este interruptor externo,si vemos una llave hasta acontecimiento, eso significa que hemos lanzado una clavey ya no estamos presionando. Así que voy a decir por igual a 0,izquierda es igual a 0, abajo es igual a 0, a la derecha es igual a 0, etcétera. >> Y note que tenemos en cada una de ellasdos casos ponen uno al lado del otro sin código separadopara el primer caso, que significa que si se trata deun S o un abajo a la derecha aquí, que va a ejecutar este código. Así que eso es bastante práctico. Impide que tengamos que hacer máscondiciones y ifs y cosas como eso. >> Así que vamos adeterminar la velocidad. Fijamos la velocidad a 0. Entonces, si se presiona hastay no hacia abajo, entonces nosotros ajustar la velocidad y a la velocidad negativa. Recuerde negativo, debido a que eldirección y negativo es hacia arriba. Y la dirección positiva es hacia abajo. Si se presiona hacia abajoy no hacia arriba, entonces estamos va a ponerlo en velocidad positiva,lo que significa que va abajo de la pantalla. Lo mismo con la izquierda y la derecha. >> Y luego vamos a actualizarlas posiciones igual que antes. Vamos a hacer de colisióndetección con límites, pero nosotros no vamos a restablecer elvelocidad, porque la velocidad es sólo controlado por el teclado. Pero vamos a restablecer elposiciones para mantenerlo en la ventana. Y vamos a establecer elposiciones en la estructura y luego hacer todo elhaciendo cosas de antes. Así que vamos a ver lo que hace. Así hacen SRCS-- vamos a ver,esto es hello6_keyboard.c. >> Oh, no. Así que nos dio algunas advertencias aquí. Y eso es simplemente decir que no lo hicimoscomprobar si cada tipo posible de evento. Eso está bien, porquehay 236 de ellos o así. Así que voy a ignorar esas advertencias. Todavía está compilado bien. Así que voy a jugar el juego. No se mueve. Pero ahora, cuando me puré en mi teclado,Yo puedo hacer algún movimiento WASD aquí, Utilizo mis teclas de dirección también. Y noto, aunque soypresionando la derecha en este momento, no va por la ventana,porque puedo restablecer en cada fotograma. Así que eso es bastante ordenada. Usted puede imaginar moverse con Marioalgunas teclas de flecha o algo por el estilo. Y sí, el X funciona. >> Archivo Así definitiva vamosa la vista, hellow7_mouse. Se trata de conseguir la entrada del ratón. Así que en éste, nosimportar el encabezado de matemáticas, porque vamos a tenerun poco de matemáticas aquí. El mismo viejo, el mismo viejo cosas, destino,misma edad, visto eso antes. Bueno, esto es interesante. Así que estamos de vuelta a la única comprobaciónpara el SDL dejar evento. ¿Porqué es eso? Así que usted puede conseguir la entrada del ratón de eventos. Como cuando el ratón se movía,se obtiene un evento para eso. Cuando se pulsa un botón del ratón,usted puede conseguir un evento para eso. >> Pero hay otra, un poco más sencillotal vez, API para conseguir la entrada del ratón. Y eso es simplemente el estado get ratón SDL. Así que tengo un int para xyy de la posición del cursor. Paso a SDL_GetMouseState,que establece estos. Y esta es la posición en elsistema de la ventana de coordenadas. Así que si la masa está en la parte superior izquierdade la ventana, que sería 0, 0. >> Ahora, lo que voy a hacer es que voyhacer un poco de matemáticas de vectores. Apuesto a que pensó que no lo haríaver que en CS50, pero aquí está. Voy a hacer un poco de vectormatemáticas para obtener el vector a partir de la imagen para el cursor. Y así, ¿por qué tengoesta resta aquí? Bueno, si acabo de utilizar dest .-- asíNecesito traducir el ratón x e y por medio la anchura yla altura de la imagen, porque quiero que el centro de laimagen que se va hacia el ratón, no el origen de la imagen. >> Así que eso es sólo para asegurarse de que estoy hablandoalrededor del centro de la imagen aquí. Entonces conseguimos delta x e y, quees la diferencia de la diana a la posición real de la imagen. Y entonces podemos obtener ladistanciarse aquí, que va a ser de Pitágorasteorema, raíz cuadrada de x por x más veces y y. >> Ahora, para evitar que la inquietud, y puedo mostrarusted lo que esto hace, si no hago esto, si la distancia entre el cursor yel centro de la imagen es inferior a cinco, Yo no voy a mover la imagen. De lo contrario, nos pusimos en la velocidad. Y hemos creado para que ella velocidad será siempre constante. Y el resultado neto de todoeste matemáticas es que la imagen va a avanzar hacia el cursor. >> Ahora, resulta queSDL_GetMouseState, además de establecer lax y argumentos esta opción, también devuelve un int que correspondecon el estado de los botones del ratón. Así que no podemos leer quedirectamente, pero podemos utilizar estas macros, una solaoperador de bits, no es que da miedo, sólo un bit a bit y. Por eso decimos botones, que es el resultadode nuestra SDL_GetMouseState, si eso y bit a bit y, esta macroaquí, SDL_BUTTON_LEFT. >> Así que esto va a resolver simplementeal mapa de bits que corresponde al botón izquierdo del ratón está presionado. Y así, si el bit a bity se produce y es no es cero, lo que significaSe ha pulsado el botón izquierdo, entonces estamos realmente va a negartanto la x y la y velocidades, que acaba de hacer el fuera de control de imagen. Actualizar posiciones. Colisiones detecciones, vistotodo antes, lo que hace, está bien. Hagámoslo. Así que tienes que MLRS = hello7_mouse.c. Excelente. No hay errores. Y juego. >> Así que aquí tengo mi ratón. Y la imagen es de hechopersiguiendo mi ratón. Ahora, en un juego que usted hace, tal vezesto es como una persecución enemiga su pequeño personaje o lo que sea. Pero aquí tenemos laimagen persiguiendo al ratón. Y cuando hago clic en el ratóncomienza persiguiendo la imagen y la imagen eshuyendo de ratón. Así que eso es muy bueno. Y aviso de nuevo, no essiendo la detección de colisiones aquí. >> Así que ese es el pequeño definitivaDemo he puesto aquí. Y vamos a echar un vistazo a una cosa más. Así que de vuelta aquí, he mencionado esto jitter. Correcto. Así que si la distancia es de menos de cinco píxeles,Yo estaba sentado x e y la velocidad a cero. ¿Qué sucede si nos deshacemos de eso? Así que me voy a hacer esto solo. Por favor, disculpe este estilo horrendo,pero comentamos el código correcto. Así que voy a guardar eso y hacer lomismo comando de delante para hacerlo. >> Correcto. Y ahora ¿qué pasa? Bueno. Todavía estamos siguiendo elratón al igual que antes, pero cuando llegamos al ratón,tenemos esta fluctuación bruto. ¿Que esta pasando ahí? Pues bien, en nuestro vectormatemáticas, recordamos que éramos teniendo la distancia entre elcursor y el centro de la imagen? Bueno, como que se acerca0, comenzamos a conseguir al igual que este tipo de comportamiento locodonde la imagen es una especie de como oscilando alrededor del cursor. Y eso es la creación de esta fluctuación. Y eso es muy feo. Y es probable que no lo hacequiere que sus juegos de hacer eso, a menos que sea algún tipo de efecto especial. >> Así que es por eso que tenemossólo por esta arbitraria cortamos de cinco píxeles, donde decimossi se trata de un plazo de cinco píxeles, estamos bien. No necesitamos para mover la imagen más. Así que eso es lo que está pasando allí. >> Así que eso es prácticamente todo. Ahora ya sabe cómo crearuna ventana, cargar una imagen, dibujar una imagen a la ventana, obtenerentrada de teclado, obtener la entrada del ratón, hay un montón de otrasde entrada que no lo haría saber como llegar si usted acaba de pasar unaunos minutos mirando documentación. Así que realmente tiene un buenpocas herramientas a su disposición ahora para escribir un juego en toda regla. >> Ahora, cada juego necesita un poco de audio,pero la documentación de audio también es bastante bueno. Y estoy dispuesto a apostar que siusted entiende todas las cosas hemos hablado hoy conlas imágenes y las superficies, las ventanas, y todo, entoncesaveriguar la API de audio no es va a ser tan malo. Así que espero verlo que creas con SDL.

Noticias relacionadas