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
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ł

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
183 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 179, userów: 4, ukrytych: 0
I am vader, Threef, Ignatus, hgter

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
Threef (22:31, 26.07.17):
c:\android było po to aby pełna ścieżka do folderów + argumenty kompilacji były krótsze niż 255 znaków
hgter (21:19, 26.07.17):
Rzeczywiście, masz rację. Czyli powinno dać się gdziekolwiek.
I am vader (21:15, 26.07.17):
proponowali c:\android zeby nie bylo spacji
hgter (21:12, 26.07.17):
Przy 1.4 "silnie rekomendowali" c:\android bo mogły być problemy z aktualizacją - może się zmieniło. Co do rozmiaru u mnie udało się zejść do 5gb (trzeba ręcznie obrazy wywalać)
Ignatus (21:09, 26.07.17):
Nie musi byc na C , ja mam na D i dziala elegancko, choc zajmuje mi to chyba z 20-30gb
I am vader (21:05, 26.07.17):
Na C nie mammeijsca
hgter (20:57, 26.07.17):
Wydaje mi się, że gdzieś kiedyś było, że to ma być C. W dodatko najlepiej C:\Android (i tu dwa katalogi z ndk i sdk)
hgter (20:55, 26.07.17):
Napiszę Ci więcej w wątku, który dodałeś (tym o błędach bo tu niezbyt wygodnie)
I am vader (20:55, 26.07.17):
To ścierwo android studio mi pobiera na C zamiast na F mimo bycia zainstalowany na F, co do K***&%^*&^*%*(
hgter (20:54, 26.07.17):
W tym artykule o gm2 jest też jak zainstalować ndk i sdk ręcznie. I cały ten artykuł w 90% powinien być zgodny z gm1.4.
I am vader (20:52, 26.07.17):
Wszystko wskazuje na to ze tamten sdk manager odszedl w zapomnienie i go usuneli. Z nowego nie wiem jak skorzystac aby pobrac pewne stare wersje ktorych 1.4 wymaga
I am vader (20:50, 26.07.17):
Artykul dotyczacy game makera 2 mowi jak to zrobic uzywajac nowego managera ktory jest wbudowany w android studio, a o to mi nie chodzi. Linki juz wczesniej sprawdzalem i nic mi z tego nie wyszlo.
hgter (20:40, 26.07.17):
Tam jest wszystko: co wybrać przy instalacji i jak potem konfigorować Gm2.
hgter (20:39, 26.07.17):
O tu masz dużo o tym: help.yoyogames....-Up-For-Android
hgter (20:36, 26.07.17):
doświadczeń z dotykaniem czegokolwiek odnośnie Androida w GM - zawsze się wysypie a potem schodzą godziny na naprawę.
hgter (20:35, 26.07.17):
Z tego co wynika ze strony googla powinno być chyba zawarte w android studio: developer.andro...tml#sdk-manager Ale kurde mam wrażanie, że jak ja to konfigurowałem, spory czas temu, to trzeba było ściągnąć ndk oraz sdk i zainstalować bez samego Studio. Natomiast wydaje mi się, że na dole strony: developer.andro...ddingComponents jest możliwość ściągnięcia gołego sdk. Ale nie sprawdzę tego u siebie - ma za dużo koszmarnych doświadcze
I am vader (20:09, 26.07.17):
Wie ktos jak pobrac SDK Managera? Nic w sieci nie mowi jak to pobrac/aktywowac a w instalce Android Studio tego nie bylo
Chell (17:34, 26.07.17):
zartowalem, ale dobra robota xD
I am vader (17:08, 26.07.17):
Smutne troche ze taka propozycja w ogole byla wzieta pod uwage. Trzeba zapraszac uzytkownikow a nie ich wypedzac.
Uzjel (14:55, 26.07.17):
Done
Uzjel (14:52, 26.07.17):
Can do, chyba i tak już zmniejszałem to kiedyś
Chell (12:30, 26.07.17):
proponuję zmienić żeby ikona tematu zmieniała się na hot topic po 2 odpowiedziach
Chell (12:29, 26.07.17):
akurat Shill by się śmiała
nowy_user (10:36, 26.07.17):
Nie mówie już o tym, że wielu nowych userów może odnieść wrażenie , że korzystanie z GMa źle wpływa na męską sprawność.
nowy_user (10:34, 26.07.17):
Hej, czy moglibyśmy zrobić coś z tymi botami? Reklamy specyfików na pobudzenie nie wzburzają mnie jakoś szczególnie( choć prywatnie ich nie stosuję), ale pomyślmy o tym że na nasze forum zaglądają też kobiety i dzieci. Pomyślcie sobie, co musi czuć np. Shill, gdy przypadkiem wejdzie na temat promujący takie specyfiki. Pomyśli sobie że jesteśmy męskimi szownistycznymi osłami.
I am vader (0:50, 26.07.17):
Nie zajmuje sie GM'em 8.0, w zyciu go nie tknalem, a 7.0 i starszych juz nie pamietam. Sam widziales ile problemow bylo przy poprzednim temacie, pomysl ile bedzie przy tym.
LolikZabijaka (0:18, 26.07.17):
A czytałeś drugi post ?
I am vader (23:54, 25.07.17):
Da, ale jeżeli chodzi o Twoj problem to nie dam rady pomoc.
LolikZabijaka (23:49, 25.07.17):
Jest tutaj ktoś ?
Chell (21:15, 25.07.17):
patrze na te wszystkie viagra boty i mysle jak gmclan jest otagowany
ANtY (8:51, 25.07.17):
bodajze 1500 pln
Ignatus (21:53, 24.07.17):
orientuje sie ktos jaki jest koszt mini stoiska indie na PGA?
Chell (21:19, 24.07.17):
zbilbym fortune na tym twoim jednorekim bandycie
ΨΧΞ (20:56, 24.07.17):
i jak nieznosze JSa, tak uwazam, ze niestety bedzie on przyszloscia gier i apek mobilnych :<
ΨΧΞ (20:56, 24.07.17):
a ja pochwale sie zrobieniem przykladowej gry w jednorekiego bandyte w 3 dni w JavaScriptcie od zera - silnik powstal wraz z gra github.com/Psic...slots-in-3-days
tramur (12:28, 24.07.17):
Powiedziałem z niską barierą wejścia, bo stworzenie shoot em upa jest troszke trudniejsze niż w GM'ie na kodach, a co do optymalizacji to nie wiem co masz na myśli.
tramur (12:26, 24.07.17):
;P powiedzoałem
Threef (6:02, 24.07.17):
Nie ma niskiego poziomu wejścia. I wymaga masy optymalizacji
tramur (21:33, 23.07.17):
Ja bym optował za czymś zgoła odwrotnym: PICO-8. Ciekawy koncept mitycznej retro konsolki z niską barierą wejścia, ale jak najbardziej z programowaniem.
Ignatus (17:13, 23.07.17):
Raczej nie
exp (16:21, 23.07.17):
a klocki w game makerze traktujecie jako programowanie?
Fervi  (11:29, 23.07.17):
Jasne, że najlepiej jest nauczyć się ich języka itd. Natomiast coś na kształt uproszczonego Dooma (powiedzmy - w skrócie) można zrobić (teoretycznie) bez żadnej linijki kodu dodatkowej. Bardziej to nie tyle Game Maker typowy co edytor map z językiem programowania
Danielus (10:37, 23.07.17):
Prawda ale chodzi raczej o coś innego. Chodzi o prostotę, im coś prościej zrobić tym łatwiej estymować pracę i tym łatwiej to potem utrzymać. Dlatego firmy ciągnie do języków takie jak C# czy Java. Pamiętaj że to tylko narzędzia i zawsze trzeba wybierać odpowiednie narzędzia jeśli możesz zrobić coś w rok w c# to wybierasz c# niż 5 lat w C nawet kosztem 50% spadku wydajności. Chyba że wydajność jest punktem krytycznym projektu.
Wojo (10:22, 23.07.17):
Aż mnie krew zalewa ale to jest nowe pokolenie programistów - idiotów
Wojo (10:22, 23.07.17):
Czytałem blog jakiegoś barana, który pisał, że C# pomimo, że jest mało wydajny to i tak warto się go uczyć bo teraz RAM bez problemu można dokupić
Wojo (10:21, 23.07.17):
No mniej więcej o to mi chodziło. O uproszczenie, co wiąże się z tym, że ludzie nawet nie myślą o optymalizacji
Danielus (10:19, 23.07.17):
W sensie mam na myśli że na początku taki człowiek dostaje gotowce i jest zadowolny a potem mówi "a mam pomysł żeby tu była taka mechanika" i nagle ludzie się uśmiechają "a to sobie napisz bo na to nie ma gotowca" no i projekt upadł.
Danielus (10:17, 23.07.17):
Zawsze wolałem 2d, jakoś przyjemniej się gra i trochę mi szkoda że nie ma już tak potężnych produkcji 2d jak np homm3 ale cuż :f Programować nadal musisz umieć, zmienia się zakres tego co trzeba umieć bo języki się uproszczają i powstają języki vizualne ale ja to wciąż będę nazywał porgoramowaniem bo wymaga takiego samego myślenia jak zwykłe programowanie. Natomiast ludzi przychodzą robić gry myśląc że to ot tak zrobią i potem płacz że miało być bez programowania
Wojo (10:14, 23.07.17):
No bo 3D to skok technologiczny i daje większe możliwości, a miłośników 2D jest znacznie mniej
Ignatus (10:12, 23.07.17):
Nie wiem co ludzie widzą w tym żę coś jest 3D, jak jest słaby pomysł i mechanika to jeden pies jaki masz widok.Wszyscy amatorzy zakładają że 3D od razu daje grze 3punkty do oceny
Ankieta
» Jakiej wersji GameMakera głównie Używasz?
GameMaker: Studio 2
GameMaker: Studio
GameMaker 8.1 i starsze
Żadnej

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2017. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!

[ Czas generowania strony: 0.02579 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev