tBane Temat założony przez niniejszego użytkownika |
Dynamiczna kamera w grze RPG 2D » 2024-05-05 17:05:26 Witam. Potrzebuję stworzyć dynamiczną kamerę, która będzie podążała za graczem, tak jak na poniższym wideo: https://www.youtube.com/watch?v=UnYnvNjGLVY#ifndef Camera_hpp #define Camera_hpp
class Camera { public: float x, y; Camera() { x = y = 0; } ~Camera() { } void setPosition( float x, float y ) { this->x = x; this->y = y; } float get_x() { return x - halfScreenWidth; } float get_y() { return y - halfScreenHeight; } void update( float player_x, float player_y ) { setPosition( player_x, player_y ); } };
Camera * cam; #endif
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-05 17:10:47 Udało mi się zrobić coś takiego. Czy to dobre rozwiązanie ? void update( float player_x, float player_y ) { x +=( player_x - x ) * smoothFactor; y +=( player_y - y ) * smoothFactor; }
|
|
DejaVu |
» 2024-05-05 22:38:14 Czy w taki sposób chcesz przesuwać wszystkie obiekty na scenie? Wydaje mi się, że w SFML-u jest metoda, która umożliwia przestawienie pozycji 'na co patrzy' kamera. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-05 22:52:28 tak, w ten sposób przesuwam wszystkie obiekty: virtual void update() { collider->setPosition( x - cam->get_x(), y - cam->get_y() ); }
To jak pracować z kamerą w SFML'u ? |
|
pekfos |
» 2024-05-05 22:53:57 Wydaje mi się, że w SFML-u jest metoda, która umożliwia przestawienie pozycji 'na co patrzy' kamera. sf::View. void update( float player_x, float player_y ) { x +=( player_x - x ) * smoothFactor; y +=( player_y - y ) * smoothFactor; }
Jeśli zakładasz że wykonuje się to w stałych odstępach czasu, to tak. |
|
DejaVu |
» 2024-05-05 22:54:52 Pytanie do GPT 4: w jaki sposób zmieniać położenie kamery w najnowszym SFML, C++?
virtual void update() { collider->setPosition( x - cam->get_x(), y - cam->get_y() ); }
wydaje mi się, że takie rozwiązanie nie jest najlepszym pomysłem, bo każdemu obiektowi trzeba modyfikować niepotrzebnie pozycję
Odpowiedź: Masz rację, że modyfikowanie pozycji każdego obiektu w grze w celu dostosowania do pozycji kamery nie jest najbardziej optymalnym rozwiązaniem. Lepszą praktyką jest zastosowanie transformacji widoku, czyli tzw. View Transformation w SFML. Dzięki temu możesz manipulować widokiem kamery bez konieczności modyfikacji pozycji każdego pojedynczego obiektu w grze.
Oto przykładowy sposób, w jaki można zaimplementować manipulację kamerą w SFML przy użyciu C++:
1. **Tworzenie i konfiguracja obiektu sf::View**: Obiekt `sf::View` pozwala na łatwe manipulowanie tym, co jest widoczne na ekranie. Możesz przesuwać, skalować oraz obracać widok, co jest równoważne z przesuwaniem kamery.
```cpp // Utwórz widok o wymiarach odpowiadających rozmiarowi okna gry sf::View view(sf::FloatRect(0, 0, windowWidth, windowHeight)); ```
2. **Aktualizacja położenia kamery**: W funkcji aktualizującej stan gry (np. w funkcji `update()`), możesz zaktualizować pozycję widoku na podstawie pozycji gracza lub innego obiektu w grze.
```cpp // Przesuń środek widoku na pozycję gracza (playerX, playerY) view.setCenter(playerX, playerY); ```
3. **Zastosowanie widoku w oknie renderowania**: W funkcji renderującej (np. w funkcji `draw()`), należy ustawić aktualny widok na okno renderowania.
```cpp // Ustaw widok w oknie przed renderowaniem obiektów window.setView(view);
// Teraz rysuj wszystkie obiekty gry window.draw(sprite); // itd. ```
Dzięki takiemu podejściu nie musisz modyfikować pozycji każdego obiektu. Zamiast tego, wszystkie obiekty są rysowane w swoich rzeczywistych pozycjach, a `sf::View` zajmuje się przesunięciem i skalowaniem widoku zgodnie z potrzebami kamery.
Jeśli masz dodatkowe pytania lub potrzebujesz więcej szczegółów na temat implementacji, daj znać!
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-05-05 23:07:44 dobra. przerzuciłem się na sf::View, ale ... rozszerzyło mi poziomo obraz. Jak to naprawić ? window->setFramerateLimit( 120 );
loadTextures(); prefabs.clear(); gameObjects.clear(); loadPrefabs();
sf::View view; window->setView( view ); view.setSize( sf::Vector2f( screenWidth, screenHeight ) ); cam = new Camera();
cout << "cursor at: " << sf::Mouse::getPosition( * window ).x << "," << sf::Mouse::getPosition( * window ).y << endl;
for( auto & go: gameObjects ) go->update();
std::sort( gameObjects.begin(), gameObjects.end(),[ ]( const auto & a, const auto & b ) { return a->y < b->y; } ); view.setCenter( player->x, player->y );
window->clear( sf::Color( 64, 128, 64 ) ); for( auto & go: gameObjects ) go->render( window );
window->display(); sf::sleep( sf::milliseconds( 50 ) );
|
|
pekfos |
» 2024-05-05 23:17:25 sf::View view; window->setView( view ); view.setSize( sf::Vector2f( screenWidth, screenHeight ) ); setView robi kopię, więc najpierw przygotuj obiekt. |
|
« 1 » 2 |