• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ruch sprite/shape po predefiniowanej ścieżce?

0 głosów
338 wizyt
pytanie zadane 26 stycznia 2016 w C i C++ przez dameg Nowicjusz (170 p.)
Witam, mam następujące pytanie, tworze symulację (C++ i SFML) pracy robota mobilnego na magazynie, chciałbym oby po odpaleniu okna programu dany shape/sprite zaczął poruszać się po wcześniej zadanym torze pomiędzy regałami, nie wiem za bardzo jak się do tego zabrać, póki co mam stworzony magazyn oraz klasę robota ale nie wiem jak poruszyć nim w taki sposób jak opisałem wyżej. Jakieś przykładowe linie kodu lub ktoś byłby w stanie wyjaśnić? Pozdrawiam.

3 odpowiedzi

0 głosów
0 głosów
odpowiedź 27 stycznia 2016 przez niezalogowany

Nie wiem na jakim konkretnie efekcie ci zależy, ale załóżmy że ścieżka może być wyznaczona przy pomocy punktów przez które ma przejść punkt, które możesz wrzucić do listy, która będzie się zapętlała, np:

Niech L będzie listą obiektów, A,B,C kolejnymi punktami przez które musi przejść obiekt, 'X -> Y' - relacja mówiąca  tym, że "X wskazuje na Y", tzn

class MyList
{
  Vector2 pos;
  MyList* next;
};


// X -> Y <=>
x.next = y;

Wtedy, wystarczy, że będziesz sprawdzał czy sprite bliżył się do punktu z listy (samo podążanie do punktu możesz zrobić w ten sposób http://szymonsiarkiewicz.pl/poradniki/goto/podazanie-za-obiektem-w-przestrzeni-2d/ ), jeżeli tak to zmieniasz cel za którym ma podążać obiekt na następny.

Psuedokod

class MyList;

// ... <- def MyList


// gdzieś w jakiejś funkcji
MyList* path = new MyList();
path.push( Vector2(0,0) ); // A
path.push( Vector2(0,1) ); // B
path.push( Vector2(1,0) ); // C
path.push( Vector2(1,1) ); // D


/* ścieżka po jakiej będzie poruszał się obiekt


A <-- D
|     ^
|     |
v     |
B --> C

*/

 

0 głosów
odpowiedź 27 stycznia 2016 przez Dash Nałogowiec (29,650 p.)

Swego czasu robiłem mały silnik 2d z możliowością odgrywania scenek. Każda postać miała kolejkę współrzędnych (możesz użyć sf::Vector2f) oraz funkcję która przesuwała postać o kolejną wartość z kolejki. Coś takiego: 

std::queue<sf::Vector2f> path; 

void load(std::queue<sf::Vector2f> & target) 
{
target.push(sf::Vector2f(3,4)); 
target.push(sf::Vector2f(7,6)); 
target.push(sf::Vector2f(3,5)); 
}

// Pętla stałokrokowa 
{


void step()
{
sprite.move(path.front());
path.pop();  
} 



} 

Niestety jest to bardzo niewydajny sposób. Druga wersja działała na zasadzie kireunek i iteracje. Implementacja była by dość długa dlatego tylko opiszę: 

struct mover
{
sf::Vector2f direction; 
int iteration; 
}; 

 Direction to znornalizowany wektor (zakres 0-1) który pokazuje kierunek. Przetrzymujesz wszystko w liście, wpychasz pierwszy element listy do postaci, następnie przesuwasz tyle razy ile wynosi iteration o wektor direction * prędkość postaci. Jeżeli wykonają się wszystkie iteracje, ładujesz kolejny element. 

Podobne pytania

0 głosów
0 odpowiedzi 243 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez niezalogowany
0 głosów
0 odpowiedzi 756 wizyt
pytanie zadane 26 października 2016 w C i C++ przez neos Początkujący (320 p.)
0 głosów
0 odpowiedzi 348 wizyt

93,734 zapytań

142,671 odpowiedzi

323,293 komentarzy

63,295 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...