Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker
Treść artykułu
Tworzenie DLLi w C++ i Object Pascal dla GM
autor: Tymon (9.01.07)
1. Do kogo skierowany jest artykuł?
     Oczywiście dla osób obecnie zainteresowanych czyli pragnących napisać własną bibliotekę (DLLa), oraz chcących wyciągnąć z Game Makera dużo więcej niż obecnie sam potrafi. Wszystko co tu opiszę nie jest to zbyt skomplikowane, jednak wymaga znajomości pewnych podstaw Game Maker Language (GML), C++ oraz Object Pascal - mam nadzieję że masz to już w małym paluszku! Postaram się opisać wszystko równie zrozumiale dla wszystkich, wykluczam tylko totalną niewiedzę. =]

2. Narzędzia
     Potrzebny będzie ci Game Maker w wersji 6.1 (choć wydaje mi się że w 5.x obsługa DLLi będzie wyglądać bardzo podobnie) z włączonym Advanced Mode (trybem zaawansowanym, można go włączyć w klikając menu 'File' -> 'Advanced Mode' - powinna pojawić się tam tzw. fajka) i do tego zarejestrowany. Jeszcze jakiś kompilator C++, najlepiej Dev C++ 4.9.9.2 (darmowym, wygodny system 'paczek', przyjazny edytor kodu) bo jego właśnie będę używał. No i Delphi - ja używam wersji 6. =) I tyle. Może się jeszcze przydać staromodna kartka i długopis. =P

3. Jak trawić biblioteki w Game Maker?
     Użycie biblioteki i odwołanie się do jej funkcji w Game Maker sprowadza się tylko i wyłącznie do użycia trzech funkcji! Są to external_define, external_call oraz external_free. Oczywiście każda z nich wymaga szczegółowego opisu, więc:

kod:
external_define( dll, funkcja, typ odwołania, typ zwracanej, liczba argumentów, typ argumentu 0, typ argumentu 1, ..., typ argumentu 11 )
Opis:
     Nie odwołuje się do funkcji z biblioteki! Definiuje tylko ją oraz jej typy argumentów i zwracanej dla Game Makera. Zwraca identyfikator za pomocą którego możemy się później odwołać do funkcji.
Argumenty:
     dll - nazwa pliku biblioteki.
     funkcja - nazwa funkcji znajdującej się w bibliotece.
     typ odwołania - typ odwołania do biblioteki - dll_cdecl albo      dll_stdcall.
     typ zwracanej - określa typ zwracanych danych. Tak jak funkcje Game Makera może być to real albo string - odpowiednio użyj ty_real dla real i      ty_string dla string.
     liczba argumentów - maksymalna liczba argumentów jakie może przyjąć funkcja, tylko liczby od 0 do 11.
     typ arguemntu 0 ... 11 - typ wartości przekazywanych dla funkcji, może być to real albo string - odpowiednio użyj ty_real dla real i ty_string dla string.

kod:
external_call( identyfikator, argument 0, argument 1, ..., argument 11 )
Opis:
     Odwołuje się do funkcji z biblioteki, zwraca dane przekazane przez funkcję o określonym wcześniej typie w funkcji external_define.
Argumenty:
     identyfikator - wcześniej otrzymany przez wykonanie funkcji external_define, niezbędny do odwołania się do funkcji.
     argument 0 ... 11 - argumenty do przekazania dla funkcji, pamiętaj o wcześniej zdefiniowanym typie w external_define!

kod:
external_free( dll )
Opis:
     Zwalnia określoną bibliotekę z pamięci. Podobno - wyłącznie podobno, Game Maker sam zwalnia biblioteki po zakończeniu działania, nie sprawdziłem tego, ale i tak nie dmuchał bym na zimne.
Argumenty:
     dll - nazwa biblioteki którą chcesz zwolnić.

Oprócz tych dwóch podstawowych jest jeszcze window_handle która zwraca identyfikator uchwytu okna (dosłownie tłumacząc =)

Tyle odnośnie funkcji Game Makera.

4. Pisanie biblioteki w C++
     Teraz trochę cierpienia. Jeśli nie masz Dev C++ to ściągnij, zainstaluj i wróć do czytania, następnie uruchom go i utwórz czysty projekt. Kliknij w tym celu menu 'Plik' -> 'Nowy' -> 'Projekt' i wybierz 'Empty Project'. Program poprosi cię o wskazanie miejsca gdzie mają być składowane pliki projektu - najlepiej utworzyć dla niego jakiś folder. Teraz ustawienia, wejdź w menu 'Projekt' -> 'Opcje projektu', następnie na zakładce 'Ogólne' poszukaj pola 'Typ' (dolny prawy róg) i zaznacz 'Win32 DLL'. Kliknij OK. Teraz wyjściowym wynikiem pracy kompilatora będzie biblioteka *.dll. Teraz plik źródłowy, czyli zakładka 'Plik' -> 'Nowy' -> 'Plik źródłowy', zada Ci głupie pytanie , oczywiście kliknij 'Yes'. Otworzył się edytor kodu, dobrze było by zapisać od razu plik źródłowy, więc menu 'Plik' -> 'Zapisz' i wklep nazwę pliku (np. dllmain). Przejdźmy teraz do przyjemniejszej części.

     Kodowanie odbywa się tak samo jak w przypadku każdej innej aplikacji - za wyjątkiem kilku wyjątków. Otóż, musimy pilnować typów naszych danych, jeśli coś jest typu real to ma być real, ale o tym jeszcze później. Oprócz tego musimy jeszcze pokazać palcem kompilatorowi które funkcje mają być eksportowane i jednocześnie dostępne dla Game Makera, aby to zrobić musisz dodać oto taką linijkę przed nazwą funkcji:
kod:
extern "C" __declspec(dllexport)
Więc konstrukcja funkcji będzie wyglądał tak:
kod:
extern "C" __declspec(dllexport) [zwracana] [funkcja] ( [argumenty] )
{
//Kod funkcji
}
Może to wprowadzić lekki bałagan w kodzie, a z racji że nie lubimy się męczyć, a tym bardziej ja sam, zdefiniujemy sobie coś takiego, powinno się to znaleźć przed resztą kodu:
kod:
#define export extern "C" __declspec(dllexport)
Dzięki temu uprościmy nieco konstrukcję, oraz nie będziemy musieli pamiętać tych wszystkich szlaczków bo pod słowo export zostały one "podpięte". Teraz konstrukcja funkcji wygląda tak:
kod:
export [zwracana] [funkcja] ( [argumenty] )
{
//Kod funkcji
}
Dużo lepiej. Taka prosta linijka daje do zrozumienia wszystkim że funkcja jest do wykorzystania przez Game Maker, nie jest to coś skomplikowanego jak widać.

Wracając jeszcze do typów zwracanej i argumentów. Z racji iż C++ to nie GML trzeba ustalić typy które będą odpowiednikami tych Game Maker, a są nimi char* dla string i double dla real. Możesz zdefiniować sobie coś podobnego jak zrobiliśmy to z export:
kod:
#define gmreal double
#define gmstring char*
Typ zwracanej musi być taki sam w C++ i Game Maker. Inaczej program wywali ci błąd. Więc lepiej nie używać tutaj typu integer zamiast double, mogą pojawić się po prostu różne komplikacje!

Jeszcze jedno, aby przekazać jakąś wartość przez funkcję musisz teraz użyć tylko return:
kod:
export [zwracana] [funkcja] ( [argumenty] )
{
     return [wartość];
}
Tak jak w GM, prawda? Tylko pamiętaj o typie zwracanej w Game Maker i C++ =)

     I to już wszystko odnośnie C++. Możesz już kompilować swój projekt, poprawić ewentualne błędy i załączyć bibliotekę do twojej gry. Nie takie straszne prawda? Jak widzisz możesz traktować bibliotekę jak zwykły program zachowują tylko kilka podstawowych zasad tyczących się relacji między Game Makerem a C++ i eksportowania funkcji.

5. Przykładowa biblioteka w C++
     Trudno przyjąć wiedzę bez przykładów.

Plik źródła biblioteki:
kod:
#include<windows.h>

#define export extern "C" __declspec(dllexport)

export double GMBeep( double a1, double a2 )
{
     Beep( a1, a2 );
}

export char* GMText( void )
{
     return "Jakis tekst przekazany przez funkcje biblioteki.";
}

export double GMAdd( double l1, double l2 )
{
return l1 + l2;
}
I w create jakiegoś obiektu w Game Maker:
kod:
GMBeep = external_define( 'dll.dll', 'GMBeep', dll_stdcall, ty_real, 2, ty_real, ty_real );
GMText = external_define( 'dll.dll', 'GMText', dll_stdcall, ty_string, 0 );
GMAdd = external_define( 'dll.dll', 'GMAdd', dll_stdcall, ty_real, 2, ty_real, ty_real );

show_message( external_call( GMText ) );
show_message( 'Suma 1111 i 7777 to ' + string( external_call( GMAdd, 1111, 7777 ) ) );

show_message( 'Beep!' );
external_call( GMBeep, 1000, 1000 );

external_free( 'dll.dll' );
Miłego testowania! =)

6. Pisanie biblioteki w Object Pascal (Delphi)
     Tutaj pisanie biblioteki jest dużo, ale to dużo prostsze. =) Nie musimy się bawić w takie ciągutki jak w C++. No, ale w sumie - Delphi jest dla leni =P

     Na początku musimy stworzyć nowy projekt. Więc klikasz po kolei menu 'File' -> 'New' -> 'Other...' i odszukaj tam komponentu 'DLL Wizard', znajduje się w zakładce 'New'. I to tyle, najlepiej od razu zapisz cały projekt! =)

     Kodowanie jest równie proste, wystarczy teraz że napiszesz jakąś funkcję i następnie użyjesz exports w celu jej wyeksportowania. Konstrukcja funkcji może wyglądać tak:
kod:
function [nazwa]( [argumenty] ) : [zwracana]; [odwołanie];
var
//Zmienne
begin
//Tu kod funkcji
end;
exports [nazwa];
Prawda że proste? Uwaga co do odwołania - może być tu albo stccall albo cdecl - tak jak w GM.

     Zwracana tak jak i argumenty mogą i muszą być, albo typu double który jest odpowiednikiem real, albo pchar który jest odpowiednikiem string.

     Zwracanie zmiennej odbywa się po przez przypisanie zmiennej Result jakiejś wartości, np.:
kod:
function [nazwa]( [argumenty] ) : [zwracana]; [odwołanie];
var
//Zmienne
begin
     Result := [wartosc]
end;
exports [nazwa];


7. Przykładowa biblioteka w Object Pascal
Kod bibloteki:
kod:
library TestDll;

function GMText():pchar; stdcall;
begin
Result := 'Jakis tekst przekazany przez funkcje biblioteki.';
end;

function GMAdd( l1, l2 :double ):double; stdcall;
begin
Result := l1 + l2;
end;

exports GMText, GMAdd;

begin
end.
I w create jakiegoś obiektu w Game Maker:
gml:
GMText = external_define( 'dll.dll', 'GMText', dll_stdcall, ty_string, 0 );

GMAdd = external_define( 'dll.dll', 'GMAdd', dll_stdcall, ty_real, 2, ty_real, ty_real );
show_message( external_call( GMText ) );
show_message( 'Suma 1111 i 7777 to ' + string( external_call( GMAdd, 1111, 7777 ) ) );

external_free( 'dll.dll' );
Miłego testowania! =)

8. Słowo od autora
     Wybaczcie mi ogólnie panujący nieład w sposobie opisu i definiowania niektórych terminów czy też funkcji - z natury jestem człowiekiem chaotycznym. Starałem się naprawdę napisać to prosto i zrozumiale. =) Gdybym coś pominął, albo coś jest jeszcze niejasne to proszę mnie poinformować. Liczę że dotarł do większej części czytających oraz oczywiście - że choć trochę pomógł w zrozumieniu mechanizmu rozszerzania możliwości Game Makera przez biblioteki.

          Pozdrawiam, Tymon =3
głosów: 23 | ocena: 8.74 oceń zasób | dodał: Tymon
Komentarze
stron: 21

2


av

kubasz (16:29, 15.11.2007)

Dużo informacji, kodu i innych !!!

av

Marmot (19:57, 9.07.2008)

Nie ma nic gorszego niż robienie DLLi do GM. Tylko dwa typy, których można używać - PChar (char* w C++) i Double. Idiotyzm. O ile PChar jest jeszcze sensownym, o tyle Double to idiotyzm w najczystszej postaci ;p . Normalnie pisząc DLLe, stosuje się typy rodzaju boolean (bool w C++), byte (o ile się nie mylę, coś pokroju unsigned char w c++) czy integer (int w c++) aby zaoszczędzić miejsce w pamięci, a tu zonk, nie można. Co jak co, ale jest różnica między 8 bajtowym Double, a 1 bajtowym byte, czy 2 bajtowym integer, czy nawet 1 bitowym boolean ;p . Trudno, trzeba przecierpieć to jakoś. Chciałbym, aby w GM8 była możliwość używania także innych typów zmiennych w DLLach, to by na prawdę był miły prezent od Yoyogamesu

av

Marmot (19:58, 9.07.2008)

A chodzi mi z tym o to, że np. ja chcę w DLLu zrobić, że wpisuje się w argumencie 1 lub 2, mógłbym to zrobić na byte, ew. integer, a na upartego nawet jako boolean (ale wtedy 0 i 1), ale pupa blada, muszę użyć typu skierowanego do liczb mających do 15 miejsc po przecinku ^^ .

av

Skovv (18:10, 5.01.2009)

Super Artykuł

av

47xxxxxxxx (21:56, 14.06.2009)

w miejscach dla Dephi są emotikonki ()

stron: 21

2



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
3 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 2, userów: 1, ukrytych: 0
Uzjel
Użytkownicy na czacie discord
MaxGaming (0:33, 20.10.18):
chodzi mi jak to z licencją jest, czy nie będę jej łamał
Wojo (22:17, 19.10.18):
zresztą, nie wiem
Wojo (22:16, 19.10.18):
tak
MaxGaming (19:21, 19.10.18):
Czy mogę usunąć w stopce "Zbudowany za pomocą Storefront i WooCommerce."?
Wojo (12:55, 19.10.18):
i cała ta dychotomia społeczeństwa wydaje się śmieszna dla osoby, która ma trochę względnego obycia w różnych środowiskach
Wojo (12:52, 19.10.18):
zresztą, zaprzestańmy tej dywagacji oraz popisu swojej erudycji
Wojo (12:51, 19.10.18):
ja w ogóle nie rozumiem tej protekcjonalnej postawy
ANtY (8:05, 19.10.18):
stalaktyzacja??
MaxGaming (0:08, 19.10.18):
exp stagmatyzacji brania narkotyków podczas zawodów mma? XD
exp (23:32, 18.10.18):
nie wiem dokładnie o czym mówicie ale stygmatyzacji brania narkotyków nie rozumiem i chyba nie zrozumiem
Sutikku (18:21, 18.10.18):
w mojej opinii też był sćpany, pozdrawiam, aż specjalnie sobie obejrzałem te gale bo tak ogólnie to mnie to nie interesowało
Wojo (19:03, 17.10.18):
mam nadzieję, że wiesz co jest pięć
Wojo (18:44, 17.10.18):
Jezu MaxGaming przeczytaj raz jeszcze co napisałem (pierwsze zdanie zaczynające się kluczowymi słowami "W MOIM PRZYPADKU"
MaxGaming (16:30, 17.10.18):
Jezu Wojo przeczytaj raz jeszcze co napisałem(punkt 3).
Wojo (13:55, 17.10.18):
Niemniej jednak wielu ludzi twierdzi w takim momencie, że coś paliłem
Wojo (13:54, 17.10.18):
W moim przypadku czerwone oczy (właściwie to lekko różowe białka) oraz opadające powieki pojawiają się najczęściej zimą gdy wchodzę z zimnego dworu do ciepłego pomieszczenia. Zresztą co ja się będę tłumaczył jak tu każdy wie swoje
MaxGaming (13:41, 17.10.18):
I 1. czerwone oczy nie są po takich środkach tylko po marihuanizacji. 2. Czerwone oczy od kamery są trochę inne niż te po paleniu. 3, Tak, marihuanizacje ciężko rozpoznać bo jest tyle opcji by mieć takie czerwone oczy. 4, nie widzę u niego ani trochę czerwonych oczu. To jeszcze odnośnie wcześniejszej wiadomości
Wojo (13:39, 17.10.18):
xD
MaxGaming (13:36, 17.10.18):
uwierzył że nie był. Pokazywałem to kilku kolegą co dużo ćwiczą i kliku co znają mefedron i jego efekty. Wszyscy to samo stwierdzili co ja.
MaxGaming (13:34, 17.10.18):
Popieram. Tak jak mówię adrenalina nie działa tak na nikogo oprócz niego. Poza tym Wojo za młody jesteś widocznie i za mało zmefedrowanowanych osób widziałeś żeby nie wiedzieć co jest pięć. Uważam że każdy kto trochę miał z tym styczność w ciągu pierwszej minuty wywiadu zorientuje się co jest pięć. Ale ogólnie Wojo od dawna zauważyłem że masz takie dzieciakie, naiwne myślenie. To nie jest sprawa która jest dla mnie jakaś istotna był naćpany to był, to nie moja
Ignatus (13:11, 17.10.18):
Obserwuję od 15 lat MMA i Adbustera od początku.Był w h*j naćpany Nikt się tak nie zachowuje nawet 10 sekund po walce
Wojo (13:02, 17.10.18):
I jak próbujecie sobie i innym wkręcać, że był naćpany to jest godne politowania (żeby nie było, nie bronię go dlatego bo jestem jego fanem, wręcz przeciwnie, irytuje mnie jego osoba)
Wojo (12:57, 17.10.18):
to dlaczego by nie zrobić specjalnej gali dla takich walk?
Wojo (12:57, 17.10.18):
Pomysłów mają dużo, lepsze to niż wpakowanie na oficjalną galę jednej walki aktora z muzykiem. I tak każdy nie będący w temacie ogląda galę dla tej jednej "popularnej" walki. Skoro w telewizji i w internecie trąbi się o wygranej muzyka z aktorem, a większość zwycięstw w tej samej gali pomija
Wojo (12:55, 17.10.18):
Uważajcie jak chcecie. Moim zdaniem taka oficjalna gala freakfightów jest dobra, zawsze coś ciekawego się dzieje. Jednemu wypada szczęka, drugi łamie nogę, trzeci chudzielec bije się z mięśniakiem, walki bliźniaków
ANtY (12:51, 17.10.18):
sorki ale nie bede tego ogladal xd
Ignatus (11:40, 17.10.18):
Obejrzyjcie wywiady ze wszystkimi uczestnikami FAMEMMA po walce, ba ,obejrzyjcie losowe kilkanaście/kilkadziesiąt wywiadów minuta po walce- NIKT NIGDY nie zachowywał się jak AdBuster- nawet oficjalny ćpun Popek .To on jeden na świecie tak reaguje na "emocje" że w niczym nie przypomina siebie na codzień?Nie ma co bronić typa-ewidnentnie się naćpał...
MaxGaming (11:37, 17.10.18):
no znam tą walkę
MaxGaming (11:36, 17.10.18):
To że oni się tak słabo przygotowują to właśnie problem. Z drugiej strony jedną rundę a nie kilka ciosów xd Poza tym mam na myśli takie nastawienie żeby wygrać z kimś zamiast pokonywać swoje słabości. To bardzo nie sportowy sposób myślenia. Jak rozróżniam jedno od drugiego? Jeśli myśli o wygranej z przeciwnikiem kombinujesz jak go przechyrzyć tak na prawdę(dowiedzieć się jakoś jaką ma stategie i treningi, a to wziąć jakąs przedtreningówkę fajną lub zaćpać, a t
Wojo (10:12, 17.10.18):
Zobacz słynną walkę pudziana z najmanem (najman przegrał jak coś), ona nie trwała długo między innymi z tego względu, że to był freakfight
Wojo (10:11, 17.10.18):
wyjaśnienia były 15 października czyli jakoś dwa dni po gali (jeśli się nie mylę), a jeśli chodzi o szybkie walki to trudno się spodziewać półgodzinnych walk jak u zawodowców. To są ludzie trenujący średnio po dwa miesiące i daleko im do zawodowego poziomu
MaxGaming (4:07, 17.10.18):
tylko dwie weszły do drugiej rundy jak dobrze pamiętam
MaxGaming (4:07, 17.10.18):
pomijam już ile trwały walki
MaxGaming (4:06, 17.10.18):
wgl nie ten state of mind zawodników
MaxGaming (4:06, 17.10.18):
dla mnie tam mało było sportu
MaxGaming (4:06, 17.10.18):
A rafon to otwarcie mówił że lubi sterydy tylko ileś tam przed walką musi przestać i po walce znowu ostro sterydy
MaxGaming (4:04, 17.10.18):
Zresztą nas to nie dotyczy to w sumie nie istotne. ale tak czy siak ja jestem w 90% pewien że coś tu mocno nie grało i stawiałbym na jakieś stymukanty/euforyki nowej generacji
MaxGaming (4:02, 17.10.18):
ja ogldałem jeszcze przed walką jakiś wywiad, nie pamiętam ile przed. Ale wysłalem znajomym że on jest na 80% naćpany. Było to widać ale nie tak mocno jak tutaj gdy doszły emocje. A mefedropodbne rcki mają ro do siebie że emocje są przetwarzane trochę inaczej i jeśi są duże to bardzo łatwo komuś kto wie co jest 5 rozpoznać czy ktoś jest porobiony czy nie nawet bez takich rzeczy jak źrenice itp
MaxGaming (4:00, 17.10.18):
można gdybać ale albo gośc ma jakieś mocne zaburzenia psychiczne albo był naćpany, nie chce mi się wierzyć że tak wygląda trzeźwy człowek Mam znajomych którzy trenują sporty walki, widziałem już ich naladowanych po wygranej czy przegranek walce gdy nimi emocje kipiały ale to zupełnie co innego. Podobnie zawodicy fame mma 2. Oprócz niego nikt nie wyglądał na naćpanego a nie jednym emocje mocno targały
MaxGaming (3:59, 17.10.18):
YT nie działa akualnie Wojo ale jeśli to ten filmik gdzie adbuster pokazuje testy zrobione tam chyba 9 czy 10 dni po to już wyjasniłem to wcześniej
MaxGaming (3:58, 17.10.18):
oglądłem najpierw całe wywiady i znim zobaczyłem tą kompilację już w pierwszej minucie wiedziałem co jest pięc
Wojo (10:48, 16.10.18):
www.youtube.com...h?v=XhmsV_IBles tutaj masz jakieś wyjaśnienia
I am Lord (9:18, 16.10.18):
swędzenie ni występuje po przedwakowaniu kofeiny tylko beta alaniny, na niektórych w tym mnie bardzo negatywnie to wpływa
I am Lord (9:17, 16.10.18):
ale ten filmik jest pocięty i moco zmanipulowany, obejrzyj full 5 minutowy wywiad i tam sprawia wrażenie normalnego tylko lekko nabuzowanego i tyle
MaxGaming (1:49, 16.10.18):
Osoby które nie mają doczynienia z mefedronem itp nie mają pojęcia że tu nie chodzi tylko o te jego drapanie po nosie czy oczy. Chodzi nawet o sposób ekspresji emocji. A raczej nadekspresji w taki bardzo nie typowy sposób. Jak to wyjąsnić? No najlepiej obejrzyjcie ten filmik z adbusterem bo to przykład 1:1
MaxGaming (1:47, 16.10.18):
natomiast na 90% mogę stwierdzić że ćpał
MaxGaming (1:46, 16.10.18):
jedno w tym wszystkim jest pewne - prawdy nie da się udowdnić, ani że był trzeźwy ani że ćpał
MaxGaming (1:46, 16.10.18):
mój kolega który nigdy nie brał amfetaminy a palił codziennie trawę na badaniach na mocz miał amferaminę ktorej nigdy w życiu nie brał i thc nie wykryto
MaxGaming (1:45, 16.10.18):
kolejna sprawa to jakość tych testów... miałem kiedyś robione testy na mocz dzień po paleniu trawy. THC ku mojemu zaskoczeniu nie wyszło wcale
MaxGaming (1:45, 16.10.18):
i czy serio oni robili wgl testy na rcki czy tylko narkotyki tradycyjne?
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
[ Polityka prywatności ]
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.03438 sekund ] [ Liczba zapytań MySQL: 13 ]