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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [+] Juego plataformista en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [+] Juego plataformista en C++  (Leído 2,531 veces)
Regexp

Desconectado Desconectado

Mensajes: 22



Ver Perfil
[+] Juego plataformista en C++
« en: 8 Junio 2015, 19:10 pm »

Buenas, soy nuevo en esta comunidad y hoy quiero traer un aporte. EL siguiente código lo hice hace un par de meses a manera de prueba de SFML y Box2D. Más que un juego completo (niveles, menús, etc), se buscaba aplicar los conceptos básicos de las herramientas antes mencionadas.

SFML: es una librería que proporciona una capa a OpenGL para trabajar gráficos. Además de esto, da también otras características interesantes relacionadas con multimedia (sonido, por ejemplo) y networking (para juegos online). Es open source y además multiplataforma (puede, de hecho, compilarse para Android utilizando las herramientas correspondientes). Pagina principal: http://www.sfml-dev.org/

Box2D: es un engine para simulación física en dos dimensiones, proporciona una serie de características útiles. También es open source y además es multiplataforma. Pagina del proyecto: http://box2d.org/ (Un dato interesante es que es utilizado en varios Game Engines, dado que es muy eficiente en sus algoritmos)

Como funciona: en primera instancia se lleva acabo un paralelismo entre pixeles y metros. Al momento de proporcionar información a los objetos de Box2D se hace la conversión correspondiente, y al dibujar en pantalla se hace exactamente lo mismo.

Qué tener en cuenta del codigo fuente
1. El juego se hizo bajo Windows con Visual Studio, por lo tanto, para compilarlo en otras plataformas habría que hacer un par de cambios menores (una o dos líneas)
2. No es un juego completo, pero pienso que ilustra varios conceptos básicos como la pila de cuerpos de un mundo (Box2D) y los métodos más frecuentes de SFML, como crear sprites, renderizarlos, tomar teclas por pantalla, etc.
3. Para poder compilar es obviamente necesario tener las clases mencionadas arriba, en las páginas oficiales encontrarán información acorde a diferentes IDE y SO.

Enlace de descarga para codigo fuente dado que son varios archivos he decidido ponerlo en mediafire, y aquí, nada más el main.cpp
http://www.mediafire.com/download/0j8ab99e9fyzhkn/pltaformista.tar.gz
El comprimido contiene:
main.cpp
Player.cpp / Player.h (objeto que representa el jugador)
Blocks.cpp / Blocks.h (objeto que representa plataformas)
Constants.h (constantes que se usan a lo largo del resto del código)

Acá el main.cpp
Código
  1. /*   __                          
  2. /  |                        
  3. (___| ___  ___  ___       ___
  4. |\   |___)|   )|___)(_/_ |   )
  5. | \  |__  |__/ |__   / / |__/
  6.  __/         |    
  7.  *
  8.  *
  9.  * Este software se ha dado tal como es, el autor no se hace responsable
  10.  * del uso que le pueda dar el usuario final. Así mismo se da el derecho
  11.  * de editar, distribuir y utilizar el código a conveniencia, siempre y
  12.  * cuando se de crédito al autor.
  13.  *
  14.  *
  15.  */
  16.  
  17.  
  18. #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
  19.  
  20. #include <iostream>
  21. #include <Box2D/Box2D.h>
  22. #include <SFML/Graphics.hpp>
  23. #include <sstream>
  24. #include <ctime>
  25. #include "Constants.h"
  26. #include "Block.h"
  27. #include "Player.h"
  28. #include <stdio.h>
  29. #include <Windows.h>
  30.  
  31.  
  32.  
  33.  
  34. using namespace std;
  35.  
  36. int main() {
  37. sf::Clock clock;
  38. sf::Time time; //Esto es para que el simulador fisico se haga proporcional a los segundos que transcurren por frame
  39. //Inicializamos la camara del juego
  40. sf::View camera;
  41. camera.reset( sf::FloatRect(0,0, (int)width, (int)height) );
  42. camera.setViewport( sf::FloatRect(0, 0, 1.0f, 1.0f) );
  43. float cameraPosition;
  44.  
  45.  
  46. //Inicializacion de Box2D
  47. b2World* world = new b2World(gravity);
  48.  
  49. //Inicializacion del App
  50. sf::RenderWindow App(sf::VideoMode(width, height, 30), "Juego prueba");
  51. App.setKeyRepeatEnabled(true);
  52. App.setFramerateLimit(90);
  53. App.setView(camera);
  54. sf::Event Event;
  55.  
  56.  
  57. Player player(world, 32, 32, sf::Vector2f(30, 30), "playerSprite.png"); //Inicializamos un "jugador"
  58. // Recordar hacer clase nivel/mundo que controle eventos independientemente!
  59.  
  60.  
  61.  
  62. std::vector<Block> bloques;
  63. // Este vector de bloques va a contener plataformas y objetos
  64. sf::Texture grass;
  65. grass.loadFromFile("grass.png");
  66. grass.setRepeated(true);
  67. grass.setSmooth(true);
  68.  
  69. bloques.push_back(Block(world, 3000.0f, 50.0f, sf::Vector2f(-200, height - 50.0f), .5f, false, 0, 0, &grass));
  70. //Esto es un suelo!
  71.  
  72.  
  73. sf::Texture bricks;
  74. bricks.loadFromFile("bricks.jpg");
  75. bricks.setRepeated(true);
  76. bricks.setSmooth(true);
  77.  
  78. bloques.push_back(Block(world, 400.0f, 49.0f, sf::Vector2f(300, 300), .5f, false, .5f, 0, &bricks));
  79. bloques.push_back(Block(world, 400.0f, 49.0f, sf::Vector2f(850, 100), .5f, false, .5f, 0, &bricks));
  80. // Inicializamos algunas plataformas
  81.  
  82. //Agregamos un objeto dinamico...
  83. sf::Texture box;
  84. box.loadFromFile("box.png");
  85. box.setSmooth(true);
  86. bloques.push_back(Block(world, 100.0f, 100.0f, sf::Vector2f(450, 150), .5f, true, .5f,  0.0f, &box));
  87.  
  88. //Inicializamos el fondo del escenario (estatico)
  89. sf::Texture bgTexture;
  90. bgTexture.loadFromFile("desert.png");
  91. bgTexture.setSmooth(true);
  92.  
  93. sf::Sprite bgImg;
  94. bgImg.setTexture(bgTexture);
  95. bgImg.setPosition( sf::Vector2f( 0, 0 ) );
  96.  
  97.  
  98. // Game loop
  99. while (App.isOpen())
  100. {
  101. clock.restart();
  102. // Manejo de eventos
  103. while (App.pollEvent(Event))
  104. {
  105. // Si cierra la ventana se cierra el juego
  106. if (Event.type == sf::Event::Closed)
  107. App.close();
  108.  
  109. // Eventos de teclado
  110. if (Event.type == sf::Event::KeyPressed)
  111. {
  112. //Todo esto se puede cambiar por un switch! recordar cambiar!!
  113. if (Event.key.code == sf::Keyboard::D)
  114. player.Run("right");
  115.  
  116. if (Event.key.code == sf::Keyboard::A)
  117. player.Run("left");
  118.  
  119. if (Event.key.code == sf::Keyboard::W)
  120. player.Jump();
  121.  
  122. }
  123.  
  124. if (Event.type == sf::Event::KeyReleased)
  125. player.Stop();
  126.  
  127.  
  128. }
  129.  
  130. //Limpia Pantalla
  131. App.clear();
  132.  
  133. // DIbuja fondo del escenario
  134. App.draw(bgImg);
  135.  
  136. // Dibuja objetos
  137. for (int i = 0; i < int(bloques.size()); i++)
  138. {
  139. App.draw( bloques[i].GetShape() );
  140. }
  141.  
  142. //Dibuja el player
  143. App.draw( player.GetSprite() );
  144.  
  145.  
  146.  
  147. //Los muestra en pantalla
  148. App.display();
  149.  
  150. // Hace update fisico al mundo
  151. time = clock.getElapsedTime();
  152. world->Step(time.asSeconds(), velocityIterations, positionIterations);
  153.  
  154.  
  155. for (int i = 0; i < int(bloques.size()); i++)
  156. {
  157. bloques[i].Update();
  158. }
  159. player.Update();
  160. player.UpdateSprite();
  161.  
  162. // Movemos la camara para que tenga de centro al objeto player!!
  163. cameraPosition = player.dimentions().x + player.screenPosition().x - width/2;
  164. if (cameraPosition < 0)
  165. cameraPosition = 0;
  166.  
  167. camera.reset( sf::FloatRect( cameraPosition, 0, (int)width, (int)height ) );
  168. App.setView(camera);
  169. // Ponemos el fondo donde se pueda ver....
  170. bgImg.setPosition( sf::Vector2f( cameraPosition, bgImg.getPosition().y ) );
  171.  
  172. }
  173.  
  174.  
  175.  
  176. return 0;
  177. }
  178.  


Screenshot

El bloque que está arriba, puede empujarse, caer, etc.. y luego usarlo como plataforma. El resto de las plataformas no se mueven, son estáticas.

Bueno, eso es todo por ahora, acepto sugerencias y críticas. Si hay algunas personas interesadas, haré un tutorial (o más) detallado(s) sobre este tema.

Saludos  ::)


En línea

No todo el que deambula está perdido
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [+] Juego plataformista en C++
« Respuesta #1 en: 8 Junio 2015, 19:14 pm »

te recomiendo probar angel engine 2d :P seguro te ayuda mucho! ya que une todas las librerías y resume codigo... alguna vez lo usé y te resume mucho trabajo en relacion a SFML

http://angel2d.com/


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: [+] Juego plataformista en C++
« Respuesta #2 en: 8 Junio 2015, 20:16 pm »

se ve interesante, gracias por el aporte  :laugh:
En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: [+] Juego plataformista en C++
« Respuesta #3 en: 8 Junio 2015, 21:22 pm »

Todos aquellos que empiezan en el foro deberían de dejarse de mensajes como "ayuda jackear wifi del vecino" y hacer aportaciones desde el mensaje 1 XDDD

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Regexp

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [+] Juego plataformista en C++
« Respuesta #4 en: 12 Junio 2015, 19:05 pm »

Me alegra que les haya gustado. Si necesitan ayuda para probarlo/compilarlo solo avisen por acá. En linux es muchísimo mas facil poner a funcionar el Box2D y el SFML. Quizá sea la mala costumbre que te da Windows de querer configurar siempre los IDE para cualquier cosa por pequeña que sea. Ultimamente en linux me ha gustado más compilar directamente por consola con bash o con CMake.

te recomiendo probar angel engine 2d :P seguro te ayuda mucho! ya que une todas las librerías y resume codigo... alguna vez lo usé y te resume mucho trabajo en relacion a SFML

http://angel2d.com/

Lo tendré en cuenta engel lex, hay varios proyectos interesantes por ahí que se pueden realizar. Investigaré sobre ello, gracias ;)


Saludos
En línea

No todo el que deambula está perdido
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Un juego MMORPG Asiatico, Juego Gratuito
Juegos y Consolas
enrikesz 0 2,788 Último mensaje 6 Octubre 2009, 05:46 am
por enrikesz
[Juego] Juego muy adictivo que arme, les juro que es divertido.
Programación Visual Basic
79137913 5 4,281 Último mensaje 1 Octubre 2010, 15:30 pm
por 7omer
Conoces este juego? A que nivel has llegado? El Juego mas dificil del mundo « 1 2 »
Juegos y Consolas
jdc 12 16,673 Último mensaje 28 Septiembre 2012, 22:46 pm
por Bomb-P
[duda] Sobre un juego online de juego flash
Juegos y Consolas
Senior++ 6 5,945 Último mensaje 28 Junio 2011, 08:49 am
por тαптяα
Para juego C++ a juego para iphone
Programación General
lluk 5 2,607 Último mensaje 12 Agosto 2012, 14:05 pm
por lluk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines