Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4193 miembros registrados.
El último usuario registrado es Godot.

Nuestros miembros han publicado un total de 85222 mensajes en 12132 argumentos.

Videojuegos desde Cero

Ver el tema anterior Ver el tema siguiente Ir abajo

Videojuegos desde Cero

Mensaje por Metalero el 2010-02-13, 16:15

Videojuegos desde Cero


Escribo este tutorial orientado mas que nada a aquellas personas ineteresadas en poder salirse del tipico maker, y comenzar una etapa nueva desarrollando videojuegos.

Primero que nada me gustaria comenzar un poco con los conceptos básicos.

¿Qué es un videojuegos?
Spoiler:

Segun Wikipedia:

"Un videojuego (del inglés video game) o juego de video es un programa informático creado para el entretenimiento, basado en la interacción entre una o varias personas y un aparato electrónico que ejecuta dicho videojuego; este dispositivo electrónico puede ser una computadora, un sistema arcade, una videoconsola, un dispositivo handheld o un teléfono móvil."

En pocas palabras, es un simple programa que ejecuta un juego (supongo que todos sabemos lo que es un juego) en un aparato electronico.

¿Como funciona un videojuego?
Spoiler:

Bueno, basicamente un videojuego, consta de un bucle de tres fases basicas:

Input (Entrada, interaccion jugador->maquina)
Process (Procesamiento logico)
Ouput (Salida, interaccion maquina->jugador)

Para la fase de Input-Ouput, es necesario SI O SI poder controlar hardware (teclado, mouse, joystic, placa de video, monitor). Y para ello se necesita programar en un lenguaje capaz de hacer esto.

Normalmente, esto es solo posible mediante lenguajes de nivel medio-bajo (aquellos mas cercanos a la maquina que al humano), ya que los lenguajes de alto nivel suprimen la caracteristica del manejo de DIRECTO hawdware para hacerlo mas sencillo. Esto no significa que no se puedan hacer juegos con lenguajes de alto nivel, si no que el manejo de hawdware es interno del lenguaje (por ejemplo, ruby esta escrito en C, y es C quien se encarga del manejo de hardware)

Es muy comun que un juego posea las fases de acceso a hardware escrito en un lenguaje de bajo-medio nivel (normalmente C/C++, con algunas partes de assembler) y la fase del procesamiento logico, en un lenguaj de alto nivel, como ruby, LUA, Pyton, etc.

Manejo de Hardware
Spoiler:

Si bien un lenguaje de nivel bajo-medio puede acceder al hardware, esto no significa que sea sencillo, pero el problema mayor radica en que, cuando uno trabaja sobre el hardware, surgen problemas de incompatibilidades, ya que no todas las placas y dispositivos son iguales, y trabajan de la misma forma.

En la PC, normalmente quien se encarga del acceso directo al hardware es el S.O. (Sistema Operativo), aunque no siempre es asi.
Por lo tanto tenemos la incompatibilidad por hardware (casi solucionada con el S.O.) y la compatibilidad de S.O.
Esto hace que haya gente que cree librerias capaces de evitar esas incompatiblidades, y sobre todo, hacer el manejo de hardware un poco mas abstracto y sencillo.

Son la llamadas librerias multimedia.

Una de ellas (sobre la cual voy a hablar) es la SDL (Simple DirectMedia Layer). Una libreria hecha por programadores expertos orientada principalmente al desarrollo de Video Juegos, aunque sirve para desarrollar software multimedia en general.

¿Que nos brinda SDL?
Spoiler:

SDL nos ofrece 7 subsistemas basicos para desarrollar un videojuego:

VIDEO

Subsistema encargado del manejo grafico de la PC. Incializacion de video y modos graficos, cargas de imagenes desde disco, manejo de superficies, alpha, etc.

AUDIO

El subsitema de audio que nos da SDL es un acceso de muy bajo nivel al hardware de audio.

TIMERS

Gracias a este subsietema podemos lograr "pausas" necesarias, por ejemplo, para manter el juego a velocidad constante, independientemente de la velociadad de procesador en que se ejecuta.

EVENTOS

Este subsitema nos da interaccion, brindandonos datos sobre la entrada mas que nada.

JOYSTIC

Aqui no hay mucho misterio. Con este subsitema podemos leer los datos obtenidos de uno o mas joystics.

CD ROM

Aca lo mismo. Esto nos da lo necesario para poder tener acceso a los datos de CD ROM.

THREADS

Los threads, o "hilos" son procesos paralelos al proceso central. Es decir, que con esto obtenemos un programa multitarea.

3RD Party Libraries

Son librerias adicionales que se acoplan perfectamente a SDL, y sirven para mejorar ciertas cosas.

SDL_image : permite la carga de diferentes formatos (SDL solo brinda carga de imagenes BMP) como PNG, JPG, TIF
SDL_mixer : esta libreria nos alivia a la hora de trabajar con sonido. Permite cargar, reproducir, pausar, dar fade in-out, etc. a varios formatos de audio tales como WAV, MP3, MID, OGG.
SDL_ttf : esta libreria nos da varias funciones simples para cargar y mostrar textos en pantalla.
SDL_net : sirve para un facil manejo de redes.
SDL_gfx : nos permite crear figuras primitivas, y nos da algunas funciones para tratamiento de iamgenes como rotacion y escalacion.

Pantalla
Spoiler:

Bueno algunos lo sabran, otros no, pero la pantalla no es mas ni menos que una superficie rectangular de puntos de colores, llamados pixels (picture element). Cada pixel (en monitores color) esta formando por 3 puntos, los cuales son los 3 colores primarios aditivos : Red (Rojo), Green (Verde), Blue (Azul), es decir el famoso RGB. A partir de la mezcla de estos tres colores, se forman todos los demas colores.

Si hablaramos de un sistema analaógico (totalmente), como la television (antes de digitalizarla) es posible obtener una cantidad infinita de colores, ya que no existe un limite para cada valor de los tres colores.

Pero la computadora trabaja digitalmente, y los valores son digitalizados, es decir, contabilizados, entonces existe un limite: la cantidad de valores que puede tomar cada punto de color primario.

Aqui es donde entra otro parametro en las imagenes de computadora, y es la profundidad de color. Este parametro nos indica cuantos bits, son reservados para representar un pixel. Mientras mayor sea la cantidad de bits, mejor es la imagen, pero peor es el rendimiento y el peso de la misma.

En la practica no hay muchas profundidaes stadard:

8 Bits= 256 Colores, se usa una paleta indexada con cada color (expresado en RGB), y la imagen esta formada solo por un 8 bytes cada pixel. De esta forma, si en nuestra paleta el color con indice 0 (cero) es el color negro. Todos aquellso pixeles con valor 0, seran negros.

16 Bits = 65.536 colores. Aqui ya no existe la paleta. Con 16 bits existen dos modos: 5 - 6 - 5, y 4 - 4 - 4 - 4.
En el primer modo, se dan 5 bits para el rojo, 6 para el verde (el ojo humano es mas sensible al color verde), y 5 al azul.
El en segundo modo, se dan 4 para cada color,y 4 mas para un 4º parametro llamado Alpha (luego hablaremos de esto)

24 Bits (Color real) = 16.777.216 colores. Aqui se dan 8 bits para cada color.

32 Bits (Color real) = exactamente igual a 24 Bits, pero reservando 8 bits para el canal Alpha.

Diseño
Spoiler:

Antes de comenzar a programar un juego, es necesario tener en mente que se quiere hacer. Y aunque no es necesario dejar sentado cada detalle del mismo, es conveniente tenerlo bien armado. Lo digo por esperiencia, por que yo no suelo hacer esto, y arranco con un idea al aire, y luego me encuentro con serios problemas de diseño, y termino putenadome a mi mismo por no haber hecho un buen diseño antes.


Tipo de juego

Lo elemental es definir que tipo de juego sera (Plataformas, RPG, Naves, Lucha, etc). Luego pensar el sistema de juego, ya que no todos los juegos de lucha son iguales, y lo mismo para los PRGs, Naves, etc.

Una vez que se tiene planeado como sera el jeugo, empieza la parte tecnica, que son las fases del jeugo, objetos, etc.

Vamos con un ejemplo.
Supongamos que quiero hacer un juego tipo PONG (si ya se que esta re quemado, pero si no la explicacion es demasiado extensa)

Nos preguntamos ¿Como será el juego?

-Tenemos una "cancha", donde dos rectangulitos (paletas) juegan a una especie de ping - pong.
-La pelota rebota contra los bordes de arriba y de abajo.
-Si toca uno de los bordes horizontales (derecha o izquerda), es un punto para el jugador del lado contrario. La pelo se reseta y el jugo comienza de nuevo.
-Al hacer 20 puntos alguno de los jugadores, el jeugo termina, teniendo como ganador a este jugador.


Listo, bastante simple y estupido no?

Bueno vamos a agrgarle algo mas interesante:

-Cada X numero de rebotes, la pelota cambia a un color aleatorio, y segun este color, a la primera paleta que toque, le cambia algo (tamaño, velocidad, etc)
-Luego la pelota vuelve a su color original.


Ahora debemos hacer el diseño minusioso.

Entonces vamos a definir cada objeto (observen que lo llamo OBJETO) y sus propiedades, y todas las demas cosas que contiene nuestro programa.

Código:

Paleta:
.grafico
.posicion x
.posicion y
.velocidad
Código:

Pelota:
.grafico
.posicion x
.posicion y
.velocidad
.direccion
Código:

Jugador:
.Paleta
.puntos
.estado alterado
.mover paleta arriba
.mover paleta abajo
Como podemos ver, la paleta y la pelota son muy parecidos. Es mas para cualquir grafico tenemos ciertas propiedades.
Entonces podemos crear un objeto llamado Sprite

Código:

Sprite:
.grafico
.x
.y
Y luego

Código:

Paleta <- Sprite:
.velocidad
Código:

Pelota <- Sprite:
.direccion
.velocidad

A muchos les parecera familiar. Esto nos nada mas ni nada menos que un bocetos de clases, de un lenguajes orientado a objetos.

Programacion orientada a objetos
Spoiler:

Bien, queria explicarles lo anterior de un modo "practico" antes de hablarlo en forma teorica.

En la programacion orientada a objeto (que desde ahora llamaré POO), el componente clave es la CLASE.
Una clase intenta imitar la estructura y comportamiento de un objeto.
Vamos con un ejemplo:

Tengo 2 objetos: Un Televisor, y una Radio.
A la hora de crear un objeto, solo basta con ver sus propiedades, y comportamientos:
Código:

Televisor:
//Varaibles
.Marca
.Tamaño[3] // alto, ancho, profundo
.Color
.Pulgadas
.Tipo de pantalla // 0 = lana, 1=  "ovalada" (no recuero como se llama))
.Tipo de tecnologia // 0 = TRC, 1 = LSD,  2 = Plasma
.Cantidad de Canales
.Canal Actual
.Volumen Maximo
.Volumen Actual
.Prendido //0 = apagado,  1 = prendido
.Estado // 0 =TV, 1 = CATV, 2 = AV
//Funciones
.Prender
.Apagar
.Subir Volumen
.Bajar Volumen
.Cambiar Canal(numero)
.Subir Un Canal
.Bajar Un Canal
.Cambiar a TV
.Cambiara a CATV
.Camvbiar a AV
FIN

Listo, como ven es extensa, pero sencilla, y facil de entender.
Ahora la radio.

Código:

Radio:
//Varaibles
.Marca
.Tamaño[3] // alto, ancho, profundo
.Color
.Cantidad de Estaciones
.Estacion Actual
.Volumen Maximo
.Volumen Actual
.Prendido //0 = apagado,  1 = prendido
.Estado // 0 =AM, 1 = FM
//Funciones
.Prender
.Apagar
.Subir Volumen
.Bajar Volumen
.Subir Una Estacion
.Bajar Una Estacion
.Cambiar a AM
.Cambiara a FM
FIN

Recuerdan lo que hicimos con los sprites? que como todas las imagenes sigen un patron, se ahce un clase base, y luego las clases con esas propiedades la usan, y agrgan sus propiedades especiales.

Eso se llama herencia. Una clase "base" o madre, posee las carectiristicas basicas de su especie, y sus clases "heredadas" o hijas, toman todas esas propiedades, y le agrgan cosas nuevas. De esta forma uno se ahorra muchas cosas. Imaginenlo como una platilla de dibujo.

Entonces en este caso, podriamos hacer una clase que sea por ejemplo : "Equipos con audio", donde tengan las propiedades, de tamaño, color, prender y todo eso que es comun en ambas clases, y luego lo que es diferente, es propie de las calses heradadas.

Esta tarea se las dejo a ustedes de diseñar.

Manos a La Obra
Spoiler:


A partir de ahora vamos a trabajar practicamente. El lenguaje usado sera C++. Asi que desde aqui yo asumo que saben programar en C++ (exceptuando lo referido a POO, que ire explicando). Cualquier cosa referida al lenguaje que no entiendan, lo pueden buscar en google, donde hay muchisima información.

Para crear un clase, son necesarias dos partes. La cabecera (.h) donde se declara la calse y todos sus elementos. Y el cuerpo donde se implentan las funciones.

Vamos con un ejemplo sencillo, vamos a crear la clase televisor.

Antes que nada debemos poner un "seguro" para evitar multiples declaraciones de la misma clase

Código:

#ifndef TELEVISOR
#define TELEVISOR

//Aca va la clase

#endif //TELEVISOR

Con esto estamos diciendo que si el macro TELEVISOR no fue declarado, se delcare y se declare la clase, con lo cual no prodra ser declarada nuevamente.

Una clase tiene un cuerpo asi:
Código:

class Televisor{
  public:
  //varaibles y funciones publicas, pueden ser accedidas desde cualquier lado
  protected:
  //varaibles y funciones protegidas, pueden ser accedidas solo desde la mima clase y sus derivados (como clases heradadas)
  provate:
  //varaibles y funciones provadas, solo pueden ser accedidas desde la misma clase
};

Metanse en la cabeza ese punyo y coma luego de la llave de cierre, por que es comun olvidarla, y el erro que se obtiene no es muy entendible que digamos.


Entonces la cabecera deberia quedarnos asi:

Código:

#ifndef TELEVISOR
#define TELEVISOR

//Includes necesarios


class Televisor{
  public:
  char *marca;
  int tamaño[3]; // alto, ancho, profundo
  char *color;
  int pulgadas;
  int pantalla; // 0 = lana, 1=  "ovalada" (no recuero como se llama))
  int tecnologia; // 0 = TRC, 1 = LSD,  2 = Plasma
  int canal;
  int volumen;
  bool prendido;
  int esatado; // 0 =TV, 1 = CATV, 2 = AV
  //Funciones
  void prender();
  void apagar();
  void subir_volumen();
  void bajar_volumen();
  void cambiar_canal(int numero);
  void subir_canal();
  void bajar_canal();
  void cambiar_tv();
  void cambiar_catv():
  void cambiar_av();
 
  protected:
  int ncanales;
  int max_volumen;
 
  private:
 
};

Herencia

Bien vamos a "heredar" las clases.

Tenemos la clase base base "Equipos Con Audio":

Código:

#ifndef EQ_AU
#define EQ_AU

//Includes necesarios


class Equipos_Audio{
  public:
  char *marca;
  int tamaño[3]; // alto, ancho, profundo
  char *color;
  int volumen;
  bool prendido;
  //Funciones
  void prender();
  void apagar();
  void subir_volumen();
  void bajar_volumen(); 

  protected:
  int max_volumen;
 
  private:
 
};

#endif //EQ_AU

Entonces para heredar una clase, la sintaxis es bastante simple:

Código:

class heredada : [tipo] base{
}

En heredada va en nombre de la clase hija, en tipo va public (todas las funciones y varaibles de la clase base se mantienen en su rango), protected (las funciones y varaibles publicas son ahora protegidas) o private (todo lo de la calse base es privado). Y en base va el nombre de la clase base.

Quedando:

Código:


#ifndef TELEVISOR
#define TELEVISOR

//Includes necesarios
#include Equipos_Audio.h//no olviden incluir la clase base

class Televisor : public Equipos_Audio{
  public:
  int pulgadas;
  int pantalla; // 0 = plana, 1=  "ovalada" (no recuero como se llama))
  int tecnologia; // 0 = TRC, 1 = LSD,  2 = Plasma
  int canal;
  int esatado; // 0 =TV, 1 = CATV, 2 = AV
  //Funciones
  void cambiar_canal(int numero);
  void subir_canal();
  void bajar_canal();
  void cambiar_tv();
  void cambiar_catv():
  void cambiar_av();
 
  protected:
  int ncanales;

  private:
 
};

Polimorfismo

Polimorfismo, es hacer que una cosa posea varios comportamientos diferentes. En la practica es crear una misma funcion que tenga varios comportamientos diferentes (segun que parametros se le pasen). Esto se logra gracias a las conocidas "funciones sobrecargadas" de C++.

Vamos con un ejemplos sencillo, vamos a crear una una funcion polimorfica, para poder obtener o setear una variable de clase (por ejemplo el canal, en caso de que la variable canal fuera privada y solo pudieramos leer su valor por medio de esta funcion).

Código:

void canal(int numero);
int canal();

void canal(int numero){
  canal = numero;
}

int canal(){
  return canal;
}

Continua...


Última edición por Metalero el 2010-02-20, 20:34, editado 8 veces

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1716

Gracias : 99

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Celio Hogane el 2010-02-13, 17:48

Perdon mi ignorancia, pero, A donde se supone que quieres llegar con esto?
avatar
Celio Hogane
Principiante
Principiante

1/3

Créditos 663

Gracias : 4

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Metalero el 2010-02-13, 18:06

Como dice el titulo, Crear un juego desde cero.

La idea es enseñar de forma facil, a aquellas personas que allan incursionado en C/C++ a utilizar SDL, y aprender las nociones basicas de como diseñar un videojuego, ya que no basta solamente saber programar en C/C++ y saber usar SDL, si no que hay que tener un minimo conocimiento sobre como se comprta un videojuego, de que forma estructurarlo, etc.

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1716

Gracias : 99

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por logos el 2010-02-13, 18:40

Bueno creo qeu todos los que llevamos bastante en esto del maker siempre hemos pensado en llegas mas alla y hacer un videojuego desde cero, me parece muy interesante el manual que das de seguro le será util a alguien, yo tambien deseo hacer un videojuego desde cero, pero ya me decidi por al parte grafica xD haber si me alio con un programador en un futuro para hacer un jueguito de plataformas que sierrpe he soñado.
avatar
logos
Veterano
Veterano

0/3

Créditos 1670

Gracias : 60

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por orochii el 2010-02-13, 19:00

Excelente teoría Metalero xD, son datos básicos para la programación.
También hay que decir que el modo 32bits es exclusivo para la tarjeta gráfica (sea integrada o "externa") y la aceleración por software como DirectX , ya que el monitor trabaja a 24bits y no puede hacer procesamiento de imagen (el valor alpha es un valor "ficticio"). Aunque me parece que estaban haciendo ya monitores con esa capacidad o algo así.

Si me equivoco, me corriges, porque si no olvido algo se me hacen enredos xd, suerte,
Orochii Zouveleki
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6689

Gracias : 337

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por znl el 2010-02-13, 19:08

Pues tiene que ser una cosa complicadisima pero si sabes se llegan a hacer barbaridades.

Muchisimas gracias por currarte el post Metalero ^^
avatar
znl
Aventurero
Aventurero

0/3

Créditos 1589

Gracias : 58

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Metalero el 2010-02-13, 19:33

Bueno, en realidad los monitores son analogicos (los que usan la ficha de 15 pines, conector VGA) y por lo tanto la salida de la placa tambien. Esa señan analogica transporta los pulsos de sincronismo, y los 3 colores.

El canal alpha, no es un color, y no tiene representacion por si mismo, ya que el color resultante dependera de la imgen que se encuentra atras. Luego les voy a explicar como funciona esto (mediante unas cuentas que consegui luego probar bastante)

El tutorial no esta completo, y mientras tenga tiempo lo voy a ir completando

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1716

Gracias : 99

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Rido el 2010-02-13, 19:40

Tengo una pregunta. ¿Este tutorial lo vas a poner en formato pdf con los avances que vayas haciendo? Me explico, ahora mismo no me interesa el tutorial, pero dentro de unos meses, sobretodo en verano, voy a estar interesado en echarle un ojo, y mi pregunta es si más adelante lo subirás en pdf con todo, más que nada para leerlo continuado sin comentarios de usuarios por medio (véase este comentario xD).

Me parece una idea genial, un saludo tío.
avatar
Rido
Aventurero
Aventurero

0/3

Créditos 7986

Gracias : 40

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Metalero el 2010-02-13, 20:20

No creo que por ahora que lo haga en pdf, pero nos mala idea para mas adelante.

Igual esoty haciendolo lo mas organzado posible para que sea comodo de leer.

Y voy a tratar de meter lo mas posible dentro de un mismo post, y asi sucesivamente. Asi que no creo que sea molesto de leer.

Igual siempre podes pedirme el .txt en donde lo escribo, aunque no vas a tener colores ni nada esta todo junto XD

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1716

Gracias : 99

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Rido el 2010-02-14, 00:11

Si vas actualizando el post (cosa que no había pensado haciendo alarde de mi estupidez) entonces perfecto, es para poder tenerlo todo juntito :D:D
avatar
Rido
Aventurero
Aventurero

0/3

Créditos 7986

Gracias : 40

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Lurch el 2010-02-14, 03:18

muy interesante trabajo, Metalero. Sería grato que avanzaras con este post.

Saludos

Atte, Lurch.
avatar
Lurch
Principiante
Principiante

0/3

Créditos 441

Gracias : 0

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Metalero el 2010-02-20, 20:35

Actualizado, ni bien termine el capitulo de "manos a la obra" (de POO) ya arrancariamos a programar el PONG

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1716

Gracias : 99

Volver arriba Ir abajo

Re: Videojuegos desde Cero

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.