Wednesday, July 4, 2018

c++ - Why do my Box2D bodies not fall, even though world.step is called?


I have SFML set up with a Box2D world that has gravity, but my bodies won't move. I std::cout'ed the position of the body in the game loop, but it's always at (0, 14)!


No errors or warnings, just no movement when there's supposed to be.


I'm quite new to Box2D, so I'm unsure if I'm doing this correctly. What mistake am I making?



main.cpp:


#include 
#include
#include
#include

#include "Box.h"

sf::RenderWindow window;



int main(int argc, char* argv[])
{
// Initialize stuff here since the things here will only run on startup
b2Vec2 gravity(0, 9.8f);
b2World world = b2World(gravity, true);

// Initialize entities
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0.0f, -10.0f);

b2Body* groundBody = world.CreateBody(&groundBodyDef);

b2PolygonShape groundBox;
groundBox.SetAsBox(50.0f, 10.0f);
groundBody->CreateFixture(&groundBox, 0.0f);

Box box;
box.init(&world, sf::Vector2f(0.0f, 14.0f), sf::Vector2f(15.0f, 15.0f), sf::Color::White);

sf::RenderWindow window(sf::VideoMode(1200, 840), "Title");


while (window.isOpen())
{

sf::Event e;
while (window.pollEvent(e))
{

if (e.type == sf::Event::Closed)
window.close();


}


// Drawing

world.Step(1 / 60, 8, 3);

window.clear();



box.getSfShape().setPosition(sf::Vector2f(box.getBody()->GetPosition().x / 30.0f, box.getBody()->GetPosition().y / 30.0f));
box.getSfShape().setRotation(box.getBody()->GetAngle());

window.draw(box.getSfShape());

//std::cout << "X : " << box.getSfShape().getPosition().x << " Y : " << box.getSfShape().getPosition().y << std::endl;
std::cout << "X : " << box.getBody()->GetPosition().x << " Y : " << box.getBody()->GetPosition().y << std::endl;

window.display();


}

}

Box.h:


#pragma once

#include
#include


class Box
{

public:
Box();
~Box();

void init(b2World* world, sf::Vector2f position, sf::Vector2f dimensions, sf::Color color);


b2Body* getBody() { return body; }
b2Fixture* getFixture() { return fixture; }

sf::RectangleShape getSfShape() { return sfmlShape; }

private:
b2Body* body = nullptr;
b2Fixture* fixture = nullptr;

sf::RectangleShape sfmlShape;


};

Box.cpp:


#include "Box.h"



Box::Box()
{


}


Box::~Box()
{

}

void Box::init(b2World * world, sf::Vector2f position, sf::Vector2f dimensions, sf::Color color)

{
// Creates a body definition
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(position.x, position.y);

// Create the body into the world
body = world->CreateBody(&bodyDef);

// Create the box for the body

b2PolygonShape boxShape;
boxShape.SetAsBox(dimensions.x / 2.0f, dimensions.y / 2.0f);

// Create a fixture for the body
b2FixtureDef fixtureDef;
fixtureDef.shape = &boxShape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
fixture = body->CreateFixture(&fixtureDef);


sfmlShape.setFillColor(color);
sfmlShape.setPosition(body->GetPosition().x / 30.0f, body->GetPosition().y / 30.0f);
sfmlShape.setRotation(body->GetAngle());
}

Answer



1/60 in your world.Step call is an integer division, which truncates toward zero. The world is being told to step by 0 seconds every iteration of the loop, hence nothing moves.


Write 1.0f / 60.0f instead.


No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...