Fecha y hora actual: Sábado 18 Ago 2018 02:30
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

[TUTORIAL] Primeros pasos par usar Box2D con SFML (II de II)

Responder al Tema

Índice del Foro > Programación de juegos o videojuegos > [TUTORIAL] Primeros pasos par usar Box2D con SFML (II de II)

Autor Mensaje
unsigned char*
Usuario Activo


Registrado: 03 Abr 2012
Mensajes: 599
Ubicación: Aqui

Mensaje Publicado: Sábado 24 Ago 2013 06:54

Título del mensaje: [TUTORIAL] Primeros pasos par usar Box2D con SFML (II de II)

Responder citando

Este tutorial viene a complementar la primera parte del mismo.

4. DESCARGAR BOX2D
a) Ir a la siguiente web y seleccionar la version pertinente (Seguramente sea 'Box2D_v2.2.1.zip'): https://code.google.com/p/box2d/downloads/list

5. CONFIGURAR CODE::BLOCK PARA USAR Box2D
a) Descomprimir el archivo descargado en nuestra carpeta external [C:\Programacion\MiProyecto\external]

b) Creamos un proyecto nuevo FILE > NEW > PROJECT...

c) En la ventana New from template seleccionaremos Empty project

d) En la ventana Empty project pondremos un titulo al projecto, donde pone Project title: escribimos Box2D
Tambien es necesario indicar donde se guardará el proyecto, en mi caso lo pondre en 'c:\Programacion\MiProyecto'
Pulsamos el boton Next >

En la siguiente pantalla, para nuestro ejemplo solo dejaremos checkeada la opcion Create "Release" configuration
Pulsamos el boton Finish

e) En 'Management' marcamos Box2D y sacamos el menu derecho, seleccionamos Add files recursively...

f) En la ventana Buscar carpeta seleccionamos la carpeta Box2D dentro de Box2D_v2.2.1 de nuestra carpeta external [C:\Programacion\MiProyecto\external\Box2D_v2.2.1\Box2D]

g) En la ventana Multiple selection pulsamos el boton Ok

h) En Management marcamos Box2D y sacamos el menu derecho, seleccionamos Properties

i) En la ventana Project/targets options seleccionamos la pestaña Build targets
Dentro de Selected build target options en donde pone Type: seleccionamos Static library
Pulsamos el boton Ok

j) En Management marcamos Box2D y sacamos el menu derecho, seleccionamos Build options...

k) En la ventana Project build options vamos a la pestaña Search directories y alli vamos a la pestaña Compiler
Añadimos el directorio 'Box2D_v2.2.1' de nuestra carpeta external [C:\Programacion\MiProyecto\external\Box2D_v2.2.1]
Pulsamos el boton Ok

l) Pulsamos el icono del engranaje (en la toolbar) para compilar la libraria

j) En Management marcamos MiProyecto y sacamos el menu derecho, seleccionamos Properties

k) En la ventana Project/targets options en la pestaña Project setting pulsamos el boton Project's dependencies...

l) En la ventana Setup project dependencies marcamos la dependencia Box2D y pulsamos el boton Close

m) En la ventana Project/targets options pulsamos el boton Ok

n) En 'Management' marcamos MiProyecto y sacamos el menu derecho, seleccionamos Build options...

ñ) En la ventana Poject build options vamos a la pestaña Linker settings y en Other linker options: añadimos (con los guiones y respetando las mayusculas):
-lBox2D

Ahora vamos a la pestaña Search directories, vamos a la pestaña Compiler y añadimos el directorio 'Box2D_v2.2.1' [C:\Programacion\MiProyecto\external\Box2D_v2.2.1]
Ahora vamos a la pestaña Linker y añadimos el directorio C:\Programacion\MiProyecto\Box2D\bin\Release
Ya esta todo configurado para usar Box2D, pulsamos en el boton Ok

3. AMPLIANDO NUESTRO PEQUEÑO ENGINE INCORPORANDO BOX2D
a) Modificamos nuestro codigo para integrar Box2D
Código:
  1.  
  2. #include <SFML/Graphics.hpp>
  3. #include <Box2D/Box2D.h>
  4.  
  5. #define TIMESTEP 1.0f/60.0f //TIEMPO DE REFRESCO
  6. #define VELITER 10 //NUMERO DE ITERACION POR TICK PARA CALCULAR LA VELOCIDAD
  7. #define POSITER 10 //NUMERO DE ITERACIONES POR TICK PARA CALCULAR LA POSICION
  8.  
  9. #define PPM 64.0f //PIXELS POR METRO
  10. #define MPP (1.0f/PPM) //METROS POR PIXEL
  11.  
  12. //Estructura con los datos para representar una caja
  13. struct Caja
  14. {
  15. Caja()
  16. {
  17. m_Size = sf::Vector2f(50.0f, 50.0f);
  18. }
  19. Caja(sf::Vector2f size)
  20. {
  21. m_Size = size;
  22. }
  23.  
  24. sf::Vector2f m_Size;
  25.  
  26. b2Body *m_pBody; //Necesario para obtener los datos generados por Box2D para esta 'pieza'
  27. };
  28.  
  29.  
  30. int main()
  31. {
  32. //Vector con las cajas a dibujar
  33. std::vector<Caja> m_vCajas;
  34.  
  35. //Definir Mundo Box2D (El parametro es la gravedad)
  36. b2World world(b2Vec2(0.0f, 10.0f));
  37.  
  38. //Definir Suelo Box2D
  39. b2BodyDef sueloBodyDef;
  40. sueloBodyDef.position.Set(400.0f*MPP, 550.0f*MPP);
  41. b2Body* sueloBody = world.CreateBody(&sueloBodyDef);
  42. b2PolygonShape sueloBox;
  43. sueloBox.SetAsBox(800.0f/2*MPP, 100.0f/2*MPP);
  44. sueloBody->CreateFixture(&sueloBox, 0.0f);
  45.  
  46. // Crear ventana
  47. sf::RenderWindow window(sf::VideoMode(800, 600), "Prueba Box2D");
  48. window.setFramerateLimit(60); //Hacer que los tiempos de refresco casen con los tiempos de Box2D
  49.  
  50. // Bucle del juego
  51. while (window.isOpen())
  52. {
  53. // Bucle de Eventos de ventana
  54. sf::Event event;
  55. while (window.pollEvent(event))
  56. {
  57. // Cerrar la ventana cuando se pulsa en el boton de cerrar ventana
  58. if (event.type == sf::Event::Closed)
  59. window.close();
  60.  
  61. // Crear una caja donde el usuario hace click izquierdo
  62. if (event.type == sf::Event::MouseButtonPressed)
  63. {
  64. if (event.mouseButton.button == sf::Mouse::Left)
  65. {
  66. int randSize = 50 + rand()%(100+1 - 50);
  67. sf::Vector2f posRaton = sf::Vector2f(event.mouseButton.x, event.mouseButton.y);
  68. Caja nuevaCaja = Caja(sf::Vector2f(randSize, randSize));
  69.  
  70. b2PolygonShape polyShape;
  71. b2FixtureDef fixtureDef;
  72. b2BodyDef bodyDef;
  73.  
  74. bodyDef.type = b2_dynamicBody; //Definimos un cuerpo dinamico (afectado por la gravedad y resto de objetos box2d creados)
  75. bodyDef.position.Set(posRaton.x * MPP, posRaton.y * MPP);
  76. nuevaCaja.m_pBody = world.CreateBody(&bodyDef);
  77.  
  78. polyShape.SetAsBox(randSize/2 * MPP, randSize/2 * MPP);
  79.  
  80. fixtureDef.shape = &polyShape;
  81. fixtureDef.friction = 0.2f;
  82. fixtureDef.restitution = 0.3f;
  83. fixtureDef.density = 0.7f;
  84.  
  85. nuevaCaja.m_pBody->CreateFixture(&fixtureDef);
  86.  
  87. m_vCajas.push_back(nuevaCaja);
  88. }
  89. }
  90. }
  91.  
  92. // Limpiar ventana con el color negro
  93. window.clear(sf::Color::Black);
  94.  
  95. //Actulizar mundo Box2D
  96. world.Step(TIMESTEP, VELITER, POSITER);
  97.  
  98. // Dibujamos las cajas creadas por el usuario
  99. for (std::vector<Caja>::iterator it = m_vCajas.begin(); it != m_vCajas.end(); ++it)
  100. {
  101. sf::RectangleShape rectCaja((*it).m_Size);
  102. rectCaja.setOrigin((*it).m_Size.x/2, (*it).m_Size.y/2);
  103. rectCaja.setFillColor(sf::Color::Red);
  104.  
  105. float angle = (*it).m_pBody->GetAngle();
  106. b2Vec2 pos = (*it).m_pBody->GetPosition();
  107.  
  108. rectCaja.setPosition(pos.x * PPM, pos.y * PPM);
  109. rectCaja.setRotation((angle * 180) / M_PI);
  110.  
  111. window.draw(rectCaja); //Dibujamos el elemento en el buffer
  112. }
  113.  
  114. // Dibujamos un rectangulo que actuara de suelo mas adelante
  115. sf::RectangleShape rectSuelo(sf::Vector2f(800, 100));
  116. rectSuelo.setOrigin(800/2, 100/2);
  117. rectSuelo.setPosition(sf::Vector2f(sueloBody->GetPosition().x*PPM, sueloBody->GetPosition().y*PPM));
  118. rectSuelo.setFillColor(sf::Color::Red);
  119. window.draw(rectSuelo); //Dibujamos el elemento en el buffer
  120.  
  121. // Mostrar el buffer en pantalla
  122. window.display();
  123. }
  124.  
  125. return 0;
  126. }
  127.  


b) Hacemos click en el icono del 'play' verde con el engranaje al fondo (en la toolbar) y miramos de que todo funcione correctamente...




++++++++++[>++++++++>++++++++>++++>+++<<<<-]>+++++.>--.<--.>-----.--.+++++++.---------.-.>>++.<<-.+++++.-------.<-.>>++.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
unsigned char*
Usuario Activo


Registrado: 03 Abr 2012
Mensajes: 599
Ubicación: Aqui

Mensaje Publicado: Sábado 07 Sep 2013 03:46

Título del mensaje: Re: [TUTORIAL] Primeros pasos par usar Box2D con SFML (II de

Responder citando

Una pregunta que lanzo asi... al aire...... ¿porque tengo 100 y pico visitas y solo 13 reproducciones del video que demuestra lo aqui se esta realizando?

Malditos bots indexadores......


++++++++++[>++++++++>++++++++>++++>+++<<<<-]>+++++.>--.<--.>-----.--.+++++++.---------.-.>>++.<<-.+++++.-------.<-.>>++.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Usar el control wxWebView de la manera mas simple

Nucleorion C, C#, Visual C++ 1 Viernes 03 Feb 2017 11:26 Ver último mensaje
El foro no contiene ningún mensaje nuevo

LibreOffice y dev c++,¿Se puede usar?

Kaesarus C, C#, Visual C++ 1 Jueves 12 Ene 2017 11:24 Ver último mensaje
El foro no contiene ningún mensaje nuevo

MACRO EXCEL: busquedas sin usar bucles

Alexia Excel 1 Viernes 28 Oct 2016 15:35 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Es posible usar una dll escrita en vc++ que no ...

reeccom Visual Basic .NET 8 Sábado 30 Abr 2016 02:08 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Que hosting aconsejan usar?

seban27 Hosting 1 Martes 09 Dic 2014 21:51 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,