Skocz do zawartości

Snake

Użytkownicy
  • Postów

    1 445
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Snake

  1. GMAPI nie dekompiluje gier, żeby dostać się do zasobów ;p wszystko opiera się na pobieraniu właściwych danych z pamięci runnera, operowaniu na nich i wywoływaniu odpowiednich funkcji z runnera w właściwy sposób, żeby GM nie zaliczył crasha :) Jeśli chodzi o ten update związany z kompatybilnością z GM8 - będę nad tym pracował, ale tylko nad wersją dla Windowsów :P na 99% uda mi się zdobyć wszystkie informacje o runnerze, tylko nie wiem czy nie będzie trzeba czasami zrobić osobnej wersji GMAPI, jeśli większość rzeczy będzie całkowicie inaczej działać. Zobaczymy.
  2. Update, łau. Nowe możliwości: Dostęp do zmiennych lokalnych/globalnych i tablic lokalnych/globalnych z GM Możliwość zmiany aktualnej instancji na inną (można wywoływać funkcje GM z inną instancją niż ta, z której została wywołana funkcja z DLL-a) Możliwość wykonywania kodu z daną grupą instancji (a'la "with" z GM) Dostęp do właściwości ("zmiennych wbudowanych") instancji obiektów z GM (x, y, hspeed, path_index, direction etc.) Zmiany nieco dokładniej: Od teraz żeby korzystać z D3D8 z GMAPI trzeba zdefiniować GMAPI_USE_D3D, poprzednie "GMAPI_NO_D3D" zostało usunięte Struktura GMVARIABLE: zmiana nazwy na GMVALUE, dodane przeładowanie operatora << z std::ostream, zmienione nazwy składowych Nowa struktura GMVARIABLE (okazało się, że zmienne w GM mają nieco inną strukturę, stąd zmiana nazwy w/w struktury na GMVALUE - ta jest wartością zmiennych) CGMVariable: Nowy konstruktor przyjmujący w parametrze strukturę GMVALUE Nowe metody z klasie CGMAPI: GetSymbolID, GetLocalVariablePtr, GetGlobalVariablePtr, GetInstancePtr, GetCurrentInstancePtr, GetCurrentInstanceID, SetCurrentInstance, EnumInstances i With. (+ inne z których się nie korzysta :)) Małe poprawki (+ nowa funkcja GMFindSymbolID) w GMAPICore\main.asm Wywołania MessageBox zmienione na MessageBoxA (przez to nie można było skompilować projektu z zestawem znaków UNICODE) Prefixy typów wskaźnikowych z GmapiDefs zmienione z LP na P (np. LPGMSPRITE >>> PGMSPRITE) Poprawki w niektórych komentarzach Download v0.4: https://gmclan.org/up541_4_GMAPIv0_4_src.html Przykładzik nowych możliwości: src: https://gmclan.org/up541_4_GmapiVariablesSrc.html demo: https://gmclan.org/up541_4_GmapiVariablesDemo.html
  3. Snake

    Google Porish Translator

    >>> :o Dobre to to ;D
  4. Snake

    string explode

    http://www.google.pl/search?q=explode+string+c%2B%2B
  5. A sry, plik podglądałem w hex edytorze i patrzałem na podgląd bajtów w postaci szesnastkowej, dlatego tak mi się pomyliło :D
  6. Nazwa pliku generowana jest z podanego klucza - do pierwszych 3 znaków w ciągu dodawana jest liczba 36. Podana liczba która ma być zaszyfrowana w pliku zamieniana jest na liczbę całkowitą a potem zamieniana na ciąg znaków, następnie do każdego znaku w stringu dodawana jest liczba 63. Potem wpisujesz do pliku 40 bajtów śmieci, zaszyfrowaną liczbę (zakończoną powrotem karetki i znakiem nowej linii) i kolejne 40 bajtów śmieci :) Nieco słabe. Powinieneś dać przykład w gm6/gmk albo przynajmniej plik gml żeby zaimportować skrypty do projektu, bo tak to się nie chce składać samemu ;p
  7. Następny update. Poprawki: - Niektóre gry po zabezpieczeniu nie uruchamiały się (unexpected error...), teraz już nie powinno się to zdarzać ;p - Tła kontrolek zmienione na przezroczyste (Jak miałem theme w Windowsie ustawiony na "Klasyczny Windows" to nie zauważyłem tego) ;o Download: http://www.sgames.ovh.org/blog/index.php/p...game-protector/
  8. Snake

    Game Framework

    Jakoś wątpię w to, że coś z tego będzie. ;s btw, w tym twoim języku skryptowym definicja klasy wygląda na definicje funkcji ;o
  9. Po prostu twórz okno bez captiona (tj. bez stylu WS_CAPTION) i na nim rysuj. Jeśli chcesz żeby okno było częściowo przezroczyste to utwórz je ze stylem rozszerzonym WS_EX_LAYERED i pobaw się funkcją SetLayeredWindowAttributes.
  10. W GM. Ale już nie tworze tej gry, szkoda mi czasu na Game Makera ;p

  11. http://gmc.yoyogames.com/index.php?showtopic=429267 :F
  12. Hm, wprowadzając taką funkcję musiałbym też dodać funkcję "zamykającą" uchwyt wątku, bo jakoś trzeba będzie zwalniać pamięć którą trzeba zachować dla każdego wątku by móc odczytać błąd, więc będzie nieco mniej wygodnie ;p no chyba, że zrobiłbym opcję automatycznego zwalniania ustawianą w thread_create, której można by użyć gdy nie będzie takiej potrzeby by sprawdzać błąd ;o Ok, w wolnym czasie dodam tą funkcje + funkcje służące do synchronizacji wątków które już dawno miałem zamiar wprowadzić.
  13. @SerMSYS: Hm, ten błąd występuje pewnie dlatego, że GM nie jest przystosowany do multi-threadingu i dlatego przechwytuje niewłaściwe parametry przekazane do skryptu... na to raczej nic nie da się poradzić ale sprawdzę jeszcze.
  14. Hm, no pewnie tak, chociaż nie wiem dokładnie jak z tymi grafikami jest - nie znam się niestety na D3D ;p
  15. Update - dodałem możliwość zwalniania bitmap z pamięci za pomocą nowej metody ReleaseBitmap w ISpriteSubimage i IBackground: https://gmclan.org/up541_4_GMAPIv0_3_src.html A tu taki prosty teścik tego ficzera: https://gmclan.org/up541_4_BMPDeallocator.html (na spacji dealokacja, na enterze show_message ze zmienionym tłem == crash) ;D Jednak po zwolnieniu mapy bitowej z pamięci nie można użyć sprite'a/backgrounda w tabeli wyników, komunikatach, przekazywać do takich funkcji jak sprite_save() itp... poza tym, sprite/background musi być załadowany do pamięci wideo (opcja preload), bo inaczej crash przy próbie załadowania do vram przez GM.
  16. Reload wiązałby się z odszyfrowaniem danych z pliku gry i dwukrotną dekompresją zlib, więc trochę by to muliło ;p muszę z tym pokombinować.
  17. Aktualizacja: - Dodano: możliwość dostępu do zasobów dźwiękowych poprzez klasy ISounds (CGMAPI::Sounds) i ISound - Poprawki: kilka małych poprawek w klasach dających dostęp do zasobów GM (konkretniej to w metodach Exists()) Download v0.2: https://gmclan.org/up541_4_GMAPIv0_2_src.html Hm, GM po załadowaniu do gry grafiki zostawia jej mapę bitową w pamięci, przez co traci się spora ilość wolnego RAM-u (zależnie od wymiarów grafiki)... nie mam 100% pewności ale one pozostawione są chyba tylko po to, żeby szło wczytać taką grafikę przy funkcjach takich jak np. show_message() gdzie można użyć backgrounda jako tła okna, bo tak to GM rysuje wszystko z pamięci wideo... więc może by tak pokombinować ze zwalnianiem bmp z pamięci ? :)
  18. Co do map pikselowych to tak, dzwiękami zajmę się jeszcze później ;p
  19. Ostatnia aktualizacja: 14.02.2010 Aktualna wersja: 0.6.1 W skrócie... GMAPI (jeszcze nie jestem pewny co do tej nazwy ;o) to biblioteka dla Visual C++ pomocna przy pisaniu bibliotek DLL do GM6.1 i GM7.0. Co takiego umożliwia ?: Wywoływanie funkcji GM prosto z biblioteki DLL Bezpośredni dostęp do zasobów gry poprzez przeanalizowane struktury z pamięci runnera (właściwie to to są klasy ;p) w tym min.: do map bitowych (sprite'ów i backgroundów) załadowanych do pamięci przez GM do plików dźwiękowych załadowanych do pamięci przez GM (sounds) do danych i właściwości zasobów (np. wysokość sprite'a, bounding box, zawartość skryptu) do interfejsów Direct3D: IDirect3D8, IDirect3DDevice8, IDirect3DTexture8 (tekstury sprite'ów, surface'ów i backgroundów w pamięci wideo) (GM używa wersji 8) do zmiennych i tablic lokalnych i globalnych do właściwości instancji (x, y, speed etc.) W aktualnej wersji można się dostać do sprite'ów, background'ów, surface'ów, dźwięków, skryptów i innych danych (min. wskaźniki na interfejsy Direct3D, uchwyty okien, wskaźniki na funkcje GM, wersja GM...). Niedługo postaram się umożliwić Wam dostęp do innych zasobów gry i wprowadzić możliwość np. załadowania sprite'a z pliku/bitmapy w pamięci... w sumie to możecie zaproponować co mógłbym dodać (btw. coś potrzebnego do D3D byłoby mile widziane - nie znam się na tym zbytnio ;p). Niestety z braku czasu nie napisałem dokumentacji... napisałem jedynie na szybko parę przykładów i dodałem opisy klas i metod w pliku nagłówkowym. Tutaj postaram się wyjaśnić najważniejsze rzeczy. Bibliotekę wydaję na licencji LGPL, więc każdy może sobie zobaczyć jak to jest zrobione czy tam modyfikować :) Jak projekt będzie już w bardziej zaawansowanym stadium i znajdzie się czas to przeniosę bibliotekę na MinGW C++ i być może na Delphi również. Korzystanie z biblioteki InstalacjaJedyne co musisz zrobić to wypakować zawartość archiwum do wybranego folderu i podać ścieżki do katalogów "include" i "lib" w IDE. Uruchom Visual C++, wybierz z menu "Tools" pozycje "Options... ", następnie przejdź do gałęzi "Projects and Solutions" >> "VC++ Directories" i z comboboxa "Show directories for:" wybierz "Include files" i dodaj ścieżkę do folderu "include" z GMAPI, potem z "Show directories for:" wybierz "Library files" i podaj ścieżkę do "lib". Done. Inicjalizacja Zanim zaczniesz pracować z biblioteką musisz włączyć plik nagłówkowy gmapi.h do jednego z plików projektu. Jeśli nie masz zainstalowanego SDK DirectX zdefiniuj GMAPI_NO_D3D przed włączeniem pliku gmapi.h (wtedy typy interfejsów D3D będą zdefiniowane jako void), czyli: #define GMAPI_NO_D3D #include <gmapi.h> Teraz musisz wskazać w opcjach linkowania odpowiednią bibliotekę statyczną - wszystko zależy od ustawień biblioteki uruchomieniowej w projekcie:gmapi-mt.lib - Multithreaded gmapi-mt-dll.lib - Multithreaded DLL gmapi-mt-d.lib - Multithreaded debug gmapi-mt-d-dll.lib - Multithreaded debug DLL Następnie musisz utworzyć główny obiekt biblioteki, czyli klasy CGMAPI. Klasa ta jest singletonem, więc tylko jedna jej instancja może być utworzona w twojej bibliotece. Do tego celu służy metoda statyczna CGMAPI::Create, przyjmująca jako argument wskaźnik na zmienną typu unsigned long - w niej zapisany zostanie wynik inicjalizacji klasy (możliwe wartości to stałe: GMAPI_INITIALIZATION_SUCCESS - gdy inicjalizacja przejdzie bezproblemowo; GMAPI_INITIALIZATION_FAILED - gdy inicjalizacja się nie powiedzie; GMAPI_ALREADY_INITIALIZED - gdy jest już utworzony obiekt klasy). Zwraca ona wskaźnik na utworzoną instację klasy który należałoby zapisać. Najlepiej zrobić to w entrypoincie DLL-a, czyli w DllMain np: gm::CGMAPI* gmapi; BOOL WINAPI DllMain( HINSTANCE aModuleHandle, int aReason, int aReserved ) { switch ( aReason ) { case DLL_PROCESS_ATTACH: { // Inicjalizacja unsigned long result = 0; gmapi = gm::CGMAPI::Create( &result ); // Sprawdzanie wyniku if ( result != gm::GMAPI_INITIALIZATION_SUCCESS ) { MessageBox( 0, "Inicjalizacja GMAPI nie powiodła się.", 0, MB_SYSTEMMODAL | MB_ICONERROR ); return FALSE; } break; } case DLL_PROCESS_DETACH: // Zwalnianie biblioteki GMAPI gmapi->Destroy(); break; } return TRUE; } Metoda CGMAPI::destroy() zwalnia obiekt klasy z pamięci. BTW, wszystkie klasy, funkcje, stałe itd. z GMAPI zadeklarowane są w przestrzeni nazw "gm". Nie należy wywoływać funkcji GM zaraz po inicjalizacji - GMAPI zakłada haka na funkcję external_call z runnera żeby można było przechwycić wskaźnik na instancję obiektu z GM, w którym ta funkcja została wywołana. Tak, więc trzeba powrócić do GM. Po utworzeniu obiektu klasy można wywoływać funkcje GM i oczywiście korzystać ze składowych CGMAPI.Wywoływanie funkcji z GM Gdy GMAPI jest już zainicjalizowane można wywoływać funkcje z GM. Wszystkie funkcje są ładnie opakowane więc wywołuje się je w prosty sposób np. int list; gm::CGMVariable value; list = gm::ds_list_create(); gm::ds_list_add( list, "test" ); gm::ds_list_add( list, 12345.12345 ); value = gm::ds_list_find_value( list, 0 ); // zwroci "test" do zmiennej value = gm::ds_list_find_value( list, 1 ); // zwroci 12345.12345 do zmiennej gm::ds_list_destroy( list ); Klasa CGMVariable której instancja jest zdefiniowana w powyższym kodzie naśladuje zmienną z GM, więc jej wartość może być ustawiana zarówno na real (double) jak i na string (char*). Używać jej należy przy funkcjach GM zwracających stringi i funkcjach których typ wyniku jest nieznany (jak w ds_list_find_value - może zwrócić i stringa i real). Trzeba ją przekazywać też w argumentach niektórych funkcji GM z tego samego powodu... poza tym ta klasa symuluje typ string z Delphi - zajmuje się alokacja, konwersją, zwalnianiem itd. stringów wykorzystując do tego celu runnera... typ char* nie jest kompatybilny z typem delphi string, dlatego musiałem to jakoś wykombinować ^^ Aha, zawsze zapisuj wynik funkcji GM mogącej zwrócić stringa do obiektu klasy CGMVariable - ta się zajmie jego dealokacją. Dostępne są wszystkie funkcje z wyjątkiem matematycznych i operujących na stringach (i takich jak is_real() czy string()). Dodam jeszcze że klasa ma kilka przeładowanych konstruktorów i można utworzyć jej instancję niejawnie przy argumentach funkcji GM (np. ds_list_add w powyższym kodzie w drugim argumencie zdefiniowany ma typ referencyjny CGMVariable i przy tym niejawnie tworzony jest tymczasowy obiekt z typu char* i double)... zaimplementowane są jeszcze przeładowania operatorów takich jak "++", "-=", operatorów rzutowania na double i char*, plus przeładowanie operatora << dla ostream :D Dostęp do zasobów z runnera Dostać do nich można się za pomocą trzech metod: za pomocą funkcji GM oczywiście (mało wydajne i mają mniej możliwości), struktur które przeanalizowałem w runnerze i za pomocą "klas dostępowych" do pamięci runnera. Korzystanie za struktur jest najbardziej wydajne i przy tym równie niebezpieczne, jak napiszę konkretną dokumentację to opiszę jak z nich korzystać. Tymczasem można korzystać z klas o których wspomniałem - są bezpieczniejsze i łatwiejsze w użyciu niż "wędrowanie" po strukturach GM-a. Dlaczego nazwałem je dostępowymi (wtf) ? Otóż, operują one całkowicie na pamięci runnera, co jest również powodem nieco pogmatwanego korzystania z nich ;o W klasie CGMAPI zdefiniowanych jest kilka obiektów takich klas: Sprites (klasa ISprites), Backgrounds (IBackgrounds), Sounds (ISounds), Surfaces (ISurfaces) i Scripts (IScripts). Wszystkie te klasy udostępniają kilka metod które przechwytują różne dane związane z poszczególnym typem zasobu GM (np. GetID() zwraca ID zasobu o podanej nazwie, GetCount() zwraca ilość zasobów tego typu) i każda z nich ma przeładowany operator [], który zwraca referencje na kolejną "klasę dostępową" - te klasy dają dostęp do danych zasobu o ID podanym w tym operatorze. Damn, ciężko to załapać... więc przykładowo: gm::CGMAPI* gmapi; (...) // Powiedzmy, że w GM dodaliśmy animacje jako sprite z 5-ma klatkami, // o nazwie spr_anim i chcemy pobrać jego szerokość int sprAnim, spriteWidth; // Najpierw trzeba pobrać jego ID sprAnim = gmapi->Sprites.GetID( "spr_anim" ); // Teraz pobieramy jego szerokosc: spriteWidth = gmapi->Sprites[sprAnim].GetWidth(); // A co jeśli sprite nie został znaleziony bo go nie dodaliśmy ? wtedy zostanie // rzucony wyjątek z obiektem klasy EGMAPISpriteNotExist (klasa wyjątku). // Łapiemy go oczywiście za pomocą try - catch try { spriteWidth = gmapi->Sprites[sprAnim].GetWidth(); } catch ( EGMAPISpriteNotExist& exc ) { exc.ShowError(); // Pokazuje komunikat z informacjami o błędzie } // operator [] w klasie ISprites (obiekt Sprites) zwraca typ referencyjny klasy // ISprite - ta klasa jako jedyna z tych "wyższego poziomu" ma zdefiniowany // kolejny obiekt takiej klasy - ISpriteSubimages (obiekt Subimages), ten // daje dostęp do danej klatki tego sprite'a. Hm, powiedzmy, że chcemy pobrać // wszystkie identyfikatory tekstury sprite'a (a'la sprite_get_texture z GM) i zapisać w // vectorze: for ( int i = 0; i < gmapi->Sprites[sprAnim].Subimages.GetCount(); i++ ) textures.push_back( gmapi->Sprites[sprAnim].Subimages[i].GetTextureID() ); Hm, to tyle jeśli chodzi o dostęp do zasobów. Uwagi - Tak jak już wspomniałem, później zajmę się konkretną dokumentacją a na razie pozostaje wam IntelliSense, dokumentacja komponentów z pliku GmapiInternal.h (opisy powinny być pokazywane przy podpowiedziach funkcji) no i trzy badziewne przykłady które napisałem. W GMAPI znajdują się również stałe z GM. Oczywiście zgłaszajcie wszystkie bugi bo projekt jest w fazie testów ;P i jak coś to pytajcie. Sry za badziewny opis ;p Download: Tu znajdziecie wszystkie wersje (najnowsza to 0.6.2) http://code.google.com/p/gmapi/downloads/list Przykłady: Mój BBCode engine ( https://forum.gmclan.org/index.php?showtopic=15031 ) przepisany do C++: src: https://gmclan.org/up541_4_BBCodeEngineSrc.html demo: https://gmclan.org/up541_4_BBCodeEngineDemo.html Przeglądarka map bitowych: src: https://gmclan.org/up541_4_BitmapViewerSrc.html demo: https://gmclan.org/up541_4_BitmapViewerDemo.html Test interfejsów Direct3D przerobiony na przykład (hardcodowy badziew :D): src: https://gmclan.org/up541_4_D3DexampleSrc.html demo: https://gmclan.org/up541_4_D3DexampleDemo.html Przykład dostawania się do instancji i zmiennych z GM: src: https://gmclan.org/up541_4_GmapiVariablesSrc.html demo: https://gmclan.org/up541_4_GmapiVariablesDemo.html Przykład dodawania/podmieniania funkcji GML: src: https://gmclan.org/up541_4_RegisteringGMFunctions.html Test dostępu do particli i wbudowanych zmiennych: src: https://gmclan.org/up541_4_ParticleTest.html Biblioteki korzystające z GMAPI: G-pathfinding by paul23 GFFI by Clam GMOgre3D by Houdini gmPython by Hach-Que Xenon PlayGate by PsichiX Advanced console by TheMagicNumber gmLua by Kofel
  20. Mi działają poprawnie przykłady w GM6, zaś w GM7 główne okno gry po uruchomieniu pozostaje niewidoczne - po dodaniu po inicjalizacji kodu "window_set_visible( true );" wszystko jest ok ;p
  21. Snake

    Almora 0.7.6B

    http://www.vimeo.com/3787797 Nadal hackable ;o btw. ten GearSHIELD przed czym tak w ogóle zabezpiecza ?
  22. https://gmclan.org/up541_12_nagrywanie.html Tylko trzeba sobie zmienić ustawienia nagrywania na miks stereo czy wave, żeby nagrywało się to co trzeba ;p
×
×
  • Dodaj nową pozycję...