mrjbom
@mrjbom

Почему SFML неправильно поворачивает квадрат?

Квадрат падает вверх(box2d делает всё вверх ногами т.к. SFML отсчитывает координаты от верхнего левого угла).

Квадрат падает с углом в 10 градусов, становиться он вроде-бы верно(10 градусов по часовой стрелке), падают они вместе ровно и синхронно.
Однако, квадрат отскакивает от пола не углом, а как будто пол выше, но когда он попрыгает на углах, приземляется он нормально. Проблема в прыжках на углах, они не верны по высоте.

Код
#include <iostream>
#include <SFML/Graphics.hpp>
#include <Box2D/Box2D.h>
#include <Windows.h>

using namespace std;
using namespace sf;

int main()
{
	//в отчёт идёт сверху внихз, левый верхний угол это (0.0)
	RenderWindow window(VideoMode(800, 600), "Box2D + SFML");
	window.clear(Color::Cyan);
	RectangleShape rect;
	rect.setOrigin(25, 25);
	rect.setFillColor(Color::Black);
	rect.setSize(Vector2f(50, 50));
	rect.setPosition(Vector2f(0, 0));


	//устанавливаем гравитацию
	b2Vec2 gravity(0.0f, 50.0f);
	//создаём мир
	b2World world(gravity);
	//создаём определение земли
	b2BodyDef groundBodyDef;
	//устанавливаем позицию, 0 по x и 600 по высоте
	groundBodyDef.position.Set(0.0f, 625.0f);
	//создаём тело земли на основе определения
	b2Body* groundBody = world.CreateBody(&groundBodyDef);
	//создаём фигуру земли
	b2PolygonShape groundBox;
	//делаем её прямоугольником и скрепляем тело с фигурой
	groundBox.SetAsBox(100000.0f, 0.0f);
	groundBody->CreateFixture(&groundBox, 0.0f);


	b2PolygonShape shape;
	shape.SetAsBox(50.0f, 50.0f);
	b2BodyDef bodyDef;
	bodyDef.position.Set(350, 0);
	bodyDef.type = b2_dynamicBody;
	bodyDef.angle = (10.0f * b2_pi) / 180.0; //угол в радианах
	b2Body* body = world.CreateBody(&bodyDef);
	b2FixtureDef fd;
	fd.shape = &shape;
	fd.density = 1.0f;
	fd.restitution = 0.75f;
	body->CreateFixture(&fd);
	while (window.isOpen())
	{
		window.clear(Color::Cyan);
		Event event;
		while (window.pollEvent(event))
		{
			if (event.type == Event::Closed)
				window.close();
		}
		cout << "1:  x - " << body->GetPosition().x << " y - " << body->GetPosition().y << " " << (body->GetAngle() / b2_pi) * 180.0f << "\n";
		world.Step(1.0f / 60.0f, 6, 2);
		rect.setPosition(Vector2f(body->GetPosition().x, body->GetPosition().y)); //позиция
		rect.setRotation((body->GetAngle() / b2_pi) * 180.0f); //угол в градусах
		Sleep(10);
		window.draw(rect);
		window.display();
	}
	return 0;
}

  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы