Crear un motor.

Publicado por dixon, Noviembre 08, 2022, 08:13:12 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

dixon

Resumen del presente post creado por you.com

Esta web trata sobre el desarrollo de un motor de juego para juegos HTML5. Se discuten los conceptos básicos necesarios para comprender cómo funciona un motor de juego, desde la estructura y el formato de los datos hasta los elementos de diseño y la creación del código. Se describen las principales etapas del desarrollo de un motor de juego, incluyendo la recopilación de datos, la implementación de una interfaz de usuario y la creación de un motor de juego y una aplicación. Además, se discuten los beneficios y limitaciones del uso de un motor de juego y los mejores enfoques para optimizar su rendimiento. Finalmente, se discuten las herramientas y bibliotecas disponibles para ayudar en el desarrollo de un motor de juego.





Voy a indicarles las características que deberá tener el motor cuando esté terminado:

1.    Creación rápida de juegos: No requiere saber programar, solo escoges los diversos objetos de una galería y los pegas en una room.
2.    Publicación inmediata: El sistema podría publicar y alojar al juego inmediatamente en una web especial, ahorrando los minutos que se invierten normalmente para publicar.
3.    Sistema multiplataforma: El sistema tiene pensado crearse con javascript mediante html5 lo que brinda la posibilidad de crear una herramienta capaz de ejecutarse en cualquier sistema, es decir que inmediatamente creado el motor podría ejecutarse tanto en móviles como en pcs, ipads y más.
4.    Juegos multiplataforma: Los juegos igualmente podrían se multiplataforma.
5.    Gratuidad: El sistema deberá ser gratuito.
6.    Libre: El motor se entregará completamente y su sistema interno también sería público para que todos vean cómo funciona y puedan comprenderlo, copiarlo y modificarlo.
7.    Score online y multiplayer online: Implementación sencilla sin programación.
8.    Fusión: deberá contar con un sistema que permita que dos juegos al ser fusionados generen un tercero el cual presenta las características de ambos
9.    Traducción: Con la ayuda del traductor de google u otro, automáticamente pudiese traducirse todos los textos del juego al lenguaje del jugador.

dixon

#1
Hola, saludos a todos.

Quiero ofrecer un poco de información (que puede ser tediosa) sobre los adelantos con respecto al motor.



Imagen del trabajo realizado para el proyecto "motor de video juegos". En esta parte se está intentando crear un simple "notebook", procesador de texto o block de notas que pueda trabajar a la par con el módulo pygame de python. Podemos ver que existen algunas funciones y variables del game maker: keyboard_key, mouse_x, mouse_y, keyboard_string. Se están empleando algunas funciones del game maker dentro de python.


Programando en Python:
El motor debe ser creado en JavaScript para que los usuarios puedan utilizarlo gratuitamente desde una página web, pero por motivos personales me urge dominar python y necesito invertir mi tiempo en aprenderlo, por lo tanto he decidido programarlo en python (aunque python no es tan veloz dibujando polígonos en comparación con JavaScript) para luego volverlo a programar en javaScript. Aunque es un trabajo doble; traerá beneficios para mí y para todos los usuarios.
Existe una forma de ejecutar los proyectos de python directamente en la web usando diversos entornos entre ellos Django, pero para la fecha no sé nada de eso y presento problemas con internet, además confío en que JavaScript es la mejor opción para crear aplicaciones webs inclusive mejor que typeScript (corríjanme si me equivoco).


El concepto de "Clase" en python y javaScript
En el proceso de desarrollo del motor he tenido que aprender el concepto de "clases", cosa que no era relevante en game maker, aunque realmente game maker si usa "clases".

Comparación:
Game maker:
1.    La "clase" seria el objeto que creamos.
2.    Las copias de un objeto son llamadas instancias.
Python:
1.    La clase sería un molde o un modelo para crear objetos.
2.    Los objetos son creados en base al modelo que presenta una clase, es decir que si queremos crear un objeto "carro", tenemos que crear una clase "carro" y luego crearlo llamando a la clase. Seria algo así:
class perro():
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def estado(self, estado):
        self.estado = estado
        if self.estado == "ladrar":
            print("ladrando")
        if self.estado == "comer":
            print("comiendo")
        if self.estado == "correr"
            print("corriendo")

# Luego en esta parte mandamos a crear al perro en una posición.
Perro01 = perro(100,100)


Si nos fijamos bien podemos ver que algo dice "self", bueno eso es simplemente un requisito que debe tener la clase. En javascript no se usa self se usa "this". Realmente no hay que comprender mucho eso porque es solo un protocolo por decirlo de una manera.


Objetivos pendientes:
Para finalizar voy a enumerar solo algunos de los objetivos que tengo que alcanzar para concretar el motor:



Es normal que los objetivos de vallan expandiendo o aumentando.


Chau.

Black_Cat

Saludos Dixon, comentarte algunas cosas:

Ya existen varios motores online para crear juegos, el otro día hablamos en el discord de la ComunidadGM de uno muy particular: https://microstudio.dev/
El cual justamente te permite trabajar con Python. Entre otros lenguajes como Javascript o algo más simplificado como microscript, el equivalente a GML en Game Maker.
Entre las ventajas que enumeramos se puede hacer: 2D y 3D ambos con físicas e incluso juegos online. Se puede usar desde el navegador e incluso varias personas pueden trabajar sobre un mismo proyecto.

Con todo respeto, no veo ocupar tu tiempo en un motor que probablemente no ocupe nadie. Sea por la simplicidad o por la misma razón que los juegos publicados aquí mueren sin pena ni gloria.

No es mi deber decirte qué debes hacer pero yo te recomendaría, que trabajes sobre microstudio dado que acepta la posibilidad de crear plugins con javascript. Podrías en el peor de los casos hacer un wrap de las funciones de Game Maker para mantener la sintaxis pero no lo veo redituable, en tiempo de ejecución.

CitarSi nos fijamos bien podemos ver que algo dice "self", bueno eso es simplemente un requisito que debe tener la clase. En javascript no se usa self se usa "this". Realmente no hay que comprender mucho eso porque es solo un protocolo por decirlo de una manera.
Aquí debo corregirte, no es tan solo un protocolo del lenguaje, se usa para diferenciar los tipos de variables dentro de una clase: variables de clase y variables de instancia.
Siguiendo el ejemplo del perro, una variable de clase es una variable que se comparte entre todas las intancias de una clase.
Si de una clase Perro, se hereda una clase Dalmata, todas las intancias de Dalmata tendrán la raza Dalmata.
Ahora, cada perro tiene su propio nombre: "cachito" , "negrito", "pulgoso". Esas variables únicas para cada instancia, son valga la redundancia, variables de instancias, entonces:

    class Dalmata( Perro):
    raza = "Dalmata" #todos los dalmatas son dalmatas

    def __init__(self, nombre):
        self.nombre = nombre #pero cada dalmata tiene un nombre diferente
El ejemplo es tosco y solo ilustrativo, claro.
Self es un apuntador a la referencia de la instancia misma.


dixon

#3

dixon

Hola a todos.

Microstudio



Black_cat tiene razón, microstudio es un gran sistema para crear video juegos y quizás el mejor actualmente. Me gusta mucho la imagen principal de microstudio en donde aparece un juego parecido a “top gear snes� y realmente quiero programar uno de esa clase.

Programar un motor de video juegos “simple� o simplificado me parece bastante interesante porque me obliga a razonar e inclusive me motiva a mejorar mis hábitos de programador.

Las técnicas que se requerir�an para crear este motor “simple� son muy parecidas a las que necesitar�an los siguientes juegos:
1.   Mario maker.
2.   Juegos de construcción de ciudades.

Por tanto esta experiencia puede prepararme para en algún futuro lograr crear uno de esos.

El block de notas
Crear un simple block de notas es uno de los primeros objetivos y valla que no ha sido fácil. Ayer reprogramé el código desde cero y hoy tengo que ajustarlo un poco más.
La siguiente tabla me permite visualizar  algunos pasos que debo seguir para lograr concretar la creación de un block de notas:




Imagen: primera etapa del draw_text_ext en Python. En esta primera etapa el sistema intenta ajustar el texto a un tamaño espec�fico pero recorta las palabras de manera inadecuada.



Modo de creación:
Posiblemente exista un módulo para Python que pudiese facilitar la creación de cuadros de textos, pero programarlo con pygame me obliga a razonar y eso me combiene. Con lo poco que he aprendido he conseguido comprender algunas técnicas que podré usar para cuando me toque trabajar a fondo con archivos Json. También me he visto obligado a crear un script que me permita tener gran control sobre el teclado y el mouse, cosa que necesitaré bastante cuando comience a crear los scripts que permitirán mover los objetos con teclado y/o ratón. Ahora que me acuerdo voy a necesitar un Joystick, si alguien puede enviarme uno USB se lo agradecer�a, me conviene integrar las funciones del joystick inmediatamente.




dixon

Hola buenas noches,

Aquí en Venezuela son las 7:42pm del día miércoles 16/11/2022 y me encuentro programando la solución al draw_text_ext para hallar la división correcta de las líneas que componen un cuadro de texto.


Esta es la imagen que tengo del script por los momentos.



dixon

Hola mundo.

Son las 9:32pm y ya terminé lo que ser�a un draw_text_ext para python - pygame.





def draw_text_ext(x, y, string, w):
    font_sys = pygame.font.SysFont(font_name, font_size)
    area = font_sys.render(string, True, font_color)
    linea_list = []
    if area.get_width() > w:
        while area.get_width() > w:
            count_x = 1
            copy_x = string_copy(string, 0, count_x)
            area_x2 = font_sys.render(copy_x, True, font_color)
            while area_x2.get_width() < w:
                count_x += 1
                count_previo = count_x
                count_x2 = count_x
                copy_x = string_copy(string, 0, count_x)
                area_x2 = font_sys.render(copy_x, True, font_color)
            # La división correcta.
            c1 = string_copy(string, count_x, 1) != " "
            c2 = len(string) != count_x
            if c1 and c2:
                while string_copy(string, count_x, 1) != " " and count_x > 0:
                    count_x -= 1
                count_x += 1
                if count_x == 1:
                    count_x = count_previo
            else:
                count_x += 1

            index = 0
            count = count_x
            linea_list.append(string_copy(string, index, count))
            index = count_x
            count = len(string)-index
            string = string_copy(string, index, count)
            area = font_sys.render(string, True, font_color)
        linea_list.append(string)
    else:
        linea_list = [string]

    draw_text(x, y, linea_list)

Este codigo trabajará en conjunto con el paquete de script del post: "scripts de otros lenguajes".

Pero esto es solo el comienzo del problema del código, ahora es necesario crear ajustar este draw_tex_ext para que permita saltos de l�nea mediante la tecla Enter, la cual proporciona un carácter de código 13.


Me tardé una hora y media más o menos porque estuve cenando unas arepas con mortadela más o menos como estas.




El tiempo para programar tengo que aprovecharlo al máximo porque queda mucho camino por recorrer.



Ser�a bueno acostarme a dormir para comenzar mañana pero ya me enganché y tengo que aprovechar esta pequeña motivación. Aunque realmente necesito autocontrol para poder dormir temprano y programar mejor. No sé cómo hacen ustedes en esos casos ¿se trasnochan, amanecen o se duermen temprano?.

dixon

Hola, saludos a todos en este nuevo día.

Mantenerme motivado es todo un reto, tengo que imaginar que todo marcha de maravilla, XD.

Ahora bien continuando con el draw_text_ext estos son los retos que tengo hoy para poder concretar el script.



dixon

#8
Hola, buenas noches.

Hoy me dediqué a buscar la solución del draw_text_ext y aunque he obtenido un resultado aceptable, voy a tratar de crear un diagrama del funcionamiento para poder comprender mejor ese sistema.

Realmente invertí todo el día en este simple script y no quedó preciso. Eso me impulsa a buscar estrategias para aumentar precisión, entre ellas crear diagramas de flujo y el pseudocódigo.


Nueva versión del draw_text_ext para Python – pygame.

def draw_text_ext(x, y, string, w):
    global count
    font_sys = pygame.font.SysFont(font_name, font_size)
    if w < font_size:
        w = font_size
    string_x = string_replace_all(string, chr(pygame.K_TAB), chr(pygame.K_SPACE)*8)
    index_x = 0
    count_x = 0
    char_num = len(string_x)
    while char_num > 0:
        copy_x2 = string_copy(string_x, index_x+count_x, 1)
        while copy_x2 == chr(pygame.K_RETURN):
            index_x += count_x+1
            count_x = 0
            copy_x2 = string_copy(string_x, index_x+count_x, 1)

        char_num -= 1
        count_x += 1
        copy_x = string_copy(string_x, index_x, count_x)
        area = font_sys.render(copy_x, True, font_color)
        copy_x2 = string_copy(string_x, index_x+count_x, 1)
        area_char = font_sys.render(copy_x2, True, font_color)
        if interface.keyboard_check_pressed("any"):
            print(copy_x2)
        if area.get_width() > w-area_char.get_width():
            count_previo = count_x
            sumar_x = 0
            while string_x[index_x+count_x-1] != " " and count_x > 0:
                sumar_x += 1
                count_x -= 1
            if count_x == 0:
                count_x = count_previo
                sumar_x += 1

            string_x = string_insert(chr(pygame.K_RETURN), string_x, index_x+count_x)
            index_x += count_x+1
            count_x = sumar_x
            char_num += 1

    list_out = string_x.split(chr(pygame.K_RETURN))
    draw_rectangle(x, y, w, len(list_out)*font_size)
    draw_text(x, y, list_out)

Considero que este script está 75% preciso.

Este es el estado de las metas del draw_text_super.




Retos personales:
Ahora me tengo que enfrentar nuevos retos personales para poder acelerar la producción de scripts.




Bueno, en cuanto a mejorar como programador quisiera agragar que tengo que aumentar mi disciplina y obligarme a dormir temprano.



v: 194

dixon



Hoy quiero reconocer que no estoy listo para crear el mini motor de juegos pero de igual manera voy a seguir adelante porque en estos pocos d�as que llevo con ese proyecto he logrado detectar algunas fallas que tengo como programador y voy a nombrarlas:

1.   Me falta estudio: no he cursado carrera informática, los conocimientos lo he adquirido empÃ�ricamente y aunque puedo enfrentar códigos desconocidos, me falta estudiar más teorÃ�as para quizás buscar soluciones de manera más eficientes.
2.   No sé pseudocódigo: desde mi vaga experiencia en pseudocódigo este puede servir para diseñar los sistemas antes de iniciar la programación, esto facilitarÃ�a el proceso de creación.
3.   No sé diagrama de flujo: El diagrama a mi parecer permite la comprensión de procesos, mediante el uso de gráficos, esto me pudiese servir para poder entender códigos difÃ�ciles.
4.   Falta de disciplina: Me acuesto tarde y me levanto sin energÃ�a, eso me quita la motivación. Reconozco que cuando me acuesto temprano recupero la energÃ�a y me levanto con mucho ánimo y alegrÃ�a. Tampoco tengo disciplina de estudio ni horarios para programar. Si aumentase mi disciplina entonces trabajarÃ�a más eficiente y alcanzarÃ�a muchas metas, no solo de programación, también tengo metas en diseño gráfico y otras muchas más, pero si no me aplico no llegaré lejos.

Una de las cosas que quisiera retomar es la creación juegos de preguntas y respuestas los cuales me pudiesen servir para agilizar la comprensión de algunos temas.
En cuanto al tema del motor de juegos, hoy no tengo código nuevo que compartir porque estuve haciendo otras actividades. Me tocó platicar con un amigo emprendedor y me transmitió su motivación, ahora también reconozco que para estar motivado necesito estar alegre y vivir buscando siempre la paz, de esa manera se me har�a mucho más fácil alcanzar metas y ayudar a otras personas.
Ahora que lo pienso, los video juegos sirven para transmitir alegr�a y felicidad por lo tanto sirve para motivar a las personas.

Bye.

88 Visitantes, 0 Usuarios