@Afafks123132132165

Почему шарик застревает в стене?

Шарик иногда застревает в стене, что делать?
#include <SFML/Graphics.hpp>

using namespace sf;

float dx = 0.7;
float dy = 0.7;
float x = 0;
float y = 0;
int main() {
	Clock clock;
	CircleShape shape(32);
	RenderWindow window(VideoMode(320,480),"Game");
	while(window.isOpen()){
	    float time = clock.getElapsedTime().asMicroseconds();
	    clock.restart();
	    time = time/3000;
		Event event;
		while(window.pollEvent(event)){
			if(event.type == Event::Closed)	window.close();
		}
		shape.setPosition(x,y);
		x+=dx*time;
		y+=dy*time;
		if(x + 64 > 320.0 || x < 0.0)
		{
			dx = -dx;
			//dy = -dy;
		}
		if(y + 64 > 480.0 || y < 0.0)
		{
			//dx = -dx;
			dy = -dy;
		}
		window.clear();
		window.draw(shape);
		window.display();
	}
	return 0;
}
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
У вас тут переменная кадровая частота. Если за длинный кадр шарик ушёл далеко за стенку, короткий кадр его не сможет вытащить наружу и снова инвертирует скорость — шар застрял. (Я это с лёгкостью повторил функцией Windows 10 «Aero Shake»).

В простейшем случае — определять, за какую стенку шар выскочил, и давать ему скорость такую, чтобы он возвращался в площадку. А не просто vx=−vx, независимо от того, куда эта скорость смотрит.

Также стоит ограничивать длительность кадра, и если он, например, продлился больше 0,2 с — пусть игра в такой ситуации «запнётся». Случилось что-то нехорошее, и не хочется, чтобы всё слетело с катушек со своих позиций.

Также надо давать float time = clock.restart().asMicroseconds(); Сейчас компы быстры и погрешность незначительна, но всё-таки.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Можно корркетировать не только вектор скорости но и координату. Это спасёт шарик от сингулярностей.

if(x + 64 > 320.0) {
  dx = -dx;
  x = 320.0;
} else if (x < 0.0) {
  dx = -dx;
  x = 0.0;
}

if (y ... e.t.c.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы