Hello.
Sorry for my Ingles.Estoy trying to integrate Box2d in SFML 2.3, and I'm having trouble adding physical my character, which in this case would be a box.
The character appears and Showing the position by the command console does not fall by gravity, which could not be the error.
Personaje.h
#pragma once
#include <Box2D/Box2D.h>
#include <SFML/Graphics.hpp>
class Personaje
{
public:
Personaje(b2World& World);
Personaje();
void run(sf::RenderWindow& window);
private:
sf::Vector2f m_Size;
b2Body *m_pBody;
b2PolygonShape polyShape;
b2FixtureDef fixtureDef;
b2BodyDef bodyDef;
};
Personaje.cpp
#include "Personaje.h"
#include "config.h"
#include <stdio.h>
#define PPM 64.0f //PIXELS POR METRO
#define MPP (1.0f/PPM) //METROS POR PIXEL
Personaje::Personaje(b2World& world)
{
m_Size = sf::Vector2f(50.0f, 50.0f);
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(50.0f, 50.0f);
m_pBody = world.CreateBody(&bodyDef);
polyShape.SetAsBox(50.0f/2*MPP, 50.0f/2*MPP);
fixtureDef.shape = &polyShape;
fixtureDef.friction = 0.2f;
fixtureDef.restitution = 0.3f;
fixtureDef.density = 0.7f;
m_pBody->CreateFixture(&fixtureDef);
}
void Personaje::run(sf::RenderWindow& window)
{
sf::RectangleShape person(m_Size);
person.setOrigin(m_Size.x / 2, m_Size.y / 2);
person.setFillColor(sf::Color::Green);
float angle = m_pBody->GetAngle();
b2Vec2 pos = m_pBody->GetPosition();
person.setPosition(pos.x * PPM, pos.y * PPM);
person.setRotation((angle * 180) / PPM);
window.draw(person);
}
EscenarioPrueba.h
#pragma once
#include <SFML\Graphics.hpp>
#include <SFML\Audio.hpp>
#include "Box2D\Box2D.h"
#include "Personaje.h"
class EscenarioPrueba
{
public:
EscenarioPrueba();
void run();
private:
sf::RenderWindow window;
sf::Clock clock;
sf::Time time;
};
EscenarioPrueba.cpp
#include "EscenarioPrueba.h"
#include "config.h"
#include "Box2D\Box2D.h"
#define TIMESTEP 1.0f/60.0f //TIEMPO DE REFRESCO
#define VELITER 10 //NUMERO DE ITERACION POR TICK PARA CALCULAR LA VELOCIDAD
#define POSITER 10 //NUMERO DE ITERACIONES POR TICK PARA CALCULAR LA POSICION
#define PPM 64.0f //PIXELS POR METRO
#define MPP (1.0f/PPM) //METROS POR PIXEL
EscenarioPrueba::EscenarioPrueba()
{
}
void EscenarioPrueba::run()
{
//Definir Mundo Box2D (El parametro es la gravedad)
b2World world(b2Vec2(0.0f, 10.0f));
//Definir Suelo Box2D
b2BodyDef sueloBodyDef;
sueloBodyDef.position.Set(400.0f*MPP, 550.0f*MPP);
b2Body* sueloBody = world.CreateBody(&sueloBodyDef);
b2PolygonShape sueloBox;
sueloBox.SetAsBox(800.0f / 2 * MPP, 100.0f / 2 * MPP);
sueloBody->CreateFixture(&sueloBox, 0.0f);
// Crear ventana
sf::RenderWindow window(sf::VideoMode(800, 600), "Prueba Box2D");
window.setFramerateLimit(60); //Hacer que los tiempos de refresco casen con los tiempos de Box2D
// Bucle del juego
while (window.isOpen())
{
// Bucle de Eventos de ventana
sf::Event event;
while (window.pollEvent(event))
{
// Cerrar la ventana cuando se pulsa en el boton de cerrar ventana
if (event.type == sf::Event::Closed)
window.close();
}
// Limpiar ventana con el color negro
window.clear(sf::Color::Black);
//Actulizar mundo Box2D
world.Step(TIMESTEP, VELITER, POSITER);
//Dibujamos a nuestro perosnaje principal
Personaje personaje(world);
personaje.run(window);
// Dibujamos un rectangulo que actuara de suelo mas adelante
sf::RectangleShape rectSuelo(sf::Vector2f(800, 100));
rectSuelo.setOrigin(800 / 2, 100 / 2);
rectSuelo.setPosition(sf::Vector2f(sueloBody->GetPosition().x*PPM, sueloBody->GetPosition().y*PPM));
rectSuelo.setFillColor(sf::Color::Red);
window.draw(rectSuelo); //Dibujamos el elemento en el buffer
// Mostrar el buffer en pantalla
window.display();
}
}
main.cpp
#include "EscenarioPrueba.h"
int main()
{
EscenarioPrueba escenarioPrueba;
escenarioPrueba.run();
return 0;
}
Thank you very much in advance for your help.