elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / [Avances][¿Qué mas agrego?] DEZCIAN LIB2D - Simple motor de videojuegos en: 1 Enero 2015, 17:14 pm
PUBLICALO EN ELHACKER.NET MOSTRANDO AVANCES, NO HACIENDO SPAM.
Código
  1.  
  2. /*   ________
  3.  *  /\    _  \_
  4.  *  \ \  \  \  \  _______  ________  ________  ________   ________   ________
  5.  *   \ \  \  \  \/\   ___\/\__     \/\   ____\/\__    _\ /\   __  \ /\   __  \
  6.  *    \ \  \ _\  \ \   ___\/_/    /_\ \  \____\/__\   \__\ \  \_\  \\ \  \ \  \
  7.  *     \ \_______\\ \______\/\_______\ \_______\/\_______\\ \__\ \__\\ \__\ \__\
  8.  *      \/_______/ \/______/\/_______/\/_______/\/_______/ \/__/\/__/ \/__/\/__/
  9.  *                                                    DEZCIAN LIB2D - GAME MAKER
  10.  *
  11.  *      Mini-libreria DEZCIAN 2D, funciones y utilidades complementarias para el
  12.  *      desarrollo de videojuegos en 2D. Creado como proyecto personal, no inten
  13.  *      ta competir contra motores de fisica y/o de videojuegos, simplemente son
  14.  *      elementos necesario que voy ocupando con el tiempo y comparto por la red
  15.  *      como agradecimiento. Ya que gracias a la misma han sido posibles algunos
  16.  *      proyectos personales (incluyendo este).
  17.  *
  18.  *
  19.  */
  20.  

Esta es la primera revisión de mi pequeña librería (le queda muy grande el nombre), la cual actualmente incluye elementos muy básicos que he necesitado en el desarrollo de videojuegos. Cabe mencionar que no es una librería gráfica ni mucho menos y que utiliza sólo funciones propias de C++ nativo, por lo que su portabilidad es del 101%, por lo que se puede usar en cualquier sistema y con cualquier método gráfico que nos guste.

Aún es muy simple, pero con el paso del tiempo y lo que valla necesitando pienso agregar más utilidades. Seguiré subiendo avances muy seguido en este mismo post, no sé si este permitido en este foro, pero creo que sí, de cualquier manera, si no lo es, favor de hacérmelo saber .


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

DIRECCIONES DE MOVIMIENTO PREESTABLECIDAS

No hay mucho que decir en esta parte, simplemente la escribí con el fin de no tener que hacerlo en cada nuevo proyecto, y tener un pequeño "estándar". Son simples definiciones de enteros que corresponden a la hora que marcarían las manecillas del reloj en esa dirección.

DIRECTION_UP
DIRECTION_DOWN
DIRECTION_LEFT
DIRECTION_RIGHT



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

EL OBJETO ROOM

NEW_OBJECT_ROOM(int LONGX, int LONGY)
Como en la mayoría de videojuegos. Corresponde a un mundo o mapa. Se declara escribiendo NEW_OBJECT_ROOM seguido de paréntesis y las dimensiones del mundo, posteriormente un espacio y el nombre del objeto.

Sus propiedades internas son las siguientes.

void SET_LONG_OBJECT(int LONG_OBJECT)
Establece el tamaño de los objetos estáticos del mundo, se usa principalmente para detectar de manera  correcta colisiones estáticas y útiles al momento de usar Allegro, SDL, etc.

void CLEAN_FULL()
No queda mucho que decir en esta parte, simplemente limpia todo el mundo, es decir, se borran todos los objetos estáticos.

void NEW_OBJECT_STATIC(int COORDX, int COORDY, char OBJECT_ID)
Su única función es situar algún objeto estático en el mundo, el OBJECT_ID es un carácter, por lo que va entre comillas simples.

int RET_LONGX()
Obtiene la longitud horizontal del mundo.

int RET_LONGY()
Obtiene la longitud vertical del mundo.

char RET_OBJECT(int COORDX, int COORDY)
Obtiene el objeto situado en las coordenadas dadas.

int RET_LONG_OBJECT()
Obtiene la longitud de cada objeto.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

EL OBJETO DINAMICO

NEW_OBJECT_DYNAMIC(int COORDX, int COORDY, int LONGX, int LONGY)
El propósito de este tipo de objeto es crear algún personaje vivo (por decirlo de alguna manera), puede desplazarse, caer, morir, etc.

void CHANGE_VELOCITY(int NEW_VELOCITY)
Cambia la velocidad constante de movimiento.

bool DETECT_COLISION_DINAMIC(NEW_OBJECT_DINAMIC OBJECT)
Detecta colisión con otro objeto dinámico. Tipo bounding box.

void MOVE(int DIRECTION)
Desplaza de acuerdo a velocidad constante, y además, a la dirección que indiquemos con las direcciones de movimiento preestablecidas y gira el objeto a esa dirección.

void GRAVITY_RUN()
Se usa simplemente para aplicar la función de gravedad en el objeto.

void CLEAN_GRAVITY_VELOCITY()
Después de usar GRAVITY_RUN(), se llama esta función para perder la velocidad.

void SET_LIVES(int LIVES)
Se establece el número de vidas.

void UP_LIVES(int LIVES)
Se aumentan las vidas que queramos.

void DOWN_LIVES(int LIVES)
Se disminuyen las vidas que queramos.

int RET_COORDX()
Obtiene posición o coordenada horizontal.

int RET_COORDY()
Obtiene posición o coordenada vertical.

int RET_DIRECTION()
Obtiene dirección actual.

int RET_LIVES()
Obtiene vidas restantes.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

EL OBJETO CAMARA

NEW_OBJECT_CAMERA
Complemento simple pero muy útil si es que deseamos mostrar solo un pedazo de mapa.

void FOLLOW_OBJECT_DINAMIC(NEW_OBJECT_DINAMIC OBJECT, NEW_OBJECT_ROOM ROOM, int WINDOW_LONGX, int WINDOW_LONGY)


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Por el momento es lo único que agrega ya que es lo único que se me ha ocurrido agregar, como ya dije, con el paso del tiempo y conforme necesite nuevas cosas, las iré agregando, de cualquier manera todo tipo de ayuda, consejo, sugerencia es totalmente bienvenido.



Aun no comento el código, para cualquier duda esta el primer post.
Código
  1. #ifndef DEZCIAN_LIB2D_H
  2. #define DEZCIAN_LIB2D_H
  3.  
  4.  
  5. #define DIRECTION_UP   12
  6. #define DIRECTION_DOWN  6
  7. #define DIRECTION_LEFT  9
  8. #define DIRECTION_RIGHT 3
  9.  
  10.  
  11. class NEW_OBJECT_ROOM
  12. {
  13. private:
  14.    int longX, longY, longObject;
  15.    char **universe;
  16.  
  17. public:
  18.  
  19.    NEW_OBJECT_ROOM(int LONGX, int LONGY)
  20.    {
  21.        longX = LONGX;
  22.        longY = LONGY;
  23.  
  24.        universe = new char *[longX];
  25.        for (int i = 0; i < longX; i++)
  26.            universe[i] = new char [longY];
  27.  
  28.        for (int y = 0; y < longY; y++)
  29.        {
  30.            for (int x = 0; x < longX; x++)
  31.                universe[x][y] = ' ';
  32.        }
  33.    }
  34.  
  35.    void SET_LONG_OBJECT(int LONG_OBJECT)
  36.    {
  37.        longObject = LONG_OBJECT;
  38.    }
  39.  
  40.    void CLEAN_FULL()
  41.    {
  42.        for (int y = 0; y < longY; y++)
  43.        {
  44.            for (int x = 0; x < longX; x++)
  45.                universe[x][y] = ' ';
  46.        }
  47.    }
  48.  
  49.    void NEW_OBJECT_STATIC(int COORDX, int COORDY, char OBJECT_ID)
  50.    {
  51.        universe[COORDX][COORDY] = OBJECT_ID;
  52.    }
  53.  
  54.    int RET_LONGX()
  55.    {
  56.        return longX;
  57.    }
  58.  
  59.    int RET_LONGY()
  60.    {
  61.        return longY;
  62.    }
  63.  
  64.    char RET_OBJECT(int COORDX, int COORDY)
  65.    {
  66.        return universe[COORDX][COORDY];
  67.    }
  68.  
  69.    int RET_LONG_OBJECT()
  70.    {
  71.        return longObject;
  72.    }
  73. };
  74.  
  75.  
  76. class NEW_OBJECT_DYNAMIC
  77. {
  78. private:
  79. int coordX, coordY, longX, longY, lives, velocity, velocityGravity, direction;
  80.  
  81. public:
  82. NEW_OBJECT_DYNAMIC(int COORDX, int COORDY, int LONGX, int LONGY)
  83. {
  84. coordX = COORDX;
  85. coordY = COORDY;
  86. longX = LONGX;
  87. longY = LONGY;
  88. velocity = 2;
  89. velocityGravity = velocity;
  90. direction = DIRECTION_DOWN;
  91. }
  92.  
  93. void CHANGE_VELOCITY(int NEW_VELOCITY)
  94. {
  95.    velocity = NEW_VELOCITY;
  96. }
  97.  
  98. bool DETECT_COLISION_DYNAMIC(NEW_OBJECT_DINAMIC OBJECT)
  99. {
  100.    if ((coordX > OBJECT.coordX + OBJECT.longX - 1) ||
  101.            (coordY > OBJECT.coordY + OBJECT.longY - 1) ||
  102.            (OBJECT.coordX > coordX + longX - 1) ||
  103.            (OBJECT.coordY > coordY + longY - 1))
  104.            return false;
  105.        return true;
  106. }
  107.  
  108. void MOVE(int DIRECTION)
  109. {
  110.    if (DIRECTION == 12)
  111.            coordY -= velocity;
  112.        else if (DIRECTION == 3)
  113.            coordX += velocity;
  114.        else if (DIRECTION == 6)
  115.            coordY += velocity;
  116.        else if (DIRECTION == 9)
  117.            coordX -= velocity;
  118.        direction = DIRECTION;
  119. }
  120.  
  121. void GRAVITY_RUN()
  122. {
  123.    coordY += velocityGravity;
  124.    velocityGravity += velocityGravity;
  125. }
  126.  
  127. void CLEAN_GRAVITY_VELOCITY()
  128. {
  129.    velocityGravity = velocity;
  130. }
  131.  
  132. void SET_LIVES(int LIVES)
  133. {
  134.    lives = LIVES;
  135. }
  136.  
  137. void UP_LIVES(int LIVES)
  138. {
  139.    lives += LIVES;
  140. }
  141.  
  142. void DOWN_LIVES(int LIVES)
  143. {
  144.    lives -= LIVES;
  145. }
  146.  
  147. int RET_COORDX()
  148. {
  149.    return coordX;
  150. }
  151.  
  152. int RET_COORDY()
  153. {
  154.    return coordY;
  155. }
  156.  
  157. int RET_DIRECTION()
  158. {
  159.    return direction;
  160. }
  161.  
  162. int RET_LIVES()
  163. {
  164.    return lives;
  165. }
  166. };
  167.  
  168.  
  169. class NEW_OBJECT_CAMERA
  170. {
  171. private:
  172.    int coordX, coordY;
  173.  
  174. public:
  175.    void FOLLOW_OBJECT_DINAMIC(NEW_OBJECT_DINAMIC OBJECT, NEW_OBJECT_ROOM ROOM, int WINDOW_LONGX, int WINDOW_LONGY)
  176.    {
  177.        coordX = OBJECT.RET_COORDX() - WINDOW_LONGX / 2;
  178.        coordY = OBJECT.RET_COORDY() - WINDOW_LONGY / 2;
  179.        if (coordX < 0) coordX = 0;
  180.        if (coordY < 0) coordY = 0;
  181.        if (coordX > (ROOM.RET_LONGX() * ROOM.RET_LONG_OBJECT()) - WINDOW_LONGX) coordX = (ROOM.RET_LONGX() * ROOM.RET_LONG_OBJECT()) - WINDOW_LONGX;
  182.        if (coordY > (ROOM.RET_LONGY() * ROOM.RET_LONG_OBJECT()) - WINDOW_LONGX) coordY = (ROOM.RET_LONGY() * ROOM.RET_LONG_OBJECT()) - WINDOW_LONGY;
  183.    }
  184. };
  185.  
  186.  
  187. #endif
  188.  
  189.  
  190.  
2  Programación / Programación C/C++ / Re: Pasar de c++ a ensamblador en: 31 Diciembre 2014, 21:06 pm
Y por que mejor no usar mingw?

Tan solo hay que ejecutar el siguiente comando.
Código:
   gcc -S -masm=intel proc.c  


Realizar las modificaciones que sean necesarias y después para hacer el enlazado.
Código:
   gcc prog.s -o prog  

http://javiyu.blogspot.mx/2010/05/compilar-codigo-ensamblador-en-formato.html
http://www.iteramos.com/pregunta/14505/como-usas-gcc-para-generar-codigo-ensamblador-en-sintaxis-de-intel
3  Programación / Programación C/C++ / Re: EJERCICIO en: 31 Diciembre 2014, 19:50 pm
Hablar es fácil, enseñame el código
#Linus Torvalds

No se hacen tareas amigo, mejor comentanos en que parte tienes dudas y muestranos tus avances.
4  Programación / Programación C/C++ / Re: Pasar de c++ a ensamblador en: 31 Diciembre 2014, 19:49 pm
Dependiendo de tu compilador existe alguna manera de generar el bytecode busca un poco en internet con el nombre de tu compilador, es muy fácil de encontrar esa información.
5  Programación / Programación C/C++ / Re: ¿C++ sirve para programar videojuegos? en: 31 Diciembre 2014, 16:32 pm
Con todo, y sin querer desanimarte... programar un videojuego "grande" es algo que no hace un programador, ni dos... los equipos de produccion de algunos videojuegos llegan fácilmente a mas de 200 personas.

Programadores de rutinas, scripts, guiones, grafistas, artistas 3D, músicos, especialistas en otros campos... a veces incluso gente que no sabe "hacer la o con un canuto" con un ordenador.

Los casos en los que una persona se curra un videojuego de exito son ya excepciones cada vez mas raras


Amigo, no tienes mucha idea de lo que hablas XD... existen multiples proyectos muy buenos por internet que han desarrollado una o dos personas... Además... todo lo que dices suena a algo muy profesionar como un GTA 5 y para eso obviamente no será posible por uno sólo XD

[edito] Yo de hecho he desarrollado multiples videojuegos y en C++... Soy nuevo en el foro, pero mis próximos proyectos los compartiré aquí en este foro :D
6  Programación / Programación C/C++ / Re: Declarar matriz en una clase y dar dimensiones con metodo constructor en: 31 Diciembre 2014, 16:29 pm
Hola crack81! muchas gracias por tu ayuda, me ha servido mucho... Había intentado algo así pero me faltaba esta parte:

Código
  1. universo=new char*[longitudX]; //crear la primera dimension
  2.   for(int i=0;i<longitudX;i++){
  3.      universo[i]=new char[longitudY]; //<---- Esto me faltaba xD
  4.   }

muchas gracias, doy el tema por solucionado :D
7  Programación / Programación C/C++ / Re: ¿C++ sirve para programar videojuegos? en: 30 Diciembre 2014, 22:09 pm
Jaja amigo! C y C++ es lo mejor para el desarrollo de videojuegos. Y más C++ por la compatibilidad con programacion orientada a objetos.
8  Programación / Programación C/C++ / Re: Codigo de fuente del GTA SA ¿Sera verdad? en: 30 Diciembre 2014, 22:07 pm
Podrá ser un remake o algo así, pero GTA San Andreas original estoy 101% seguro que no...
9  Programación / Programación C/C++ / [Solucionado] Declarar matriz en clase y dar dimensiones con metodo constructor en: 30 Diciembre 2014, 18:30 pm
Citar
Hola! soy nuevo en este foro... ultimamente estoy desarrollando demasiado contenido en C++... Entre mis proyectos tengo una librería de simulación de fisica y algunas otras funciones para el desarrollo de videojuegos... Seguiré pidiendo ayuda sobre nuevas dudas que me surjan en el desarrollo de la misma.

Luego de tanto blabla aqui mi duda... Como puedo hacer que una matriz declarada dentro de una clase obtenga sus dimensiones el metodo constructor (o de que otra forma lo puedo hacer)... No tengo mucha idea de esto, nunca lo habia intentado... Tengo algo como esto y no funciona (como era de esperarse XD)

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class MiClase {
  6. private:
  7.      const int longitudX, longitudY;
  8.      char universo[longitudX][longitudY];
  9.  
  10. public:
  11.      MiClase(int lx, int ly) {
  12.            longitudX = lx;
  13.            longitudY = ly;
  14.      }
  15. }
  16.  
  17. int main() {
  18.    MiClase(4,5);
  19.    return 0;
  20. }
  21.  
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines