jaupl Temat założony przez niniejszego użytkownika |
[SFML, C++] Wczytywanie części obrazu » 2011-07-21 08:14:32 Od razu mówię że nie chodzi o typowe wczytywanie takie jak w kursie. Chcę wczytać tylko część obrazu. Widziałem kiedyś coś takiego w modach do gry lf2 ;] Taka umiejętność będzie bardzo przydatna moim zdaniem, bo zamiast w folderze z naszym projektem mieć 10, 20, 30 czy więcej obrazków będziemy mieli tylko jedną plansze. Z góry dzięki za odpowiedź :) |
|
m4tx |
» 2011-07-21 08:37:25 Nie da się tak :) Możesz co najwyżej ten swój texture atlas (czy cokolwiek innego) wczytać, a potem podzielić... Hmmm... Funkcją Copy? No, chyba że te pliki graficzne masz w BMP... Wtedy byś mógł zrobić coś takiego chyba... Ale łatwe by to nie było, bo musiałbyś własny algorytm do wczytywania plików graficznych napisać, a na dodatek Twoja gra "ważyła" by 10x tyle co w przypadku PNG + JPEG. |
|
JarekKatowice |
» 2011-07-21 09:01:29 ehhhh wystarczy czytac dokumentacje na stronie sfml.
Wczytujesz bitmape a potem wyswietlasz tylko jej fragment np. klatke animacji
Jest od tego odpowiednia funckja |
|
m4tx |
» 2011-07-21 09:20:14 Hmm... Tak jak mówi JarekKatowice też można :) W sf::Sprite jest taka funkcja. |
|
WiecznyWem |
» 2011-07-21 09:54:40 Może jest to trochę pośrednio, ale jeżeli nie chcesz trzymać całego pliku graficznego z animacjami postaci, możesz zrobić tak, że tworzysz wskaźnik na sf::Image. Następnie wczytujesz do niego obrazek. Potem dzielisz go do innych sf::Image. A potem możesz usunąć wartość wskaźnika którego stworzyłeś. |
|
akwes |
» 2011-07-21 14:46:02 Nie, nigdy się tka nie robi że cała grafika jest w jednym pliku. Grafiki tez nie są osobno :P Jest to mądry środek. Pliki graficzne, które mają ze sobą ścisłą zależność są w jednym pliku. Klatki jednej animacji, litery jednej czcionki, czy całe GUI. I do tego celu nie używamy Copy ponieważ funkcja stosuje kopiowanie piksel po pikselu i zjada CPU jak moja kuzynka lody waniliowe. Przede wszystkim JAK NAJMNIEJ sf::Image, to ciężkie obiekty i ich nie lubimy, sf::Sprite też chcemy mało, mimo że są już całkiem znośne. Skoro i tak cały obrazek ładujemy do sf::Image, to NIC nie tracimy jeżeli ładujemy go całego do sf::Sprite, co potem? Potem ustawiamy kamerę i rysujemy, proponuję napisać do tego własną klasę sFrame to w jest sf::Sprite okno to sf::RenderWindow posx i posy to współrzędne, gdzie ma być rysowany x to ilość klatek w rzędzie ! (do policzenia przez sFrame.GetImage()->GetWidth() / szerokosc_klatki ) klatka_do_rysowania to liczba int. Co np. 0.1s można robić klatka_do_rysowania++; int ax = klatka_do_rysowania % x * szerokosc_klatki; int ay = klatka_do_rysowania / x * wysokosc_klatki;
const sf::IntRect & kwd = sf::IntRect( ax, ay, ax + szerokosc_klatki, ay + wysokosc_klatki ); sFrame.SetSubRect( kwd );
sFrame.SetPosition( posx, posy ); okno.Draw( sFrame );
Mniej więcej coś takie mam upakowane w klasę, działa szybko, nic nie kopiuje, i wyświetla dobrze. Jeżeli chcesz mieć dużo takich klas, to nie trzymaj w klasie tego sf::Image tylko np. moja_klasa * animacja = new moja_klasa( ); sf::Image a; a.LadFromFile( "obrazek.png" ); animacja->sFrame.SetImage( a );
Dzięki temu animacja będzie mieć przypisany obrazek, ORAZ dostęp do Image przez wskaźnik na sf::Image, który sf::Sprite posiada. |
|
DejaVu |
» 2011-07-21 15:07:53 Kopiować spokojnie można sobie obraz. W końcu kopiujesz fragmenty bitmap przy inicjalizacji, a nie za każdym obiegiem, więc gila Ciebie to czy start aplikacji to będzie trwał sekundę dłużej czy też nie :) |
|
akwes |
» 2011-07-21 15:14:08 Staram się bardzo rygorystycznie do tego podchodzić :P
Bo do robienia mapy, kopiowanie naprawdę się nie opłaca, przy tworzeni mapy z kafli 128x128 o wielkości 20x30, myślałem że jest błąd w kodzie, bo po starcie ekran biały a to po prostu 3-5 sekund i dopiero obraz. Nie powiem już co było jak chciałem na bieżąco widoczne kafle kopiować, przy rozdzielczości 1024x768 to było mordowanie...
A co do animacji, jeżeli zakładamy że chcemy mieć dużo animacji, to jednak fajnie mieć 1 sf::Image zamiast 160 (20 animacji po 8 klatek) :P Warto od początku zakładać że projekt będzie duży :D Bo a nuż gra się spodoba i będą ludzie chcieli więcej. |
|
« 1 » |