User Tools

Site Tools


sk2:sfml

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
sk2:sfml [2023/11/29 22:54] – jkonczaksk2:sfml [2023/11/30 12:15] (current) – jkonczak
Line 2: Line 2:
  
 Aby zainstalować potrzebne pakiety na __Linuksie SK prog__, należy wykonać: Aby zainstalować potrzebne pakiety na __Linuksie SK prog__, należy wykonać:
-<html><div style="margin:-1.2em 0 0 0;line-height:1.2em"/></html>+<html><div style="margin-top:-1.2em;line-height:1.2em"/></html>
 <code> <code>
 su su
Line 10: Line 10:
  
 Aby zainstalować potrzebne pakiety na __Linuksie lokalnym__, należy wykonać: Aby zainstalować potrzebne pakiety na __Linuksie lokalnym__, należy wykonać:
-<html><div style="margin:-1.2em 0 0 0;line-height:1.2em"/></html>+<html><div style="margin-top:-1.2em;line-height:1.2em"/></html>
 <code> <code>
 sudo zypper install -y sfml2-devel sudo zypper install -y sfml2-devel
Line 49: Line 49:
 promują użycie aktywnego czekania, tzn. aplikacja będzie zużywać procesor nawet promują użycie aktywnego czekania, tzn. aplikacja będzie zużywać procesor nawet
 jeśli nic się nie dzieje. jeśli nic się nie dzieje.
-Aby uniknąć aktywnego czekania, można dodawać co jakiś czas sleepy; w SFML jest +Aby uniknąć nadmiernego użycia procesora, można dodawać co jakiś czas sleepy; w SFML jest 
-to "oficjalnie" opakowne w funkcję ''[[https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1Window.php#af4322d315baf93405bf0d5087ad5e784|setFramerateLimit]]''+to "oficjalnie" opakowne w funkcję ''[[https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1Window.php#af4322d315baf93405bf0d5087ad5e784|setFramerateLimit]]''.
 </small> </small>
  
 Mimo posiadania modułu do obsługi połączeń sieciowych, funkcja ''[[https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1WindowBase.php#a6a143de089c8716bd42c38c781268f7f|pollEvent]]'' Mimo posiadania modułu do obsługi połączeń sieciowych, funkcja ''[[https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1WindowBase.php#a6a143de089c8716bd42c38c781268f7f|pollEvent]]''
 nie wspiera zdarzeń z gniazd. nie wspiera zdarzeń z gniazd.
-Obsługę gniazd w pętli zdarzeń należy zbudować ręcznie.+\\ 
 +**Obsługę gniazd w pętli zdarzeń należy zbudować ręcznie.**
  
 ===== Budowanie kodu i CMake ===== ===== Budowanie kodu i CMake =====
  
 Aby zbudować kod używający SFML, należy dodać do opcji kompilatora łączenie z Aby zbudować kod używający SFML, należy dodać do opcji kompilatora łączenie z
-odpowiednimi bibliotekami: ''sfml-system'', ''sfml-graphics'', ''sfml-network'',+odpowiednimi bibliotekami: \\ ''sfml-system'', ''sfml-graphics'', ''sfml-network'',
 ''sfml-audio'', ''sfml-window''. ''sfml-audio'', ''sfml-window''.
  
 Ręcznie, z linii poleceń można podać (np. dla programu potrzebującego modułów graphics i network): Ręcznie, z linii poleceń można podać (np. dla programu potrzebującego modułów graphics i network):
-<html><div style="margin:-1.2em 0 -1.2em 0"/></html>+<html><div style="margin-top:-1.2em"/></html>
 <code bash>c++ prog.cpp -o prog -lsfml-graphics -lsfml-network</code> <code bash>c++ prog.cpp -o prog -lsfml-graphics -lsfml-network</code>
  
 Dla systemu automatyzacji budowania CMake należy do pliku ''CMakeLists.txt'' dodać: Dla systemu automatyzacji budowania CMake należy do pliku ''CMakeLists.txt'' dodać:
-<html><div style="margin:-1.2em 0 -1.2em 0"/></html>+<html><div style="margin-top:-1.2em"/></html>
 <code cmake> <code cmake>
-find_package(SFML 2.6 COMPONENTS system network REQUIRED)+find_package(SFML 2.5 COMPONENTS system network REQUIRED)
 target_link_libraries(prog  …  sfml-system sfml-network  …  ) target_link_libraries(prog  …  sfml-system sfml-network  …  )
 </code> </code>
-<html><div style="margin:-1.2em 0 -1.2em 0"/></html>+<html><div style="margin-top:-1.2em"/></html>
 SFML __nie__ ustawia zmiennych zawierających listę modułów do linkowania, trzeba SFML __nie__ ustawia zmiennych zawierających listę modułów do linkowania, trzeba
 je podać ręcznie. je podać ręcznie.
Line 79: Line 80:
 <small> <small>
 Przykład kompletnego pliku ''CMakeLists.txt'': Przykład kompletnego pliku ''CMakeLists.txt'':
-<html><div style="margin:-1.2em 0 0 0"/></html>+<html><div style="margin-top:-1.2em"/></html>
 <code cmake> <code cmake>
 cmake_minimum_required(VERSION 3.12) cmake_minimum_required(VERSION 3.12)
 project(myProg) project(myProg)
 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
-find_package(SFML 2.6 COMPONENTS graphics system network REQUIRED)+find_package(SFML 2.5 COMPONENTS graphics system network REQUIRED)
 add_executable(myProg main.cpp window.h window.cpp) add_executable(myProg main.cpp window.h window.cpp)
 target_link_libraries(myProg sfml-graphics sfml-network) target_link_libraries(myProg sfml-graphics sfml-network)
Line 93: Line 94:
  
 Klasy do obsługi sieci są dostępne po dodaniu do kodu dyrektywy: Klasy do obsługi sieci są dostępne po dodaniu do kodu dyrektywy:
-<html><div style="margin:-1.2em 0 0 0"/></html>+<html><div style="margin-top:-1.2em"/></html>
 <code c++>#include <SFML/Network.hpp></code> <code c++>#include <SFML/Network.hpp></code>
  
Line 124: Line 125:
   * ''send'' - wysyła dane   * ''send'' - wysyła dane
   * ''receive'' - odbiera dane   * ''receive'' - odbiera dane
 +  
 +**Uwaga:** klasy oferowane przez SFML nie mają konstruktorów kopiujących (//copy constuctor//) __ani przesuwających (//move constructor//)__.
  
 ==== Tryb nieblokujący ==== ==== Tryb nieblokujący ====
Line 140: Line 143:
 \\ \\
 Odpowiednio nowe połączenie, ilość wysłanych / odebranych bajtów jest wpisywana do dodatkowego Odpowiednio nowe połączenie, ilość wysłanych / odebranych bajtów jest wpisywana do dodatkowego
-argumentu przekazywanego przez referencję.+argumentu przekazywanego przez referencję, np: 
 +<html><div style="margin-top:-1.2em"/></html> 
 +<html><div style="line-height:1.2em"></html> 
 +<code C++> 
 +char buffer[1024]; 
 +size_t receivedBytes; 
 +if (sock.receive(buffer, 1024, receivedBytes) == sf::Socket::Done) { 
 +  sf::String receivedBufferAsString(std::string(buffer, receivedBytes)); 
 +  (…) 
 +</code> 
 +<html><div style="margin-top:-1.2em"/></html> 
 +<code C++> 
 +std::unordered_map<int, sf::TcpSocket> clients; 
 +if (servSock.accept(clients[clientIdSequencer]) == sf::Socket::Done) { 
 +  int clientId = clientIdSequencer++; 
 +  clients[clientId].send(helloPacket); 
 +  (…) 
 +</code> 
 +<html></div></html>
  
 ==== Zadania ==== ==== Zadania ====
Line 164: Line 185:
  
 Przykładowo, do wysłania i odbioru danych można: Przykładowo, do wysłania i odbioru danych można:
-<html><div style="margin:-1.2em 0 -1.2em 0"/></html> +<html><div style="margin-top:-1.2em"/></html> 
-<html><div style="line-height:1.1em"></html>+<html><div style="line-height:1.2em"></html>
 <code C++> <code C++>
 enum MessageType : sf::Uint8 { Foo = 1, Bar, Baz }; enum MessageType : sf::Uint8 { Foo = 1, Bar, Baz };
Line 199: Line 220:
  
 Dla poprawienia modularności i czytelności kodu można dodać własne operatory: Dla poprawienia modularności i czytelności kodu można dodać własne operatory:
-<html><div style="margin:-1.2em 0 0 0"/></html> +<html><div style="margin-top:-1.2em"/></html> 
-<html><div style="line-height:1.1em"></html>+<html><div style="line-height:1.2em"></html>
 <code C++> <code C++>
 sf::Packet &operator<<(sf::Packet &packet, const FooMessage &msg) { sf::Packet &operator<<(sf::Packet &packet, const FooMessage &msg) {
Line 251: Line 272:
 \\ \\
 Klasa ''sf::TcpSocket'' w prywatnym polu przechowuje częściowe dane przychodzącego Klasa ''sf::TcpSocket'' w prywatnym polu przechowuje częściowe dane przychodzącego
-pakietu ([[https://github.com/SFML/SFML/blob/2.6.x/include/SFML/Network/TcpSocket.hpp#L219|kod]]).+pakietu ([[https://github.com/SFML/SFML/blob/2.6.x/include/SFML/Network/TcpSocket.hpp#L219|kod1]], 
 +[[https://github.com/SFML/SFML/blob/2.6.x/src/SFML/Network/TcpSocket.cpp#L379|kod2]]).
 \\ \\
 Pakiet podany jako argument jest wypełniany danymi tylko w ostatnim wywołaniu funkcji ''receive''. Pakiet podany jako argument jest wypełniany danymi tylko w ostatnim wywołaniu funkcji ''receive''.
Line 288: Line 310:
  
 Przykład użycia klasy ''sf::SocketSelector'' do stworzenia serwera czatu: Przykład użycia klasy ''sf::SocketSelector'' do stworzenia serwera czatu:
-<html><div style="margin:-1.2em 0 0 0"/></html> +<html><div style="margin-top:-1.2em"/></html> 
-<html><div style="line-height:1.1em"></html>+<html><div style="line-height:1.2em"></html>
 <code c++> <code c++>
 #include <SFML/Network.hpp> #include <SFML/Network.hpp>
Line 329: Line 351:
  
 SFML oferuje też klasy do wysłania żądań HTTP i obsługi FTP, ale nie obsługuje SFML oferuje też klasy do wysłania żądań HTTP i obsługi FTP, ale nie obsługuje
-powszechnego dziś dla protokołu HTTP szyfrowania.+powszechnego dziś dla protokołu HTTP szyfrowania (tzn. nie zadziała żadna strona 
 +z adresem zaczynającym się od ''https:/%%%%/'').
  
 ===== Przykład z GUI ===== ===== Przykład z GUI =====
Line 338: Line 361:
 objętość kodu który trzeba napisać żeby cokolwiek osiągnąć w tej bibliotece. objętość kodu który trzeba napisać żeby cokolwiek osiągnąć w tej bibliotece.
 Powyższy przykład ma 277 linii kodu. Dla porównania daleko bardziej funkcjonalny Powyższy przykład ma 277 linii kodu. Dla porównania daleko bardziej funkcjonalny
-klient TCP w Qt (z poprzednich zajęć) ma 115 linii kodu i to już okazało się dla+klient TCP w Qt (z poprzednich zajęć) ma 115 linii kodu i to już okazało się dla
 części osób zaporową liczbą. części osób zaporową liczbą.
  
sk2/sfml.1701298459.txt.gz · Last modified: (external edit)