Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamiczna kamera w grze RPG 2D

Ostatnio zmodyfikowano 2024-05-05 23:47
Autor Wiadomość
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

C/C++
#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
P-181009
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 ?

C/C++
void update( float player_x, float player_y ) {
   
x +=( player_x - x ) * smoothFactor;
   
y +=( player_y - y ) * smoothFactor;
}
P-181010
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.
P-181011
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-05 22:52:28
tak, w ten sposób przesuwam wszystkie obiekty:

C/C++
virtual void update() {
   
collider->setPosition( x - cam->get_x(), y - cam->get_y() );
}

To jak pracować z kamerą w SFML'u ?
P-181014
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.

C/C++
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.
P-181015
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ć!
P-181016
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ć ?

C/C++
window->setFramerateLimit( 120 );

loadTextures();
prefabs.clear();
gameObjects.clear();
loadPrefabs();

sf::View view;
window->setView( view );
view.setSize( sf::Vector2f( screenWidth, screenHeight ) );
cam = new Camera();

// ... //

// UPDATES
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 );

// RENDER
window->clear( sf::Color( 64, 128, 64 ) );
for( auto & go: gameObjects )
   
 go->render( window );

//player->render(window);
window->display();
sf::sleep( sf::milliseconds( 50 ) );

P-181020
pekfos
» 2024-05-05 23:17:25
C/C++
sf::View view;
window->setView( view );
view.setSize( sf::Vector2f( screenWidth, screenHeight ) );
setView robi kopię, więc najpierw przygotuj obiekt.
P-181022
« 1 » 2
  Strona 1 z 2 Następna strona