Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





raylib - Librería en C para APRENDER programación de videojuegos

Iniciado por raysan, 19 de Diciembre de 2013, 08:02:10 PM

« anterior - próximo »

raysan

Hola a todos,

Rescato este viejo post para anunciar una nueva versión de raylib.

Tras 8 meses de trabajo, he publicado raylib v1.3. Sin duda es la mayor actualización de la librería desde su creación e incluye un montón de novedades:

- Soporte para Shaders: Aplicables a modelos 3d o a postprocesado, con una sencilla interfaz de uso. Además se incluye una pequeña colección de shaders de postprocesado listos para usar (tanto en version GLSL 330 como version 100).

- Soporte múltiples formatos de Texturas: El módulo de texturas ha sido enormemente mejorado, no solo se pueden cargar nuevas extensiones.dds, .pkm, .ktx, .astc, .pvr; demás se puede escoger el formato interno de las texturas: GRAYSCALE, R5G6B5, R5G5B5A1, R4G4B4A4... DXT1, DXT3, DXT5, ETC1, ETC2, ASTC, PVRT...

- Módulo de Cámaras: Un nuevo módulo que incluye una serie de cámaras predefinidas para su uso: FREE, ORBITAL, FIRST_PERSON, THIRD_PERSON

- Módulo de Gestures: Un nuevo módulo que incluye soporte de múltiples gestos para dispositivos táctiles (Android, HTML5). Util para detectar TAP, DOUBLE-TAP, HOLD, DRAG, SWIPE_RIGHT...

- Modulo raygui: Un nuevo módulo para la creación de GUIs en modo immediato (IMGUI). Util para la creación de tools multiplataformas sin dependencias externas. Todavía en fase experimental pero totalmente funcional.

- Cientos de cambios y mejoras por todo el código

Además se han revisado y añadido +20 nuevos ejemplos de código mostrando todas las nuevas funcionalidades (http://www.raylib.com/examples.htm).

Podeis descargar raylib desde: http://www.raylib.com/
o desde GitHub: https://github.com/raysan5/raylib

También se ha añadido en la web un nuevo foro donde los estudiantes pueden consultar sus dudas y enseñar sus juegos: http://www.raylib.com/forum/index.php?p=/categories

Como siempre, todo feedback es bienvenido!

Saludos,

Ray

megamarc

Buenas!

Impresionante trabajo el de tu librería, muy completa y de uso directo. Como autor de otra librería gráfica, aunque muy diferente a la tuya en enfoque (http://www.stratos-ad.com/forums/index.php?topic=16970.0), sé lo difícil que es llevar un proyecto personal adelante. Aparte de la librería en sí están los ports, los ejemplos, la documentación en línea... mucho trabajo! Así que te felicito. Además comparto tu interés por la programación "espartana", me crié con el BASIC de Spectrum y luego el Turbo C (no C++) de Borland. Ahora tiro mucho de notepad++ y mingw/gcc. Me parece muy bien que lo defiendas, cada vez más gente piensa que crear un videojuego consiste en utilizar algún tipo de entorno "point and click" lleno de asistentes sin escribir una línea de código (tipo GameMaker). Estas herramientas están muy bien como punto de entrada, pero nunca sustituirán a la flexibilidad ni la eficiencia de un buen programador.

Quería comentarte algunas cosas:

Me he bajado el proyecto master de github para compilarlo en Android (precisamente ahora estoy en la labor de portar el mío a Android y ya tengo JDK, SDK, NDK, Ant...) pero la carpeta raylib/template_android donde supuestamente está el proyecto no existe, ni he encontrado rastro de los fuentes del wrapper JNI. No sé si se trata de un error o lo has dejado fuera expresamente por algún motivo. No obstante sí que he encontrado los binarios precompilados.

Conoces Python? A pesar de que yo soy sobretodo programador de C, Python me parece muy adecuado para la programación de juegos, más incluso que C. C es sistemas: punteros, acceso directo a los datos en memoria, y máximo rendimiento. Imprescindible para crear librerías de bajo nivel. Pero no es interactivo y el proceso compilación/depuración a veces es tedioso, sobretodo sin un buen debugger. Python en cambio es abstracción, sintaxis limpia, y el modo inmediato desde consola es genial para probar cosas de forma interactiva (al estilo BASIC). Por ello escribí un wrapper para utilizar mi motor en C desde Python. Abrir una consola, escribir una orden y ver el resultado inmediatamente en la ventana gráfica asociada no tiene precio. Tu raylib, orientada a la enseñanza, es carne de cañón de la interactividad que ofrece python. Te has planteado lanzar un wrapper? Podría echarte una mano, si tuviera más tiempo te lo haría yo mismo pero eso es algo que no puedo prometer...

Nadie ha comprobado si compila en linux o si hay que tocar el makefile? O ya lo tienes resuelto pero no está en el proyecto master todavía?

Un saludo,
Marc

raysan

Hola megamarc!

Muchas gracias por tus palabras y enhorabuena por Tilengine, un trabajo impresionante! Recuerdo haber visto el post en algún momento por el foro pero no había podido verla con detalle... Como comentas, el enfoque es diferente a raylib pero veo que tiene similitudes y que hay mucho esfuerzo puesto en ella; los ejemplos son muy espectaculares, que nostalgia cuando los veía! La web y la API reference están genial!

Solo un detalle sobre los samples, al intentar ejecutarlos directamente desde samples/win32 me pedía Tilengine.dll y SDL2.dll (era de esperar), pero casi todos los ejemplos se quedaban colgados; he deducido que no encontraba los recursos necesarios en la misma carpeta. También he echado de menos el código fuente de la librería... ;)

Sobre lo que me comentas de la compilación de raylib para Android, utiliza los mismos src que la versión escritorio, raspberypi o html5. Simplemente facilito el proyecto (o llamale makefile) C:\raylib\raylib\src_android\jni\Android.mk que hace referencia a las fuentes de C:\raylib\raylib\src y genera la librería que puedes encontrar en C:\raylib\raylib\templates\android_project\jni\libs\libraylib.a.
Ese mismo proyecto en templates: C:\raylib\raylib\templates\android_project\jni\basic_game.c es un proyecto de android que se puede compilar utilizando el NDK para generar directamente el .APK. Al instalar raylib, se instala Notepad++ portable preconfigurado con un monton de scripts (F6) para recompilar la librería o el proyecto Android.

Si, conozco Python aunque hace años que no lo utilizo... Escogí C para educación porque me parece básico, atemporal, multiplataforma (incluso microprocesadores) y su conocimiento se puede aplicar a muchísimos otros campos a parte del diseño de videojuegos, sin duda es el primer paso para dar luego el salto a C++ y C#... y básicamente porque creo que todo el mundo debería aprenderlo. Se que el proceso de compilación no es fácil, por eso a mis alumnos les facilito una serie de scripts con Notepad++ ya preparados. Respecto la depuración, creo que si el alumno aprende a convivir sin ella y es capaz de buscar sus errores, luego todo es infinitamente más sencillo.

Llevo 2 años utilizando raylib con más de 150 alumnos y hasta ahora ha funcionado excelentemente bien; la mayoría de alumnos, en apenas 40h de clase y empezando desde cero (sin haber escrito una linea de código en su vida), han sido capaces de crear un videojuegos programando a pelo (Notepad++), incluso algunos se han presentado a la Global Game Jam y han finalizado sus juegos con raylib... me parece increíble... y es una muestra de que raylib funciona para educación.

No me había planteado un wrapper para Python (tampoco se como hacerlo) pero todo añadido a raylib es muy bienvenido. :D

Respecto Linux, al parecer había un pequeño error en el makefile que ya esta resuelto en la rama develop de github.

De nuevo, muchas gracias por tu respuesta y tu feedback y enhorabuena por Tilengine!

Saludos,

Ray

megamarc

Hola Ray,

Gracias por tu extensa respuesta y por los halagos a Tilengine  :) No somos muchos por aquí haciendo librerías o motores gráficos multiplataforma... Paso a responderte:

Cita de: raysan en 04 de Septiembre de 2015, 07:22:11 PM
los samples al intentar ejecutarlos directamente desde samples/win32 me pedía Tilengine.dll
Los samples de Tilengine no te funcionan tal cual te lo bajas porque hay que hacer una pequeña instalación previa. Como este es tu hilo, te pongo el enlace al mío donde lo explico con más detalle. Espero que ahora puedas probarlo todo!
http://www.stratos-ad.com/forums/index.php?topic=16970.msg163686#msg163686

Cita de: raysan en 04 de Septiembre de 2015, 07:22:11 PM
También he echado de menos el código fuente de la librería...
Este es un tema recurrente, ejm... El caso es que de momento lo tengo cerrado. No me importaría abrirlo si viera que hay interés en colaborar, o por lo menos que alguien se animara a intentar probarla. Pero como nadie tiene interés en usarla pues no veo en qué me puede beneficiar abrirlo ahora, además ya es gratis sin limitaciones. Pero bueno, el tiempo dirá.

Cita de: raysan en 04 de Septiembre de 2015, 07:22:11 PM
...la compilación de raylib para Android, utiliza los mismos src que la versión escritorio...
Como estoy empezando y voy un poco verducho me había encallado. Echaba en falta la capa JNI. Pero después de profundizar un poco más, he visto que en la carpeta que comentas están los makefiles, he ejecutado el ndk-build y se ha generado sin problemas. También he entendido la ausencia del JNI, daba por hecho (porque es la práctica habitual) que en Android la aplicación principal está en Java y raylib en C nativo, en ese caso es necesario el JNI (como en Tilengine, que sí lo tengo hecho). Pero vosotros hacéis la aplicacion en Android también en C nativo, así que no es necesaria la capa JNI.

Qué bien que tengas a tus alumnos trabajando con raylib, testando, aportando ideas y viendo los proyectos que hacen, tiene que ser gratificante. Ahí me llevas mucha ventaja! En cuanto al uso de C, yo me encuentro divido al respecto. Durante muchos años sólo he programado en C, así que como es el lenguaje que más domino siempre es mi primera opción, y de hecho tanto Tilengine como la mayoría de ejemplos acompañados están en C. El típico caso del herrero que lo arregla todo a martillazos, no porque el martillo sea siempre la herramienta más adecuada sino porque es la que más domina y es eficiente usándola. Pero desde que empecé a conocer otros lenguajes con mayor abstracción me di cuenta de la enorme diferencia entra la programación de sistemas y la de aplicaciones. Hace unos cuantos años también fui profesor en una academia privada, y en el C se estrellaba mucha gente. Pese a ser mi "martillo", hoy en día ya no enseñaría C como primer lenguaje. Por lo que dices tus alumnos son artistas sin formación técnica. No dudo de la calidad de vuestro curso (que tampoco sé qué engloba ni cuáles son las expectativas de los alumnos) ni de los resultados finales, que por lo que dices son muy buenos. Pero se me hace extraño que alguien que no es ingeniero ni tiene intención de serlo, que sólo quiere una herramienta para poder expresar unas mecánicas de juego básicas y plasmarlas en un programa, tenga que empezar por el tedio del bajo nivel, punteros huérfanos, fugas de memoria, desbordamientos, una librería estándar críptica y poco intuitiva... Ojo, que esto no es una crítica, tan sólo una reflexión, no sobre la validez del C (que como lenguaje flexible y universal es totalmente incontestable) sino como la idoneidad de que sea el bautismo para un estudiante de aplicaciones de alto nivel, que bastante les cuesta a los pobres asimilar los conceptos básicos. Y que conste que yo soy el primero que me lo hago todo en C!

Me alegro que tengas resuelto el tema de linux, sino le iba a echar un vistazo porque mi librería ya tuve que portarla así que lo tengo fresco.

Y felicidades por tu enorme trabajo en raylib y por los buenos resultados que os está dando, esa es la mejor recompensa!

Un saludo y ánimo,
Marc

raysan

Hola a todos,

De nuevo, rescato el post original para anunciar raylib 1.4. De nuevo, tras muchas horas de trabajo llega una nueva versión de raylib. Algunas de las novedades de esta versión:

- Una gran novedad es la inclusión de un set de funciones para manipular imagenes: cortar, escalar, coloreado, flip, dithering e incluso dibujado de imagen sobre imagen o texto sobre imagen, todo ello en la CPU y antes de convertir la imagen a textura.

- El sistema de SpriteFonts ha sido mejorado añadiendo soporte para fuentes AngelCode (.fnt) y fuentes TrueType. Ahora el SpriteFont se genera automáticamente a partir del fichero .ttf.

- Nuevo módulo para físicas 2D (physac). Todavía en fase experimental pero completamente funcional, un par de ejemplos incluidos para un plataformas 2D y un sistema de aplicación de fuerzas.

- El módulo raymath ha sido revisado y transformado en un fichero .h (header-only) para mayor portabilidad. Se ha añadido la posibilidad de usar las funciones como inline.

- El módulo de detección de gestos (gestures) ha sido completamente rediseñado para soportar cualquier touch-event, incluso los provenientes de ratón. De este modo podemos crear juegos multiplataforma con la misma base de código.

- El sistema de inputs para Raspberry Pi tambien ha sido rediseñado para utilizar eventos genericos de Linux. Tambien se ha añadido soporte experimental para gamepad.

- Otros añadidos importantes incluyen funciones de raycast para 3D picking incluyendo detección de colisiones entre rayo y esfera/cubo; un par de funciones para guardar/cargar datos desde disco e incluso se ha añadido un pequeño módulo para easings (animación de valores).

- Sin duda, el añadido que más va a interesar a los usuarios van a ser los 8 nuevos ejemplos de código (http://www.raylib.com/examples.htm) y más de 10 ejemplos de juegos (http://www.raylib.com/games.htm) para aprender, incluyendo juegos clásicos como Arkanoid, Asteroids, Missile Commander, Snake, Pang o Tetris.

Muchas horas de trabajo han concluido en esta nueva versión de #raylib.

Podeis descargar raylib desde: http://www.raylib.com/
o desde GitHub: https://github.com/raysan5/raylib

También podeis acceder al foro donde los estudiantes consultan sus dudas y enseñan sus juegos: http://forum.raylib.com

Como siempre, todo feedback es bienvenido!

Saludos,

Ray

XÑA

Uau!! Qué pasada!!!!

He visto que funciona desde tu página Web... ¿Cómo se puede ejecutar el ejecutable? ¿webGL? ¿Cómo portas el código de Ca HTML? ???

raysan

Hola XÑA! Me alegro que te guste!  :)

Si, raylib soporta la compilación del código C directamente a asm.js (http://asmjs.org/). Para ello utilizo emscripten (http://kripken.github.io/emscripten-site/), es la misma tecnología que utilizan otras herramientas como Unity o Unreal en las últimas versiones, aunque raylib es mucho más libiano. Además, en raylib me he limitado a utilizar solo algunas de las funciones de OpenGL ES 2.0 para evitar capas de emulación al transformarse el código a WebGL y obtener así el máximo rendimiento.

En la Wiki de raylib https://github.com/raysan5/raylib/wiki/Compile-your-game-for-Web hay algo más de explicación de como configurar y utilizar emscripten.

Evidentemente, todos los juegos y ejemplos están preparados para compilarse también en Escritorio, Android o Raspberry Pi. ;)



raysan

Hey Gallo! Muchas gracias por el interés! Si necesitáis cualquier tipo de información adicional solo tenéis que pedírmela!


raysan

Hola a todos!

Parece mentira que ya han pasado 2 años y medio desde que empece esta aventura llamada raylib... y sigo rescatando este post... :P

No mas esperas! Tras 5 meses de trabajo desde la última versión, hoy llega raylib 1.5! Esta nueva versión supone un gran rediseño de la librería y llega con increibles novedades:

- Soporte para Oculus Rift CV1 y VR simulado. Probablemente una de las pocas librerías del mercado que permite programar en C de manera sencilla para Oculus Rift CV1, incluyendo soporte para VR simulado; es decir, si no dispones de un dispositivo de VR, simplemente se genera un render en estereo con distorsión simulando las especificaciones del dispositivo seleccionado. Y funciona en todas las plataformas, incluyendo HTML5 y Raspberry Pi!

- Nuevo sistema de materiales. Soporte de materiales para modelos 3D, similar a otras herramientas del mercado, incluyendo soporte para color diffuse-ambient-specular y texturas diffuse-normal-specular.

- Nuevo sistema de iluminación, con soporte para 8 luces configurables de 3 tipos diferentes: point, directional y spot.

- Soporte de gamepad mejorado en Raspberry Pi. Multiple gamepads configurable soportados, realizando la lectura de datos en modo raw en un segundo thread.

- Sistema de físicas 2D mejorado, mucho más sencillo de utilizar y eficiente.

- Soporte para módulos de audio (.xm, .mod) y mezcla de multiples canales de audio.

- Otras mejoras como un sistema de cámara 2D, render a textura y soporte para OpenGL 2.1 en escritorio.

Todo apoyado con nuevos ejemplos de código y un instalador pre-configurado y autocontenido con todas las herramientas necesarias para empezar a desarrollar desde el minuto zero!

Podeis descargar raylib desde: http://www.raylib.com/
o desde GitHub: https://github.com/raysan5/raylib

También podeis acceder al foro donde consultar dudas y enseñar vuestros juegos: http://forum.raylib.com

Como siempre, todo feedback es bienvenido! :)

Gallo

Enhorabuena por esta nueva versión, estas haciendo un muy buen trabajo con esta lib. Una pregunta, el sistema de materiales es un modelo fijo o se puede manipular / extender / reemplazar por uno propio? lo digo para utilizarlo con otros modelos como metalness/roughness (PBR) por ejemplo.

raysan

Gracias Gallo! Esta nueva versión ha supuesto bastante trabajo de rediseño para adaptar la librería al sistema de materiales/luces y al render estéreo para VR! A partir de aquí, espero que sea más sencillo añadir soporte para PBR.

Actualmente el sistema de materiales es fijo a nivel de usuario pero se puede modificar fácilmente a nivel de desarrollador. Simplemente tengo un shader standard (similar al de Unity) que soporta un número de parámetros configurables, básicamente determinados por las structs Mesh (atributos de vertices soportados: position, texcoords, texcoords2, normal, tangent, color)  y Material (parámetros soportados: color diffuse-ambient-specular, mapas diffuse-normal-specular). Todos estos datos los recibe el shader (solo si estan activos, es decir si han sido asignados) y el shader hace todos los cálculos pertinentes, incluyendo iluminación (según luces activas).

Cualquiera puede modificar el shader (o crearse el suyo propio) para hacer cálculos de iluminación más complejos o custom.

Gallo

Ya que mencionas los atributos de vértice te recomiendo añadir la bitangent, y tanto tangent como bitangent calcularlas con la lib de mikktspace, la puedes pillar de aquí: https://github.com/carter2422/blender-ui/tree/master/intern/mikktspace que aparentemente es como un estandar, también se le llaman "synced normals". Estoy buscando algún articulo que lo explique pero solo encuentro posts por ahi en plan "sabiduría popular", es como yo me enteré en el foro de polycount, pero te puedo decir que los programas de modelado y motores como Unity (a partir de la 5.3) o UE4 (a partir de la 4.7) ya lo calculan con esa lib al importar.

raysan

Muchas gracias Gallo! Muy interesante la librería! Sin duda me sera muy útil para cálculos de iluminación más complicados. :)

Como aportación adicional, una librería que justo he encontrado hoy y me parece increíble: https://github.com/ands/lightmapper






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.