Popular channels

Crea tu propio motor gráfico en 2D - Parte 2


Hola a todos , Bueno hoy continuamos con la creación de nuestro propio motor gráfico en 2D
Aviso, Si no leíste la parte 1 probablemente no entiendas nada de esta segunda parte.

Puedes ver la parte uno haciendo Click Aquí


Bueno sin mas que decir, empecemos.



Bien. En la primera parte de este tutorial hicimos lo sencillo que fue crear una ventana usando SDL Pero por desgracia que sea sencillo no significa que sea fácil de usarla y menos a largo plazo, así que para que nuestro motor sea usable y sencillo, vamos a necesitar invertir de nuestro tiempo en puro diseño, Mejor dicho encontrar una estructura de clases que defina nuestro juego como debe ser y que nos permita extender su funcionalidad en cada parte de este tutorial.



Bueno los primeros pasos son estos.
  • Leer el input del jugador.
  • Reaccionar al input del jugador.
  • Actualizar el estado del juego.
  • Mostrar por pantalla el juego.
Estos puntos son conocidos como bucle principal, que si lo quisiéramos hacer en código seria 


  while run do
      input
      update
      render


Pero la solución sencilla seria reescribir nuestro main, para que quede asi


   int main(int argc, char** argv)
   {
     bool run = true;
  
     while (run)
     {
       input();
       update();
       render();
      }


      return 0;
  }


Pero esto tiene un inconveniente el cual es que en cuanto quieras extender tu motor sea un verdadero infierno nuestro motor, Para solucionarlo vamos a crear una clase propia llamada "Game" y en la función quedara reducida a la mínima expresión(Como tendría que ser)


    int main(int argh, char** argv)
    {
       Game game;
       
       Game.start();


       return 0;
   }
Pasamos a definir nuestra clase Game, Esto es importante ya que sera la clase principal sobre donde todo nuestro motor colgara, por lo que es de crucial importancia definiría adecuadamente. Por ahora nuestro juego solo tendrá una ventana y responderemos al imput del teclado, Pero mas adelante añadiremos mas funcionalidad al mismo. Dado que este es nuestro primer acercamiento a motores de videojuegos usaremos un diseño bastante sencillo enfocado en ser comprendido con facilidad y no en que sea el mas correcto o potente.




Sabemos que nuestro juego necesita de una ventana, y esta sera nuestro primer elemento del motor, asi que pasamos a definir la clase Window.


#ifndef   elkadofan_rules
#define  elkadofan_rules


#include
#include


class Window
{
public:
      window(int width, int height);
      virtual -Window();


      void show();
      void hide();
      void render();


private:
     int m_width;
     int m_height;
     SDL_Renderer* m_renderer;
     SDL_Window* m_window;
}


#endif /* defined(elkadofan_rules) */


En la parte anterior vimos la necesidad de SDL_Renderer y SDL_Window. ademas de estos dos, guardaremos el ancho y alto de nuestra ventana, y definiremos los métodos show, hide y render para poder interactuar con la ventana.


#include "window.hpp"
#include


using namespace std;


Window::Window(int width, int height) :
         m_width(width), m_heidht(height)
{


}


Window::~Window()
{
       hide();
}


void Window::show()
{
       if (m_window != nullptr)
      {
            string title;
            int   posX;
            int   posY;
            int WindowType;


            title = ""
////Como en el tutorial pasado, podemos rellenar las comillas con lo que queramos.
            posX = SDL_WINDOWPOS_CENTERED;
            poxY = SDL_WINDOWPOS_CENTERED;
            windowType = SDL_WINDOW_OPENGL;


            m_window = SDL_CreateWindow(title.c_str(), posX, posY, m_width, m_height, windowType);


            int rendererIndex;
            int rendererType;


            rendererIndex = 0;
            rendererType = SDL_RENDERER_ACCELERATED;


            m_renderer = SDL_CreateRenderer(m_window, rendererIndex, rendererType);


       }
}


void Window::hide()
{
     SDL_DestroyRenderer(m_renderer);
     SDL_DestroyWindow(m_window);
}


void Window::render()
{
      SDL_RenderClear(m_renderer);


      SDL_RenderPresent(m_renderer);
}


Bueno eso es todo por ahora, Hasta la proxima parte !
0
2
0
2Comments
project_marp

Eres un Coco.

0
elkadofan

Gracias igual 😄

0
project_marp

@elkadofan Te puedo enviar mensajes por alguna red social?. Quizás me puedas ayudar en unas cosas.

0
emanuelbertey

Lastima usas windows ..no es portable..buen ejemplo

0