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. |
|
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 :)
|
|
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. |
|
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)); |
|
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: 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 ) );
|
|
waxx |
» 2012-06-21 00:00:18 upewnij sie zeby floaty wstawiac w obu miejscach w std::min, std::max np
800 / 2.0f |
|
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... 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 ) ) ); |
|
« 1 » |