Ruch postacią

0

Witam, otoz mam problem, pisze gre i nie potrafie zaprogramowac ruchu jednostajnie przyspieszonego po okregu, przy czym srodkiem okregu jest myszka. Jesli chodzi o kat to normalnie go wyliczam i ustawiam statek w kierunku myszki, wiec musze tylko dobrze wyliczac punkty na okregu. Mecze sie z tym juz dosc dlugi czas i dalej nie wiem, jak to zrobic, a chcialbym to w koncu zrozumiec :/ . Moglby mi ktos to wypisac w punktach? Jak ja to widze:

1.przyspieszenie katowe jest w tym ruchu stale, wiec wybieram sobie jakas wartosc
2.predkosc liniowa na poczatku = 0 (predkosc liniowa jest potrzebna do ustawienia limitu szybkosci poruszania sie)
3.obliczam predkosc katowa koncowa = predkosc katowa poczatkowa + stale przyspieszenie katowe * czas
4.wyliczam pozycje x i y
x=Rcos(predkosc katowa koncowa * czas)
y=Rsin(predkosc katowa koncowa * czas)
5.obliczam sobie predkosc liniowa ze wzoru predkosc katowa koncowa * R

0

Wygląda poprawnie, sprawdź w jakich granicach masz predkosc katowa koncowa bo jeżeli ona jest blisko granicy 2*Pi to masz problem ze zbyt dużą prędkością lub zbyt małą rozdzielczością czasową.

0

Mam cos takiego:

void Player::accelerate(sf::Vector2f mysz, String key, float t) //to to czas klatki 0.01
{
	

	Vector2f norm = mysz - spaceship.getPosition();//Counting the vector between the mouse and sprite
	float rot = atan2(norm.y,norm.x);// counting the rotation (angle)
	predkosc_katowa_poczatkowa=rot/t;
	predkosc_katowa_koncowa=predkosc_katowa_poczatkowa+przyspieszenie_lub_opoznienie_kątowe*t; //rad/s
	float r = static_cast<float>(sqrt((norm.x - spaceship.getPosition().x)*(norm.x - spaceship.getPosition().x) + (norm.y - spaceship.getPosition().y)*(norm.y - spaceship.getPosition().y))); // promiec od myszki do statku
	
	v = predkosc_katowa_koncowa*r;

	if(key=="A") // ruch jednostajnie przyspieszony do lewej
	{
		
		float xN = static_cast<float>(r*cos(predkosc_katowa_koncowa*t));
	    float yN = static_cast<float>(r*sin(predkosc_katowa_koncowa*t));
		vx -= xN;
		vy += yN ;
		spaceship.move(vx,vy);
		
	}
	
	else if(key=="W") // tu normalnie do przodu
	{
		float ankle= rot * 180.f/M_PI;//conversion to degrees
	    ankle += 90; // adding to work normally 
		float xN = static_cast<float>(5 * sin(( ankle * M_PI ) / 180.0 ));
	    float yN = static_cast<float>(5 * cos(( ankle * M_PI ) / 180.0 ));
		vx += xN * 0.02f;
		vy -= yN * 0.02f;
		spaceship.move(vx,vy);
		
	} 

Nastepnie w Player.update mam

 Vector2f norm = mysz - spaceship.getPosition();//Counting the vector between the mouse and sprite
	float rot = atan2(norm.y,norm.x);// counting the rotation
	rot = rot * 180.f/M_PI;//conversion to degrees
    rot += 90; // adding to work normally 
	spaceship.setRotation(rot);
	
	spaceship.move(vx,vy);
	//vx = vx - vx * 0.002f*10;//slowing down
	//vy = vy - vy * 0.002f*10;

Niestety nie dziala, po nacisnieciu A wyrzuca mi statek od razu prawie poza ekranem.
Nie wiem tez, jak pogodzic zwalnianie do przodu i do boku, bo do przodu to normalnie zmniejszam szybkosc, ale w lewo nie mozna chyba tak, bo te mnozenie

 0.002f*10

spowoduje, juz nie bedzie ruchu po okregu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1