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

[SFML]Ukrycie czarnego tła poza mapą

Ostatnio zmodyfikowano 2012-06-21 18:04
Autor Wiadomość
Borek23
Temat założony przez niniejszego użytkownika
[SFML]Ukrycie czarnego tła poza mapą
» 2012-06-19 21:24:33
Witam. Co powinienem zrobić, aby "ukryć" ten brzydki czarny kawałek ekranu, którego nie chcę wyświetlić ? Do scentrowania postaci używam sf::View z SFMLa 2.0. Użyć jakiegoś ifa, aby kiedy kamera dojdzie do tego punktu graniczącego z czarnym tłem, przestać przewijać kamerę ? Jeśli tak, to w jaki sposób ?
Oto link do sreenshota http://iv.pl/images/28156632217648833463.png.
P-58727
Gronek8624
» 2012-06-19 23:09:43
Ja tam bym dał jakieś tło wykonane z kafelek ale ogrodzone jakimś płotem , ścianom .
Lub też jak zbliża się kamera do krawędzi to blokował bym ją w danej osi :)

Pierwszy sposób jest dobry w przypadku map o nierównym kształcie

drugi zaś przykład jest lepszy przy prostych mapach + nie potrzebuje dodatkowej pamięci :)

P-58734
SeaMonster131
» 2012-06-20 08:48:14
Ustaw postać na środku ekranu. Jeżeli przesunięcie mapy według osi X osiągnie 0 (czyli początek mapy) to nie scrolluj już mapy, tylko przemieszczaj gracza od środka ekranu do lewej krawędzi ekranu. Jeżeli gracza od lewej krawędzi z powrotem wejdzie na środek ekranu, to już go nie przemieszczaj, lecz scrolluj mapę. Podobnie w osi Y.
Robiłem tak i wychodziło bardzo dobrze.
P-58737
waxx
» 2012-06-20 12:09:40
Gracza to on moze zawsze przemieszczac, a bawic sie tylko kamera :P

View.SetCenter(sf::Vector2f((m_postac.x < mapaWidth/2) ? std::max(m_postac.x + m_postac.width/2, screenWidth/2) : std::min(m_postac.x + m_postac.width/2, mapaWidth - screenWidth/2),
(m_postac.y < mapaHeight/2) ? std::max(m_postac.y + m_postac.Height/2, screenHeight/2) : std::min(m_postac.y + m_postac.Height/2, mapaHeight - screenHeight/2));
P-58741
Borek23
Temat założony przez niniejszego użytkownika
» 2012-06-20 22:34:18
Z tymi funkcjami min i max coś chyba nie tak jest. Podstawiłem wartości pod co trzeba, a wyskakują 4 błądy, że   no matching function for call to 'max(float, int)', albo sam już nie wiem czy to moje argumenty są złe... Co do sprawdzenia mapy czy X osiągnęło 0 to z tym muszę jeszcze pokombinować, bo np taki vector gdzie getPosition(sf::RenderWindow) - daje to stałą wartość bo przecież nie ma przesunięcia tego co widzę na ekranie. Oto przerobiona funkcja:
C/C++
sf::View scena;

int vLudekWys = 64;
int vLudekSzer = 47;

sf::Vector2f vLudek( sLudek.getPosition() );

scena.setCenter( sf::Vector2f(( vLudek.x < 1600 / 2 ) ? max( vLudek.x + vLudekSzer / 2, 800 / 2 )
    : min( vLudek.x + vLudekSzer / 2, 1600 - 800 / 2 )
    ,( vLudek.y < 600 / 2 ) ? max( vLudek.y + vLudekWys / 2, 600 / 2 )
    : min( vLudek.y + vLudekWys / 2, 1600 - 600 / 2 ) );
P-58823
waxx
» 2012-06-21 00:00:18
upewnij sie zeby floaty wstawiac w obu miejscach w std::min, std::max
np

800 / 2.0f
P-58833
Borek23
Temat założony przez niniejszego użytkownika
» 2012-06-21 18:04:40
Okej, teraz działa, lecz przesunięcie nadal występuje poza mapą i dopiero wtedy się zatrzymuje. Chyba jakieś za duże wartości dałem. Muszę pokombinować...

Dobra, już mam dobrze srollujący się widok. Tutaj jest poprawiony kod. Właściwie to sam nie wiem dlaczego musiałem zmienić niektóre z tamtych liczb, stosowałem metodę prób i błędów, ale doszedłem...
C/C++
scena.setCenter( sf::Vector2f(( vLudek.x < 1200.0f / 2.0f )
? max( vLudek.x + vLudekSzer / 2.0f, 1000.0f / 2.0f )
    : min( vLudek.x + vLudekSzer / 2.0f, 1600.0f - 1640.0f / 2.0f )
    ,( vLudek.y < 1200.0f / 2.0f ) ? max( vLudek.y + vLudekWys / 2.0f, 1000.0f / 2.0f )
    : min( vLudek.y + vLudekWys / 2.0f, 980.0f - 400.0f / 2.0f ) ) );
P-58847
« 1 »
  Strona 1 z 1