health

[tahir][bigposts]

vehicles

[tahir][bigposts]

business

[tahir][bigposts]

Game maker için DLL kullanımı

DLL'leri kullanma
Bu işlevsellik yalnızca Game Maker'ın Pro Edition sürümünde mevcuttur.
Sürüm 7'den beri Game Maker'da yeni bir uzantı mekanizması olduğunu unutmayın. Bu bölümde açıklanan işlevler yerine, bu uzantı mekanizmasını kullanmaya teşvik edilirsiniz. Ayrıntılar için http://www.yoyogames.com/extensions adresini ziyaret edin. Bu işlevler temel olarak geçmişle uyumluluk için ayrılmıştır.

Bu durumlarda GML'nin işlevselliği sizin isteğiniz için yeterli değildi, aslında eklentileri kullanarak olasılıkları genişletebilirsiniz. Bir eklenti bir DLL dosyası (Dinamik Bağlantı Kitaplığı) biçiminde gelir. Böyle bir DLL dosyasında işlevleri tanımlayabilirsiniz. Bu işlevler, DLL'lerin oluşturulmasını destekleyen herhangi bir programlama dilinde programlanabilir (örneğin, Delphi, C, C ++, vb.) Bunu yapmak için bazı programlama becerilerine sahip olmanız gerekir. Eklenti işlevlerinin belirli bir biçimi olmalıdır. Her biri gerçek bir sayı (C cinsinden çift) veya boş sonlandırılmış bir dize olabilen 0 ile 16 argüman arasında olabilirler. (4'ten fazla argüman için, sadece şu anda gerçek argümanlar desteklenir.) Ya gerçek ya da boş sonlandırılmış bir dize döndürmelidirler.

Delphi'de ilk önce Dosya menüsünden Yeni'yi seçip sonra da DLL'yi seçerek bir DLL oluşturun. İşte Delphi'de yazılmış Game Maker ile kullanabileceğiniz bir DLL örneği. (Bunun Delphi kodu olduğunu unutmayın, GML kodu değil!)
library MyDLL;

uses SysUtils, Classes;

function MyMin(x,y:double):double;  cdecl;
begin
  if x<y then Result := x else Result := y;
end;

var res : array[0..1024] of char;

function DoubleString(str:PChar):PChar; cdecl;
begin
  StrCopy(res,str);
  StrCat(res,str);
  Result := res;
end;

exports MyMin, DoubleString;

begin
end.

Bu DLL iki işlevi tanımlar: İki gerçek argüman alır ve en az iki döndüren MyMin ve dizeyi iki katına çıkarır DoubleString. Bellek yönetimine dikkat etmeniz gerektiğini unutmayın. Bu yüzden sonuçta ortaya çıkan dize global ilan ettim. Ayrıca cdecl çağrı kuralı kullanımı dikkat edin. CDecl veya stdcall çağrı kurallarını kullanabilirsiniz. Delphi içinde DLL oluşturduktan sonra bir dosya MyDLL.DLL alacaksınız. Bu dosya oyununuzun çalışan dizinine yerleştirilmelidir. (Veya Windows'un bulabileceği başka bir yer.)
Bu DLL'yi Game Maker'da kullanmak için öncelikle kullanmak istediğiniz harici işlevleri ve ne tür argümanlar aldıklarını belirtmeniz gerekir. Bunun için GML’de aşağıdaki işlevler vardır:
external_define (dll, isim, calltype, restype, argnumb, arg1type, arg2type, ...) Harici bir işlev tanımlar. dll, dll dosyasının adıdır. ad, işlevlerin adıdır. calltype kullanılan çağrı kuralıdır. Bu kullanım için dll_cdecl veya dll_stdcall. restype, sonucun türüdür. Bu kullanım için ty_real veya ty_string. argnumb argüman sayısıdır (0-16). Ardından, her argüman için türünü belirtmelisiniz. Bunun için ya ty_real ya da ty_string kullanın. 4'ten fazla argüman olduğunda, hepsi ty_real tipinde olmalıdır.
Bu işlev, çağırmak için kullanılması gereken harici işlevin kimliğini döndürür. Yukarıdaki 

örnekte, oyunun başında aşağıdaki GML kodunu kullanırsınız:



{
  global.mmm = external_define('MyDLL.DLL','MyMin',dll_cdecl,
                                     ty_real,2,ty_real,ty_real);
  global.ddd = external_define('MyDLL.DLL','DoubleString',dll_cdecl,
                                     ty_string,1,ty_string);
}

Şimdi, işlevleri çağırmanız gerektiğinde, aşağıdaki işlevi kullanırsınız:
external_call (id, arg1, arg2, ...) Verilen işleve ve verilen argümanlara sahip harici işlevi çağırır. Doğru türde (gerçek veya dize) doğru sayıda argüman sağlamanız gerekir. Fonksiyon harici fonksiyonun sonucunu döndürür.
Yani, örneğin, sen yazarsın:


{
  aaa = external_call(global.mmm,x,y);
  sss = external_call(global.ddd,'Hello');
}
Artık DLL kullanmanız gerekmiyorsa, daha iyi serbest bıraktınız. external_free (dll) DLL'yi verilen adla serbest bırakır. Oyunun DLL'yi kaldırması gerekiyorsa bu özellikle gereklidir. DLL serbest olmadığı sürece kaldırılamaz. En iyisi bu örn. Oyun etkinliğinin sonunda.Oyunda bir şeyler yapan bir DLL'de nasıl bir işlev yapılacağını merak edebilirsiniz. Örneğin, oyununuza nesne örnekleri ekleyen bir DLL oluşturmak isteyebilirsiniz. En kolay yol, DLL işlevinizin bir GML kodu parçası içeren bir dize döndürmesine izin vermektir. GML parçasını içeren bu dize, GML işlevi kullanılarak yürütülebilir execute_string (str, arg0, arg1, ...) Belirtilen argümanlarla str dizgesindeki kod parçasını yürütün. Alternatif olarak, DLL'nin çalıştırılabilen bir betik içeren bir dosya oluşturmasına izin verebilirsiniz (bu işlev, bir oyunun davranışını daha sonra değiştirmek için de kullanılabilir).execute_file (fname) Dosyadaki kod parçasını yürütün.Artık bir harici işlevi çağırabilir ve ardından ortaya çıkan dizeyi, örn. aşağıdaki gibi:

{
  ccc = external_call(global.ddd,x,y);
  execute_string(ccc);
}
Bazı nadir durumlarda DLL'nizin oyun için ana grafik penceresinin tanıtıcısını bilmesi gerekebilir. Bu, aşağıdaki işlevle elde edilebilir ve daha sonra DLL'ye geçirilebilir: window_handle () Ana pencerenin pencere kolunu döndürür. DLL'lerin güvenli modda kullanılamayacağını unutmayın. Harici DLL'leri kullanmak son derece güçlü bir mekanizmadır. Ama lütfen sadece ne yaptığını biliyorsan onu kullan...

2 comments: