Autor Wątek: mySQL  (Przeczytany 7138 razy)

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 15, 2016, 23:47:12
Czas zrobić wreszcie jakieś MMO.. lub przerobić aktualnie tworzone RPG na MMORPG. Tak, to z pewnością dobry pomysł, więc się za to zabrałem.
Po wielu przeszukiwaniach internetu znalazłem taki oto artykuł (http://strefakodera.pl/programowanie/c/laczenie-sie-z-baza-danych-mysql-z-poziomu-c), lecz w nim nie jest pokazana sama instalacja biblioteki (no właśnie, jakiej biblioteki?) oraz konfigurowanie projektu. Jest jednak link do artykułu gdzie jest to pokazane, ale dotyczy on niestety zupełnie innego środowiska niż ja używam.. Ja używam MS Visual 2010.
Tak więc szukałem dalej. Znalazłem stronę MySQL (http://dev.mysql.com/downloads/connector/cpp/), gdzie pobrałem; najpierw instalator, którego działania kompletnie nie rozumiem, potem source. Z folderu source przeniosłem to co trzeba tam gdzie trzeba, tj. include do include, lib do lib. Potem na stronie znalazłem adres linkera mysqlcppconn-static.lib, który zalinkowałem.
Aplikacja nie działała.
Dokładnie kompilator wyrzuca takie coś:
1>------ Build started: Project: ---, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\program files\microsoft visual studio 10.0\vc\include\cppconn\sqlstring.h(39): warning C4251: 'sql::SQLString::realStr' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'sql::SQLString'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>c:\program files\microsoft visual studio 10.0\vc\include\cppconn\exception.h(61): warning C4251: 'sql::SQLException::sql_state' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'sql::SQLException'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>c:\program files\microsoft visual studio 10.0\vc\include\cppconn\exception.h(145): warning C4251: 'sql::SQLUnsupportedOptionException::option' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of struct 'sql::SQLUnsupportedOptionException'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Ax=std::allocator<char>
1>          ]
1>c:\program files\microsoft visual studio 10.0\vc\include\mysql_connection.h(31): fatal error C1083: Cannot open include file: 'boost/shared_ptr.hpp': No such file or directory
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Potem na stronie mySQL znalazłem takie coś: https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-apps-windows-visual-studio.html, gdzie jest dokładnie pokazane, że trzeba zrobić projekt konsolowy, a ja chcę zapisywać i odczytywać dane z bazy danych w locie.. No i aplikacja ma być okienkowa.
Jak to w takim razie zrobić?
Pozdrawiam, Brunon :)
« Ostatnia zmiana: Styczeń 16, 2016, 00:26:54 wysłana przez BrunonDEV »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 16, 2016, 00:05:48
OK, ale co konkretnie chcesz robić z tym mySQL? Bo na moje to szykuje się tutaj coś bardo dziwnego.

Offline garen_eye

  • Użytkownik

# Styczeń 16, 2016, 00:20:02
MySQL nie jest ci zupełnie potrzebny na początek. Najpierw zainteresuj się relacją client-server, poczytaj trochę o TCP, UDP, socetach, pakietach. Musisz utworzyć nowy projekt serwera, który będziesz chciał połączyć z twoją grą. Potem spróbuj dodać możliwość połączenia kilku takich clientów. Dopiero potem może wyniknie potrzeba bazy danych dla serwera.

Taką drogę musisz sobie obrać.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 16, 2016, 00:25:23
Chodzi mi jedynie o zapis tego co aktualnie zapisuję w plikach na dysku w bazie danych, nie potrzebuję żeby to się działo dynamicznie.
W ramach 'MMO' ma być zapis w chmurze (mySQL), ranking graczy na 'Biuletynie' oraz system handlu. Do tego nie potrzebuję serwera. :)
Jakiś czas temu robiłem małą strategię w PHP, chcę to rozwiązać podobnie jak tam, czyli tak jak podałem powyżej. ;)

Offline garen_eye

  • Użytkownik

  • +1
# Styczeń 16, 2016, 00:54:43
Jeżeli dobrze zrozumiałem, to nie chcesz kilku graczy online w jednym świecie tylko jakby wspólne statystyki dla każdej instancji gry. Więc musisz mieć postawioną gdzieś bazę MySQL aby każdy miał do niej dostęp, więc musisz mieć jakiś np. serwer wirtualny, albo od biedy hosting z bazą MySQL. Ja jednak proponuje Ci tego nie rozwiązywać w ten sposób, bo nie powinno być tak, że każdy client łączy się bezpośrednio z bazą danych gdzieś w sieci, bo musiałby mieć w kodzie dane do takiego połączenia (lol). Jeśli umiesz PHP, to możesz sobie postawić stronę która będzie w jakiś sposób autoryzowała klientów i client będzie mógł za jej pośrednictwem jakoś te swoje statystyki do bazy wpakować i z tej bazy pobrać.

BTW. To się nie nazywa wtedy MMO moim zdaniem.
(Do starych wyjadaczy, posta piszę pod Brunona.)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 16, 2016, 01:55:39
Cytuj
Jakiś czas temu robiłem małą strategię w PHP, chcę to rozwiązać podobnie jak tam, czyli tak jak podałem powyżej. ;)
No to podobnie, tyle że łączysz się z bazą przez PHP. Przy okazji z poziomu PHP możesz załatwić szyfrowanie/uwierzytelnianie. Sam tak zrobiłem w swojej gierce i mogę polecić - system chodzi od dwóch tygodni, mam 600 wpisów w hiscore i 3.4MB zebranych statystyk i jak na razie wszystko śmiga ładnie.

Offline Xion

  • Moderator
    • xion.log

  • +1
# Styczeń 16, 2016, 03:25:25
Jak dotąd to ten wątek nie jest ani o MySQL, ani o pisaniu MMO, tylko o tym jak koszmarną platformą jest C++, gdzie nie ma żadnego sensownego a już tym bardziej uniwersalnego mechanizmu instalowania paczek, czy też ogólniej zarządzania zależnościami.

No ale to raczej wszyscy wiemy.

OP, możesz jakoś wypełnić tę wielką konceptualną dziurę pomiędzy "Chcę zrobić MMO" a "Mam problem z jakąś biblioteką do MySQL". Bo jak na razie zobaczyliśmy głównie:
Cytuj
Jak to w takim razie zrobić?
gdzie nie bardzo wiadomo czym "to" jest.

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 16, 2016, 10:26:46
Cytuj
No to podobnie, tyle że łączysz się z bazą przez PHP. Przy okazji z poziomu PHP możesz załatwić szyfrowanie/uwierzytelnianie. Sam tak zrobiłem w swojej gierce i mogę polecić - system chodzi od dwóch tygodni, mam 600 wpisów w hiscore i 3.4MB zebranych statystyk i jak na razie wszystko śmiga ładnie.

Samą rejestrację i logowanie mogę zrobić w PHP, ale kompletnie nie rozumiem jak mógłbym zrobić zapisywanie w locie np. hp, życia i innych zmiennych gracza w grze napisanej w C++.

Cytuj
OP, możesz jakoś wypełnić tę wielką konceptualną dziurę pomiędzy "Chcę zrobić MMO" a "Mam problem z jakąś biblioteką do MySQL". Bo jak na razie zobaczyliśmy głównie: ...

Chcę, żeby co np 30 sekund, wywoływana była w grze funkcja, która wyszuka w bazie danych tabelę z parametrem nick takim jak gracza i zapisze tam w poszczególnych kolumnach hp, złoto, exp, lvl, itp.

Cytuj
Jeżeli dobrze zrozumiałem, to nie chcesz kilku graczy online w jednym świecie tylko jakby wspólne statystyki dla każdej instancji gry. Więc musisz mieć postawioną gdzieś bazę MySQL aby każdy miał do niej dostęp, więc musisz mieć jakiś np. serwer wirtualny, albo od biedy hosting z bazą MySQL. Ja jednak proponuje Ci tego nie rozwiązywać w ten sposób, bo nie powinno być tak, że każdy client łączy się bezpośrednio z bazą danych gdzieś w sieci, bo musiałby mieć w kodzie dane do takiego połączenia (lol). Jeśli umiesz PHP, to możesz sobie postawić stronę która będzie w jakiś sposób autoryzowała klientów i client będzie mógł za jej pośrednictwem jakoś te swoje statystyki do bazy wpakować i z tej bazy pobrać.

Tak to miałem zamiar zrobić.. Połączenie z bazą danych w kodzie, baza danych na hostingu strony gry.

Offline maro

  • Użytkownik

# Styczeń 16, 2016, 11:24:29
Cytuj
Samą rejestrację i logowanie mogę zrobić w PHP, ale kompletnie nie rozumiem jak mógłbym zrobić zapisywanie w locie np. hp, życia i innych zmiennych gracza w grze napisanej w C++.
Tak samo, jak przeglądarka otwiera stronę (i w rezultacie uruchamia skrypt php), tak samo ty możesz ją otworzyć ze swojej apki. Otwierasz socket TCP, tworzysz i wysyłasz request HTTP(s) z odpowiednimi poleceniami/parametrami w POST/GET i czekasz na odpowiedź (czyli dane, które twój skrypt php pobierze z bazy i wyrzuci w jakimś fajnym formacie, np. JSON/XML/CSV. Wszystko opakowujesz w jakieś asynchroniczne gettery / settery, żeby się wygodnie używało, i używasz podobnie jak np. pliki.

Pierwszy z brzegu link o wysyłaniu zapytań z C++: http://stackoverflow.com/questions/1011339/how-do-you-make-a-http-request-with-c
« Ostatnia zmiana: Styczeń 16, 2016, 11:32:05 wysłana przez maro »

Offline BrunonDEV

  • Użytkownik
    • Construgia -- RPG

# Styczeń 16, 2016, 11:58:17
Cytuj
Pierwszy z brzegu link o wysyłaniu zapytań z C++: http://stackoverflow.com/questions/1011339/how-do-you-make-a-http-request-with-c

Ok, poszukałem trochę i chyba będzie działać.

Dziękuję wszystkim za pomoc. :)

Offline Xender

  • Użytkownik

# Styczeń 16, 2016, 12:54:31
Tak samo, jak przeglądarka otwiera stronę (i w rezultacie uruchamia skrypt php), tak samo ty możesz ją otworzyć ze swojej apki. Otwierasz socket TCP, tworzysz i wysyłasz request HTTP(s) z odpowiednimi poleceniami/parametrami w POST/GET i czekasz na odpowiedź (czyli dane, które twój skrypt php pobierze z bazy i wyrzuci w jakimś fajnym formacie, np. JSON/XML/CSV. Wszystko opakowujesz w jakieś asynchroniczne gettery / settery, żeby się wygodnie używało, i używasz podobnie jak np. pliki.

I to ma działać w czasie rzeczywistym?

Gry multi często nawet nie stosują TCP, bo ma za duży overhead, a w wypadku laga zwykła retransmisja pakietów raczej pogarsza sprawę, tylko nabudowują lżejsze i bardziej przystosowane pod grę mechanizmy potwierdzenia odbioru danych na UDP (albo korzystają z libek do tego).

A Ty proponujesz na to jeszcze kanapkę HTTP, JSON i skrypty PHP po stronie serwera (nie wspomniałeś nic o pisaniu własnej pętli serwerowej w tych skryptach, więc pewnie sugerujesz dokładnie ten sam model wykonania, co przy stronach WWW? To nie pyknie).
« Ostatnia zmiana: Styczeń 16, 2016, 13:01:06 wysłana przez Xender »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 16, 2016, 16:02:32
Cytuj
I to ma działać w czasie rzeczywistym?
A czy "co 30 sekund" to jest "czas rzeczywisty"? ;)

Offline Xender

  • Użytkownik

# Styczeń 16, 2016, 18:32:58
A czy "co 30 sekund" to jest "czas rzeczywisty"? ;)

To jest "czas rzeczywisty" dla bardzo ubogich. ;)

No ok, to będzie działać.
Chociaż pokusiłbym się o utrzymywanie jednego połączenia i/lub protokół inny, niż HTTP. (To, że HTTP wspiera keepalive, nie znaczy, że musi być on domyślnie włączony.)

Ale prawdziwym problemem OP w tym momencie jest, moim wtrącającym się zdaniem, nieznajomość przestrzeni możliwości i przez to brak możliwości zaprojektowania *sensownej* architektury.

W roli młotka: PHP, MySQL, C++, HTTP
W roli śruby: Napisanie MMO.
Interfejs młotek-śruba: zrezygnujmy z czasu rzeczywistego i róbmy aktualizacje co 30 sekund.

@BrunonDEV - Masz jakąś spójną wizję tego, co robisz? Twoje rozwiązanie jest zgoła niestandardowe, co samo w sobie nie jest złe - dopóki wiesz, co robisz. Sprawdzi się do synców do 30 sekund, wyłoży się, jak będziesz chciał dodać coś bardziej realtime.

Wreszcie czemu C++ na kliencie, skoro reszta stacka wskazuje na typową przeglądardkówkę - czy ten model nie odpowiadałby lepiej potrzebom?

Offline Xion

  • Moderator
    • xion.log

  • +1
# Styczeń 16, 2016, 18:34:14
Cytuj
Chcę, żeby co np 30 sekund, wywoływana była w grze funkcja, która wyszuka w bazie danych tabelę z parametrem nick takim jak gracza i zapisze tam w poszczególnych kolumnach hp, złoto, exp, lvl, itp.
Ahem... Tak nie działają gry MMO. Not even close.

Przeczytaj sobie przynajmniej kawałek tej książki (cała chyba jeszcze nie jest gotowa), to zrozumiesz, że rzecz jest "trochę" trudniejsza niż prosty sync z bazą daną co pół minuty.

Offline Xender

  • Użytkownik

  • +1
# Styczeń 16, 2016, 18:38:29
Ahem... Tak nie działają gry MMO. Not even close.

Przeczytaj sobie przynajmniej kawałek tej książki (cała chyba jeszcze nie jest gotowa), to zrozumiesz, że rzecz jest "trochę" trudniejsza niż prosty sync z bazą daną co pół minuty.

Z drugiej strony, patrząc na to, że OP to początkujący, może sync-co-30-s i porąbany stack technologiczny jest lepszy, niż stwierdzenie-że-zrobienie-tego-poprawnie-jest-za-trudne i nierobienie niczego.

Opcja pierwsza przynajmniej jest jakoś edukacyjna, opcja 2 byłaby jeszcze bardziej edukacyjna - ale ma dużo większy próg wejścia.