GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

MultiLine (Çok Satırlı) TextDraw

Başlatan squarepants, 18 Eylül 2020, 15:09:58

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

squarepants

GİRİŞ


Herkese iyi forumlar. Bugün kolay ama kullanışlı olduğunu düşündüğüm bir konuyu sizlere anlatmak ve paylaşmak istedim. Umarım yardımcı olabilirim.

Konu, başlıkta da belirtildiği gibi TextDraw (metin çizimleri) kullanarak birden fazla satırda mesaj göndermenin mantığını anlatmaya çalışacağım. Bu yöntem genellikle FreeRoam sunucularında kullanılmayı tercih edilse de bence diğer sunucular için de işe yarayabilir.


PAWN UYGULAMASI


Şimdi ise PAWN derleyicisini kullanarak yapmak istediğimiz projeye başlayalım.

- İlk olarak çoklu satırlı TextDraw oluşturmak için bir sıralayıcı değişken tanımlıyoruz :

enum E_SUNUCU_MESAJ
{
 Float:E_KOORDINATX, // TextDraw X Koordinatı
 Float:E_KOORDINATY, // TextDraw Y Koordinatı
 E_MESAJ[128], // TextDraw Mesaj
 Text:TDID // TextDraw ID (Kimlik)
}
- Gerekli sıralayıcı değişkenler tanımlandıktan sonra kontrol işlemi için bir dizi tanımlamamız gerekiyor. Diziyi tanımlamadan önce oluşturulacak Maximum Satır Sayısını belirlememiz gerekiyor -ki Dizi yapacağı işlemi satır sayısına göre gerçekleştirebilsin.

#define MAX_SATIR (4)
new _sMesaj[MAX_SATIR][E_SUNUCU_MESAJ] =
{
/*-----X----Y-------METIN------*/
 {320.0,245.0,"BOS METIN"}, //Başlangıç Noktası
 {320.0,255.0,"BOS METIN"}, //245 + 10
 {320.0,265.0,"BOS METIN"}, //255 + 10
 {320.0,275.0,"BOS METIN"} //265 + 10
};
Yukarıda da görüldüğü gibi 4 satırdan oluşan iki boyutlu bir dizi tanımlandı.
Şimdi ise bu 4 TextDraw için X ve Y koordinatlarını belirlememiz gerekiyor. İlk olarak TextDraw ' ın başlangıç konumunu ayarlamak için X ve Y koordinatlarını manuel olarak belirlememiz gerekiyor. Bu işlem sonrasında satırlar arası boşluk (Y ekseni) için bir değer belirlememiz gerekiyor. Ben bu değeri 10 olarak ayarlamıştım.


- Daha sonra ise oluşacak bu yeni TextDraw topluluğu için satırları kontrol edebileceğimiz bir fonksiyon oluşturmalıyız :
stock MESAJ_GONDER(const metin[])
{
static
mSlot = 0; //Dizimizi kontrol edecek olan eleman
if(mSlot == MAX_SATIR)
{
                     for(new i = 0; i < MAX_SATIR; i++)
                     {
if(_sMesaj[i][E_KOORDINATX] == 320.0 && _sMesaj[i][E_KOORDINATY] == 245.0){
     format(_sMesaj[i][E_MESAJ],128, "%s", metin); // Mesaj Alindi
     TextDrawDestroy(_sMesaj[i][TDID]); //TextDraw Kaldirildi
     _sMesaj[i][E_KOORDINATY] = _sMesaj[i][E_KOORDINATY] + 30;
     _sMesaj[i][TDID] = TextDrawCreate(_sMesaj[i][E_KOORDINATX], _sMesaj[i][E_KOORDINATY], _sMesaj[i][E_MESAJ]);
     TextDrawSetShadow(_sMesaj[i][TDID], 0); //Gölge Kaldırıldı
                       TextDrawShowForAll(_sMesaj[i][TDID]);//TextDraw Mesajı herkese gösterildi
}
else
{
                             TextDrawDestroy(_sMesaj[i][TDID]); //TextDraw kaldirildi
                             _sMesaj[i][E_KOORDINATY] = _sMesaj[i][E_KOORDINATY] - 10;
                             _sMesaj[i][TDID] = TextDrawCreate(_sMesaj[i][E_KOORDINATX], _sMesaj[i][E_KOORDINATY], _sMesaj[i][E_MESAJ]);
                             TextDrawSetShadow(_sMesaj[i][TDID], 0); //Gölge Kaldırıldı
               TextDrawShowForAll(_sMesaj[i][TDID]); //TextDraw Mesajı herkese gösterildi
}
     }
}
else
{
     format(_sMesaj[mSlot][E_MESAJ],128, "%s", metin); // Mesaj Alindi
    _sMesaj[mSlot][TDID] = TextDrawCreate(_sMesaj[mSlot][E_KOORDINATX], _sMesaj[mSlot][E_KOORDINATY], _sMesaj[mSlot][E_MESAJ]);
    TextDrawSetShadow(_sMesaj[mSlot][TDID], 0);//Gölge Kaldırıldı
    TextDrawShowForAll(_sMesaj[mSlot][TDID]); mSlot++; //TextDraw Mesajı herkese gösterildi, mSlot +1 değer kazandı.
}
}
Yukarıdaki fonksiyonun çalışma mantığı ; mSlot adında durgun bir değişken tanımlayarak her satır için ayrı bir TextDraw oluşturmak. Fonksiyon her çağırıldığında mSlot adlı değişken +1 değer alarak bir sonraki satır için TextDraw oluşturulur. Daha sonra ise eğer satır limiti dolu ise (mSlot adlı değişken MAX_SATIR adlı tanımlamadan küçük ise), basit bir döngü oluşturarak ilk satır TextDraw konumunu tespit etmiş oluyoruz. Gönderilen mesajı alarak ilk satırın bulunduğu TextDraw silinerek son satırın bulunduğu TextDraw konumuna taşıyoruz. Basit bir matematik oyunu ile yani bulunduğu Y koordinatına +30 birim ekleyerek 240 + 30 = 270 değerini elde ediyoruz. Altta kalan diğer 3 TextDraw ise 10 birim -10 birim Y ekseni boyunca ilerlemek zorunda , bu nedenle her biri -10 birim yukarıya kaydırılıyor. TextDraw 2 boyutlu bir koordinat düzleminde çalışır, bunu örnek bir görsel ile ifade etmek gerekir ise :

- Artık geriye sadece fonksiyon kullanımı kaldı. Basit bir örnek üzerinden açıklamak gerekir ise :
CMD:mgon(playerid, params[])
{
 new mid, mesaj[28 + 32], Isim[28];
 if(sscanf(params,"d",mid)) return SendClientMessage(playerid,-1,"BILGI : Kullanım /mgon [0 - 4]");
 GetPlayerName(playerid, Isim, sizeof Isim);
 switch(mid)
 {
     case 0:{format(mesaj, 128,"%s adli oyuncu oyuna girdi.",Isim); MESAJ_GONDER(mesaj);}
     case 1:{format(mesaj, 128,"%s adli oyuncu DERBY'e gitti.",Isim); MESAJ_GONDER(mesaj);}
     case 2:{format(mesaj, 128,"%s adli oyuncu DM'e girdi.",Isim); MESAJ_GONDER(mesaj);}
     case 3:{format(mesaj, 128,"%s adli oyuncu B'i soydu.",Isim); MESAJ_GONDER(mesaj);}
     case 4:{format(mesaj, 128,"%s adli oyuncu sunucudan cikti.",Isim); MESAJ_GONDER(mesaj);}
 }
 return 1;
}
Yukarıdaki komutu 4 defa sunucu içerisinde denediğinizde :

Yukarıdaki gibi bir görüntü elde edersiniz. Eğer bu komutu 5 defa deneseydiniz 1. satır silinecek , yeni mesaj alınacak ve son satır koordinatlarında yeniden oluşturulacaktı. Diğer satırlar ise - 10 birim yukarıya kaymış olacaktı. Yani bu döngü sürekli bir şekilde devam edecek. Tabii bu TextDraw mesajlarını kendinize göre renklendirebilirsiniz. Bir örnek daha uygularsak :
public OnPlayerSpawn(playerid)
{
    new ism[30], gmsj[30 + 34]; GetPlayerName(playerid, ism, sizeof ism);
    format(gmsj, 64, "~r~%s ~b~ adli oyuncu oyuna girdi.", ism);
    MESAJ_GONDER(gmsj);
    return 1;
}

Oyuncu spawn olduğunda ismini kırmızı  (~r~) diğer metni ise mavi (~b~) renkte yazacaktır. Bu metin renk tanımlarını aşağıdaki bağlantı adresinden de bulabilirsiniz :
https://wiki.sa-mp.com/wiki/GameTextStyle
Bu, ve bu tip mesajları sunucunuza göndererek çok satırlı bir TextDraw metin bilgisi elde etmiş olursunuz.

Umarım yararlı olmuştur. Herkese iyi forumlar.
Son düzenlenme: 18 Eylül 2020, 16:19:13 ThePosition

Zeynel

Avrupa HP Hırsız Polis