Autor
|
Tema: Proyecto de Motor de Juegos (Leído 20,040 veces)
|
~
|
Necesito hacer un proyecto para el que tenga ayuda de varios otros para cada una de sus partes. Se me ocurre que lo primero que tengo que hacer son las primitivas de manejo y dibujado de la pantalla, y los algoritmos básicos sin saltarse. Así que necesito alguien que se encargue de los algoritmos de línea, de círculos, de rellenado, escalado, de color a escala de grises, doble búfer, entre otros que tengo que mencionar aquí. Una vez eso esté listo, necesito gente que me ayude a hacer un de juegos que básicamente defina un conjunto de estructuras para cada personaje. TODO en el juego es un personaje, el fondo, la música, el suelo, etc., pero necesito que me ayuden a definir con código y explicaciones claras. Esos personajes simplemente se actualizan al mismo tiempo en un mismo bucle cada cierto tiempo para un escenario de juego. Unos pueden actualizarse y otros tal vez no. He estado poniendo el código para eso en https://sourceforge.net/projects/api-simple-completa/, como todo lo demás. También necesito que alguien defina cómo definir cada acción como saltar, correr, caerse, etc..., y explique los trucos de cómo se hace en un programa. Necesito que todavía alguien más descifre el Game Programming Crash Course de GameDev.net.
|
|
|
En línea
|
|
|
|
|
~
|
Planeo tener 2 streams MJPEG de mi programación de juegos todo este año. Si les dan clic, pueden ver lo que estoy haciendo en vivo.
Una de las primeras cosas que voy a hacer es transcribir a mano el juego de Mario de MS-DOS poco a poco, en Pascal y en C, para entenderlo y aprender trucos que no sé ahorita.
Por ejemplo, ¿alguien sabe cómo implementar el suelo y objetos para implementar saltar y las demás acciones como correr?
Pueden darme sugerencias de cómo estoy haciendo las cosas, o darme más referencias de estudio.
|
|
« Última modificación: 16 Abril 2023, 05:01 am por ~ »
|
En línea
|
|
|
|
|
Serapis
|
Necesito hacer un proyecto para el que tenga ayuda de varios otros para cada una de sus partes. ...
Así que necesito alguien que se encargue de los algoritmos de ...
Una vez eso esté listo, necesito gente que me ayude a hacer un de juegos que básicamente defina...
Es difíci que así por las buenas alguien vaya a entregar su tiempo, esfuerzos y capacidades por amor al arte... tú pides que la gente te entregue su alma... Lo mejor es que trates de encontrar gente que esté en tu misma inquietud y así poder ayudaros mutuamente, al menos el trabajo queda repartido. Como ambos sois los interesados, ambos podeis colaborar... También necesito que alguien defina cómo definir cada acción como saltar, correr, caerse, etc..., y explique los trucos de cómo se hace en un programa.
2 cosas. A - Las acciones se maneja por teclado manipulando sprites: https://en.wikipedia.org/wiki/Sprite_(computer_graphics) B - Debes realizar algoritmos de detección de colisiones entre sprites: https://en.wikipedia.org/wiki/Collision_detectionUn motor de videojuegos lleva bastante trabajo, pero si uno tiene paciencia y los conocimientos adecuados, sale adelante... No obstante mi recomendación es que simplifiques, haz que funcione y funcione bien, y ya lo irás mejorando con el tiempo. La mejor forma de no acabarlo nunca es imponerte metas muy altas.
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.411
Hackentifiko!
|
A ver, yo quiero: 1- Hacer un videojuego de luchas estilo Megaman, Castlevania, etc, de NES. 2- Hacer un videojuego de olimpiadas estilo (tiene un nombre rarísimo, a ver https://www.youtube.com/watch?v=wrGIAWXY7y42:55 ). 3- Hacer un videojuego estilo Downtown special no sé qué (está en el video, 4:10). Uno de fútbol tampoco estaría mal, pero primero quiero hacer uno de tenis. Creo que están ordenados por facilidad de hacerse, y lo único que hice para esos sería para el 1, aquí puedes ver (busca el 1er código): https://foro.elhacker.net/foro_libre/un_tipo_dice_que_no_se_programar_y_que_lea_un_libro_iquestes_un_troll_o_que_hago_mal-t517472.0.htmlEl tema es que... 1- Tengo muchos proyectos y cosas que me gusta hacer, no dedicaría tanto tiempo a ese "1" que te mencioné. 2- Tú pareces querer hacer un juego típico de plataformas, o al menos mencionas a Mario, no me llama la atención eso, pero has dicho que hasta la música sería un personaje, eso suena muy interesante, así que tal vez quieras hacer algo que me interese, pero en fin. En "1" la pantalla estaría fija, es más fácil de hacer que lo que quieres tú. 3- ¡No te entiendo ni J! No sé lenguaje técnico, no sé lo que es un motor en programación, no entiendo eso de que quieres que alguien se encargue de "pintar" imágenes o algo así, ni qué quieres compilar del ZSNES (¿el emulador?), etc. A mí me interesa un código que haga que el personaje pueda saltar, etc, según qué tecla se presione en ciertos momentos, y me interesa hacerlo con un lenguaje más o menos de alto nivel: Lo de "pintar" no lo hago, copio sprites de otros juegos o si tuviera que dibujar algo lo hago como si dibujara en Paint, se guarda la imagen y se carga cuando se necesita, no uso código para "pintar", eso lo hacía en Clipper, pero ya rre fue xD El emulador que yo sepa se usa para jugar, poner cheats, etc, de compilar ni idea. Además no pareces hablar de un archivo FIG o de roms de SNES sino de PASCAL y no sé qué. 4- No me gusta descargar cosas raras ni entrar a sitios raros. 5- Uso un lenguaje sencillo y prefiero no aprender uno más complicado. 6- Tú pareces hablar mucho de cosas raras, pones muchos links, pero por otro lado dices que quieres que tu colaborador programe ¿entonces qué harás, qué sabes hacer, historias y música? Yo no sé tanto de programación como para hacer todo, si tú sabes menos que yo entonces no le veo mucho sentido a colaborar. En fin, me interesa que colaboremos pero ten en cuenta esas cosas. Uso el programa Macromedia Flash 5, es muy viejo, pero a diferencia de otros flashes tiene el comando save (guarda variables en un archivo, de modo muy simple) y además los más recientes creo que no permiten poner código en películas entonces seguí usando este, que además es más ligero y el código me parece más simple. Otros lenguajes intenté usar pero no me parecieron tan fáciles o visuales o útiles o ligeros. Mira: https://drive.google.com/file/d/1M_R4kkdklUc_u-YRkZJK1RFtYN-4U0qi/view?usp=share_linkTen en cuenta que eso está a medio hacer desde hace años, me puse a programar otro personaje. ¿Te explico más sobre Flash, explicas mejor qué quieres, o qué?
|
|
|
En línea
|
|
|
|
~
|
Sí, sería de explicar todo lo que has desarrollado del tutorial, desarrollar y explicar paso a paso como para que alguien más pueda seguir e implementar su propia versión a partir de eso. Necesitamos hacer una sola tabla estándar de las posiciones de scan codes del teclado, para identificarlas por un número 0-255 (aunque las teclas pueden ser ilimitadas y tener que procesarse de alguna forma extendida). Cada teclado soportado (PS/2 y después USB) tiene que ser independiente para que sea multijugador. Tenemos un objeto teclado por cada teclado. El objeto teclado tiene un puntero a una tabla de funciones por cada tecla para apretar y soltar. Si una tecla tiene valor nulo para el proceso del juego, esa tecla no hace nada. Si apunta a un valor (una función) llamamos esa función al apretar o soltar. Implementamos una función principal que guarda los registros del CPU, y muchas pequeñas funciones que no guardan nada, una por tecla, para simplemente ejecutar lo que contengan de la tabla de funciones, que la función principal se encarga de llamar. Las funciones principales tiene que ser breves como para que no cueste llamarlas con un mismo tipo de puntero, ya solo para ejecutar una acción para un ID de tecla apretada o soltada. Hay que ver si una tecla tiene acciones de apretar/repetir/soltar (make/repeat/break) y solo responder normalmente a apretar y soltar para mantener las banderas de estado del juego. Con eso ni siquiera necesitamos un búfer de teclado, solo detectar las teclas. Lo ideal sería detectar si ya terminaron los scan codes con el bit de estado de comandos o de datos del KBC PS/2, y solo entonces comparar el scan code.
|
|
« Última modificación: 17 Abril 2023, 20:21 pm por ~ »
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.411
Hackentifiko!
|
Sí, sería de explicar todo lo que has desarrollado del tutorial, desarrollar y explicar paso a paso como para que alguien más pueda seguir e implementar su propia versión a partir de eso. El código te lo di en un link, te lo dejo acá: fscommand ("fullscreen", "true"); Player.Facing = 1; Player.Attacking = 0; Player.Action = 1; // 0 crouching, 0.5 startingjump, 1 nothing, 2 walking, 3 falling, 3.5 minjump, 4 jumping. // ///////////////////////////////////////////// // ////////////////// Bond /////////////////// // ///////////////////////////////////////////// function PersControl () { if (Player.Action == 2) { // Si el personaje está caminando. if (Key.isDown(65)) { // Si se presiona A. StartingJump(); } else if (Key.isDown(83)) { // Si se presiona S. Attack(); } else if (Key.isDown(40)) { // Si se presiona abajo. Crouch(); } else if (Key.isDown(39)) { // Si se presiona derecha. FaceRight(); Player._x = Player._x+0.9; } else if (Key.isDown(37)) { // Si se presiona izquierda. FaceLeft(); Player._x = Player._x-0.9; } else { Quiet(); } //FALTA THROW } else if (Player.Attacking == 0) { // Si el personaje no está atacando. if (Player.Action == 1) { // Si el personaje está en reposo. if (Key.isDown(65)) { // Si se presiona A. StartingJump(); } else if (Key.isDown(83)) { // Si se presiona S. Attack(); } else if (Key.isDown(40)) { // Si se presiona abajo. Crouch(); } else if (Key.isDown(39)) { // Si se presiona derecha. FaceRight(); Player._x = Player._x+0.9; Walk(); } else if (Key.isDown(37)) { // Si se presiona izquierda. FaceLeft(); Player._x = Player._x-0.9; Walk(); } //FALTA THROW } else if (Player.Action == 3) { // Si el personaje está cayendo. Player.SpeedY = Player.SpeedY+0.1; MovingJump(); if (Player._y>=554) { // Si el personaje toca el suelo. Player._y = 554; // Acá no debería haber Quiet sino FallEnd o... // depende de la velocidad de la caída??? Quiet(); } //FALTA: AT, THROW } else if (Player.Action == 4) { // Si el personaje está saltando. Jump(); //FALTA: AT, THROW } else if (Player.Action == 0.5) { // Si el personaje está empezando a saltar. if (Key.isDown(39)) { // Si se presiona derecha. if (Player.Facing == -1) { Player.Facing = 1; } Player.SpeedX = 0.9; } else if (Key.isDown(37)) { // Si se presiona izquierda. if (Player.Facing == 1) { Player.Facing = -1; } Player.SpeedX = -0.9; } else { Player.SpeedX = 0; } //FALTA: AT, THROW, Down? } else if (Player.Action == 0) { // Si el personaje está agachado. if (Key.isDown(40)) { // Si se presiona abajo. if (Key.isDown(65)) { // Si se presiona A. StartingJump(); } else if (Key.isDown(83)) { // Si se presiona S. Player.Attacking = 1; Player.gotoAndPlay(124); } } else { Quiet (); } } else if (Player.Action == 3.5) { // Si el personaje está saltando pero aún no llegó a cierta altura. Player.SpeedY = Player.SpeedY+0.1; if (Player.SpeedY<-3) { MovingJump(); } else { // Si el personaje llegó a cierta altura (y perdió cierta velocidad). Player.Action = 4; Jump(); } //FALTA: AT, THROW??? } //¿FALTA: AT, THROW, AG? } } //JUMP, AG WHILE STARTING AT? AFTER? //AG // Otras funciones. function StartingJump () { Player.gotoAndPlay(96); Player.Action = 0.5; } function MovingJump () { Player._x = Player._x+Player.SpeedX; Player._y = Player._y+Player.SpeedY; } function MinJump () { Player.Action = 3.5; Player.SpeedY = -4; MovingJump(); } function Jump () { if (Key.isDown(65)) { // Si se presiona A. Player.SpeedY = Player.SpeedY+0.1; if (Player.SpeedY>=0) { // Si el personaje comienza a caer. Fall(); } } else { // Si se suelta A. Player.SpeedY = 0.1; Fall(); } MovingJump(); } function Fall () { Player.Action = 3; Player.play(); } function Walk () { Player.gotoAndPlay(35); Player.Action = 2; } function Attack () { Player.gotoAndPlay(2); Player.Attacking = 1; Player.Action = 1; } function FaceRight () { if (Player.Facing == -1) { Player.Facing = 1; Player._xscale = 100; } } function FaceLeft () { if (Player.Facing == 1) { Player.Facing = -1; Player._xscale = -100; } } function Crouch () { Player.gotoAndStop(96); Player.Action = 0; } function Quiet () { Player.gotoAndStop(1); Player.Action = 1; } //Player.SpeedX = 0.9*Player.Facing; //Jump();
Algunas cosas están sin hacer o confusas, estoy aprendiendo. Las imágenes es un poco más complicado explicar cómo hacer que aparezcan, pero me parece que depende mucho del programa que uses. Usando Quickbasic o Clipper, no tengo idea cómo hacer lo que puedo hacer con Flash. También he probado algún que otro programa muy poquito y no me parecieron tan visuales y fáciles como él. De nuevo no te entiendo, en el leguaje que uso simplemente pones que si se presiona una tecla se hace X cosa u otra dependiendo de ciertas condiciones, tú hablas de crear una tabla y cosas que ¿son de lenguaje de bajo nivel? Creo que mi Flash no permite jugar en modo multijugador, pero probablemente te convenga usar un lenguaje de más alto nivel.
|
|
|
En línea
|
|
|
|
~
|
¿Y cómo implementar la colisión con cosas irregulares, el suelo, otros personajes, los ataques?
|
|
|
En línea
|
|
|
|
Tachikomaia
Desconectado
Mensajes: 1.411
Hackentifiko!
|
A tanto no llegué. Flash tiene una instrucción que chequea si 2 objetos se están tocando, pero las áreas siempre son rectangulares, por lo que si el objeto no lo es, creo que puede ocurrir que se considere colisión si esas áreas se tocan, aunque los objetos en sí no se estén tocando. Puedes poner varias áreas rotadas si quieres que sea parecido a un área circular ¿no? Pero para objetos con punta hay que poner varias áreas de distintos tamaños, si se quiere algo muy exacto. Yo hice un juego de una "luz" que se agrandaba al tocar triángulos más pequeños que ella, había que esquivar a los que fueran más grandes. Como los triángulos son copias de un mismo objeto, al agrandarlos el defecto del área se hacía más notable. Y a su vez la "luz" tenía sus problemas, y rota. O al menos así lo recuerdo. Acá lo puedes jugar, pero claro, es MUY sencillo, no estaba intentando hacer gran cosa, todo lo contrario. Es un exe, te pasaría un swf pero no creo que puedas abrirlo. https://drive.google.com/file/d/1jUaWkPhwIGpIXXfzFbosa5ivWVKYcLE8/view?usp=sharing// Cambios desde la versión anterior: // - El recovery del riv sólo aumenta cuando pierde naves. // - Arranca con Df similar al player. // - El método para que no siempre agregue naves se basa ahora en rec. // // Resultado: // Demasiado fácil, quizá. // // Funciones pequeñas. function PlayerScale () { Resum = 100+Player.Df/100; setProperty (Player, _xscale, Resum); setProperty (Player, _yscale, Resum); } function NaveRemoval () { NavesDfLeftRecovery = NavesDfLeftRecovery+1; eval(Res+".swapDepths")("Nave"+N); removeMovieClip (Res); setProperty ("Nave"+N, _name, "Nave"+N2); if (N>1) { N = N-1; N2 = N2-1; } } // Inicio típico. Player.Df = 10000; PlayerScale(); N = 0; NavesDfLeft = 9999; NavesDfLeftRecovery = 1; // Gran función. function F2 () { // Increase enemy caster mana. NavesDfLeft = NavesDfLeft+NavesDfLeftRecovery; if (random(NavesDfLeftRecovery/25) == 0) { // Aparece nave. N = N+1; Res = "Nave"+N; attachMovie("Nave", Res, N); NaveDf = random(NavesDfLeft)+1; NavesDfLeft = NavesDfLeft-NaveDf; set (Res+".Df", NaveDf); setProperty (Res, _x, random(799)+1); Resum = 100+NaveDf/100; setProperty (Res, _xscale, Resum); setProperty (Res, _yscale, Resum); } // Movimiento del jugador. Player._rotation = Player._rotation+10; Player.Sp = 1+9/(Player.Df/100); if (Key.isDown(Key.LEFT)) { if (Key.isDown(Key.UP)) { V = Math.sqrt(Player.Sp*Player.Sp/2); Player._x = Player._x-V; Player._y = Player._y-V; } else if (Key.isDown(Key.DOWN)) { V = Math.sqrt(Player.Sp*Player.Sp/2); Player._x = Player._x-V; Player._y = Player._y+V; } else { Player._x = Player._x-Player.Sp; } } else if (Key.isDown(Key.RIGHT)) { if (Key.isDown(Key.UP)) { V = Math.sqrt(Player.Sp*Player.Sp/2); Player._x = Player._x+V; Player._y = Player._y-V; } else if (Key.isDown(Key.DOWN)) { V = Math.sqrt(Player.Sp*Player.Sp/2); Player._x = Player._x+V; Player._y = Player._y+V; } else { Player._x = Player._x+Player.Sp; } } else if (Key.isDown(Key.UP)) { Player._y = Player._y-Player.Sp; } else if (Key.isDown(Key.DOWN)) { Player._y = Player._y+Player.Sp; } // Movimiento de las naves. N2 = 1; do { Res = "Nave"+N2; NaveDf = eval(Res+".Df"); setProperty (Res, _y, getProperty(Res, _y)+1+9/(eval(Res+".Df")/100)); if (Player.hitTest(eval(Res)) == true) { // Contacto. if (Player.Df>NaveDf) { Player.Df = Player.Df+NaveDf/10; PlayerScale(); NaveRemoval(); } else { stop (); } } else if (getProperty(Res, _y)>700) { // Fuera de la pantalla. NaveRemoval(); } N2 = N2+1; } while (N>=N2); }
Es tan simple, o eso parece, pero lo hice de un modo muy complicado, jajaja. ¡caster dice! ¡mana! Jajaja. Es que estaba practicando para hacer un juego en que dos magos convocaran cosas. Mucho Diablo 2 y quizá Fate Stay Night. El suelo no debería ser mucho problema a menos que pongas cosas triangulares o así extrañas, suele ser plano. En el juego que hice hay enemigos, o se pueden considerar disparos, da igual. Toma demasiado tiempo grabar videos y quitar cosas, o copiar imagenes, así que te copio el tutorial sin las imagenes: Detección de colisiones Puede utilizar el método hitTest del objeto MovieClip para detectar colisiones en una película. El método hitTest comprueba si el objeto ha colisionado con un clip de película y devuelve un valor Booleano (true o false). Puede utilizar los parámetros del método hitTest para especificar las coordenadasx e y de un área de impacto en el Escenario, o utilizar la ruta de destino de otro clip de película como área de impacto.
Cada clip de película de una película es una instancia del objeto MovieClip. Esto le permite llamar a los métodos del objeto desde cualquier instancia, como se muestra a continuación:
myMovieClip.hitTest(target); Puede utilizar el método hitTest para comprobar la colisión en un clip de película y un solo punto
Mueva el cursor sobre la forma de la película para comprobar la colisión. Los resultados de hitTest se devuelven en el campo de texto.
También puede utilizar el método hitTest para comprobar la colisión entre dos clips de película.
Para comprobar la colisión, arrastre uno de los clips de película hasta que haga contacto con el otro. Los resultados de hitTest se devuelven al campo de texto.
Para realizar una detección de colisión entre un clip de película y un punto del Escenario:
1 Seleccione un clip de película en el Escenario. 2 Seleccione Ventana> Acciones para abrir el panel Acciones de objeto. 3 Haga doble clic sobre la acción trace en la categoría Acciones de la caja de herramientas. 4 Active la casilla de verificación Expresión e introduzca lo siguiente en el cuadro del mismo nombre: trace (this.hitTest(_root._xmouse, _root._ymouse, true); Este ejemplo utiliza las propiedades_xmouse e _ymouse como las coordenadasx e y para el área de impacto y envía los resultados a la ventana Salida en el modo de prueba de película. También puede establecer un campo de texto en el Escenario para visualizar los resultados o utilizar los resultados en una sentencia if. 5 Seleccione Control > Probar película y mueva el ratón sobre el clip de película para comprobar la colisión. Para realizar la detección de colisión en dos clips de película:
1 Arrastre dos clips de película al Escenario y asígneles los nombres de instancia mcHitArea y mcDrag. 2 Cree un campo de texto en el Escenario e introduzca status en el cuadro Variable opciones de texto. 3 Seleccione mcHitArea y elija Ventana > Acciones. 4 Haga doble clic sobre evaluate en la caja de herramientas. 5 Introduzca el siguiente código en el cuadro Expresiones seleccionando elementos de la caja de herramientas: _root.status=this.hitTest(_root.mcDrag); 6 Seleccione la acción onClipEvent en la ventana Script y elija enterFrame como el evento. 7 Seleccione mcDrag y elija Ventana > Acciones. 8 Haga doble clic sobre startDrag en la caja de herramientas. 9 Active la casilla de verificación Bloquear ratón en el centro. 10 Seleccione la acción onClipEvent en la ventana Script y elija el evento Mouse down. 11 Haga doble clic sobre stoptDrag en la caja de herramientas. 12 Seleccione la acción onClipEvent en la ventana Script y elija el evento Mouse up. 13 Seleccione Control > Probar película y arrastre el clip de película para comprobar la detección de colisión. Si desea obtener más información sobre el método hitTest , consulte el Diccionario de ActionScript. Lo que me parece complicado, entre otras cosas, son las plataformas. El suelo es, lo toca y deja de caer, simple. Pero las plataformas, si el personaje las toca por encima debe quedar encima y sino rebotar hacia abajo o sobrepasarlas si son de ese estilo. Entonces no sé, como dije no llegué a tanto.
|
|
« Última modificación: 10 Junio 2023, 07:06 am por Tachikomaia »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda con proyecto motor
Electrónica
|
eboy
|
3
|
4,736
|
21 Enero 2007, 21:38 pm
por NM9
|
|
|
[PREGUNTA] que motor para juegos me recomiendan, UDK o Unity 3D???
Programación General
|
Noxware
|
2
|
3,923
|
1 Marzo 2014, 01:10 am
por Noxware
|
|
|
Motor juegos C++, openGL y codeblocks
Programación C/C++
|
Desiresportal
|
6
|
7,653
|
10 Marzo 2016, 21:05 pm
por class_OpenGL
|
|
|
Os presento el IscEngine, mi propio motor de juegos (100% C++11 + OpenGL)
Programación C/C++
|
BlackM4ster
|
0
|
2,210
|
26 Febrero 2016, 16:28 pm
por BlackM4ster
|
|
|
Ayuda con el motor de juegos M.U.G.E.N
Programación General
|
Toreto1500
|
0
|
2,734
|
10 Octubre 2018, 00:07 am
por Toreto1500
|
|