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

[SFML, C++] Wczytywanie części obrazu

Ostatnio zmodyfikowano 2011-07-21 15:14
Autor Wiadomość
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ź :)
P-36413
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ą » SFML 1.6 » ImageCopy?

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.
P-36414
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
P-36415
m4tx
» 2011-07-21 09:20:14
Hmm... Tak jak mówi JarekKatowice też można :) W sf::Sprite jest taka funkcja.
P-36416
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ś.
P-36418
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 » SFML 1.6 » ImageCopy 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++;
C/C++
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.

C/C++
moja_klasa * animacja = new moja_klasa( /* argumenty */ );
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.
P-36451
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 :)
P-36452
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.
P-36453
« 1 »
  Strona 1 z 1