SlideShare a Scribd company logo
1 of 103
Download to read offline
3D Game
               Studio
FUNCTĐONLAR:
1-)TEXT

font resim_font=<system.pcx>,10,12;//özel font resim olarak
font arial="arial",1,20;//standart font

text yazi()//text objesi tanımlanıyor
{
      pos_x=10;//x koordinat teki başlangıç adresi
      pos_y=10;//y koordinattaki başlangıç yeri
      font= arial;//yada “resim_font” yazarak resim fontu seçeriz
      string=" a=n b=n c=n";//yazi /n alt satıra geçer
      alpha=100;//parlaklık
      layer=2;//daha önce panel ya da yazı varsa hangisi hangisinin
//üzerine geçeceğini belirten bir hiyareşi
      flags=visible , outline , transparent;
      }

Burada önemeli olan “flags” aldığı parametreler.
Bunlar:
condensed –yazıyı yatay olarak sıkıştırır.
narrow -yazıyı sıkıştırır.
transparent – arka planı gösterir.
visible – yazının görünmesi ya da göstermemek.
shadow – TTF gölgelendirme yapar.
outline- TTF yazıları belirgin hale getirir.




Text function unda “string” rakam atayamıyor.
2-) PANEL
Ön panelle ilgili yazı resim koyabilmek için bir function.



bmap fatih=<fatih.pcx>;//resim değişkeni

PANEL ekran_panel()
{
pos_x=10;//yazının başlangıç kordinati
pos_y=10;


/*----------------------------------------------------------------------------------
Ekrana resim yerleştirmek için Windows özelliğini kullanırız bu
özelliğin ilk 2 parametre (x,y) pos_x ve pos_y belirten koordinattan
başlayarak verdiğiniz x,y koordinattan resim başlayacak. Diğer 2
parametre sırasıyla genişlik ve yükseklik resmin. Diğer parametre
resmin değişkeni. Son 2 parametre (x,y) ise resmin neresinden
başlayarak ekrana yerleştirelecegini ifade eder.
----------------------------------------------------------------------------------*/
window(200,200,400,400,fatih,500,500);

/*----------------------------------------------------------------------------------
Digits özelligi ise kordinatı verilen yere sadece rakam yerleştirmeye
yarar. Aldığı ilk 2 parametre ekranın neresinden başlanacağını
kordinatıdır. Diğer parametre yazının uzunluğunu verir yazıdan
daha uzun bir değer verirseniz sağa tarafa yanaşmış olarak yazılır.
Diğer parametre font değişkeni diğer parametre çarpan değeridir.
Son parametre ise bir ekrana yazdırmak istediğimiz rakam,
değişkendir.
----------------------------------------------------------------------------------*/
digits=0,0,9,arial,1,b;
digits=0,20,9,arial,1,a;
/*----------------------------------------------------------------------------------
Visibile= rakamın görünmesi ya da göstermemek.
overlay = Tam siyah olan bölgeleri yok sayması şeffaf yapar arka planı
gösterir.
transparent= arka plan resmi harmanlayarak gösterir.
Not: bu ayarları iyi görebilmek için main functionun içine”
screen_color.red = 255;” parametrelerinide ekleyin.
----------------------------------------------------------------------------------*/
layer=1;//hiyareşi üsteki text adlı örnekte bakarsınız layer onda2
//bunda 1 oldu için bu altta kalacak
flags=visible;
}
ÖRNEKLER:
1-)
2-)
3-)BUTTON

Bu çalışmada buton yapmayı ve butona estetik kazandırmak için
buton basıldığında şeklinin değişmesini sağlayacaz butona
basıldığında bir “function” çağıracaz bazı işlemler yaptıracaz.
Buttonu oluşturmak için panel functiondan faydalanıyoruz buton
yapısına bakalım.

BUTTON = x, y, bmapOn, bmapOff, bmapOver,
functionOn, functionOff, functionOver;
Parametreler=
x – pos_x verdiğimiz koordinattan başlayarak x kordinatına
gider.
y – pos_y verdiğimiz koordinattan başlayarak y kordinatına
gider.



bmapOn – Butona tıklanınca alacağı resim.
bmapOff - Butona tıklanmayınca alacağı resim.
bmapOver – Farenin imleci butonun üzerine gelince butonun
alacağı resim.
functionOn- Butona tıklanınca çalışacak olan function.
functionOff- Butona tıklanmayınca çalışacak function.


functionOver - Farenin imleci butonun üzerine gelince
çalışacak function.
Ör:
4-) YATAY VE DĐKEY KAYDĐRMA ÇUBUKLARI
Kaydırma çubuklarına aldıgı parametrelere batkımızda=
VSLIDER = x, y, len, bmap, min, max, var;
HSLIDER = x, y, len, bmap, min, max, var;
x - X posizyonundaki sol üst kordinatı.
y - Y posizyonundaki sol üst kordinatı.
len –Kaydırmaının ekrandaki genişligi.
bmap- resim dosyası.
min – minumum alabilecegi deger.
max - maxsumum alabilecegi deger.
var – kaydırma çubugun degişimdeki degerini buraya
yansıtacak.


Ör:
5-) ENTITY
Şimdi tanıtacağımız fonksiyon camera görüntemize bir model yada bir resim eklememize
sağlayacaz. Đleriki aşamalarda silah gösterimdede kullanacagız. Ufak bir hatırlatma 3d
dünyasında kameraya bir silah eklemek o silahın 3d dünyasında varlıgını ifade etmez sadece
bizim kameramızda gözükür. Genellikle Wolfenstein zamanlarında çıkan oyunlarda gözüken bir
kullanımdır bu. Bu kullanım Wolfensteinda da kullanılmıştır. Desteklenen dosya formatları pcx,
bmp, tga, dds, vede mdl dir.
Resimdende anlaşılacağı üzere type özelliğine modelimizin dosyasını ismini veriyoruz. Flags ise
bu varlıgımıza ait özellikleri buradan ayarlıyoruz visible diyerek silahı görünür hale yapıyoruz. x
y z ile de ekranımıza yerleşimini yapıyoruz bu yerleşimi daha iyi anlamak için aşşagıdaki resme
bakınız.
Resimdeki kordinat sistemini bizim pc ekranımız olrak kabul ederek düşünüz .Bu arada bişey
hatırlatıyım peki ekrana yarleştirecegimiz modelin baz alınacagı yeri nasıl belirleyecez ☺ burada
da modelimizin orjinini baz almakta ama her modelde orjin modelin ortası olmayabilir bunun
için mdl dosyamızı med ile açarsak aşşagıdaki resme göre modelimizi yerini ayarlarsak artık
modelimizin döndürdügümüzde veya taşıdıgımızda artık modelin ortası baz alınacaktır.
Varlıgımıza diger fonksiyonlardan ulaşmak için ise silah.x gibi varlıgımızın ismini yazdıktan
sonra nokta ile alt özelliklerini ulaşarak degiştirebiliyoruz yada öğrenebiliyoruz.
Resim yada animasyonlu resim ekleyebeliriz. Sprites örnek olması için aşşagıda bir
uygulama var.
Bu bize ekrannımaza objeyi yerleştirmemize yardımcı olacak ama animasyonunu başka yerde ya
bunun frame özelliğine ulaşarak yapacaz yada ent_animate yle yapacaz. Sprite ismini dikkat
edersiniz. Explo+11 denilmiş ordaki +11 resimde 11 tane framenin animasyonun oldugunu
bildirmekte.Flags daki overlay ise renk kodu 0,0,0 yani tam siyah olanları ekrana yansıtma
demektir.

Entity özelliğini çoğu şeyde kullancaz 3d li boş kovanlarda olsun silahın ucundan çıkan duman
olsun ekrana 3 boyutlu bişey yerleştirmekten tutun çoğu yerde faydalanacaz.

Layerlara deginilecek.

6-) VĐEW
View ekranda haritada bir yeri göstermek için kullanılmaktadır.
Bu ayarları yaptıktan sonra ekranıza sol üst köşesinden bir alan gelmiştir sanırım bu görüntünün
ayarları için artık remote den faydalanacaz. Not:içinden verdigim kordinatları kabul etmiyor
dişaridan ulaşılarak degiştirilmeli.




Üsteki resimlede bu actionu atadıgımız varlığı bir nevi kamera gibi düşünüp onun kordinatlarını
alarak remote görüntüye yansıttık.




Veya bir tv gibi bir varlığa o görüntüde olmasını istiyorsak bu actionunada o varlıga eklemeliyiz.

Panellerde falan resmini degiştirmek için bmap kullanılır. Sonra roketin giderken nasıl gittiginide
burada gösterebiliriz.




6-) SKY
Bakacam sonra. Flagslardan CUBE , DOME, SCENE
incelenecek. Layerlara değinilecek.
SKY      creates a sky entity. Otherwise it's a view entity.
DOME     360 degrees half dome texture
CUBE     six sided cube texture
CYLINDER 360 degrees cylinder texture
SCENE    don't use the z buffer (sky models only)




5-)POĐNTER
Pointer bir function yada degişken yada entity memory
adresini saklamak için kullanır bu adreslede varlıga
ulaşılabilir.
entity* the_player;

function* check_status;

string* my_name;

panel* game_over;

bmap* health_picture;

Ör:
entity* p_adam;//burada bir varlık pointer degişken
tanımlıyoz.
action adam{p_adam=me;//pointer degişkene bu
//action verdigimiz adam yada varlıgı hafıza adresini
//aktarıyoz.}
function kl_up(){p_adam.x+=1;
wait(1);}
on_anykey = kl_up;//burada bir tuşa basıp çektikten
sonra kl_up fonksiyonuna git diyoz. Đstersek on_X
buradaki X hangi tuş ise onun ismini temsil ediyor.
Ör:on_q=kl_up Q harfine basıp çekince kl_up
fonksiyonunu çagırıyor.
6-)KLAVYE
Bir tuşa basıldıgını anlamak için
“key_X” buradaki x hangi tuş ise onu temsil ediyor
yalnız burada tuşa basılınca aktif oluyor biz tuşa
basılıp çekince aktif olmasını istiyorsak yukardada
anlattım kod gövdelerin dişinda “on_a=function_ismi”
diyerek a tuşuna basılıp çekilince function_ismini
belirtimiz functiona zipliyor.


7-)FARE
Farenin tuşlarının basılıp basılmadını
“mouse_left==1” veya “mouse_right==1” olarak
ögrenebiliriz. Mousun ekranda gözükmesi için
Sonsuz bir döngüde mousun x,y kordinatlarını ve
mousun mode ayarlamalıyız vede mousun imleci
atamalıyız.
8-)BREAKPOINT VE BREAKPOINT_ON
Oyun esnasında değişkenlerimiz görmek için bir kırılım
noktası ayarlamak için kullanacağız 2 çeşit kullanımı var
bunlardan birincisi nerde kırılma yapmak istiyorsak o yere
“breakpoint; diyerek orda kırılma oluşacak ve kodlar oyun
ekranının sol üst köşesinde gözükecektir. Boşluk tuşuyla kod
kaldığı yerden adım adım ilerlemesi
sağlanabilir.




Đkinci yolumuz “breakpoint_on();” dur bu kodumuz
özelliği parantez içerisine koşul yazıyoz koşul
gerçekleştiğinde kırılma gerçekleşmesidir.
breakpoint_on (my.pan > 357);
9-)ELLE ADAM OLUŞTURMAK
Haritaya daha sonradan adam sprite gibi araçlar varlık koymak
için “ent_create” özelliginden yaralanıyoz bu özelligin prototipi
ent_create (string filename, vector Position, function);
10-)Camera
Camera.aspect //camerayı tersini alma veya sündürme. Yani yatay dikey piksel boyut oranını
belirleme.
10-)MODEL YÜRÜTME

Varlığımızı haraket ettirmek için kullancağımız 2 fonksiyon vardır.

Bunlar ent_move ve c_move dir. Bu 2 fonksiyonda birbirinin çok
benzemektedir yalnız c_move sonradan eklenmiş olup daha yeni mode
özelliklerine sahiptir sadece aralarındaki fark budur.

Tanımlama ve aldığı parametreler aşağıdadır.

1-)c_move(ENTITY* entity,VECTOR* reldist,VECTOR* absdist,var
mode)

2-)ent_move (vector reldist, vector absdist);
move_mode =GLIDE;

Aşağıda ent_move ile bir örnek yapılmıştır c_movede bunun gibidir
hiçbir farkı yoktur sadece move_mode ile ent_move birleştirmiştirler .
ent_move(move,nullvector);//ilk parametre yerel kordinata göre adam
yönlendirken(adamın kendi x y sine göre) 2 ci parametresi ise global
kordinat sistemine (haritanın kordinatı) göre hareket ettirir.(yukaridaki
resme bakınız)
Tabiki bu yönlendirme şu vektöre (x y z) git değil daha çok x bir verirsek
adam her fps 1 piksel öne yada y 1 verirsek 1 piksel yana z 1 verirsek bir
piksel yukarı gibi kaydırmayla çalışmakta .

Move_mode = GLIDE;
Yürümeye bazi özellikler katmak için move_mode kullanıyoz. Aldığı
degişken parametreler aşşagıdadır:
IGNORE_YOU //sürtüşmeyi ve/veya çarpışmayı diğer varlıklar (model
entity) yok say.
IGNORE_PASSABLE//bütün yol , duvar, model lerin passable bayrağı
seçiliyse çarpışmaları aldırma. Bu özellik daha çok su gibi varlıklar için
kullanılmakta.(bakınız aşağıdaki resme)




IGNORE_PASSENTS // passable bayrağı işaretli olan model ve sprite
aldırma. Bu özellik ignore_passable geliştirilmiş halidir. Ignore_passents
aktif edilmiş ise bize 3 tane bayrağı kullanarak bize bilgi vermektedir.

in_passable=modelin içindeysek bu bayrak 1 olur içinde değilsek 0 dır.
on_passable= modelin diş kenarındaysak bu bayrak 1 olur diş kenarında
değilsek 0 dır.
in_solid=Bakılacak . bu özellik sadece ent_move için geçerli sanırım.
Not : Bu özellik move de kullanılıdığı için yukaridaki bayrakların
degişimi bizim hareketimize bağlı olarak değişmekte haraket etmiyorsak
0 olarak döner.


IGNORE_MAPS //Harita varlıklarını (map entity) yoksay. (aşşagıdaki
resme bakınız)




IGNORE_MODELS //bütün modellere aldırma.
IGNORE_SPRITES //bütün sprite aldırma.

ACTIVATE_PUSH //Bir varlığa çarptığımızda karşıdakinden
geçemediysek bu olay meydana gelmiş olur çarpişma alğılamak için
kullanıyoz.
Çarptığımız engele bu olayı tetiklemek için event_mode activate_push
eklenmesi gerektiğinide unutmayın.

Ör:
function engel
{
  if(event_type==EVENT_PUSH) //tetiklenen olayın türünü
sorğulayoruz.
  {beep(); }//bip sesi çıkarmak için

}

action beni_itiyorlar
{
  my.push = -2; //ignore_push a bakın.
  my.ENABLE_PUSH = ON; //tetiklemeyi aktif yaptık
  my.event=engel; //fonksiyonu çağırdık.

}
IGNORE_PUSH //kendi push degerinden(my.push) düşük olan
varlıkları aldırmadan içinden geçiyor yalnız tetikleme meydana geliyor.
Sadece içinden geçmesini enğelemiyor . my.push default olarak 0 dır -
100 … ile 100 arası bir değer alabiliyor.
Mesala bir kayanın “you.push = -2;” oldugunu ama bizim playerimizin
“my.push=10;” kabul edersek 10>-2 büyük olduğu için kahramanımız
kaynın içinden geçebilecek ama tetikleme yinedemeydana gelecek tabiî
ki biz move_mode a activate_push eklediysek tetikleme meydana
gelecektir aksi halde tetikleme gerçekleşmez. Kendimezden düşük push
olan varlıkları algılama.



ACTIVATE_TRIGGER - Hareket esnasında tetik olayları muktedir kıl.

Ör:
function engel
 {
   if(event_type==EVENT_TRIGGER) //tetiklenen olayın türünü
                                               sorğulayıyoruz.
{beep(); }}//bip sesi çıkarmak için


}

action beni_itiyorlar
{
 my.trigger_range = 500; //yaklaşma mesafesi
  my.ENABLE_TRIGGER = ON; //tetiklemeyi aktif yaptık

    my.event = engel; //fonksiyonu çağırdık.

}

Bu özellik daha çok belli mesafelerden varlığa yaklaşıldığında çalışması
için kullanılır yaklaşma mesafesini belirlemek için my.trigger_range
verdigimiz değer kadar uzaktan tetikleme meydana gelir default değeri 0
dir.

ACTIVATE_SHOOT , ACTIVATE_SONAR
Birbirlerinen aynısı sayılır bunlar bir nevi kapan ğibi düşünebilirsiniz bir
varlığın üzerine çıkmak bir varlığa dokunmak gibi olaylarla tetiklenir.
Ör:

function func_kapan
 {
   if(event_type==EVENT_SONAR)
   {beep(); }

 }
action kapan
{

    my.ENABLE_SONAR = ON;
my.event = func_kapan;

}


USE_AABB= Düzene sokulmuş eksen ifade etmekte. Bunun anlamıda
çarpışma algılamalarında bir varlığı sanki bir kutu çerçeveliyor gibi
kullanılmasıdır bunda esas amaç verimli ve hızlı olmasıdır ama ne
yazikki varlığın gerçek yüzeyleri yok sayılmakta. Çevrelen kutuyu
görmek için oyun motorunda çalıştırdıktan sonra F11 ile görebilirsiniz.
Bu çevreleyen kutunun büyüklüklerini min_x, min_y, min_z max_x,
max_y, max_z den ayarlayabilirsiniz.

Ör:
vec_set(my.min_x,vector(-50,-50,-50));
vec_set(my.max_x,vector(50,50,50));


GLIDE // kaymayı aktif eder.
You= Bir olay gerçekliştiğinde kimin tarafından gerçekleştirdiğini
bellekteki adresini buradan ögrenileiliriz. Örnek vermek gerekirse bir
çarpışma olayı ayarladık ve geldi biri bize çarptı o anda you
degişkeninde bize çarpan kişinin bellek adresini geri döndürürek kimin
çarptıgını algılatabiliriz eger bir olay yoksa null döndürür.
Target= çarpışmanın gerçekleştigi yerin posizyonunu verir.



Genel bir örnek:

action adam_yuru()
{
  player=me;
     while(player!=NULL)
     {
//klavye sag sol yön tuşuna göre atama
 x=key_cud-key_cuu;
 move.x=x;
 y=key_cur-key_cul;/y ekseninde adam
 move.y=y;
 z=key_a-key_z;
 move.z=z;
move_mode=glide;
 ent_move(move,nullvector);//adamı hareket ettiriyoz
     wait(1);

    }

}

key_cur=klavye yön tuşundan sol
key_cul=klavye yön tuşundan sağ
key_cud=klavye yön tuşundan aşağı
key_cuu= klavye yön tuşundan yukarı




key_force.x // klavyedeki sag sol ok yönleri temsil etmekte olup sağ 1
sol -1 dir hiçbir tuşa basılmadıgında 0 olmaktadır.

key_force.y // klavyedeki yukarı aşşağı ok yönleri temsil etmekte olup
yukarı 1 aşşağı -1 dir hiçbir tuşa basılmadıgında 0 olmaktadır.
Adamımızı döndürmek içinse pan özelligini kullanıyoz.
Adam kendi yönünde saat yönünde dönmekte pan değeri 0 ile 360 derece
arasında bir deger almakta.
11-)KAMERA

Varlıgımızla gözüyle dünyayı görmek için varlıgımızla beraber
kameranında haraket etmesi gerekiyor .

vec_set(camera.x,player.x);
camera.z+=27;
vec_set(camera.pan,player.pan);
player varlığımızın sürekli tekrarlayan yerine bu kodu yazarsanız
adamızla beraber camerada gidecektir yalnız adamımız
gözekecektir eğer adamımızı bir merkez olarak ele alarak
haraket etmesini istiyorsanız örek vermek gerekirse quake3
oyununda player göremezsiniz sadece silah vardır adamı görmek
için aynaya bakmanız gerekir Bu gibi görünte eldetmelere first
person denilmekte bir bevi ilk bizim görmemiz gibi. Bunun gibi
bişeyi yapmak isityorsanız cameramıza adamı bağlamamız
gerekir bunun içinde camera.genius=player;
koduyla adamımızı bağlıyoruz adamı göremiyorsanız kamerayla
ama kahramanımız orda hiçbir yere gitmedi isterseniz ben bunun
gibi bişey yazarım derseniz tabiki yapabilirsiniz sadece işler
biraz karışırı onun içinde sin ve cos faydalanarakta
yapabilirsiniz.

camera.x=player.x +(200 * cos(camera.pan) );
camera.y=player.y + (200 *sin(camera.pan) );



                  12-)MODEL ANĐMASYON



ent_animate(player,"run",run%100,ANM_CYCLE);

player =ent_animate fonksiyonunu aldığı ilk parametre adamın değişken
ismi
"run"=run ise mdl formattaki modelin animasyondaki ismi olmalı bu çok
önemlidir eğer ismini yazmazsanız adam istediginiz animasyonu
yapmayacaktır .
run%100= animasyon 0…100 kadar aralıkta tanımlanmış olup run
isminde bir degişken tanımlanıp bu degişeken 1 er 1 er artırılıyor ve
%100 ile 100 klanı olan modunu alıyor.
ANM_CYCLE=animasyonun modlarını ayarlıyor aldıgı
parametreler 3 tane bunlar:
ANM_CYCLE //tekrarlı animasyon
ANM_SKIP //atlamalı animasyon
ANM_ADD //eklemeli animasyon

Vec_set( 1vec, 2 vec);// 2 vectörü 1 vectörü kopyalar.
Camera.pan //camera sag sol dönme
Camera.tilt //camera aşagı yukarı dönüş



                         13-)YER ÇEKĐMĐ


Şimdide modelimizi yüretecez vede merdivenden ve/veya aşyaların
üzerine çıkmasını sağlayacaz bunu için kullanacamız fonksiyon c_trace
isimli fonksiyon olacak bu fonksiyon modelimiz ile varlık harita objeler
v.b. karşılaştırma yapar C_trace use_box seçilmemişse her zaman işin
kullanır. Use_box seçilmişse çok köşeli polygonlarda elipsoid bir biçim
test eder. C_trace aslında bir nevi tarama dır ileride görecegimiz c_scan
dan önce çıkan bir özellik olup yönlendirme açı veremiyoz c_scan
özellikleri daha çok olup ama c_trace kendine özgü özellikleri
mevcuttur. Aşşagıdaki resme bakarsanız. C_trace çalışmasını daha iyi
anlayacaksınız.
Level çarpişmalarda her zaman elipsoid kullanılmakta.


c_trace(VECTOR* from, VECTOR* to, var mode)
// trace fonksiyonun aldıgı ilk parametre modelimiz x konumu 2 ci
parametre ise hedef vektorümüz 3cü parametremizde trace ilgili ayarlar.


Daha sonra c_trace fonksiyonun kullanacagız ama c_trace geçmeden
istisnalar v.b. modunu tanımlayalım.

mode=

IGNORE_ME // Benim varlığımı görmezlikten gel.
IGNORE_YOU //sürtüşmeyi ve/veya çarpışmayı diğer varlıklar (model
entity) yok say.

IGNORE_PASSABLE//bütün yol , duvar, model lerin passable bayrağı
seçiliyse çarpışmaları aldırma. Bu özellik daha çok su gibi varlıklar için
kullanılmakta.(bakınız aşağıdaki resme)
IGNORE_PASSENTS // passable bayrağı işaretli olan model ve sprite
aldırma. Bu özellik ignore_passable geliştirilmiş halidir. Ignore_passents
aktif edilmiş ise bize 3 tane bayrağı kullanarak bize bilgi vermektedir.

in_passable=modelin içindeysek bu bayrak 1 olur içinde değilsek 0 dır.
on_passable= modelin diş kenarındaysak bu bayrak 1 olur diş kenarında
değilsek 0 dır.
in_solid=Bakılacak . bu özellik sadece ent_move için geçerli sanırım.



IGNORE_MAPS //Harita varlıklarını (map entity) yoksay. (aşşagıdaki
resme bakınız)
IGNORE_MODELS //bütün modellere aldırma.
IGNORE_SPRITES //bütün sprite aldırma.



IGNORE_PUSH //kendi push degerinden(my.push) düşük olan
varlıkları aldırmadan içinden geçiyor yalnız tetikleme meydana geliyor.
Sadece içinden geçmesini enğelemiyor . my.push default olarak 0 dır -
100 … ile 100 arası bir değer alabiliyor.
Mesala bir taşın “you.push = -2;” oldugunu ama bizim playerimizin
“my.push=10;” kabul edersek 10>-2 büyük olduğu için kahramanımız
taşın içinden geçebilecek ama tetikleme yinedemeydana gelecek tabiî ki
biz move_mode a activate_push eklediysek tetikleme meydana
gelecektir aksi halde tetikleme gerçekleşmez. Kendimezden düşük push
olan varlıkları algılama.

IGNORE_WORLD//Görmezlikten gel level terrain ve level block
larını.
IGNORE_FLAG2 //Bayrak 2 seçiliyse aldırma.




USE_BOX //(MIN_X, MAX_X ) b_box bayrağı seçiliyken yada seçili
degilken kahramanımızın kaplayan çerçeveyi kullanrak f11 gözüken
çerçeveyi kullanarak tara bu taramada kahramanımızın orgini degilde
kutunun altından başla taramaya. Polyğon bayragı seçiliyse poligana
göre tara bu taramada kahramanımızın orjininden başlayarak tara
(aşşağıdaki resme bakınız).

ACTIVATE_SHOOT //varlığa vurulmayı sağla.
ACTIVATE_SONAR //varlığa sonar olayını sağla.

ACTIVATE_SHOOT , ACTIVATE_SONAR Birbirlerinen aynısı sayılır
bunlar bir nevi kapan ğibi düşünebilirsiniz bir varlığın üzerine çıkmak
bir varlığa dokunmak gibi olaylarla tetiklenir.



SCAN_TEXTURE //textureyi tarmayı aktifle. Bu özellik c_trace
taranan textureler hakkında bize bilgi verecek önceden tanımlanmış
değişkenler var taranan texturelerin bilgilerini buralara yazmakta bu
tanımlanmış değişkenler şunlardır :
tex_name // taranan texturenin ismini yazar. Aşşagıdaki iki resme
bakarsanız bir uygulama ile taranan resim ismini ekrana yazdırdım.




Đsterseniz direkte karşılaştırma yapabiliriz eger karşılaştırma yanı ise
dönen deger 1 iken degilse 0 dönecektir. str_cmp (tex_name
,”linesblackyell”); Yazi (string) ile uygulamalarımız biraz zahmetli
olacaktır kullandıgımız dil itabiriyle biraz c ye biraz delphiye
benzemekte string karşılaştırmalarda oyun motorun sunduğu
hizmetlerden faydalanacağız. Yeri geldikce strinğ karşılaştırmalara
deginecegim.

Hitvertex// bu özellik use_polygon aktif edildiği zaman çalışmaktadır
taranan varlığın en yakın vertex numarasını vermektedir ki gerçekçi
uygulamalarımızda çok faydalı olacaktır. Bu özellik modellerde vertex
oldu için model varlıklarda tarama yapmalısınız.

tex_flag1..tex_flag8// Bu özellik ile tarama yaptıgımız texturelerin flag
seçili olup olmadığını algılatmak için.
tex_light // Texturenin üzerine düşen işigın şiddetini vermektedir.
(0..255)




tex_color// vertex rengini veriri 3 boyutludur RGB

tex_fog// texturenin bulanıklığını verir.




Not: Scan_tex in gördügümüz degişkenlerinden sadece tex_name string
iken diger degişkenler numeriktir.

C_trace özellikleri gördükten sonra genel bir örnekle işin pekişmesini
sağlayacaz.
Şimdi öncelikle geçici bir vektör tanımlayalım vede bu vektöre
modelimizin konumunu aktaralım.

var temp_move[3]=0,0,0;//vektör tanımladık.
 vec_set(temp_move,player.x);//player.x player.y player.z konumunu
temp_move adlı vektöre kopyaladık.

temp_move.z-=200;//playerin konumundan z ekseninden – 200 düştük

z= -(c_trace(player.x,temp_vector,use_box +ignore_me ) ); //trace fark
pozitif degil negatif dir çünkü use_box kullandımız için kahramanı
çevreleyen tel kafesten başladı için kendisine göre negatiftir (aşşagıdaki
resme bakınız).
USE_AABB ve USE_POLYGON // bu seçenekler tarama modelin orjininden
başlarken use_box kendisini çevreleyen çerçevenin en altından başlayarak taramaya başlar. Use_polygon
modellerin girintli çıkıntılı grçek yüzeylerini algilayabilirken use_aabb algılayamamakta. Use_aabb f11
gördügümüz çerçeveyi degilde wed de modelin özelliklerine girdigimizde b_box ve polygon
seeçilmediginde f11 çıkan küçük kutucukla ilgilenmekte. Bu özelikler yeni özellik olduğu için daha
geliştirilmekte olup tamamen oturmamıştır geniş bir bilgi neyazikki yoktur. Bu özellikler çarpışmayla ilgili
yeni özelliklerdir aşşağıdaki resme bakınız.
MODĐFĐYELER:
target= Çarpişmanın gerçekleştigi yerin posizyonunu verir.

You= bir olay gerçekliştiginde kimin tarafından gerçekleştirdiğini
ögrenmek için bellekteki adresini buradan ögrenileiliriz. Örnek vermek
gerekirse bir çarpışma olayı ayarladık ve geldi biri bize çarptı o anda you
degişkeninde bize çarpan kişinin bellek adresini geri döndürürek kimin
çarptıgını algılatabiliriz eger bir olay yoksa null döndürür.
trace_hit = c_trace bir şeyi yakaladıgı zaman 1 döndürürken hiçbirşey
algılamadıgında 0 döndürür.




       14-)VARLIK ALGILAMA TARAMA

Şimdide bir nesneye veya varlığa yaklaşan modelleri algılatacaz buna
bir örnek vermek gerekirsek bir modelin kapıya yaklaştığında otomatik
olarak açılması veya modelimiz bir kapının karşısındayken bir tuşa
basarak o kapıyı açtırmak yada bir güvenlik kamerasının düşmanı
alğılaması veya bir düşmanın yaklaştıgını algılayarak yapacamız
stratejiyi belirlemek . Bunun için kullanacamız fonksiyon c_scan
foksiyonu dur.

                               C_SCAN

c_scan yapısını aşşagıda görebiliriz.

c_scan (VECTOR* pos, ANGLE* dir, VECTOR* sector, var
mode);
Pos                                                                            Taramanın başlayacagı
                                                                               noktayı orjinin noktası
Dir                                                                            Taramanın yönü
sector.x                                                                       Yatay tarama koni
                                                                               şeklinde veya 360
                                                                               derece verilerse daire .
sector.y                                                                       Dikey tarama koni
                                                                               şeklinde veya 360
                                                                               derece verilerse daire .
sector.z                                                                       Taramanın uzaklık
                                                                               mesafesi .
Mode                                                                           Tarama modları
                                                                               özellikleri.


C_scanın tarama mantıgını ve tarama mesafesini şeklini daha iyi anlamak için alttaki
resme bakınız.




C_trace ile c_scan görsel olarak karşilaştırısak aşşagıdaki resimle daha iyi
anlayacaksınız.
Mode özelliklerin aldığı değerler.

IGNORE_ME        Görmemizlikten gel beni.
IGNORE_YOU Görmemizlikten gel diğer modelleri .
                 Varlıkları tara ve olayları incele bu özellik ile bir varlık yakalandığı zaman
SCAN_ENTS
                 tetiklendigi zaman event_scan olayı gerçekleşir.
SCAN_POS         Camera tarar cameraya olan uzaklığıda geri döndürür.
                 Path veya Türkçesi ile yolun başlangiç konumunu dikkat sıfırıncı dügümü
SCAN_PATHS
                 başlangıç noktasını uzaklıgını geri döndürür.
                 Path in vaya Türkçesi yolun dügüm noktalarını tarar buldugunun arasındaki
SCAN_NODES
                 mesafeyi geri döndürür.
SCAN_LIGHTS Durağan işikları tarar kendine olan uzaklığı geri döndürür.
SCAN_LIMIT       SCAN_ENTS ve SCAN_LIGHTS birlikte çalışıyor gibi davranır.
C_scan taramada biri yakalanırsa kendisine olan uzaklığını geri
döndürmektedir.
Modifies:
you       Yakaldıgı varlıgın bellek adresini verir.
result    Taranan yere en yakın samimi olan yerin bize olan uzaklıgını verir.
target    Taranan yere en yakın samimi olan yerin posizyonunu verir.
bounce    Çarpışmanın yerinin açısal olarak çarptıktan sonra ziplayacagi yere yönlendirir.
           Çarpışmanın eksenlerdeki yerinin dikmi yatıkmı oldugunu algılamakta kullanılmakta.
          Ör: kurşun çarptıktan sonraki ziplayacagi yeri. Bunla yönlendiriz.
          z de tavan -1 zemin 1 dir egere çarpma yan yüzeylerde gerçekleşmişse x,y yüzeylerine
Normal
          z deki gibi 1 yada -1 deger almakta. Örnek duvara mermi çarpmasının izini
          bırakmakta kullanırız . Aşşagıdaki resme bakınız.
tex_color Duragan işik şiddeti.




                                 SCAN_ENTITY
Bildiniz üzere bir kapıyı açtırmak için bir tuşa basarak modelin
önündeki kapıyı açtıracaz böylelikle sürekli konturoldan kurtarırak
sistemin kasılmasından kurtaracaz .

Öncelikle bir fonkisyon tanımlayalım
 function calis()
{
scan_entity(player.x,vector(100,0,100));
}

Sonra bu fonksiyonu çagırmak için ya main blogun içine yada bütün
blogların dışında boş bir alana on_key=calis; //burada on_key deki
key anlamı klavyedeki tuşların ismi yerine ör: on_a dersem a tuşuna
basılıp çekildikten sonra gösterdigim fonksiyona ziplayacak.
 Ben bu örnegimizde on_q=calis;//q hrfini kullandım. Q harfine
bastıgımda scan_entity modelimizin konumndan başlayarak
taramaya başlayacak karşı modelimizde harita varlıgında
my.enable_scan=on; diyerek kendisinin taramaya aktif oldugunu
taramadan geçtiginde my.event aktarılan fonksiyonu çağıracak.
Buradaki önemli olan şey my.enable_scan=on; diyerek varlık olayı
tanımlıyoz yani bir kapıyı birisi taradıgında my.event aktarılan
fonksiyonu çalıştırır. Şimdi bu varlık olaylarını aşşagıda anlatıyım.
VARLIK OLAYLARI

•   Event_block – varlıgımız hareket halindeyken biri tarafından durdurulması halinde veya
    wed deki block lari çarpmasıyla gerçekleşir. c_move veya fizik hareketleriyle tetiklenir .
    Passable ve push degerlerinide dikkate alarak gerçekleşir.
    Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür.
    Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1
    ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir.

•   Event_entity – varlığın başka bir varlıkla çarpışma algılar. c_move ve fizik hareketlerinde
    tetiklenir. EVENT_PUSH ve EVENT_IMPACT te etkilenir.
    You değişkeniyle bize çarpan kişini bellek adresini geri bildirir.
    Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür.
    Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü, 1
    ise altı gibi diger yüzeyler içinde geçerlidir x,y -1 yüzeyi diger yüzeyi, x,y 1 ise diger yüzeyin
    çarpıştıgını geri bildirir.


•   Event_friction – sürtüşme anlamındadır fizik ve c_move ile gerçekleşir sürtüşme anında
    geçerli olur her iki objedede gerçekleşir olay. Geçen yazımızdaki c_move activate_push
    bakınız.
    Target degişkeniyle çarpışmanın gerçekleştigi yerin kordinatı geri bildirir.
    Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür.
    Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1
    ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir.


•   Event_impact –çarpma anlamında kullanılmaktadır haraket eden obje bize çarptıgında
    gerçekleşir. C_move ile tetiklenmektedir.
    You ile kendisine çarpan kişinin bellek adresini verir. Geçen yazımızdaki c_move
    activate_push ve ignore_push bakınız.
    Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür.
    Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1
    ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir.



•   Event_push – c_move de activate push yaparak karşısındaki kişiye push olayını
    gerçekleştirmeye yarar bize çarpanın kişinin bellek adresini you değişkeniyle bildirir. . Geçen
    yazımızdaki c_move activate_push ve ignore_push a bakınız.
•   Event_click – farenin sol tuşuyla varlığa tıklamak.
•   Event_rightclick – farenin sağ tuşuyla varlığa tıklamak
•   Event_release – bu özellik fare okunun varlığımızın üzerinde çıktığı zaman tetiklenir. ( no
    longer touching)
•   Event_touch- bu özellik mousun okunun varlığımızın üzerinde girdiği zaman tetiklenir.
•   Event_scan – varlığın c_scan ile taranması ile tetiklenmektedir. Bizi biri üzerimizden scan
    geçirmesiyle olur. You değişkeniyle bizi tarayan varlığın ram adresini döndürürken result
    değişkeniyle tarayan ile taranan arasındaki mesafeyi geri döndürmektedir.
•   Event_detect – c_scan ile tetiklenmektedir yalnız karşı tarafın değil kendimizde yani c_scan
    herhangi birşeyi algıladığında bizde bu olay gerçekleşir. (event_scan bakınız) You ile karşı
    kişinin hafızadaki adresini geri döndürür bize, result değişkeni ile ise bize algılanan kişini ile
    bizim aramızdaki mesafesini geri döndürür.
•   Event_trigger – bu özellik c_move de mode özelliğine ACTIVATE_TRIGGER
    eklenmesiyle ancak tetiklenir.
•   Event_shoot – c_trace ve c_move mode özelliğinde activate_shoot varsa, c_trace
    tarandığında yada c_move ile çarpışmasıyla bu olay meydana gelir. You değişkeniyle bizi
    tarayan ya da çarpan kişinin ram adresini geri döndürür.
•   Event_sonar – c_trace ve c_move mode özelliğinde activate_sonar varsa, c_trace
    tarandığında ya da c_move ile çarpışılmasıyla bu olay meydana gelir. You değişkeniyle bizi
    tarayan ya da çarpan kişinin ram adresini geri döndürür.
•   Event_disconnect – çoklu oyuncular(multi player) için kullanılmakta bağlantı
    kurulamamağında gerçekleşir. (comm. pro versions vardır bu özellik)
•   Event_receive – bu özellik send_skil1 (entity. skill, var mode) fonksiyonun kullanılmasıyla
    bize bir data gelmesiyle tetiklenir. ( multi player comm, pro versions için kullanılır.)



EVENT_BLOCK: c_move ile veya fiziksel olarak hareket etmekteyken, bir wed bloğu tarafından
durdurulduğu zaman tetiklenir.
EVENT_ENTITY: c_move ile veya fiziksel olarak hareket etmekteyken başka bir entity ile
temas edildiğinde tetiklenir.
EVENT_FIRICTION: fiziksel bir entity herhangi birşeye dokunduğunda, sürtünme esnasında
tetiklernir. Đki fiziksel obje birbirine dokunursa, ikisininki birden tetiklenir.
EVENT_PUSH: push değeri kendinden daha büyük bir entity ile temasda tetiklenir.
EVENT_IMPACT: Hareket eden başka bir objenin çarpması sonucu tetiklernir. Biz bini
kullanacağız, karakterimiz(hareket eden obje) paraya çarpması sonucu tetiklenecek.
EVENT_SHOOT: c_trace + ACTIVATE_SHOOT ile taranma sonucunda tetiklenir.
EVENT_SONAR: c_trace + ACTIVATE_SONAR ile taranma sonucunda tetiklenir.
(ACTIVATE_SHOOT ve ACTIVATE_SONAR, c_trace'ın son parametresi olan moda
yazılarak etkinleştirilir.)
EVENT_SCAN: c_scan tarafından taranma sonucu tetiklenir.
EVENT_DEDECT: c_scan ile taranma yapıldığında en az bir obje bulunursa, taramayı yapan
obje için tetiklenir.
EVENT_TRIGGER: Tetiklenme yarıçapı içinde, ACTIVATE_TRIGGER ile c_move
kullanan bir obje algılanırsa tetiklenir.
EVENT_TOUCH: objeye mouse ile dokunulursa tetiklenir.
EVENT_RELEASE: mouse objenin üzerinden çekilirse tetiklenir.
EVENT_CLICK: objeye mouse ile tıklanırsa tetiklenir.
EVENT_RIGHTCLICK : objeye farenin sağ tuşu ile tıklanırsa tetiklenir.
EVENT_RECIEVE: obje send_skill ile gönderilen bir skill alırsa tetiklenir(multiplayerde)
EVENT_DISCONNECT: objenin istemcisi(objeyi kullanan client) oyundan ayrılırsa
tetiklenir.(multiplayer,server)



                    15-)AŞAMALAR ARASI DEGĐŞĐM


Kahramanımız verilen görevi tamamladıktan sonra aşmamamızı
degiştirip kahramanımıza yeni görevler vermememiz gerekir bunu
yapmak için öncelikle oyun motorumuzu donduracaz daha sonra
aşamamızı degiştirip oyun motorumuzu serbest bırakacaz.
Tabiî ki bu degişim kahramanamız görevi tamamladıgında yada
kahramanımız belli bir kapıyı açtıgında bu degişim gerçekleşecek
bunuda yukarıda biraz anlatımız yöntem olan kagramanımızın yaptıgı
olayları algılayarak ya kapıya çarptında yada bir kapıyı açmak
istedeginde gerçekleşecek .

Oyun motorumuzu durdurmak için freeze_mode özelligini kullanacaz
aldıgı parametreler=

0 – bütün fonksiyonlar çalışıyor (default)
1 – varlık fonksiyonlarını (my != NULL // freze mode kullanırken
adamımızı kaldırmamız gerekiyor bunu uygulamayı unutmayın) ve
parça fonksiyonları askıya al , diger bütün fonksiyonlar çalışıyor.
2 – bütün fonksiyonları askıya al.

Şimdi bir örnek yapalım:

function level_change()
{
     wait(1);
     if (EVENT_TYPE == event_impact)
     {
           my = NULL;
           freeze_mode = 1;
           level_load(“TLlevel2.wmb”);
           wait(2);
           freeze_mode = 0;
     }
}


action zone_block
{
     my.enable_impact = on;
     my.event = level_change;
}


Amacımız zone_block action ile verdigimiz bir kapıya enable_impact
olayını gerçekleştirmek yani bir şeyin çarpması sonucunda
my.event=level_change; fonksiyonuna ziplayarak level_change
fonksiyonunu işletecez level_change fonksiyonunda olayın ne
oldugunu ögrenmek için if (EVENT_TYPE == event_impact) olay
tipinin event_impact yani kapıya bir şeyin çarpması olayı olup
olmadını eger olay bu ise my = NULL; ile adamamızı oyun
motorundan kaldırıyoz ve freeze_mode = 1; diyrek varlık
fonksiyonlarını donduruyoz level_load(“TLlevel2.wmb”); ile ise
diger aşamamızı yüklüyor ve bu işlemden sonra oyun motoruna 2 fps
diger işleri yapması için izin veriyom (wait(2);) son olarakta
freeze_mode = 0; diyerek bütün fonksiyonları serbest bırakarak
kaldımız yerden devam ediyoz. :)



           ASANSÖR VEYA YÜRÜYEN MERDĐVEN

Kahramanımız artık merdivenden çıkmasını gerek kalmadan
asansörle yukarıya çıkaracaz .
Kodlamalarda siz okuyucumların rahat anlaması için kodları
fazla karışık yapmaktan kaçınıyom ama büsüferde çok
fonksiyonlu bişey çıkmıyor ama siz okuyucularımızın hayal
gücünü kullanarak bu eksikleri gidermesini bekliyom böylelikle
kitaba baglı kalmadan istediginiz kodlamayı yapmayı
kazandıracaktır.

function yukariya()//kahramanımızı yukarıya çıkrayoz.
{
     my.skill2=my.z+5;//asansörümüzün ilk konumunu ve çıkacagı
yüksegi ayarlıyoz
     sleep(2);//2 sn bekle
     while (my.skill1==0)
     {
          my.z+=time;
          if(my.z>my.skill2)
          {my.skill1=1;
          }
          wait(1);
     }

}

action asansor
{
     my.enable_sonar=on;//sonar taraması başlanıyor
     my.event=yukariya;//yukariya fonksiyonunu çagırıyor;

}

Sonarı aktif ettik ama tetikleyecigi koymadık bunun için
trace_mode = ACTIVATE_SONAR;
trace_mode ya activate_sonar eklemeyi unutmayın.

Varsa bir kapıyı yatay şeklilde döndürün ve kapı olayına asansor seçin
kahramanımız kapının üzerini çıktıktan 2 sn sonar yukarıya çıkacaktır.

                     VARLIK DEGĐŞKENLERĐ
Varlıkların yaratılmasıyla standart degişkenler almaktadırki otomatik
olrak bunlar kod yazarken bunlar degişken oluşturmaktan kurtarıyor
bizi. Bunlardan bir tanesi skill1….100 1 den 100 kadar giderek
100 tane degişken 1..20 kadarı wed yani level editorde direk gözükür
ki ellede degerlerini degiştirebilirsiniz.

Bir digeride flag1…8        1 den 8 kadar olan bayraklardır bunlar
alabilecegi deger 0 veya 1 dir bunların anlamı evet hayır gibi anlamlı
degişkenlerimizdir burda 1 evet anlamında 0 ise hayır anlamındadır.

Bunları kunllanırken örnegin my.skill1=10;
Diyerek skill1 degişkenin degerini 10 yapmaktır ama bu skill ifadesi
hiç bişey anlatmıyor kalıcı olmadıgı için “define deneme,skill1 “
diyerek my.deneme=10; dedigimzdede skill1 degeri 10 olacaktır
buşekilde kullandıgımız degişkenlerin ne anlama geldigini basit bi
şekilde anlarız wed de yani level editor de “define deneme,skill1 “
dememiz ordaki skill1 adlı degişkenin degerini degiştirmedigini
görmüşsünüz bunu bir adım daha götürerek action başlıgın üzerinden
açıklama yazar gibi //uses:deneme diyerek level editördede skill1
yerine artık deneme yazdıgını göreceksiniz.




Burdaki define ile tanımladıgımız kod editoründekini degiştirken uses
ile ise level editördekini degiştirmiş olduk. Yalnız define ile
tanımlama yapmadan uses eklerseniz uses anlamyacaktır hangi skillX
degiştirecegini bilemeyecegi için level editorde bir degişkliklige
gitmeyecektir.


              Asansörü geliştirilmiş bir örnek
wait(sayı); ve sleep(sayı); daha önceki derslerde belirtildiği gibi wait
parantezler arasındaki kare(frame) kadar, sleep ise parantezler
arasındaki saniye kadar bekletir.
if (belirtec != 1) { return; }




                             PATH –YOL
Şimdide size 3d game studionun güzel özelliklerinden birinden
bahsedecem. Path in türkçesi yol olrak tercüme edebilir peki bu
yol nedir kafanızda bazı şeylerin canlanması için birkaç fikir
verecem mesala bir asker nöbet tutuyor bir oyana bir buyana
sürekli aynı şekilde vede yolda dolanıyor düşman tarıyor arıyor
işte bu askerin güzergahını path yapabiliriz veya gölde yüzen
balık havada uçan kuş kelebek ortalıkta dolaşan asker araba tren
yolu v.b. birçok örnek çoogoltılabilir işte buralarda ve pekçok
yerde kullanabilecigimiz path tanıtacam sizlere öncelikle path
oluşturmak hakkında bilgi veriyim.
Resimdedende anlaşılacağı üzere oyun sahnemizde farenin sağ
tuşuyla açılan popup menuden Add Path diyerek ilk yolumuzun
node (düğüm) noktasını yerleştiriyoz daha sonra yolumuzu
çizmek için resimdede siyah okla gösterdigim vertex move tolbar
dügmesiyle yolumuzu çiziyoz.




Resimdende anlaşılacagı üzere siyah yuvarlakla aldıgım yerler
yolumuzun düğüm (node) noktalarıdır buralar bizim için çook
önemli .Dügümlere direk erişebiliriz ama edgelere direk
erişeyemeyecez dügümler aracılıgıyla erişecez. Đlerleyen
kısımlarda daha iyi anlayacaksınız. ☺
Siyah çizgeyle gösterdiğim alanlar ise iki dügüm arası
yüzeylerimiz (edge) lerimiz.




Bu resimde de görülecegi üzere edge ve node özellikleri yer
almakta edge özelliklere baktıgımızda direction 4 den 3 , 3 dende
4 de gidilecegibilini gösteriyor buurdan edge lerin trafigini
ayarlayabilirsiniz ve diger özellikler yer alırken. Node de ise her
bir nodenin dügümün skill özellikleri yer almakta.
Lite c scripit editor kodlarımıza baktığımızda gayet zengin bir
koda sahibz bunları tek tek inceyelim.

---------------------------------------------------------------------------

                              path_scan
path_scan(ENTITY* ent, VECTOR* pos, ANGLE* dir,
VECTOR* sector)
path_scan kodumuz kahramanımızın posizyonuna göre önene
gelen path in node dügüm sırasını geri döndirmekte ayrıca yön
seçebilmekteyiz ayrıca path_set gibi varlıgımıza buldugu path i
eklememekte.(ayrıntılı bilgi için path_set bakın) Scan yaparken arada
duvar varsa yok sayar .
Şimdide aldığı parametrelere baktığımızda :




Parameters:




ent           Varlığımızın özelliklerinin saklı tutulduğu ram adresi.
pos           Taramaya başlayacagımız merkez orgin.
dir           Tarama yönünü ( açı).
sector.x      Yatay tarama kısmın pozisyonu, yada sabit bir deger
              girerek koninin genişliği.
sector.y      Dikey tarama kısmın pozisyonu, yada sabit bir deger
              girerek koniye dönüşüm açısı.
sector.z      Tarama uzaklıgı.

Ör: path_scan(me,my.x,my.pan,vector(180,180,50));
Fonksiyonun döndürdügü degerde buldugu dügümün (node) sıra
numarasıdır. Not: path seçilmesine(path_set) demeye derek yoktur
herhangi bir önene gelen dügümün sıra numarısını verir.

---------------------------------------------------------------------------

                           path_scannode
path_scannode(ENTITY*,var index)
path_scannode path_scan ile entegre(beraber) biçimde
çalışır.
Parameters:

ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram
adresi.
index – 0 tanımlı ilk dügümü gösterir, 1 ikincil dügümü
gösterir bakış açısına göre ya 1 fazlası ya 1 eksigini dügüm
yoksa ondan sonrası için 0 gösterir.
i1=path_scan(player,player.x,player.pan,vector(180,180,10
0) );
i2=path_scannode(player,1);
Döndürdügü degerde buldugu dügümün sıra numarası.

---------------------------------------------------------------------------

                            path_getnode
path_getnode(ENTITY*,var node,VECTOR* pos,var*
skills)
Kısaca verediğimiz dügüm numarasının kordinatını ve
dügümün özelliklerini ögrenebiliriz.
Parameters:

ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram
adresi.
node – aranacak node dügüm numarası sırası.
pos – node konumunu döndüreceği degişken vektor 3
boyutlu.
Skills- dügüm noktasının özelliklerini aktaracağımız 6
boyutlu dizi degişken kullanmak istemiyorsanız NULL
yazarak boş odlunu bildirin.
Ör:
path_getnode(my,2,deneme,null);
Bu özelligin çalışması için ya path seçilmeli (path_set) yada
path taranarak (path_scan) ilerlenmelidir path tarayarak
ilerlemek bazen avantaj sağlar.
---------------------------------------------------------------------------

                            path_setnode
path_setnode(ENTITY*,var node,VECTOR* pos,var*
skills)
path_setnode dügümün konumunu ve özelliklerini
degiştirmeye yarar.
Parameters:

ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram
adresi.
node – istenilecek node dügüm numarası.
pos – konumunu degiştirecegimiz path yeni konumu 3
boyutlu degişken.
Skills- istedigimiz dügüm noktasının skill parametreleri
degiştirmek için 6 boyutlu dizi degişkeni ile degişkenin
içindeki veriyi node nin özelliklerine aktarıyoz,
kullanmak istemiyorsanız NULL yazarak boş odlunu
bildirin.
Bu özelligin çalışması için ya path seçilmeli (path_set) yada
path taranarak (path_scan) ilerlenmelidir path tarayarak
ilerlemek bazen avantaj sağlar.


---------------------------------------------------------------------------

                            path_getedge
path_getedge(ENTITY*,var node,var edge,var* skills)
 ise dügüm ile edge arası uzaklık, agırlık ve sikll degerini
veriyor. Bu özelligin çalışması için ya path seçilmeli
(path_set) yada path taranarak (path_scan) ilerlenmelidir
path tarayarak ilerlemek bazen avantaj sağlar.
Parameters:

ENTITY* Varlığımızın özelliklerinin saklı tutulduğu ram adresi.

node – dügümün numarası
edge – dügümün dallandıgı yüzeyin numarası (daha
ayrıntılı bilgi için path_nextnode bakın)
skills – dügüm ile yüzeyin uzaklık mesafesinin agırlıgının
ve skill degerinin aktarılması için 3 boyutlu dizi degişken.
skills[0] – yüzey uzaklıgı
skills[1] –yüzey agırlıgı
skills[2] – yüzeyin skill degeri


path_setedge(my,3,1,deneme);
path_getedge(my,3,1,deneme2);
---------------------------------------------------------------------------

                            path_setedge
path_setedge(ENTITY*,var node,var edge,var* skills)
numarasını verdigimiz edgenin yüzeyinin özellikler
parametresindeki yer alan bezier , weight , skill degerlerini
degiştiriyor. Node numarasını vererek dallandıgı yüzeye
söleyerek erişiyoz edgeye. (daha ayrıntılı bilgi için
path_nextnode bakın) ☺ Bu özelligin çalışması için ya path
seçilmeli (path_set) yada path taranarak (path_scan)
ilerlenmelidir path tarayarak ilerlemek bazen avantaj
sağlar.
Parameters:

ENTITY* Varlığımızın özelliklerinin saklı tutulduğu ram adresi.

node – dügümün numarası
edge – dügümün yüzeyin numarası
skills – bezier , weight , skill degerinin varlıktaki degerleri
degiştirmek için 3 boyutlu dizi degişken.
skills[0] – yüzey bezier
skills[1] –yüzey weight
skills[2] – yüzeyin skill degeri
path_setedge(my,3,1,deneme);
path_getedge(my,3,1,deneme2);

                             path_length
path_length(ENTITY*)
Pathin bütün yüzey kısımlarının toplamlarını geri
döndürür. Bu özelligin çalışması için ya path seçilmeli
(path_set) yada path taranarak (path_scan) ilerlenmelidir
path tarayarak ilerlemek bazen avantaj sağlar. ☺

                           path_next
path_next(ENTITY*);
Çalışması için path_scan a ihtiyaç duyar.
Seçili path in bir sonraki oluşturulmuş pathhin dügüm
taranan sayıyı geri döndürür. Dönen degere 0 ise path
yoktur. Bir sonraki path seçer.

                        path_nextnode
path_nextnode(ENTITY*,var node,var edge)
path seçtikten sonra işe yarar.
Bakınız path_set fonksiyonuna.

Path_nextnode biraz karışık bir fonksiyondur buradaki amaç
verdigimiz node numarasından sonraki gelen ama dikkat edin sıra
numarası degil numarası verdigimiz dügümden sonraki hangi dügüm
geliyorsa onu verir. Ama işte sorunda burada başlıyor eger dügüm 2 ,
3 hatta 4 yol gibi ayrılıyorsa hangi yol daki dügümün numarasını
verecek ve o yola gitmeye yöne izni varmı işte bu sorunun cevabı
path_nextnode fonksiyonun son olarak aldıgı parametre olan edge .
edgeye verdigimiz degere göre bir sonraki node dügümün (o yola
gitmeye iznimiz varsa tabi) numarasını verecektir.
Parameters:

ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram
adresi.
node – bir sonraki düügümün ögrenmek istedigimz dügüm
numarası önceki dügüm numarası.
edge - işte olayın püf noktası burada hangi yola gidecez
bunu burada belirliyoz .( saat yönünden başlayarak gider.)




Resimde dikkat ederseniz bi adamımız var şimdi ben
node2 den sonraki yollara dallanacagımızı düşünelim.
numara=path_nextnode(my, 2,1);
diyerek node 2 den sonraki 1 ci edge yolundaki dügüm
numarasını ver dedik. bize path_nexnode 3 degerini geri
döndürecektrir.
numara=path_nextnode(my, 2,2);
deseydik path_nexnode 6 degerini geri döndürecek.
numara=path_nextnode(my, 2,3);
deseydik path_nexnode 9 degerini geri döndürecek.
numara=path_nextnode(my, 2,0);
deseydik path_nexnode 1 degerini geri döndürecektir.
Bu bize ileride path_getnode fonksiyonu ile birçok iş
yaptıracaktır.
---------------------------------------------------------------------------

                               path_set
path_set(my, "path_011");




Varlıklarımızın ekler diye bir bölümü vardir resimdende
görebileciginiz gibi yolumuzu varlıgımıza baglamak için 3
yolumuz var birincisi resimdede gözüktügü gibi path (yol)
dügmesiyle varlıgımıza yolun özelliklerini direk erişim
hakkı verebiliriz yada kod esnasında path_set(my,
"path_001"); diyerek el ile varlıgımıza path ekleriz. Yada
digerlerini göre daha avantajlı olan3 yol ise path a
baglanmaksızın gördügünü kendisini ekleyen path_scan ile
yaparız. (ayrıntılı bilgi için path_scan yada path_set a
bakınız)

                         path_spline
path_spline(ENTITY*,VECTOR* pos,var dist)
Evet artık path fonksiyonunu bitirmek üzereyiz daha
önceki örnek anlatımlarımla bir varlıga baglayarak el ile
çok güzel yapay zekalar çıkarabiliriz ama 3dgs studionun
sundugu bir kolaylıkta bu path bir adam baglayarak
sadece bir satır kodlada yürütebiliriz. Path_spline path
bagladıgımız insanı prüssüz titretmeden yürütmeye
yarıyor aldıgı parametreler kısıtlı oldu için sadece o yolu
sürekli doalşıyor. Nodeleri sırasıyla takip ediyor. Geri
döndürdügü degerde ulaştıgı node oluyor şimdi aldıgı
parametrelere bakalım.
Parameters:
ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram
               adresi.

pos -          Hesapladığı posizyon.
dist -         Posizyonun hızını degiştirdigimiz bir sürekli
               artan bir degişken degişken çok hızlı artarsa
               varlıgımız o kadar hızlı olur.
Tabiî ki bu fonksiyonun çalışması için adamaıza path
eklenmeli.yarıntılı bilgi için path_set bakınız.
Ör:
action aktor
{ var yurume;
while(1)
{
temp= path_spline(my,my.x,yurume);
yurume+=time_step;
wait(1);
}
}
VEKTORLER
Vektor denince aklımaza gelen ilk şey uzayda yönü ve kuvveti olan bir
büyüklük aklımıza gelmeli. Vektorun kuvet demekle istedigim uzantının
büyüklügü iken yön is dünya kordinat sistemde ki açısıdır. Vektörlerde
genellikle 3 degerden oluşmaktadır bunlar kullanıldıgı yere göre isim alır eger
kordinat sistemde kullanıyorsak x,y,z ile isimlendirilirken eger açıda
kullanıyorsak pan,tilt,roll olarak isimlendirilecektir renkte kullanırsak
mavi,yeşik,kırmızı olarak isimlendirilmektedir. VECTOR, ANGLE, yada
COLOR yapıları 3 boyutlu dizilerdir. Bu yapılar birbirlerinden farkı yoktur
denebilir sadece farkları bu 3 boyutlu dizilerin tanımlanan degişken boyutları
farklıdır mesala COLOR dizisi yada vektörü byte ile tanımlanımı hafızada 3
byte yer kaplarken 0-255 arası deger almaktadır. Sizin dikkat etmeniz gereken
bir nokta büyük boyutlu bir diziye küçük bişey aktarırsak veri de kaybolma
olmayacaktır ama sadece hafızada fazladan yer ayırmış oluruz ama küçük bir
yere alamaycagından büyük bir deger atarsak deger kırpılır(yada hata
verecektir). Mesala COLOR vektörüne ben 300 degerinin atarsam kırpacak ve
45 sayısını alacaktır vede veri kaybına neden olacaktır.

                                 Accelerate
Hızlandırma yada ivmelendirmede kullanılmaktadır. Artırma yada düşüş
saglanabilir. Bunu çalışması dönen sandalyelere benzemektedir.
Tanımlanmasına bakarsak :

accelerate(var speed,var accel,var friction);

speed: Akışın hızını gösterir. Friction sıfır olursa yani sürtüşme olmazsa haliyle
speed aynı degerde kalcak sıfıra çekmeyecek.

Accel: Aldıgı deger pozitif ise speed teki degişkeni arttırmakta, accel negatifse
speedi azalttırmakta. Eger accel sıfır ise sürtüşmede varsa sürtüşme oranında
speedi sıfıra çekmektedir.

Friction: sürtüşme büyüklügü.

Return: Dönen deger speed degerine baglı olrak belli bi oranda
küçügüdür.(yaklaşık olararak %15 i dönen degeri yada 7de 1i)

Ör:

var aspeed; //Akışın hızı;
vec_add(camera.pan,accelerate(aspeed,5*key_force.x,0.7))

// sag sol klavye tuşları ile kameranın yavaş ivmelenerek hızlanması
klavyeden eli çekinceisede yavaşlayarak sıfıra çekilmesi.
Dikkat ederseniz key_force.x diyerek, klavye sag sol tuşlardan elin çekilmesiyle
sıfır olacagından speed degişkenide sıfıra çekilecek( friction verilmişse ) eger
key_force.x 1 olsaydı speed artırmakta yada tersi durumda -1 olsaydı speed
azaltılacak. Burada anahtar konturol kısmımız accel olmalı.

                                 vec_accelerate
Accelerate gibi dir tek farkı bunun degerleri vectorel (3lü x,y,z) degerler
almasıdır. Tanımı:

vec_accelerate(vector distance,vector speed,vector
accel,var friction);
Ör:
vec_accelerate(dist,speed,force,0.5);
c_move(me,dist,nullvector,IGNORE_YOU|IGNORE_PASSABLE|USE_AABB
);

                                     vec_add
Vektörel toplamalarda kullanıyoz.

Tanımı :

vec_add ( VECTOR* vector1, VECTOR* vector2)

Aldıgı parametreler bir nevi düz toplama gibi:

vector1 = vector1 + vector2

Birinci ile ikinci toplanır sonuç birinciye aktarılır.



                                     vec_diff
vec_diff ( VECTOR* vector, VECTOR* vector1,
VECTOR* vector2)
vec_diff iki vektörü birbirinden çıkarıp vektöre atamaya
yarıyor.
Başka kullanım tipide :
vector = vector1 - vector2;
Parameters:
vector -      Sonucun yazılacağı vektor.
vector1       Đlk vektör.
vector2 -     Đkinci vektör.
Ör:
var vec0[3];
var vec1[3] = { 10, 20, 30 };
var vec2[3] = { 1, 2, 3 };


vec_diff(vec0, vec1, vec2); // vec0 alacagı deger == 9, 18, 27

dikkat edilirse vec1 den vec2 çıkarılıp vect0 atanıyor.



                                 vec_dist
Đki vector arasındaki uzaklıgı bulup geri döndürmekte. Hipotenus teoremi ile
bulmakta.

Tanımı:

vec_dist (vector1, vector2);
Ör:

distance = vec_dist(my.x,your.x);//benim posizyonum ile karşı
tarafın arasındaki en yakın uzakligi vermekte.

                                  vec_dot
Đki vector arasındaki açıyı hesaplamakta. Buldugu açıyı geri döndürerek
bildirmekte.

Tanımı:

vec_dot (VECTOR* vector1, VECTOR* vector2);
vec_for_angle
Verilen açının dünyadaki kordinatta hangi eksene geldigi bildirmekte. Hangi
eksende ise o ekseni pozitifindeyse o ekseni 1 yapken negatifinde ise o ekseni
-1 yapmakta.

Tanımı:

vec_for_angle(VECTOR* vec,ANGLE* ang)
ör:
var temp[3];

vec_for_angle(temp,vector(90,0,0));//temp artık 0,1,0


                      vec_for_min vec_for_min
B_Box (bounding box) yani varlıgı çevreleyen telkafesin ayarlanmasında
kullanılmakta min ile max arasında tel kafes giydirilir varlıga bu giydirilen tel
kafesin baz noktası modelin med deki orjinidir.

Tanımı:

vec_for_min (VECTOR*, ENTITY*);
vec_for_max(VECTOR*, ENTITY*);
vec_for_mesh vec_to_mesh
Vec_for_mesh numarası verilen meshin kendi model içindeki yani meddeki
orjinine göre olan en yakın noktasını pozisyonun local kordinatını vermekte.

Tanımı:

vec_for_mesh (VECTOR*, ENTITY*, var number);
vector: ile mesh numarası verilen meshin kordinatını
aktarılacak vektör.
Entity: mesh ögrenilecek olan varlıgın hafızadaki adresi.
Number: mesh numarası
Vec_to_mesh ise mesh real time defarmasyonunu saglamaktadır. Numarasını
verdigimiz meshin vektörününü vererek istenilen kordinata taşınmaktadır.

Tanımı:

vec_to_mesh (VECTOR*, ENTITY*, var number);
vector: taşınacak olan yerin kordinatı yine kendi local kordinatı.

Entity: mesh taşınılcak olan varlıgın hafızadaki adresi.

Number:taşınılacak olan mesh numarası.

                              vec_for_normal
Numarası verilen meshin dünyadaki x,y,z deki yüzey konumlarını vermekte.
Evet biraz anlaması zor ama daha iyi anlamak için c_trace c_move den normal
bakınız daha iyi anlayacaksınız.

Tanımı:

vec_for_normal (VECTOR* vector, ENTITY* entity, var
number);
vec_for_screen
Ekranda kordinatı verilen noktanın dünyadaki kordinatını verir.

Tanımı:

vec_for_screen ( VECTOR*, VIEW*);
vector: Aldığı ilk parametre ekranın üzerindeki belli bir
noktanın local kordinatı sonra bulunan sonuç tekrar buna
yazılmakta.
View: hangi varlıkta bakılacaksa o varlık.
Ör:
temp.x = mouse_pos.x;
temp.y = mouse_pos.y;
temp.z = 200;
//ekrandaki mousun x,y kordinatı ile 200 derinlikteki
bir noktanın cameradanki dünya kordinatını vermekte
vec_for_screen(temp,camera);
Vec_for_screen
               vec_for_screen ( VECTOR*, VIEW*);


Bu fonksiyon 1 parametresi ile ekranımızdan belli bir
konumundan vede belli bir uzaklıktaki vectorun
konumunu vermekte 2 aldıgı aparametre ise bakış açımıza
bakarak o yönde oluşturmakta.




Ör:
function silah_mermi_defarmasyonu()

{

temp.x=screen_size.x /2;

temp.y=screen_size.y /2;

temp.z=800;

vec_for_screen(temp,camera) ;
ent_create("silah_kursor.bmp",temp,null);

}




                            vec_for_uv          vec_to_uv
Vec_for_uv skin editordeki uv map daki vertex numarası verilen vertexin
skin texture üzerindeki konumunu verir . z ekseni haliyele yoktur zira
texture 2d oldu için.




Tanımı:
vec_for_uv (VECTOR*, ENTITY*, var number);

vector: vertex numarası verilen yerin texturedeki x,y
konumu.
Entity: varlık ram adresi.
Number: uv map daki vertex numarası.


Vec_to_uv ise uv mapdaki vertex numarası verilen
vertexin konumunu degiştirmeye yaramaktadır.
Tanımı:
vec_to_uv (VECTOR*, ENTITY*, var number);

vector:numarası verilen vertexin yeni konumu.
Entity: varlık ram adresi.
Number: uv mapdaki vertex numarası



Ör:

vec_for_uv(temp2,silah_el,340);//340 numaralı
vertexin uv mapdaki konumu ögrenmek için
temp2[0] += 0.1; // 340 numaralı uv map vertexin 1
piksel yana kaydırarak modelin texturesinin
degiştirilmesi
 vec_to_uv(temp2,silah_el,340);//340 numaralı uv map
vertexin yeni konumunu ayarlıyoruz.



                      vec_for_vertex
Bu fonksiyonumuz bir modeldeki belli bir vertex numarasının
dünya kordinat sistemindeki posizyonunu vermektedir.




Vertex kısaca poligonların dügüm noktaları desek
yanlış olmayacaktır.
Tanımı:
vec_for_vertex (VECTOR* vector, ENTITY* entity, var
number);
vector: numarası verilen vertexin konumunu atayacagı
degişken.
Entity: varlık ram adresi.
Number: posizyonunu ögrenmek istedigimiz vertexin
numarası.

                  vec_inverse
Vektörü negatiflemeye yarmaktadır.
Tanımı:
vec_inverse ( VECTOR* vector);

ör:
var i[3]={10,20,30};
vec_inverse(i);//artıki içindeki degerler -10,-20,-30


                   vec_length
Verilen vektörün dünya kordinat sistemindeki orjine
olan uzaklıgını geri döndürerek verir.




Tanımı:
vec_length (vector);
ör: uzaklik = vec_length(my.x);



                       vec_lerp
interpalosyon ne ?      acaba

tanımı:
vec_lerp( VECTOR* v,VECTOR* v1,VECTOR* v2,var f);

v = (1-f)*v1 + f*v2

                   vec_normalize
Verilen bir büyüklük ile vektörel uzunlugu
orantılıyarak scalalıyor. Ama tam olarak ne işe
yaradıgını bilmiyommm ?.
Tanımı:
vec_normalize (VECTOR* vector, var length);

vector[0] *= length / vec_length(vector);
vector[1] *= length / vec_length(vector);
vector[2] *= length / vec_length(vector);




                        vec_rotate
      vec_rotate (VECTOR* Dir, VECTOR* Angle);
Vektörümüzü kordinatını orjinden başladığını kabul
ederek döndürmeye ve yeni kordinatını aktarmaya
yaramaktadır. Aldigi ilk paramtere vectorün büyüklüğü
yani kordinattaki yeri başlangiç yeri olrak orjin kabul
edilmekte, 2 parametre ise angle döndürülecek yerdir x
parametresi pan , y parametresi tilt, z parametresi ise roll
anlamına gelmektedir. Vecrotate ile orjini baz alarak
döndürerek dünya kordinat sistemine göre yeni
konumunu vermektedir.
Ör:
var direction[3] = 7.07, 0, 0;//vektörümüzün büyüklüğü
kordinatteki yeri.
var angle[3] = 45, 0, 0; //döndürülecek açı ve yönü
vec_rotate(direction,angle);
Sonucu tekrar direction içine yazmaktadır. Yeni konumu
olmaktadır döndürme işleminin sonunda.
vec_scale
Vectorü scale ediyoz yan belli bi oranda küçültüp
yada büyütüyoruz.

Tanımı:
vec_scale ( VECTOR* vector, var factor);

vector:işleme tabi tutulacak vector.
Factor: 1 orjinal büyüklügüdür 1 den büyük verirsek
büyütürkenken 1 den küçük bi rakam verirsek
küçültürürüz.

Ör:
var v[3] = { 10, 20, 30 };

vec_scale(v,5);//v nin degeri artık 50,100,150 oldu
vec_set
vec_set ( VECTOR* vector1, VECTOR* vector2)
Bu fonksiyonumuz birden fazla boyutlu degişkenleri
birbirine kopylamaktır.
Parameters:
vector1       Hedef vector.
vector2       Kaynak vector.
Kısaca bu işe yarıyor.
vector1[0] = vector2[0];
vector1[1] = vector2[1];
vector1[2] = vector2[2];

boşluk tuşundan elini çekince çalışması
while (key_space == off) {wait (1);}


while (key_space == on) {wait (1);}
my.shadow = on;//normal gölge ekler
render_shadows(); //yumuşak gölge ekler.




                           vec_sub
vec_sub ( VECTOR* vector1, VECTOR*
vector2);

Buda vec_diff gibi vektorler arası çıkarım işine yarıyor
sadece farkı çıkarttığı vektorü sonucu onun
içineyazar.vector1 i vector 2 den çıkardıktan sonra sonucu
tekrar vector1 yazması. Kısaca şu işi yapıyor:
vector1 = vector1 - vector2;




                           vec_to_angle
vec_to_angle (ANGLE* ang, VECTOR* dir);
Bu fonksiyonumuz verdigimiz vektörü açıya çeviriyor.
Döndürdüğü değer bir üçgen gibi düşünürsek hipotenusun
uzunlugu ilk aldıgı parametre ise buldugu açıyı
aktaracağı degişken. Bu fonksiyonu genellikle varlığımız
ilerlerken yönünü o yöne dönmesi için kullanıyoz.
Ör:
adam2=vec_to_angle(adam,vector(10,10,0));//adam=45
bulunur adam2 ise 14.14 (10 kök2)döndürür değer olarak.
vector(10,10,0) diyerek x 10 , y 10 bir ikiz kenar dik
üçgenin yaptığı açı ve hipotenus degerini buldurmak
yaptıgımız iş.



                         vec_to_screen
Cameranın görüş alanına giren bir kordinatta yada vectorde, monitörün
hangi x,y çözünürlük yerine geldigini verir. Dikkat ederseniz mutlaka
cameranın görüş alanına girmesi gerekli pozisyonun bölelikle giren o
pozisyonun monitörün hangi yerine geldigini verebilir.

Tanımı:

vec_to_screen ( VECTOR*, VIEW*);
vector: bu vector input ve output olarak çalışmakta
birincisi dünyakordinat sistemini verilen posizyonu
vermek için ikincisi ise verilen kordinatta monitöre dek
gelen pikselin konumunu almak için kullanılır.
View: bakış açısına giren yeri belli etmek için cameranın
ram adresi.


Return: geri dönen deger eger view bakış açısında ise
sonuç vektörü geri döndürürken bakış açısından dışında
ise NULL geri döndürür.
Ör:
PANEL* panel_pan = { bmap = "fd.tga"; }//bir panel oluşturalım ve daha sonra
diger bi fonksiyon içinden çagıralım

  vec_set(temp,my.x);
  if (NULL != vec_to_screen(temp,camera)) //ekran
bakış açısın içindemi posizyon eger içindeyse göster
degilse gösterme
   {
     panel_pan.pos_x = temp.x;
     panel_pan.pos_y = temp.y;
     panel_pan.VISIBLE = ON;//c-script
     set(panel_pan,VISIBLE);//lite c
   } else {
     panel_pan.VISIBLE = OFF;//c-script
     reset(panel_pan,VISIBLE);//lite c
   }
ANG()


Ang() ı açı eklme çıkarmada kullancaz. Genellikle açı farklarını veya eklemelerin
bularak en yakın yerden döndürülmesinde kullanılır.

x = ang(0); // x degeri 0
x = ang(-350); // x degeri 10

x =ang (185); // x degeri -175




Uygulama:
Yukarıdaki resimdeki posizyonda haritamızda oldugunu varsayarsak askeri player
yönünde döndürmek istiyoz.

Vec_to_angle(dunya_kordinat_acisi,player.x);

Asker.pan=dunya_kordinat_acisi.pan;

Diyerek döndürebiliriz ama bu bi anda gerçekleşecegi için estetik gözükmeyecektir. Bu
yüzden askerinaçısını(askerin konumu önemli degil) , playeri açısına yavaş yavaş
dönmeli vede bunu yaparkende en yakın yerden dönerek yaptırmalıyız.

Bunun için izleyecegimiz yol.

Vec_to_angle(dunya_kordinat_acisi,player.x);



Asker.pan=ang( dunya_kordinat_acisi.pan - asker.pan) * time_step /5;

Buradaki ang alma işlemini matematiksel ifade edersek.

-150 - 120 = -270 derece eder ang ilede bu açının pozitif yöndemi yoksa negatifmi
dönecegini hesaplatacaz -270 90 derece ederki 90 derece askerin açısını artıracaz.
PROC_KĐLL
Proc_kill fonksiyonu bize bazen ölümcül faydası olmaktadır. Bildiginiz gibi Windows her işi
aynı anda yapamaz bu yüzden bi sıraya sokar. Đşte proc_kill fonksiyonuda burada devreye
giriyor aşağıda detaya inecegim ama size biraz fikir olması için bir örnek anlatacağım. Mesala
c_scan ile tarama yapacaz ve taramada aynı anda 2 şeyi tetiklamak istemiyoz mesala kapı
açacaz ama tarama alanınada 2 kapı girmekte ama biz sadece birini açtırmak istiyoz işte
burada proc_kill devreye gierrek aynı fonksiyonu Windows işleme kuyruguna soktugu an
diger fonksiyonu yokkediyoz iptal ediyoz. Veya bi kapı açtıracaz oyuncu açma tuşuna 1 den
fazla bastı ne olacak kapı açılacak ama kaç defa bastıysa onun kadar aynı anda çalıştıracagı
için kapı çok hızlı açılacak işte sadece bir varlıkta bir fonksiyonun çalışmasını istedigimizde
diger kopya fonksiyonların iptal olmasını istiyorsak proc_kill den faydalanacaz. Sonsuz
döngülerde falan çok ölümcül kurtarıcımız olacak.

proc_kill (var mode);

mode Aldığı parametreler:


Mode
1            Benim tarafından çagrılan bütün fonksiyonları sona erdir anlamındadır. 1 ve 2
             bir fonksiyonla başka fonksiyonların çagırılmasıyla ilgiliyken 4 5 6 ise bir
             fonksiyonun hafızadaki birden fazla örnrkleme çagırmasıyla ilgilidir.

2            Karşı tarafın geçerli fonksiyonlarını iptal et demekti . Benim tarafımdan karşı
             tarafı tetikleyerek. Birazadaha açmak gerekirse mesala bir tarama yaparken you
             degişkeniyle dönen kişinin bütün fonksiyonlarını durdur demektir. Dikkat
             edilecek hususlardan bir tanesi proc_kill yeri çok önemlidir. Not: Bu olaylara
             dikkat edilmeli zira taramada 1 den fazla kişi oldugu zaman bize en yakın kişin
             you degişkeniyle ram adresi dönerken 2 ci şahsın ram adresini
             ögrenemedigimizden ilk adamımızda işe yararken 2 ci adamamızda işe
             yaramamaktadır.
4            4 numaralı seçenek bir fonksiyonu birden fazla varlık kullanıyorsa bile tüm
             fonksiyonlar diger varlıkların kullandığı fonkisuonlarını içere alarak sadece bir
             tanesi çalışır. Diger varlıklar daki fonksiyonlar tamamen duruken sadece
             herhangi bir varlıkta sadece çalışır 1 tane fonksiyon. Diger varlıklardaki
             fonksiyonların hepsi iptal edilmiştir.

5            Aynı çagırımda örneklemeden birden fazla çagırım varsa güncül durumda
             geçerli durumda olanların benim tarafımdan yapılan örneklemeleri iptal
             etmekte. 4 numaradan farkı vir fonksiyonu birden fazla varlık kullansa bile
             varlıklarda birertane fonksiyon çalışır . 4 numaradaki gibi diger varlıkların
             fonksiyonları hepsi öldürülmez diger varlıkların örneklemerinide 1 düşürülür.
6            Aynı çagırımda örneklemeden birden fazla çagırım varsa güncül durumda
             geçerli durumda olanların karşıtaraftan yapılan diger örneklemeleri sona
             erdirmekte.
16           Leveldeki bütün fonksiyonları durdur.




Proc_kill bir nevi olay katarlarında kendisinden önce gelen olayları iptal etmekte
durdurmaktadır. Aşşagıdaki resimde ifade etmeye çalıştım.




Đnkey
        inkey (pass_str); // type the password
                      if(result == 13) // if we press Enter
                      {
                               pass_txt.visible = off; // hide the text
                      }
eror
timer Time since the last timer() call in microseconds (1/1000000 sec).
file_var_read

randomize(); // starts a initial value
x=random(100); // x becomes number between 0 and 99
time_factor
d3d_lightres = 1; // improved dynamic lights high kalite


total_ticks
The time passed since start of the game, in ticks.
Oyunun başlangıcından beri geçen süre.

New debug code

Let's take a look at the interesting values offered by the engine:
- num_actions, number of currently running actions;
- num_visents, number of visible entities;
- num_visentpolys, visible model and sprite polys;
- num_vismappolys, visible map and wmb polys;
- d3d_texskins, memory used by models and sprites;
- d3d_texbmaps, memory used by panels and "entity"
definitions;
- d3d_texsurfs, memory used by wmb entities;
- d3d_texsmaps, memory used by the shadow maps;
- d3d_texfree, available video memory.
-d3d_lightres haraketli işiklarda yüksek kalite.
action flickering_light
{
   d3d_lightres = on;
   while (1)
   {
      my.lightrange = 70 + random(30);
      my.lightred = 150 + random(100);
      my.lightgreen = 150;
      my.lightblue = 50;
      waitt (2);
   }
}
Aum 16
Bunlar sistem hakkında bilgi veriyor mesala o anda çalışan
fonksiyon sayısı gibi ekran kartının aloabilecegi mb falan vb.

Breakable windows

Read this article and you will find out how to create a window that breaks when you shoot it or when
the player passes through it. The player should loose a part of its health if it does that, right?

action breakable_glass
{
   my.transparent = on;
   my.enable_impact = on;
   my.enable_entity = on;
   my.enable_shoot = on;
   my.event = glass_pieces;
}

The action above will be attached to your window entity and it will make it transparent and sensitive to
impact, shoot or other entities. When one of these events is detected, function glass_pieces will run:

function glass_pieces()
{
if (you == player) {player._health -= 20;} // decrease player's health if it breaks the window by
passing through it
   my.passable = on;
   snd_play (breakglass_snd, 50, 0);
   my.skill10 = 0;
   my.invisible = on;
   while (my.skill10 < 15)
   {
        create (gibglass_mdl, my.pos, gib_glass); //kırık parça mdl dosyası animate var aum21          bak
2ci bi yöntemdaha var.


      my.skill10 += 1;
      wait (1);
    }
    ent_remove (me);
}




snd_tune (engine_handle, 25, 100, 0); // original frequency (100%)

aum21 tank var onda yumuşak düşüş mermi rocket ve yumaşak dönme var.

asker.pan+= ang(temp.pan-asker.pan)* time_step *0.2;




                                              BONE
Bone Türkçede kemik anlamına gelmektedir. Yarattıgımız modelleri gerçek bir insan
gibi kullanmak için bir çok yöntem vardır bunlardanda biri de modele kemik
eklemektir. Kemigin birçok avantajı vardır bunlara deginirsek oyun zamanında
kemiklere hitap ederek yönlendirme şansımızdır. Zira daha önceki örneklerimize
bakarsanız hep modellerde hazır animasyonları kullanmıştık artık oyun zamanında
real time modele hükmederek modelin istedigimiz bir uznunu kullanabilecegiz. Kemik
oyun zamanında gözükmezler vede model tasarlarken sanki o kemigin etki edecegi
yerleri ve şiddeti ayarlayarak model derisini gayet güzel şekilde hareket
ettirtmekteyiz.




                                       ent_bonemove
Ent_bonemove c_move gibi verdigimiz yöne boneyi hareket ettirmekte kullnıyoruz. Bone
hareket ettirdigimizde ismini verdigimiz bone hareket ederken digerleri hareket etmemekte ve
bu yüzden hareket edenle hareket etmeyen arasındaki deri sünmekte.

ent_bonemove(ENTITY*, STRING* name, VECTOR* offset)




                                     ent_bonename
Sıra numarası verdigimiz bonenin bize gerçek ismini vermekte.

ent_bonename(ENTITY*,STRING*,var num)

Ör:

STRING* den;

ent_bonename(my,den,0);

error(den);




                                     ent_bonereset
ent_bonereset(ENTITY*,STRING* name)
Đsmi verilen bonenin orijinal haline dönmesinde kullanılır.

ent_bonereset_branch(ENTITY*,STRING* name)
Branch ise çocuk alt dallarının da resetlenmesinde kullanılır.

ent_bonereset_all(ENTITY*)
Varlığa ait tüm boneleri resetler.

                                     ent_bonerotate
   Boneleri döndürmekte kullanıyoz. Verdigimiz bone isminden sonrakileride döndürür ve
        döndürmeye bonenin dügüm noktasını baz alarak onun etrafında döndürür.

ent_bonerotate(entity,string name,vector angle)
ent_bonerotate_parent
ent_bonerotate den farkı ent_bonerotate_parent boneyui döndürüken dügüm noktasından
degilde bonenin gövdesini alarak döndürür bu yuzden kendi etrafında degilde yarı çapı
bonenin gövde uzunluğu olan daire gibi döndürür.

ent_bonerotate_parent(entity,string name,vector angle)




                                     ent_bones
Varlıktaki bone dügüm sayısını geri döndürmekte.

ent_bones (entity);




                                  ent_bonescale
Bonenin büyüklügünü degiştirmekte kullanıyoruz bonenin büyüklügünü degiştirdigimizde
haliyle dışındaki deride ona baglı olarak büyükmektedir.
ent_bonescale(entity,string name,vector scale)

Vector scale sırasıyla x,y,z nin büyüklüklerine hitap etmektedir.




                                    ang_for_bone
Đsmini verdigimiz bonenin açısal degerlerini pan tilt ve roll degerlerini sırasıyla ögrenmemizi
saglamaktadır.

ang_for_bone(ANGLE*,ENTITY*,STRING*)

ANGLE degeri sırasıyla pan tilt ve roll degerlerini geri döndürmekte.




                                     vec_for_bone


Bonenin dünya daki kordinatlarını ögrenmemize saglamaktadır.

vec_for_bone(VECTOR*,ENTITY*,STRING*)

Vector ismini verdigimiz bonenin dünya kordinatlarını geri döndürmekte.
PARTĐCLE BAŞLAGIÇ


Particel diyince aklımıza ne gelmeli? Particel diyince aklıma gelmesi gereken ilk
şey uçan küçük zerrecikler olmalı. Particel genellikle bu zerreciklerin
birleşmesiyle meydana gelmektedir. Şöle nerelerde kullanabiliriz diye
düşünürsek yagmur yapımında duman, ateş, füzenin kuyrugu, patlamalarda
oluşan küçük zerrecilker vb. yerlerde 3d olarak kullanabiliriz. Şimdi bi particel
oluşturmak için elimizde bu particeldan üretecemiz bir resim olması gerekli
oluşturmak için mecbur tutulmamışsada güzel görünmesi için bu gerekli.




effect (function, var number, VECTOR* pos, VECTOR* vel);



function: Her framede (FPS) çagrılan fonksiyon.

Number: üretilecek partical sayısı.

Pos: üretilecek olan zerreciklerin posizyonları.

Vel: vectorel ilk hızları yada beam uzunlugu. (MOVE aktifse hızı beam aktifse boyu
olmaktadır)

Şimdide bu fonksiyonun aldıgı parametrelere bakalım.
Lifespan : particelin yaşam süresi karesi belirler. Zerre girilen sayı kadar fps yaşayacak.
Dikkat: çagrılan fonksiyon sürekli çagrıldıgı için azalttıkça yeniden atayacak lifespani
buyüzden yaşam süresinin o fonksiyondan çıkılmalı bunun içinde çocuk fonksiyon çagırarak
diyer function ile zerre yaşadıkça her fps tekrarlayacagından tekrar lifespan deger almayacak
bu yöntem ile ilk çagrılan fonksiyon birden fazla çalışacak(1-10) ama diger fonksiyona
geçince çalışmayı bırakcak ve bölelikle sürekli boşuna tekrarlanmaycak hız kanacaz.




vel_x: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE
aktifse hızı beam aktifse boyu olmaktadır)

vel_y: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE
aktifse hızı beam aktifse boyu olmaktadır)

vel_z: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE
aktifse hızı beam aktifse boyu olmaktadır)
Gravity: particelin yer çekimini aktif etmek için kullanılır default olarak 0 dır hızını
ayarlamaya yarar. vel_z degiştirerek ilerlemekte .Hareket etmesi için particelin Move
aktifleyin.

Size: piksel yada siprite particelları boyutunu ayarlamak için kullanılır. Note: sonradan
boyutlandırılan particiler çok yavaşlatmakta. Default olarak 4 tür.

Bmap: particelin resmini atamakta kullanılır.

Move: eger bu bayrak seçilmişse velocity(vel_x, vel_y, vel_z) vektör yönünde hareket yada
gravity ile yarçekimi aktif olur böylelikle harekete geçer.

Function(c-script) event(lite-c): bu işlev particelin davranışlarını yani özelliklerini
ayarlamakta kullanılır.

Beam: zerrelerin bir laser şeklinde velocity vektör yönünde oluşturulur bir düzene sokar

Streak: Beam benzemektedir beamdan hızlıdır ama bakış birazdaha farklıdır sanki hareket
bulanıklıgı vermektedir vede başka kullanım yeride benzer patlamalarda vermelerde
kullanılır.

Skills: 7 tane sikil vardır.

Red: particalda kırmızı rengin kuvveti.

Blue: particalda mavi rengin kuvveti.
Gren: particalda yeşil rengin kuvveti. Bu renkler genellikle ortama gökyüzüne uygun hale
getirmek için kullanılır.

Alpha: alpha transparancy miktarı.

Transparent, TRANSLUCENT: bu bayrak Transparent aktif pasifligini ayarlar.

Overlay: Bu bayrak açık ise bir resimdeki alpha kanalındaki rgb (0 0 0) olan renkleri yok
etmekte ve siyahın tonajına göre denk gelen yerleri şefaflaştırmakta. Overlayı kullanabikmek
için resim dosyanında bir alpha kanalı olmasi gerekmektedir.

Flare: Eger bir zerrenin perinin yada modelin TITREK-ĐŞĐK bayrağı, da koyulunur , varlık
alfa saydamlığını varsayacak. Daha karanlık bölümler, daha parlak bölümlerden daha
saydamdır. Bu yol patlamaları ışık etkileri yada kamera titrek ışıkları, üretilebilir. Eğer
SAYDAM da ayarlanırsa aynı zamana , saydamlık tersine çevirilir i.e., daha parlak bölümler
siyah duman için benzer, daha karanlık bölümlerden daha saydamdır. 16-dizgin yada 32-bit
modlarında, ve sadece peri varlıkları için sadece valid. TITREK-ĐŞĐK bayrağı, varlığın ilk
olarak eyleminin başlamasında açılmalı. Bütün varlıklar paylaşır aynı dosyasa sahip olmalı
aynı alfasa saydamlığı. Eğer varlık dokusu bir alfa kanalını içerse , titrek ışık bayrağı
varsayılan değer olarak bahse girilir.NOT:Flare c-script da vardir lite-c de yok.

BRIGHT: Arka palanle kendisini harmanlar vede işik kaynagı varsa ona duyarlı şekilde
davranır alpha kanalıda varsa onuda şefaflaştırır siyahın tonuna görevede resimde de olan
siyah yerleri şefaflaştırır. Her ikiyi karıştırmanın yerine arka plan üzerinde varlık yada zerre
harmanlar, alfa kanal dokular yada saydamlığı ile birleşimde. Renkler ilave etmesi bu yol ve
varlık, benzer yangın yada kıvılcımlar, aydınlatılan sanar. Varlık KARANLĐK ile birleşimde,
düzeyde normal güneş ışığı ile diği gibi bir ortalama ortam ışığını alır. Bright kullanabikmek
için resim dosyanında bir alpha kanalı olmasi gerekmektedir. Bright en büyük özelligi arka
plana göre kendisini adepte etmesi sanki arkaplanla bütünleşiyor.



Fikret DURU

fikretduru@gmail.com

xdsoft_programing@hotmail.com

www.oyunyapali.com

www.acknexturk.com

More Related Content

Viewers also liked

Viewers also liked (12)

PingPing mpayment ecosystem
PingPing mpayment ecosystemPingPing mpayment ecosystem
PingPing mpayment ecosystem
 
Univ lleida turisme (pase diapos)
Univ lleida turisme (pase diapos)Univ lleida turisme (pase diapos)
Univ lleida turisme (pase diapos)
 
Plants
PlantsPlants
Plants
 
RETAIL MARKETING
RETAIL MARKETINGRETAIL MARKETING
RETAIL MARKETING
 
Presentación red cide evento el hierro julio 2010
Presentación red cide evento el hierro julio 2010Presentación red cide evento el hierro julio 2010
Presentación red cide evento el hierro julio 2010
 
Ban Smart Card Mahasweta
Ban Smart Card MahaswetaBan Smart Card Mahasweta
Ban Smart Card Mahasweta
 
The four biggest benefits of using a fulfillment services
The four biggest benefits of using a fulfillment servicesThe four biggest benefits of using a fulfillment services
The four biggest benefits of using a fulfillment services
 
Machine X Language
Machine X LanguageMachine X Language
Machine X Language
 
Sycor
SycorSycor
Sycor
 
Presentazione Easymob Salo socialcasehistoryforum
Presentazione Easymob Salo socialcasehistoryforumPresentazione Easymob Salo socialcasehistoryforum
Presentazione Easymob Salo socialcasehistoryforum
 
5 7.3
  5 7.3  5 7.3
5 7.3
 
Digital people in peterborough presentation 14 05 14 v3
Digital people in peterborough presentation 14 05 14 v3Digital people in peterborough presentation 14 05 14 v3
Digital people in peterborough presentation 14 05 14 v3
 

Ww W.Oyun Yapali.Co M Xfabs X Acknexturk.Co M

  • 1. 3D Game Studio FUNCTĐONLAR: 1-)TEXT font resim_font=<system.pcx>,10,12;//özel font resim olarak font arial="arial",1,20;//standart font text yazi()//text objesi tanımlanıyor { pos_x=10;//x koordinat teki başlangıç adresi pos_y=10;//y koordinattaki başlangıç yeri font= arial;//yada “resim_font” yazarak resim fontu seçeriz string=" a=n b=n c=n";//yazi /n alt satıra geçer alpha=100;//parlaklık layer=2;//daha önce panel ya da yazı varsa hangisi hangisinin //üzerine geçeceğini belirten bir hiyareşi flags=visible , outline , transparent; } Burada önemeli olan “flags” aldığı parametreler. Bunlar: condensed –yazıyı yatay olarak sıkıştırır. narrow -yazıyı sıkıştırır. transparent – arka planı gösterir. visible – yazının görünmesi ya da göstermemek.
  • 2. shadow – TTF gölgelendirme yapar. outline- TTF yazıları belirgin hale getirir. Text function unda “string” rakam atayamıyor.
  • 3. 2-) PANEL Ön panelle ilgili yazı resim koyabilmek için bir function. bmap fatih=<fatih.pcx>;//resim değişkeni PANEL ekran_panel() { pos_x=10;//yazının başlangıç kordinati pos_y=10; /*---------------------------------------------------------------------------------- Ekrana resim yerleştirmek için Windows özelliğini kullanırız bu özelliğin ilk 2 parametre (x,y) pos_x ve pos_y belirten koordinattan başlayarak verdiğiniz x,y koordinattan resim başlayacak. Diğer 2 parametre sırasıyla genişlik ve yükseklik resmin. Diğer parametre resmin değişkeni. Son 2 parametre (x,y) ise resmin neresinden başlayarak ekrana yerleştirelecegini ifade eder. ----------------------------------------------------------------------------------*/ window(200,200,400,400,fatih,500,500); /*---------------------------------------------------------------------------------- Digits özelligi ise kordinatı verilen yere sadece rakam yerleştirmeye yarar. Aldığı ilk 2 parametre ekranın neresinden başlanacağını kordinatıdır. Diğer parametre yazının uzunluğunu verir yazıdan daha uzun bir değer verirseniz sağa tarafa yanaşmış olarak yazılır. Diğer parametre font değişkeni diğer parametre çarpan değeridir. Son parametre ise bir ekrana yazdırmak istediğimiz rakam, değişkendir. ----------------------------------------------------------------------------------*/ digits=0,0,9,arial,1,b; digits=0,20,9,arial,1,a;
  • 4. /*---------------------------------------------------------------------------------- Visibile= rakamın görünmesi ya da göstermemek. overlay = Tam siyah olan bölgeleri yok sayması şeffaf yapar arka planı gösterir. transparent= arka plan resmi harmanlayarak gösterir. Not: bu ayarları iyi görebilmek için main functionun içine” screen_color.red = 255;” parametrelerinide ekleyin. ----------------------------------------------------------------------------------*/ layer=1;//hiyareşi üsteki text adlı örnekte bakarsınız layer onda2 //bunda 1 oldu için bu altta kalacak flags=visible; }
  • 6. 2-)
  • 7.
  • 8. 3-)BUTTON Bu çalışmada buton yapmayı ve butona estetik kazandırmak için buton basıldığında şeklinin değişmesini sağlayacaz butona basıldığında bir “function” çağıracaz bazı işlemler yaptıracaz. Buttonu oluşturmak için panel functiondan faydalanıyoruz buton yapısına bakalım. BUTTON = x, y, bmapOn, bmapOff, bmapOver, functionOn, functionOff, functionOver; Parametreler= x – pos_x verdiğimiz koordinattan başlayarak x kordinatına gider. y – pos_y verdiğimiz koordinattan başlayarak y kordinatına
  • 9. gider. bmapOn – Butona tıklanınca alacağı resim. bmapOff - Butona tıklanmayınca alacağı resim. bmapOver – Farenin imleci butonun üzerine gelince butonun alacağı resim. functionOn- Butona tıklanınca çalışacak olan function. functionOff- Butona tıklanmayınca çalışacak function. functionOver - Farenin imleci butonun üzerine gelince çalışacak function. Ör:
  • 10. 4-) YATAY VE DĐKEY KAYDĐRMA ÇUBUKLARI Kaydırma çubuklarına aldıgı parametrelere batkımızda=
  • 11. VSLIDER = x, y, len, bmap, min, max, var; HSLIDER = x, y, len, bmap, min, max, var; x - X posizyonundaki sol üst kordinatı. y - Y posizyonundaki sol üst kordinatı. len –Kaydırmaının ekrandaki genişligi. bmap- resim dosyası. min – minumum alabilecegi deger. max - maxsumum alabilecegi deger. var – kaydırma çubugun degişimdeki degerini buraya yansıtacak. Ör:
  • 12.
  • 13. 5-) ENTITY Şimdi tanıtacağımız fonksiyon camera görüntemize bir model yada bir resim eklememize sağlayacaz. Đleriki aşamalarda silah gösterimdede kullanacagız. Ufak bir hatırlatma 3d dünyasında kameraya bir silah eklemek o silahın 3d dünyasında varlıgını ifade etmez sadece bizim kameramızda gözükür. Genellikle Wolfenstein zamanlarında çıkan oyunlarda gözüken bir kullanımdır bu. Bu kullanım Wolfensteinda da kullanılmıştır. Desteklenen dosya formatları pcx, bmp, tga, dds, vede mdl dir.
  • 14. Resimdende anlaşılacağı üzere type özelliğine modelimizin dosyasını ismini veriyoruz. Flags ise bu varlıgımıza ait özellikleri buradan ayarlıyoruz visible diyerek silahı görünür hale yapıyoruz. x y z ile de ekranımıza yerleşimini yapıyoruz bu yerleşimi daha iyi anlamak için aşşagıdaki resme bakınız.
  • 15. Resimdeki kordinat sistemini bizim pc ekranımız olrak kabul ederek düşünüz .Bu arada bişey hatırlatıyım peki ekrana yarleştirecegimiz modelin baz alınacagı yeri nasıl belirleyecez ☺ burada da modelimizin orjinini baz almakta ama her modelde orjin modelin ortası olmayabilir bunun için mdl dosyamızı med ile açarsak aşşagıdaki resme göre modelimizi yerini ayarlarsak artık modelimizin döndürdügümüzde veya taşıdıgımızda artık modelin ortası baz alınacaktır. Varlıgımıza diger fonksiyonlardan ulaşmak için ise silah.x gibi varlıgımızın ismini yazdıktan sonra nokta ile alt özelliklerini ulaşarak degiştirebiliyoruz yada öğrenebiliyoruz.
  • 16. Resim yada animasyonlu resim ekleyebeliriz. Sprites örnek olması için aşşagıda bir uygulama var.
  • 17. Bu bize ekrannımaza objeyi yerleştirmemize yardımcı olacak ama animasyonunu başka yerde ya bunun frame özelliğine ulaşarak yapacaz yada ent_animate yle yapacaz. Sprite ismini dikkat edersiniz. Explo+11 denilmiş ordaki +11 resimde 11 tane framenin animasyonun oldugunu bildirmekte.Flags daki overlay ise renk kodu 0,0,0 yani tam siyah olanları ekrana yansıtma demektir. Entity özelliğini çoğu şeyde kullancaz 3d li boş kovanlarda olsun silahın ucundan çıkan duman olsun ekrana 3 boyutlu bişey yerleştirmekten tutun çoğu yerde faydalanacaz. Layerlara deginilecek. 6-) VĐEW View ekranda haritada bir yeri göstermek için kullanılmaktadır.
  • 18. Bu ayarları yaptıktan sonra ekranıza sol üst köşesinden bir alan gelmiştir sanırım bu görüntünün ayarları için artık remote den faydalanacaz. Not:içinden verdigim kordinatları kabul etmiyor dişaridan ulaşılarak degiştirilmeli. Üsteki resimlede bu actionu atadıgımız varlığı bir nevi kamera gibi düşünüp onun kordinatlarını alarak remote görüntüye yansıttık. Veya bir tv gibi bir varlığa o görüntüde olmasını istiyorsak bu actionunada o varlıga eklemeliyiz. Panellerde falan resmini degiştirmek için bmap kullanılır. Sonra roketin giderken nasıl gittiginide burada gösterebiliriz. 6-) SKY
  • 19. Bakacam sonra. Flagslardan CUBE , DOME, SCENE incelenecek. Layerlara değinilecek. SKY creates a sky entity. Otherwise it's a view entity. DOME 360 degrees half dome texture CUBE six sided cube texture CYLINDER 360 degrees cylinder texture SCENE don't use the z buffer (sky models only) 5-)POĐNTER Pointer bir function yada degişken yada entity memory adresini saklamak için kullanır bu adreslede varlıga ulaşılabilir. entity* the_player; function* check_status; string* my_name; panel* game_over; bmap* health_picture; Ör: entity* p_adam;//burada bir varlık pointer degişken tanımlıyoz. action adam{p_adam=me;//pointer degişkene bu //action verdigimiz adam yada varlıgı hafıza adresini //aktarıyoz.} function kl_up(){p_adam.x+=1;
  • 20. wait(1);} on_anykey = kl_up;//burada bir tuşa basıp çektikten sonra kl_up fonksiyonuna git diyoz. Đstersek on_X buradaki X hangi tuş ise onun ismini temsil ediyor. Ör:on_q=kl_up Q harfine basıp çekince kl_up fonksiyonunu çagırıyor. 6-)KLAVYE Bir tuşa basıldıgını anlamak için “key_X” buradaki x hangi tuş ise onu temsil ediyor yalnız burada tuşa basılınca aktif oluyor biz tuşa basılıp çekince aktif olmasını istiyorsak yukardada anlattım kod gövdelerin dişinda “on_a=function_ismi” diyerek a tuşuna basılıp çekilince function_ismini belirtimiz functiona zipliyor. 7-)FARE Farenin tuşlarının basılıp basılmadını “mouse_left==1” veya “mouse_right==1” olarak ögrenebiliriz. Mousun ekranda gözükmesi için Sonsuz bir döngüde mousun x,y kordinatlarını ve mousun mode ayarlamalıyız vede mousun imleci atamalıyız.
  • 21. 8-)BREAKPOINT VE BREAKPOINT_ON Oyun esnasında değişkenlerimiz görmek için bir kırılım noktası ayarlamak için kullanacağız 2 çeşit kullanımı var bunlardan birincisi nerde kırılma yapmak istiyorsak o yere “breakpoint; diyerek orda kırılma oluşacak ve kodlar oyun ekranının sol üst köşesinde gözükecektir. Boşluk tuşuyla kod kaldığı yerden adım adım ilerlemesi
  • 22. sağlanabilir. Đkinci yolumuz “breakpoint_on();” dur bu kodumuz özelliği parantez içerisine koşul yazıyoz koşul gerçekleştiğinde kırılma gerçekleşmesidir. breakpoint_on (my.pan > 357);
  • 23. 9-)ELLE ADAM OLUŞTURMAK Haritaya daha sonradan adam sprite gibi araçlar varlık koymak için “ent_create” özelliginden yaralanıyoz bu özelligin prototipi ent_create (string filename, vector Position, function);
  • 24. 10-)Camera Camera.aspect //camerayı tersini alma veya sündürme. Yani yatay dikey piksel boyut oranını belirleme.
  • 25.
  • 26. 10-)MODEL YÜRÜTME Varlığımızı haraket ettirmek için kullancağımız 2 fonksiyon vardır. Bunlar ent_move ve c_move dir. Bu 2 fonksiyonda birbirinin çok benzemektedir yalnız c_move sonradan eklenmiş olup daha yeni mode özelliklerine sahiptir sadece aralarındaki fark budur. Tanımlama ve aldığı parametreler aşağıdadır. 1-)c_move(ENTITY* entity,VECTOR* reldist,VECTOR* absdist,var mode) 2-)ent_move (vector reldist, vector absdist); move_mode =GLIDE; Aşağıda ent_move ile bir örnek yapılmıştır c_movede bunun gibidir hiçbir farkı yoktur sadece move_mode ile ent_move birleştirmiştirler .
  • 27. ent_move(move,nullvector);//ilk parametre yerel kordinata göre adam yönlendirken(adamın kendi x y sine göre) 2 ci parametresi ise global kordinat sistemine (haritanın kordinatı) göre hareket ettirir.(yukaridaki resme bakınız) Tabiki bu yönlendirme şu vektöre (x y z) git değil daha çok x bir verirsek adam her fps 1 piksel öne yada y 1 verirsek 1 piksel yana z 1 verirsek bir piksel yukarı gibi kaydırmayla çalışmakta . Move_mode = GLIDE; Yürümeye bazi özellikler katmak için move_mode kullanıyoz. Aldığı degişken parametreler aşşagıdadır:
  • 28. IGNORE_YOU //sürtüşmeyi ve/veya çarpışmayı diğer varlıklar (model entity) yok say. IGNORE_PASSABLE//bütün yol , duvar, model lerin passable bayrağı seçiliyse çarpışmaları aldırma. Bu özellik daha çok su gibi varlıklar için kullanılmakta.(bakınız aşağıdaki resme) IGNORE_PASSENTS // passable bayrağı işaretli olan model ve sprite aldırma. Bu özellik ignore_passable geliştirilmiş halidir. Ignore_passents aktif edilmiş ise bize 3 tane bayrağı kullanarak bize bilgi vermektedir. in_passable=modelin içindeysek bu bayrak 1 olur içinde değilsek 0 dır. on_passable= modelin diş kenarındaysak bu bayrak 1 olur diş kenarında değilsek 0 dır. in_solid=Bakılacak . bu özellik sadece ent_move için geçerli sanırım.
  • 29. Not : Bu özellik move de kullanılıdığı için yukaridaki bayrakların degişimi bizim hareketimize bağlı olarak değişmekte haraket etmiyorsak 0 olarak döner. IGNORE_MAPS //Harita varlıklarını (map entity) yoksay. (aşşagıdaki resme bakınız) IGNORE_MODELS //bütün modellere aldırma. IGNORE_SPRITES //bütün sprite aldırma. ACTIVATE_PUSH //Bir varlığa çarptığımızda karşıdakinden geçemediysek bu olay meydana gelmiş olur çarpişma alğılamak için kullanıyoz. Çarptığımız engele bu olayı tetiklemek için event_mode activate_push eklenmesi gerektiğinide unutmayın. Ör: function engel
  • 30. { if(event_type==EVENT_PUSH) //tetiklenen olayın türünü sorğulayoruz. {beep(); }//bip sesi çıkarmak için } action beni_itiyorlar { my.push = -2; //ignore_push a bakın. my.ENABLE_PUSH = ON; //tetiklemeyi aktif yaptık my.event=engel; //fonksiyonu çağırdık. } IGNORE_PUSH //kendi push degerinden(my.push) düşük olan varlıkları aldırmadan içinden geçiyor yalnız tetikleme meydana geliyor. Sadece içinden geçmesini enğelemiyor . my.push default olarak 0 dır - 100 … ile 100 arası bir değer alabiliyor. Mesala bir kayanın “you.push = -2;” oldugunu ama bizim playerimizin “my.push=10;” kabul edersek 10>-2 büyük olduğu için kahramanımız kaynın içinden geçebilecek ama tetikleme yinedemeydana gelecek tabiî ki biz move_mode a activate_push eklediysek tetikleme meydana gelecektir aksi halde tetikleme gerçekleşmez. Kendimezden düşük push olan varlıkları algılama. ACTIVATE_TRIGGER - Hareket esnasında tetik olayları muktedir kıl. Ör: function engel { if(event_type==EVENT_TRIGGER) //tetiklenen olayın türünü sorğulayıyoruz.
  • 31. {beep(); }}//bip sesi çıkarmak için } action beni_itiyorlar { my.trigger_range = 500; //yaklaşma mesafesi my.ENABLE_TRIGGER = ON; //tetiklemeyi aktif yaptık my.event = engel; //fonksiyonu çağırdık. } Bu özellik daha çok belli mesafelerden varlığa yaklaşıldığında çalışması için kullanılır yaklaşma mesafesini belirlemek için my.trigger_range verdigimiz değer kadar uzaktan tetikleme meydana gelir default değeri 0 dir. ACTIVATE_SHOOT , ACTIVATE_SONAR Birbirlerinen aynısı sayılır bunlar bir nevi kapan ğibi düşünebilirsiniz bir varlığın üzerine çıkmak bir varlığa dokunmak gibi olaylarla tetiklenir. Ör: function func_kapan { if(event_type==EVENT_SONAR) {beep(); } } action kapan { my.ENABLE_SONAR = ON;
  • 32. my.event = func_kapan; } USE_AABB= Düzene sokulmuş eksen ifade etmekte. Bunun anlamıda çarpışma algılamalarında bir varlığı sanki bir kutu çerçeveliyor gibi kullanılmasıdır bunda esas amaç verimli ve hızlı olmasıdır ama ne yazikki varlığın gerçek yüzeyleri yok sayılmakta. Çevrelen kutuyu görmek için oyun motorunda çalıştırdıktan sonra F11 ile görebilirsiniz. Bu çevreleyen kutunun büyüklüklerini min_x, min_y, min_z max_x, max_y, max_z den ayarlayabilirsiniz. Ör: vec_set(my.min_x,vector(-50,-50,-50)); vec_set(my.max_x,vector(50,50,50)); GLIDE // kaymayı aktif eder. You= Bir olay gerçekliştiğinde kimin tarafından gerçekleştirdiğini bellekteki adresini buradan ögrenileiliriz. Örnek vermek gerekirse bir çarpışma olayı ayarladık ve geldi biri bize çarptı o anda you degişkeninde bize çarpan kişinin bellek adresini geri döndürürek kimin çarptıgını algılatabiliriz eger bir olay yoksa null döndürür. Target= çarpışmanın gerçekleştigi yerin posizyonunu verir. Genel bir örnek: action adam_yuru() { player=me; while(player!=NULL) {
  • 33. //klavye sag sol yön tuşuna göre atama x=key_cud-key_cuu; move.x=x; y=key_cur-key_cul;/y ekseninde adam move.y=y; z=key_a-key_z; move.z=z; move_mode=glide; ent_move(move,nullvector);//adamı hareket ettiriyoz wait(1); } } key_cur=klavye yön tuşundan sol key_cul=klavye yön tuşundan sağ key_cud=klavye yön tuşundan aşağı key_cuu= klavye yön tuşundan yukarı key_force.x // klavyedeki sag sol ok yönleri temsil etmekte olup sağ 1 sol -1 dir hiçbir tuşa basılmadıgında 0 olmaktadır. key_force.y // klavyedeki yukarı aşşağı ok yönleri temsil etmekte olup yukarı 1 aşşağı -1 dir hiçbir tuşa basılmadıgında 0 olmaktadır. Adamımızı döndürmek içinse pan özelligini kullanıyoz.
  • 34. Adam kendi yönünde saat yönünde dönmekte pan değeri 0 ile 360 derece arasında bir deger almakta.
  • 35.
  • 36. 11-)KAMERA Varlıgımızla gözüyle dünyayı görmek için varlıgımızla beraber kameranında haraket etmesi gerekiyor . vec_set(camera.x,player.x); camera.z+=27; vec_set(camera.pan,player.pan); player varlığımızın sürekli tekrarlayan yerine bu kodu yazarsanız adamızla beraber camerada gidecektir yalnız adamımız gözekecektir eğer adamımızı bir merkez olarak ele alarak haraket etmesini istiyorsanız örek vermek gerekirse quake3
  • 37. oyununda player göremezsiniz sadece silah vardır adamı görmek için aynaya bakmanız gerekir Bu gibi görünte eldetmelere first person denilmekte bir bevi ilk bizim görmemiz gibi. Bunun gibi bişeyi yapmak isityorsanız cameramıza adamı bağlamamız gerekir bunun içinde camera.genius=player; koduyla adamımızı bağlıyoruz adamı göremiyorsanız kamerayla ama kahramanımız orda hiçbir yere gitmedi isterseniz ben bunun gibi bişey yazarım derseniz tabiki yapabilirsiniz sadece işler biraz karışırı onun içinde sin ve cos faydalanarakta yapabilirsiniz. camera.x=player.x +(200 * cos(camera.pan) ); camera.y=player.y + (200 *sin(camera.pan) ); 12-)MODEL ANĐMASYON ent_animate(player,"run",run%100,ANM_CYCLE); player =ent_animate fonksiyonunu aldığı ilk parametre adamın değişken ismi "run"=run ise mdl formattaki modelin animasyondaki ismi olmalı bu çok önemlidir eğer ismini yazmazsanız adam istediginiz animasyonu yapmayacaktır . run%100= animasyon 0…100 kadar aralıkta tanımlanmış olup run isminde bir degişken tanımlanıp bu degişeken 1 er 1 er artırılıyor ve %100 ile 100 klanı olan modunu alıyor.
  • 38. ANM_CYCLE=animasyonun modlarını ayarlıyor aldıgı parametreler 3 tane bunlar: ANM_CYCLE //tekrarlı animasyon ANM_SKIP //atlamalı animasyon ANM_ADD //eklemeli animasyon Vec_set( 1vec, 2 vec);// 2 vectörü 1 vectörü kopyalar. Camera.pan //camera sag sol dönme Camera.tilt //camera aşagı yukarı dönüş 13-)YER ÇEKĐMĐ Şimdide modelimizi yüretecez vede merdivenden ve/veya aşyaların üzerine çıkmasını sağlayacaz bunu için kullanacamız fonksiyon c_trace isimli fonksiyon olacak bu fonksiyon modelimiz ile varlık harita objeler v.b. karşılaştırma yapar C_trace use_box seçilmemişse her zaman işin kullanır. Use_box seçilmişse çok köşeli polygonlarda elipsoid bir biçim test eder. C_trace aslında bir nevi tarama dır ileride görecegimiz c_scan dan önce çıkan bir özellik olup yönlendirme açı veremiyoz c_scan özellikleri daha çok olup ama c_trace kendine özgü özellikleri mevcuttur. Aşşagıdaki resme bakarsanız. C_trace çalışmasını daha iyi anlayacaksınız.
  • 39. Level çarpişmalarda her zaman elipsoid kullanılmakta. c_trace(VECTOR* from, VECTOR* to, var mode) // trace fonksiyonun aldıgı ilk parametre modelimiz x konumu 2 ci parametre ise hedef vektorümüz 3cü parametremizde trace ilgili ayarlar. Daha sonra c_trace fonksiyonun kullanacagız ama c_trace geçmeden istisnalar v.b. modunu tanımlayalım. mode= IGNORE_ME // Benim varlığımı görmezlikten gel. IGNORE_YOU //sürtüşmeyi ve/veya çarpışmayı diğer varlıklar (model entity) yok say. IGNORE_PASSABLE//bütün yol , duvar, model lerin passable bayrağı seçiliyse çarpışmaları aldırma. Bu özellik daha çok su gibi varlıklar için kullanılmakta.(bakınız aşağıdaki resme)
  • 40. IGNORE_PASSENTS // passable bayrağı işaretli olan model ve sprite aldırma. Bu özellik ignore_passable geliştirilmiş halidir. Ignore_passents aktif edilmiş ise bize 3 tane bayrağı kullanarak bize bilgi vermektedir. in_passable=modelin içindeysek bu bayrak 1 olur içinde değilsek 0 dır. on_passable= modelin diş kenarındaysak bu bayrak 1 olur diş kenarında değilsek 0 dır. in_solid=Bakılacak . bu özellik sadece ent_move için geçerli sanırım. IGNORE_MAPS //Harita varlıklarını (map entity) yoksay. (aşşagıdaki resme bakınız)
  • 41. IGNORE_MODELS //bütün modellere aldırma. IGNORE_SPRITES //bütün sprite aldırma. IGNORE_PUSH //kendi push degerinden(my.push) düşük olan varlıkları aldırmadan içinden geçiyor yalnız tetikleme meydana geliyor. Sadece içinden geçmesini enğelemiyor . my.push default olarak 0 dır - 100 … ile 100 arası bir değer alabiliyor. Mesala bir taşın “you.push = -2;” oldugunu ama bizim playerimizin “my.push=10;” kabul edersek 10>-2 büyük olduğu için kahramanımız taşın içinden geçebilecek ama tetikleme yinedemeydana gelecek tabiî ki biz move_mode a activate_push eklediysek tetikleme meydana gelecektir aksi halde tetikleme gerçekleşmez. Kendimezden düşük push olan varlıkları algılama. IGNORE_WORLD//Görmezlikten gel level terrain ve level block larını.
  • 42. IGNORE_FLAG2 //Bayrak 2 seçiliyse aldırma. USE_BOX //(MIN_X, MAX_X ) b_box bayrağı seçiliyken yada seçili degilken kahramanımızın kaplayan çerçeveyi kullanrak f11 gözüken çerçeveyi kullanarak tara bu taramada kahramanımızın orgini degilde kutunun altından başla taramaya. Polyğon bayragı seçiliyse poligana göre tara bu taramada kahramanımızın orjininden başlayarak tara (aşşağıdaki resme bakınız). ACTIVATE_SHOOT //varlığa vurulmayı sağla. ACTIVATE_SONAR //varlığa sonar olayını sağla. ACTIVATE_SHOOT , ACTIVATE_SONAR Birbirlerinen aynısı sayılır bunlar bir nevi kapan ğibi düşünebilirsiniz bir varlığın üzerine çıkmak bir varlığa dokunmak gibi olaylarla tetiklenir. SCAN_TEXTURE //textureyi tarmayı aktifle. Bu özellik c_trace taranan textureler hakkında bize bilgi verecek önceden tanımlanmış değişkenler var taranan texturelerin bilgilerini buralara yazmakta bu tanımlanmış değişkenler şunlardır :
  • 43. tex_name // taranan texturenin ismini yazar. Aşşagıdaki iki resme bakarsanız bir uygulama ile taranan resim ismini ekrana yazdırdım. Đsterseniz direkte karşılaştırma yapabiliriz eger karşılaştırma yanı ise dönen deger 1 iken degilse 0 dönecektir. str_cmp (tex_name
  • 44. ,”linesblackyell”); Yazi (string) ile uygulamalarımız biraz zahmetli olacaktır kullandıgımız dil itabiriyle biraz c ye biraz delphiye benzemekte string karşılaştırmalarda oyun motorun sunduğu hizmetlerden faydalanacağız. Yeri geldikce strinğ karşılaştırmalara deginecegim. Hitvertex// bu özellik use_polygon aktif edildiği zaman çalışmaktadır taranan varlığın en yakın vertex numarasını vermektedir ki gerçekçi uygulamalarımızda çok faydalı olacaktır. Bu özellik modellerde vertex oldu için model varlıklarda tarama yapmalısınız. tex_flag1..tex_flag8// Bu özellik ile tarama yaptıgımız texturelerin flag seçili olup olmadığını algılatmak için.
  • 45. tex_light // Texturenin üzerine düşen işigın şiddetini vermektedir. (0..255) tex_color// vertex rengini veriri 3 boyutludur RGB tex_fog// texturenin bulanıklığını verir. Not: Scan_tex in gördügümüz degişkenlerinden sadece tex_name string iken diger degişkenler numeriktir. C_trace özellikleri gördükten sonra genel bir örnekle işin pekişmesini sağlayacaz.
  • 46. Şimdi öncelikle geçici bir vektör tanımlayalım vede bu vektöre modelimizin konumunu aktaralım. var temp_move[3]=0,0,0;//vektör tanımladık. vec_set(temp_move,player.x);//player.x player.y player.z konumunu temp_move adlı vektöre kopyaladık. temp_move.z-=200;//playerin konumundan z ekseninden – 200 düştük z= -(c_trace(player.x,temp_vector,use_box +ignore_me ) ); //trace fark pozitif degil negatif dir çünkü use_box kullandımız için kahramanı çevreleyen tel kafesten başladı için kendisine göre negatiftir (aşşagıdaki resme bakınız).
  • 47. USE_AABB ve USE_POLYGON // bu seçenekler tarama modelin orjininden başlarken use_box kendisini çevreleyen çerçevenin en altından başlayarak taramaya başlar. Use_polygon modellerin girintli çıkıntılı grçek yüzeylerini algilayabilirken use_aabb algılayamamakta. Use_aabb f11 gördügümüz çerçeveyi degilde wed de modelin özelliklerine girdigimizde b_box ve polygon seeçilmediginde f11 çıkan küçük kutucukla ilgilenmekte. Bu özelikler yeni özellik olduğu için daha geliştirilmekte olup tamamen oturmamıştır geniş bir bilgi neyazikki yoktur. Bu özellikler çarpışmayla ilgili yeni özelliklerdir aşşağıdaki resme bakınız.
  • 48.
  • 49. MODĐFĐYELER: target= Çarpişmanın gerçekleştigi yerin posizyonunu verir. You= bir olay gerçekliştiginde kimin tarafından gerçekleştirdiğini ögrenmek için bellekteki adresini buradan ögrenileiliriz. Örnek vermek gerekirse bir çarpışma olayı ayarladık ve geldi biri bize çarptı o anda you degişkeninde bize çarpan kişinin bellek adresini geri döndürürek kimin çarptıgını algılatabiliriz eger bir olay yoksa null döndürür. trace_hit = c_trace bir şeyi yakaladıgı zaman 1 döndürürken hiçbirşey algılamadıgında 0 döndürür. 14-)VARLIK ALGILAMA TARAMA Şimdide bir nesneye veya varlığa yaklaşan modelleri algılatacaz buna bir örnek vermek gerekirsek bir modelin kapıya yaklaştığında otomatik olarak açılması veya modelimiz bir kapının karşısındayken bir tuşa basarak o kapıyı açtırmak yada bir güvenlik kamerasının düşmanı alğılaması veya bir düşmanın yaklaştıgını algılayarak yapacamız stratejiyi belirlemek . Bunun için kullanacamız fonksiyon c_scan foksiyonu dur. C_SCAN c_scan yapısını aşşagıda görebiliriz. c_scan (VECTOR* pos, ANGLE* dir, VECTOR* sector, var mode);
  • 50. Pos Taramanın başlayacagı noktayı orjinin noktası Dir Taramanın yönü sector.x Yatay tarama koni şeklinde veya 360 derece verilerse daire . sector.y Dikey tarama koni şeklinde veya 360 derece verilerse daire . sector.z Taramanın uzaklık mesafesi . Mode Tarama modları özellikleri. C_scanın tarama mantıgını ve tarama mesafesini şeklini daha iyi anlamak için alttaki resme bakınız. C_trace ile c_scan görsel olarak karşilaştırısak aşşagıdaki resimle daha iyi anlayacaksınız.
  • 51. Mode özelliklerin aldığı değerler. IGNORE_ME Görmemizlikten gel beni. IGNORE_YOU Görmemizlikten gel diğer modelleri . Varlıkları tara ve olayları incele bu özellik ile bir varlık yakalandığı zaman SCAN_ENTS tetiklendigi zaman event_scan olayı gerçekleşir. SCAN_POS Camera tarar cameraya olan uzaklığıda geri döndürür. Path veya Türkçesi ile yolun başlangiç konumunu dikkat sıfırıncı dügümü SCAN_PATHS başlangıç noktasını uzaklıgını geri döndürür. Path in vaya Türkçesi yolun dügüm noktalarını tarar buldugunun arasındaki SCAN_NODES mesafeyi geri döndürür. SCAN_LIGHTS Durağan işikları tarar kendine olan uzaklığı geri döndürür. SCAN_LIMIT SCAN_ENTS ve SCAN_LIGHTS birlikte çalışıyor gibi davranır.
  • 52. C_scan taramada biri yakalanırsa kendisine olan uzaklığını geri döndürmektedir. Modifies: you Yakaldıgı varlıgın bellek adresini verir. result Taranan yere en yakın samimi olan yerin bize olan uzaklıgını verir. target Taranan yere en yakın samimi olan yerin posizyonunu verir. bounce Çarpışmanın yerinin açısal olarak çarptıktan sonra ziplayacagi yere yönlendirir. Çarpışmanın eksenlerdeki yerinin dikmi yatıkmı oldugunu algılamakta kullanılmakta. Ör: kurşun çarptıktan sonraki ziplayacagi yeri. Bunla yönlendiriz. z de tavan -1 zemin 1 dir egere çarpma yan yüzeylerde gerçekleşmişse x,y yüzeylerine Normal z deki gibi 1 yada -1 deger almakta. Örnek duvara mermi çarpmasının izini bırakmakta kullanırız . Aşşagıdaki resme bakınız. tex_color Duragan işik şiddeti. SCAN_ENTITY Bildiniz üzere bir kapıyı açtırmak için bir tuşa basarak modelin önündeki kapıyı açtıracaz böylelikle sürekli konturoldan kurtarırak sistemin kasılmasından kurtaracaz . Öncelikle bir fonkisyon tanımlayalım function calis() { scan_entity(player.x,vector(100,0,100));
  • 53. } Sonra bu fonksiyonu çagırmak için ya main blogun içine yada bütün blogların dışında boş bir alana on_key=calis; //burada on_key deki key anlamı klavyedeki tuşların ismi yerine ör: on_a dersem a tuşuna basılıp çekildikten sonra gösterdigim fonksiyona ziplayacak. Ben bu örnegimizde on_q=calis;//q hrfini kullandım. Q harfine bastıgımda scan_entity modelimizin konumndan başlayarak taramaya başlayacak karşı modelimizde harita varlıgında my.enable_scan=on; diyerek kendisinin taramaya aktif oldugunu taramadan geçtiginde my.event aktarılan fonksiyonu çağıracak. Buradaki önemli olan şey my.enable_scan=on; diyerek varlık olayı tanımlıyoz yani bir kapıyı birisi taradıgında my.event aktarılan fonksiyonu çalıştırır. Şimdi bu varlık olaylarını aşşagıda anlatıyım.
  • 54. VARLIK OLAYLARI • Event_block – varlıgımız hareket halindeyken biri tarafından durdurulması halinde veya wed deki block lari çarpmasıyla gerçekleşir. c_move veya fizik hareketleriyle tetiklenir . Passable ve push degerlerinide dikkate alarak gerçekleşir. Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür. Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1 ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir. • Event_entity – varlığın başka bir varlıkla çarpışma algılar. c_move ve fizik hareketlerinde tetiklenir. EVENT_PUSH ve EVENT_IMPACT te etkilenir. You değişkeniyle bize çarpan kişini bellek adresini geri bildirir. Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür. Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü, 1 ise altı gibi diger yüzeyler içinde geçerlidir x,y -1 yüzeyi diger yüzeyi, x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir. • Event_friction – sürtüşme anlamındadır fizik ve c_move ile gerçekleşir sürtüşme anında geçerli olur her iki objedede gerçekleşir olay. Geçen yazımızdaki c_move activate_push bakınız. Target degişkeniyle çarpışmanın gerçekleştigi yerin kordinatı geri bildirir. Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür. Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1 ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir. • Event_impact –çarpma anlamında kullanılmaktadır haraket eden obje bize çarptıgında gerçekleşir. C_move ile tetiklenmektedir. You ile kendisine çarpan kişinin bellek adresini verir. Geçen yazımızdaki c_move activate_push ve ignore_push bakınız. Bounce degeri ile çarpişilan varlıgın çarpışmadan sonra ziplayıp gidecegi açıyı geri döndürür. Normal degeri ile ise çarpışılan varlıgın yüzeyini belirlemekte kullanılır eger z -1 ise üstü 1 ise altı gibi x,y -1 yüzeyi diger yüzeyi x,y 1 ise diger yüzeyin çarpıştıgını geri bildirir. • Event_push – c_move de activate push yaparak karşısındaki kişiye push olayını gerçekleştirmeye yarar bize çarpanın kişinin bellek adresini you değişkeniyle bildirir. . Geçen yazımızdaki c_move activate_push ve ignore_push a bakınız. • Event_click – farenin sol tuşuyla varlığa tıklamak. • Event_rightclick – farenin sağ tuşuyla varlığa tıklamak • Event_release – bu özellik fare okunun varlığımızın üzerinde çıktığı zaman tetiklenir. ( no longer touching) • Event_touch- bu özellik mousun okunun varlığımızın üzerinde girdiği zaman tetiklenir.
  • 55. Event_scan – varlığın c_scan ile taranması ile tetiklenmektedir. Bizi biri üzerimizden scan geçirmesiyle olur. You değişkeniyle bizi tarayan varlığın ram adresini döndürürken result değişkeniyle tarayan ile taranan arasındaki mesafeyi geri döndürmektedir. • Event_detect – c_scan ile tetiklenmektedir yalnız karşı tarafın değil kendimizde yani c_scan herhangi birşeyi algıladığında bizde bu olay gerçekleşir. (event_scan bakınız) You ile karşı kişinin hafızadaki adresini geri döndürür bize, result değişkeni ile ise bize algılanan kişini ile bizim aramızdaki mesafesini geri döndürür. • Event_trigger – bu özellik c_move de mode özelliğine ACTIVATE_TRIGGER eklenmesiyle ancak tetiklenir. • Event_shoot – c_trace ve c_move mode özelliğinde activate_shoot varsa, c_trace tarandığında yada c_move ile çarpışmasıyla bu olay meydana gelir. You değişkeniyle bizi tarayan ya da çarpan kişinin ram adresini geri döndürür. • Event_sonar – c_trace ve c_move mode özelliğinde activate_sonar varsa, c_trace tarandığında ya da c_move ile çarpışılmasıyla bu olay meydana gelir. You değişkeniyle bizi tarayan ya da çarpan kişinin ram adresini geri döndürür. • Event_disconnect – çoklu oyuncular(multi player) için kullanılmakta bağlantı kurulamamağında gerçekleşir. (comm. pro versions vardır bu özellik) • Event_receive – bu özellik send_skil1 (entity. skill, var mode) fonksiyonun kullanılmasıyla bize bir data gelmesiyle tetiklenir. ( multi player comm, pro versions için kullanılır.) EVENT_BLOCK: c_move ile veya fiziksel olarak hareket etmekteyken, bir wed bloğu tarafından durdurulduğu zaman tetiklenir. EVENT_ENTITY: c_move ile veya fiziksel olarak hareket etmekteyken başka bir entity ile temas edildiğinde tetiklenir. EVENT_FIRICTION: fiziksel bir entity herhangi birşeye dokunduğunda, sürtünme esnasında tetiklernir. Đki fiziksel obje birbirine dokunursa, ikisininki birden tetiklenir. EVENT_PUSH: push değeri kendinden daha büyük bir entity ile temasda tetiklenir. EVENT_IMPACT: Hareket eden başka bir objenin çarpması sonucu tetiklernir. Biz bini
  • 56. kullanacağız, karakterimiz(hareket eden obje) paraya çarpması sonucu tetiklenecek. EVENT_SHOOT: c_trace + ACTIVATE_SHOOT ile taranma sonucunda tetiklenir. EVENT_SONAR: c_trace + ACTIVATE_SONAR ile taranma sonucunda tetiklenir. (ACTIVATE_SHOOT ve ACTIVATE_SONAR, c_trace'ın son parametresi olan moda yazılarak etkinleştirilir.) EVENT_SCAN: c_scan tarafından taranma sonucu tetiklenir. EVENT_DEDECT: c_scan ile taranma yapıldığında en az bir obje bulunursa, taramayı yapan obje için tetiklenir. EVENT_TRIGGER: Tetiklenme yarıçapı içinde, ACTIVATE_TRIGGER ile c_move kullanan bir obje algılanırsa tetiklenir. EVENT_TOUCH: objeye mouse ile dokunulursa tetiklenir. EVENT_RELEASE: mouse objenin üzerinden çekilirse tetiklenir. EVENT_CLICK: objeye mouse ile tıklanırsa tetiklenir. EVENT_RIGHTCLICK : objeye farenin sağ tuşu ile tıklanırsa tetiklenir. EVENT_RECIEVE: obje send_skill ile gönderilen bir skill alırsa tetiklenir(multiplayerde) EVENT_DISCONNECT: objenin istemcisi(objeyi kullanan client) oyundan ayrılırsa tetiklenir.(multiplayer,server) 15-)AŞAMALAR ARASI DEGĐŞĐM Kahramanımız verilen görevi tamamladıktan sonra aşmamamızı degiştirip kahramanımıza yeni görevler vermememiz gerekir bunu yapmak için öncelikle oyun motorumuzu donduracaz daha sonra aşamamızı degiştirip oyun motorumuzu serbest bırakacaz. Tabiî ki bu degişim kahramanamız görevi tamamladıgında yada kahramanımız belli bir kapıyı açtıgında bu degişim gerçekleşecek bunuda yukarıda biraz anlatımız yöntem olan kagramanımızın yaptıgı olayları algılayarak ya kapıya çarptında yada bir kapıyı açmak istedeginde gerçekleşecek . Oyun motorumuzu durdurmak için freeze_mode özelligini kullanacaz aldıgı parametreler= 0 – bütün fonksiyonlar çalışıyor (default) 1 – varlık fonksiyonlarını (my != NULL // freze mode kullanırken adamımızı kaldırmamız gerekiyor bunu uygulamayı unutmayın) ve parça fonksiyonları askıya al , diger bütün fonksiyonlar çalışıyor. 2 – bütün fonksiyonları askıya al. Şimdi bir örnek yapalım: function level_change()
  • 57. { wait(1); if (EVENT_TYPE == event_impact) { my = NULL; freeze_mode = 1; level_load(“TLlevel2.wmb”); wait(2); freeze_mode = 0; } } action zone_block { my.enable_impact = on; my.event = level_change; } Amacımız zone_block action ile verdigimiz bir kapıya enable_impact olayını gerçekleştirmek yani bir şeyin çarpması sonucunda my.event=level_change; fonksiyonuna ziplayarak level_change fonksiyonunu işletecez level_change fonksiyonunda olayın ne oldugunu ögrenmek için if (EVENT_TYPE == event_impact) olay tipinin event_impact yani kapıya bir şeyin çarpması olayı olup olmadını eger olay bu ise my = NULL; ile adamamızı oyun motorundan kaldırıyoz ve freeze_mode = 1; diyrek varlık fonksiyonlarını donduruyoz level_load(“TLlevel2.wmb”); ile ise diger aşamamızı yüklüyor ve bu işlemden sonra oyun motoruna 2 fps diger işleri yapması için izin veriyom (wait(2);) son olarakta freeze_mode = 0; diyerek bütün fonksiyonları serbest bırakarak kaldımız yerden devam ediyoz. :) ASANSÖR VEYA YÜRÜYEN MERDĐVEN Kahramanımız artık merdivenden çıkmasını gerek kalmadan asansörle yukarıya çıkaracaz .
  • 58. Kodlamalarda siz okuyucumların rahat anlaması için kodları fazla karışık yapmaktan kaçınıyom ama büsüferde çok fonksiyonlu bişey çıkmıyor ama siz okuyucularımızın hayal gücünü kullanarak bu eksikleri gidermesini bekliyom böylelikle kitaba baglı kalmadan istediginiz kodlamayı yapmayı kazandıracaktır. function yukariya()//kahramanımızı yukarıya çıkrayoz. { my.skill2=my.z+5;//asansörümüzün ilk konumunu ve çıkacagı yüksegi ayarlıyoz sleep(2);//2 sn bekle while (my.skill1==0) { my.z+=time; if(my.z>my.skill2) {my.skill1=1; } wait(1); } } action asansor { my.enable_sonar=on;//sonar taraması başlanıyor my.event=yukariya;//yukariya fonksiyonunu çagırıyor; } Sonarı aktif ettik ama tetikleyecigi koymadık bunun için trace_mode = ACTIVATE_SONAR; trace_mode ya activate_sonar eklemeyi unutmayın. Varsa bir kapıyı yatay şeklilde döndürün ve kapı olayına asansor seçin kahramanımız kapının üzerini çıktıktan 2 sn sonar yukarıya çıkacaktır. VARLIK DEGĐŞKENLERĐ
  • 59. Varlıkların yaratılmasıyla standart degişkenler almaktadırki otomatik olrak bunlar kod yazarken bunlar degişken oluşturmaktan kurtarıyor bizi. Bunlardan bir tanesi skill1….100 1 den 100 kadar giderek 100 tane degişken 1..20 kadarı wed yani level editorde direk gözükür ki ellede degerlerini degiştirebilirsiniz. Bir digeride flag1…8 1 den 8 kadar olan bayraklardır bunlar alabilecegi deger 0 veya 1 dir bunların anlamı evet hayır gibi anlamlı degişkenlerimizdir burda 1 evet anlamında 0 ise hayır anlamındadır. Bunları kunllanırken örnegin my.skill1=10; Diyerek skill1 degişkenin degerini 10 yapmaktır ama bu skill ifadesi hiç bişey anlatmıyor kalıcı olmadıgı için “define deneme,skill1 “ diyerek my.deneme=10; dedigimzdede skill1 degeri 10 olacaktır buşekilde kullandıgımız degişkenlerin ne anlama geldigini basit bi şekilde anlarız wed de yani level editor de “define deneme,skill1 “ dememiz ordaki skill1 adlı degişkenin degerini degiştirmedigini görmüşsünüz bunu bir adım daha götürerek action başlıgın üzerinden açıklama yazar gibi //uses:deneme diyerek level editördede skill1 yerine artık deneme yazdıgını göreceksiniz. Burdaki define ile tanımladıgımız kod editoründekini degiştirken uses ile ise level editördekini degiştirmiş olduk. Yalnız define ile tanımlama yapmadan uses eklerseniz uses anlamyacaktır hangi skillX degiştirecegini bilemeyecegi için level editorde bir degişkliklige gitmeyecektir. Asansörü geliştirilmiş bir örnek
  • 60. wait(sayı); ve sleep(sayı); daha önceki derslerde belirtildiği gibi wait parantezler arasındaki kare(frame) kadar, sleep ise parantezler arasındaki saniye kadar bekletir.
  • 61. if (belirtec != 1) { return; } PATH –YOL Şimdide size 3d game studionun güzel özelliklerinden birinden bahsedecem. Path in türkçesi yol olrak tercüme edebilir peki bu yol nedir kafanızda bazı şeylerin canlanması için birkaç fikir verecem mesala bir asker nöbet tutuyor bir oyana bir buyana sürekli aynı şekilde vede yolda dolanıyor düşman tarıyor arıyor işte bu askerin güzergahını path yapabiliriz veya gölde yüzen balık havada uçan kuş kelebek ortalıkta dolaşan asker araba tren yolu v.b. birçok örnek çoogoltılabilir işte buralarda ve pekçok yerde kullanabilecigimiz path tanıtacam sizlere öncelikle path oluşturmak hakkında bilgi veriyim.
  • 62. Resimdedende anlaşılacağı üzere oyun sahnemizde farenin sağ tuşuyla açılan popup menuden Add Path diyerek ilk yolumuzun node (düğüm) noktasını yerleştiriyoz daha sonra yolumuzu çizmek için resimdede siyah okla gösterdigim vertex move tolbar dügmesiyle yolumuzu çiziyoz. Resimdende anlaşılacagı üzere siyah yuvarlakla aldıgım yerler yolumuzun düğüm (node) noktalarıdır buralar bizim için çook önemli .Dügümlere direk erişebiliriz ama edgelere direk erişeyemeyecez dügümler aracılıgıyla erişecez. Đlerleyen kısımlarda daha iyi anlayacaksınız. ☺
  • 63. Siyah çizgeyle gösterdiğim alanlar ise iki dügüm arası yüzeylerimiz (edge) lerimiz. Bu resimde de görülecegi üzere edge ve node özellikleri yer almakta edge özelliklere baktıgımızda direction 4 den 3 , 3 dende 4 de gidilecegibilini gösteriyor buurdan edge lerin trafigini ayarlayabilirsiniz ve diger özellikler yer alırken. Node de ise her bir nodenin dügümün skill özellikleri yer almakta.
  • 64. Lite c scripit editor kodlarımıza baktığımızda gayet zengin bir koda sahibz bunları tek tek inceyelim. --------------------------------------------------------------------------- path_scan path_scan(ENTITY* ent, VECTOR* pos, ANGLE* dir, VECTOR* sector) path_scan kodumuz kahramanımızın posizyonuna göre önene gelen path in node dügüm sırasını geri döndirmekte ayrıca yön seçebilmekteyiz ayrıca path_set gibi varlıgımıza buldugu path i eklememekte.(ayrıntılı bilgi için path_set bakın) Scan yaparken arada duvar varsa yok sayar . Şimdide aldığı parametrelere baktığımızda : Parameters: ent Varlığımızın özelliklerinin saklı tutulduğu ram adresi. pos Taramaya başlayacagımız merkez orgin. dir Tarama yönünü ( açı). sector.x Yatay tarama kısmın pozisyonu, yada sabit bir deger girerek koninin genişliği. sector.y Dikey tarama kısmın pozisyonu, yada sabit bir deger girerek koniye dönüşüm açısı. sector.z Tarama uzaklıgı. Ör: path_scan(me,my.x,my.pan,vector(180,180,50));
  • 65. Fonksiyonun döndürdügü degerde buldugu dügümün (node) sıra numarasıdır. Not: path seçilmesine(path_set) demeye derek yoktur herhangi bir önene gelen dügümün sıra numarısını verir. --------------------------------------------------------------------------- path_scannode path_scannode(ENTITY*,var index) path_scannode path_scan ile entegre(beraber) biçimde çalışır. Parameters: ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram adresi. index – 0 tanımlı ilk dügümü gösterir, 1 ikincil dügümü gösterir bakış açısına göre ya 1 fazlası ya 1 eksigini dügüm yoksa ondan sonrası için 0 gösterir. i1=path_scan(player,player.x,player.pan,vector(180,180,10 0) ); i2=path_scannode(player,1); Döndürdügü degerde buldugu dügümün sıra numarası. --------------------------------------------------------------------------- path_getnode path_getnode(ENTITY*,var node,VECTOR* pos,var* skills) Kısaca verediğimiz dügüm numarasının kordinatını ve dügümün özelliklerini ögrenebiliriz. Parameters: ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram adresi.
  • 66. node – aranacak node dügüm numarası sırası. pos – node konumunu döndüreceği degişken vektor 3 boyutlu. Skills- dügüm noktasının özelliklerini aktaracağımız 6 boyutlu dizi degişken kullanmak istemiyorsanız NULL yazarak boş odlunu bildirin. Ör: path_getnode(my,2,deneme,null); Bu özelligin çalışması için ya path seçilmeli (path_set) yada path taranarak (path_scan) ilerlenmelidir path tarayarak ilerlemek bazen avantaj sağlar. --------------------------------------------------------------------------- path_setnode path_setnode(ENTITY*,var node,VECTOR* pos,var* skills) path_setnode dügümün konumunu ve özelliklerini degiştirmeye yarar. Parameters: ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram adresi. node – istenilecek node dügüm numarası. pos – konumunu degiştirecegimiz path yeni konumu 3 boyutlu degişken. Skills- istedigimiz dügüm noktasının skill parametreleri degiştirmek için 6 boyutlu dizi degişkeni ile degişkenin içindeki veriyi node nin özelliklerine aktarıyoz, kullanmak istemiyorsanız NULL yazarak boş odlunu bildirin.
  • 67. Bu özelligin çalışması için ya path seçilmeli (path_set) yada path taranarak (path_scan) ilerlenmelidir path tarayarak ilerlemek bazen avantaj sağlar. --------------------------------------------------------------------------- path_getedge path_getedge(ENTITY*,var node,var edge,var* skills) ise dügüm ile edge arası uzaklık, agırlık ve sikll degerini veriyor. Bu özelligin çalışması için ya path seçilmeli (path_set) yada path taranarak (path_scan) ilerlenmelidir path tarayarak ilerlemek bazen avantaj sağlar. Parameters: ENTITY* Varlığımızın özelliklerinin saklı tutulduğu ram adresi. node – dügümün numarası edge – dügümün dallandıgı yüzeyin numarası (daha ayrıntılı bilgi için path_nextnode bakın) skills – dügüm ile yüzeyin uzaklık mesafesinin agırlıgının ve skill degerinin aktarılması için 3 boyutlu dizi degişken. skills[0] – yüzey uzaklıgı skills[1] –yüzey agırlıgı skills[2] – yüzeyin skill degeri path_setedge(my,3,1,deneme); path_getedge(my,3,1,deneme2);
  • 68. --------------------------------------------------------------------------- path_setedge path_setedge(ENTITY*,var node,var edge,var* skills) numarasını verdigimiz edgenin yüzeyinin özellikler parametresindeki yer alan bezier , weight , skill degerlerini degiştiriyor. Node numarasını vererek dallandıgı yüzeye söleyerek erişiyoz edgeye. (daha ayrıntılı bilgi için path_nextnode bakın) ☺ Bu özelligin çalışması için ya path seçilmeli (path_set) yada path taranarak (path_scan) ilerlenmelidir path tarayarak ilerlemek bazen avantaj sağlar. Parameters: ENTITY* Varlığımızın özelliklerinin saklı tutulduğu ram adresi. node – dügümün numarası edge – dügümün yüzeyin numarası skills – bezier , weight , skill degerinin varlıktaki degerleri degiştirmek için 3 boyutlu dizi degişken. skills[0] – yüzey bezier skills[1] –yüzey weight skills[2] – yüzeyin skill degeri path_setedge(my,3,1,deneme); path_getedge(my,3,1,deneme2); path_length path_length(ENTITY*)
  • 69. Pathin bütün yüzey kısımlarının toplamlarını geri döndürür. Bu özelligin çalışması için ya path seçilmeli (path_set) yada path taranarak (path_scan) ilerlenmelidir path tarayarak ilerlemek bazen avantaj sağlar. ☺ path_next path_next(ENTITY*); Çalışması için path_scan a ihtiyaç duyar. Seçili path in bir sonraki oluşturulmuş pathhin dügüm taranan sayıyı geri döndürür. Dönen degere 0 ise path yoktur. Bir sonraki path seçer. path_nextnode path_nextnode(ENTITY*,var node,var edge) path seçtikten sonra işe yarar. Bakınız path_set fonksiyonuna. Path_nextnode biraz karışık bir fonksiyondur buradaki amaç verdigimiz node numarasından sonraki gelen ama dikkat edin sıra numarası degil numarası verdigimiz dügümden sonraki hangi dügüm geliyorsa onu verir. Ama işte sorunda burada başlıyor eger dügüm 2 , 3 hatta 4 yol gibi ayrılıyorsa hangi yol daki dügümün numarasını verecek ve o yola gitmeye yöne izni varmı işte bu sorunun cevabı path_nextnode fonksiyonun son olarak aldıgı parametre olan edge . edgeye verdigimiz degere göre bir sonraki node dügümün (o yola gitmeye iznimiz varsa tabi) numarasını verecektir. Parameters: ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram adresi. node – bir sonraki düügümün ögrenmek istedigimz dügüm numarası önceki dügüm numarası.
  • 70. edge - işte olayın püf noktası burada hangi yola gidecez bunu burada belirliyoz .( saat yönünden başlayarak gider.) Resimde dikkat ederseniz bi adamımız var şimdi ben node2 den sonraki yollara dallanacagımızı düşünelim. numara=path_nextnode(my, 2,1); diyerek node 2 den sonraki 1 ci edge yolundaki dügüm numarasını ver dedik. bize path_nexnode 3 degerini geri döndürecektrir. numara=path_nextnode(my, 2,2); deseydik path_nexnode 6 degerini geri döndürecek. numara=path_nextnode(my, 2,3); deseydik path_nexnode 9 degerini geri döndürecek.
  • 71. numara=path_nextnode(my, 2,0); deseydik path_nexnode 1 degerini geri döndürecektir. Bu bize ileride path_getnode fonksiyonu ile birçok iş yaptıracaktır. --------------------------------------------------------------------------- path_set path_set(my, "path_011"); Varlıklarımızın ekler diye bir bölümü vardir resimdende görebileciginiz gibi yolumuzu varlıgımıza baglamak için 3 yolumuz var birincisi resimdede gözüktügü gibi path (yol) dügmesiyle varlıgımıza yolun özelliklerini direk erişim hakkı verebiliriz yada kod esnasında path_set(my, "path_001"); diyerek el ile varlıgımıza path ekleriz. Yada digerlerini göre daha avantajlı olan3 yol ise path a baglanmaksızın gördügünü kendisini ekleyen path_scan ile
  • 72. yaparız. (ayrıntılı bilgi için path_scan yada path_set a bakınız) path_spline path_spline(ENTITY*,VECTOR* pos,var dist) Evet artık path fonksiyonunu bitirmek üzereyiz daha önceki örnek anlatımlarımla bir varlıga baglayarak el ile çok güzel yapay zekalar çıkarabiliriz ama 3dgs studionun sundugu bir kolaylıkta bu path bir adam baglayarak sadece bir satır kodlada yürütebiliriz. Path_spline path bagladıgımız insanı prüssüz titretmeden yürütmeye yarıyor aldıgı parametreler kısıtlı oldu için sadece o yolu sürekli doalşıyor. Nodeleri sırasıyla takip ediyor. Geri döndürdügü degerde ulaştıgı node oluyor şimdi aldıgı parametrelere bakalım. Parameters: ENTITY* - Varlığımızın özelliklerinin saklı tutulduğu ram adresi. pos - Hesapladığı posizyon. dist - Posizyonun hızını degiştirdigimiz bir sürekli artan bir degişken degişken çok hızlı artarsa varlıgımız o kadar hızlı olur. Tabiî ki bu fonksiyonun çalışması için adamaıza path eklenmeli.yarıntılı bilgi için path_set bakınız. Ör: action aktor { var yurume; while(1) {
  • 74. VEKTORLER Vektor denince aklımaza gelen ilk şey uzayda yönü ve kuvveti olan bir büyüklük aklımıza gelmeli. Vektorun kuvet demekle istedigim uzantının büyüklügü iken yön is dünya kordinat sistemde ki açısıdır. Vektörlerde genellikle 3 degerden oluşmaktadır bunlar kullanıldıgı yere göre isim alır eger kordinat sistemde kullanıyorsak x,y,z ile isimlendirilirken eger açıda kullanıyorsak pan,tilt,roll olarak isimlendirilecektir renkte kullanırsak mavi,yeşik,kırmızı olarak isimlendirilmektedir. VECTOR, ANGLE, yada COLOR yapıları 3 boyutlu dizilerdir. Bu yapılar birbirlerinden farkı yoktur denebilir sadece farkları bu 3 boyutlu dizilerin tanımlanan degişken boyutları farklıdır mesala COLOR dizisi yada vektörü byte ile tanımlanımı hafızada 3 byte yer kaplarken 0-255 arası deger almaktadır. Sizin dikkat etmeniz gereken bir nokta büyük boyutlu bir diziye küçük bişey aktarırsak veri de kaybolma olmayacaktır ama sadece hafızada fazladan yer ayırmış oluruz ama küçük bir yere alamaycagından büyük bir deger atarsak deger kırpılır(yada hata verecektir). Mesala COLOR vektörüne ben 300 degerinin atarsam kırpacak ve 45 sayısını alacaktır vede veri kaybına neden olacaktır. Accelerate Hızlandırma yada ivmelendirmede kullanılmaktadır. Artırma yada düşüş saglanabilir. Bunu çalışması dönen sandalyelere benzemektedir. Tanımlanmasına bakarsak : accelerate(var speed,var accel,var friction); speed: Akışın hızını gösterir. Friction sıfır olursa yani sürtüşme olmazsa haliyle speed aynı degerde kalcak sıfıra çekmeyecek. Accel: Aldıgı deger pozitif ise speed teki degişkeni arttırmakta, accel negatifse speedi azalttırmakta. Eger accel sıfır ise sürtüşmede varsa sürtüşme oranında speedi sıfıra çekmektedir. Friction: sürtüşme büyüklügü. Return: Dönen deger speed degerine baglı olrak belli bi oranda küçügüdür.(yaklaşık olararak %15 i dönen degeri yada 7de 1i) Ör: var aspeed; //Akışın hızı; vec_add(camera.pan,accelerate(aspeed,5*key_force.x,0.7)) // sag sol klavye tuşları ile kameranın yavaş ivmelenerek hızlanması klavyeden eli çekinceisede yavaşlayarak sıfıra çekilmesi.
  • 75. Dikkat ederseniz key_force.x diyerek, klavye sag sol tuşlardan elin çekilmesiyle sıfır olacagından speed degişkenide sıfıra çekilecek( friction verilmişse ) eger key_force.x 1 olsaydı speed artırmakta yada tersi durumda -1 olsaydı speed azaltılacak. Burada anahtar konturol kısmımız accel olmalı. vec_accelerate Accelerate gibi dir tek farkı bunun degerleri vectorel (3lü x,y,z) degerler almasıdır. Tanımı: vec_accelerate(vector distance,vector speed,vector accel,var friction); Ör: vec_accelerate(dist,speed,force,0.5); c_move(me,dist,nullvector,IGNORE_YOU|IGNORE_PASSABLE|USE_AABB ); vec_add Vektörel toplamalarda kullanıyoz. Tanımı : vec_add ( VECTOR* vector1, VECTOR* vector2) Aldıgı parametreler bir nevi düz toplama gibi: vector1 = vector1 + vector2 Birinci ile ikinci toplanır sonuç birinciye aktarılır. vec_diff vec_diff ( VECTOR* vector, VECTOR* vector1, VECTOR* vector2) vec_diff iki vektörü birbirinden çıkarıp vektöre atamaya yarıyor. Başka kullanım tipide :
  • 76. vector = vector1 - vector2; Parameters: vector - Sonucun yazılacağı vektor. vector1 Đlk vektör. vector2 - Đkinci vektör. Ör: var vec0[3]; var vec1[3] = { 10, 20, 30 }; var vec2[3] = { 1, 2, 3 }; vec_diff(vec0, vec1, vec2); // vec0 alacagı deger == 9, 18, 27 dikkat edilirse vec1 den vec2 çıkarılıp vect0 atanıyor. vec_dist Đki vector arasındaki uzaklıgı bulup geri döndürmekte. Hipotenus teoremi ile bulmakta. Tanımı: vec_dist (vector1, vector2); Ör: distance = vec_dist(my.x,your.x);//benim posizyonum ile karşı tarafın arasındaki en yakın uzakligi vermekte. vec_dot Đki vector arasındaki açıyı hesaplamakta. Buldugu açıyı geri döndürerek bildirmekte. Tanımı: vec_dot (VECTOR* vector1, VECTOR* vector2);
  • 77. vec_for_angle Verilen açının dünyadaki kordinatta hangi eksene geldigi bildirmekte. Hangi eksende ise o ekseni pozitifindeyse o ekseni 1 yapken negatifinde ise o ekseni -1 yapmakta. Tanımı: vec_for_angle(VECTOR* vec,ANGLE* ang) ör: var temp[3]; vec_for_angle(temp,vector(90,0,0));//temp artık 0,1,0 vec_for_min vec_for_min B_Box (bounding box) yani varlıgı çevreleyen telkafesin ayarlanmasında kullanılmakta min ile max arasında tel kafes giydirilir varlıga bu giydirilen tel kafesin baz noktası modelin med deki orjinidir. Tanımı: vec_for_min (VECTOR*, ENTITY*); vec_for_max(VECTOR*, ENTITY*);
  • 78. vec_for_mesh vec_to_mesh Vec_for_mesh numarası verilen meshin kendi model içindeki yani meddeki orjinine göre olan en yakın noktasını pozisyonun local kordinatını vermekte. Tanımı: vec_for_mesh (VECTOR*, ENTITY*, var number); vector: ile mesh numarası verilen meshin kordinatını aktarılacak vektör. Entity: mesh ögrenilecek olan varlıgın hafızadaki adresi. Number: mesh numarası
  • 79. Vec_to_mesh ise mesh real time defarmasyonunu saglamaktadır. Numarasını verdigimiz meshin vektörününü vererek istenilen kordinata taşınmaktadır. Tanımı: vec_to_mesh (VECTOR*, ENTITY*, var number); vector: taşınacak olan yerin kordinatı yine kendi local kordinatı. Entity: mesh taşınılcak olan varlıgın hafızadaki adresi. Number:taşınılacak olan mesh numarası. vec_for_normal Numarası verilen meshin dünyadaki x,y,z deki yüzey konumlarını vermekte. Evet biraz anlaması zor ama daha iyi anlamak için c_trace c_move den normal bakınız daha iyi anlayacaksınız. Tanımı: vec_for_normal (VECTOR* vector, ENTITY* entity, var number);
  • 80. vec_for_screen Ekranda kordinatı verilen noktanın dünyadaki kordinatını verir. Tanımı: vec_for_screen ( VECTOR*, VIEW*); vector: Aldığı ilk parametre ekranın üzerindeki belli bir noktanın local kordinatı sonra bulunan sonuç tekrar buna yazılmakta. View: hangi varlıkta bakılacaksa o varlık. Ör: temp.x = mouse_pos.x; temp.y = mouse_pos.y; temp.z = 200; //ekrandaki mousun x,y kordinatı ile 200 derinlikteki bir noktanın cameradanki dünya kordinatını vermekte vec_for_screen(temp,camera);
  • 81. Vec_for_screen vec_for_screen ( VECTOR*, VIEW*); Bu fonksiyon 1 parametresi ile ekranımızdan belli bir konumundan vede belli bir uzaklıktaki vectorun konumunu vermekte 2 aldıgı aparametre ise bakış açımıza bakarak o yönde oluşturmakta. Ör: function silah_mermi_defarmasyonu() { temp.x=screen_size.x /2; temp.y=screen_size.y /2; temp.z=800; vec_for_screen(temp,camera) ;
  • 82. ent_create("silah_kursor.bmp",temp,null); } vec_for_uv vec_to_uv Vec_for_uv skin editordeki uv map daki vertex numarası verilen vertexin skin texture üzerindeki konumunu verir . z ekseni haliyele yoktur zira texture 2d oldu için. Tanımı: vec_for_uv (VECTOR*, ENTITY*, var number); vector: vertex numarası verilen yerin texturedeki x,y konumu. Entity: varlık ram adresi. Number: uv map daki vertex numarası. Vec_to_uv ise uv mapdaki vertex numarası verilen vertexin konumunu degiştirmeye yaramaktadır. Tanımı: vec_to_uv (VECTOR*, ENTITY*, var number); vector:numarası verilen vertexin yeni konumu.
  • 83. Entity: varlık ram adresi. Number: uv mapdaki vertex numarası Ör: vec_for_uv(temp2,silah_el,340);//340 numaralı vertexin uv mapdaki konumu ögrenmek için temp2[0] += 0.1; // 340 numaralı uv map vertexin 1 piksel yana kaydırarak modelin texturesinin degiştirilmesi vec_to_uv(temp2,silah_el,340);//340 numaralı uv map vertexin yeni konumunu ayarlıyoruz. vec_for_vertex Bu fonksiyonumuz bir modeldeki belli bir vertex numarasının dünya kordinat sistemindeki posizyonunu vermektedir. Vertex kısaca poligonların dügüm noktaları desek yanlış olmayacaktır. Tanımı:
  • 84. vec_for_vertex (VECTOR* vector, ENTITY* entity, var number); vector: numarası verilen vertexin konumunu atayacagı degişken. Entity: varlık ram adresi. Number: posizyonunu ögrenmek istedigimiz vertexin numarası. vec_inverse Vektörü negatiflemeye yarmaktadır. Tanımı: vec_inverse ( VECTOR* vector); ör: var i[3]={10,20,30}; vec_inverse(i);//artıki içindeki degerler -10,-20,-30 vec_length Verilen vektörün dünya kordinat sistemindeki orjine olan uzaklıgını geri döndürerek verir. Tanımı: vec_length (vector);
  • 85. ör: uzaklik = vec_length(my.x); vec_lerp interpalosyon ne ? acaba tanımı: vec_lerp( VECTOR* v,VECTOR* v1,VECTOR* v2,var f); v = (1-f)*v1 + f*v2 vec_normalize Verilen bir büyüklük ile vektörel uzunlugu orantılıyarak scalalıyor. Ama tam olarak ne işe yaradıgını bilmiyommm ?. Tanımı: vec_normalize (VECTOR* vector, var length); vector[0] *= length / vec_length(vector); vector[1] *= length / vec_length(vector); vector[2] *= length / vec_length(vector); vec_rotate vec_rotate (VECTOR* Dir, VECTOR* Angle); Vektörümüzü kordinatını orjinden başladığını kabul ederek döndürmeye ve yeni kordinatını aktarmaya yaramaktadır. Aldigi ilk paramtere vectorün büyüklüğü yani kordinattaki yeri başlangiç yeri olrak orjin kabul edilmekte, 2 parametre ise angle döndürülecek yerdir x parametresi pan , y parametresi tilt, z parametresi ise roll anlamına gelmektedir. Vecrotate ile orjini baz alarak döndürerek dünya kordinat sistemine göre yeni konumunu vermektedir. Ör:
  • 86. var direction[3] = 7.07, 0, 0;//vektörümüzün büyüklüğü kordinatteki yeri. var angle[3] = 45, 0, 0; //döndürülecek açı ve yönü vec_rotate(direction,angle); Sonucu tekrar direction içine yazmaktadır. Yeni konumu olmaktadır döndürme işleminin sonunda.
  • 87. vec_scale Vectorü scale ediyoz yan belli bi oranda küçültüp yada büyütüyoruz. Tanımı: vec_scale ( VECTOR* vector, var factor); vector:işleme tabi tutulacak vector. Factor: 1 orjinal büyüklügüdür 1 den büyük verirsek büyütürkenken 1 den küçük bi rakam verirsek küçültürürüz. Ör: var v[3] = { 10, 20, 30 }; vec_scale(v,5);//v nin degeri artık 50,100,150 oldu
  • 88. vec_set vec_set ( VECTOR* vector1, VECTOR* vector2) Bu fonksiyonumuz birden fazla boyutlu degişkenleri birbirine kopylamaktır. Parameters: vector1 Hedef vector. vector2 Kaynak vector. Kısaca bu işe yarıyor. vector1[0] = vector2[0]; vector1[1] = vector2[1]; vector1[2] = vector2[2]; boşluk tuşundan elini çekince çalışması while (key_space == off) {wait (1);} while (key_space == on) {wait (1);} my.shadow = on;//normal gölge ekler render_shadows(); //yumuşak gölge ekler. vec_sub vec_sub ( VECTOR* vector1, VECTOR* vector2); Buda vec_diff gibi vektorler arası çıkarım işine yarıyor sadece farkı çıkarttığı vektorü sonucu onun
  • 89. içineyazar.vector1 i vector 2 den çıkardıktan sonra sonucu tekrar vector1 yazması. Kısaca şu işi yapıyor: vector1 = vector1 - vector2; vec_to_angle vec_to_angle (ANGLE* ang, VECTOR* dir); Bu fonksiyonumuz verdigimiz vektörü açıya çeviriyor. Döndürdüğü değer bir üçgen gibi düşünürsek hipotenusun uzunlugu ilk aldıgı parametre ise buldugu açıyı aktaracağı degişken. Bu fonksiyonu genellikle varlığımız ilerlerken yönünü o yöne dönmesi için kullanıyoz. Ör: adam2=vec_to_angle(adam,vector(10,10,0));//adam=45 bulunur adam2 ise 14.14 (10 kök2)döndürür değer olarak. vector(10,10,0) diyerek x 10 , y 10 bir ikiz kenar dik üçgenin yaptığı açı ve hipotenus degerini buldurmak yaptıgımız iş. vec_to_screen Cameranın görüş alanına giren bir kordinatta yada vectorde, monitörün hangi x,y çözünürlük yerine geldigini verir. Dikkat ederseniz mutlaka cameranın görüş alanına girmesi gerekli pozisyonun bölelikle giren o pozisyonun monitörün hangi yerine geldigini verebilir. Tanımı: vec_to_screen ( VECTOR*, VIEW*);
  • 90. vector: bu vector input ve output olarak çalışmakta birincisi dünyakordinat sistemini verilen posizyonu vermek için ikincisi ise verilen kordinatta monitöre dek gelen pikselin konumunu almak için kullanılır. View: bakış açısına giren yeri belli etmek için cameranın ram adresi. Return: geri dönen deger eger view bakış açısında ise sonuç vektörü geri döndürürken bakış açısından dışında ise NULL geri döndürür. Ör: PANEL* panel_pan = { bmap = "fd.tga"; }//bir panel oluşturalım ve daha sonra diger bi fonksiyon içinden çagıralım vec_set(temp,my.x); if (NULL != vec_to_screen(temp,camera)) //ekran bakış açısın içindemi posizyon eger içindeyse göster degilse gösterme { panel_pan.pos_x = temp.x; panel_pan.pos_y = temp.y; panel_pan.VISIBLE = ON;//c-script set(panel_pan,VISIBLE);//lite c } else { panel_pan.VISIBLE = OFF;//c-script reset(panel_pan,VISIBLE);//lite c }
  • 91. ANG() Ang() ı açı eklme çıkarmada kullancaz. Genellikle açı farklarını veya eklemelerin bularak en yakın yerden döndürülmesinde kullanılır. x = ang(0); // x degeri 0 x = ang(-350); // x degeri 10 x =ang (185); // x degeri -175 Uygulama:
  • 92. Yukarıdaki resimdeki posizyonda haritamızda oldugunu varsayarsak askeri player yönünde döndürmek istiyoz. Vec_to_angle(dunya_kordinat_acisi,player.x); Asker.pan=dunya_kordinat_acisi.pan; Diyerek döndürebiliriz ama bu bi anda gerçekleşecegi için estetik gözükmeyecektir. Bu yüzden askerinaçısını(askerin konumu önemli degil) , playeri açısına yavaş yavaş dönmeli vede bunu yaparkende en yakın yerden dönerek yaptırmalıyız. Bunun için izleyecegimiz yol. Vec_to_angle(dunya_kordinat_acisi,player.x); Asker.pan=ang( dunya_kordinat_acisi.pan - asker.pan) * time_step /5; Buradaki ang alma işlemini matematiksel ifade edersek. -150 - 120 = -270 derece eder ang ilede bu açının pozitif yöndemi yoksa negatifmi dönecegini hesaplatacaz -270 90 derece ederki 90 derece askerin açısını artıracaz.
  • 93. PROC_KĐLL Proc_kill fonksiyonu bize bazen ölümcül faydası olmaktadır. Bildiginiz gibi Windows her işi aynı anda yapamaz bu yüzden bi sıraya sokar. Đşte proc_kill fonksiyonuda burada devreye giriyor aşağıda detaya inecegim ama size biraz fikir olması için bir örnek anlatacağım. Mesala c_scan ile tarama yapacaz ve taramada aynı anda 2 şeyi tetiklamak istemiyoz mesala kapı açacaz ama tarama alanınada 2 kapı girmekte ama biz sadece birini açtırmak istiyoz işte burada proc_kill devreye gierrek aynı fonksiyonu Windows işleme kuyruguna soktugu an diger fonksiyonu yokkediyoz iptal ediyoz. Veya bi kapı açtıracaz oyuncu açma tuşuna 1 den fazla bastı ne olacak kapı açılacak ama kaç defa bastıysa onun kadar aynı anda çalıştıracagı için kapı çok hızlı açılacak işte sadece bir varlıkta bir fonksiyonun çalışmasını istedigimizde diger kopya fonksiyonların iptal olmasını istiyorsak proc_kill den faydalanacaz. Sonsuz döngülerde falan çok ölümcül kurtarıcımız olacak. proc_kill (var mode); mode Aldığı parametreler: Mode 1 Benim tarafından çagrılan bütün fonksiyonları sona erdir anlamındadır. 1 ve 2 bir fonksiyonla başka fonksiyonların çagırılmasıyla ilgiliyken 4 5 6 ise bir fonksiyonun hafızadaki birden fazla örnrkleme çagırmasıyla ilgilidir. 2 Karşı tarafın geçerli fonksiyonlarını iptal et demekti . Benim tarafımdan karşı tarafı tetikleyerek. Birazadaha açmak gerekirse mesala bir tarama yaparken you degişkeniyle dönen kişinin bütün fonksiyonlarını durdur demektir. Dikkat edilecek hususlardan bir tanesi proc_kill yeri çok önemlidir. Not: Bu olaylara dikkat edilmeli zira taramada 1 den fazla kişi oldugu zaman bize en yakın kişin you degişkeniyle ram adresi dönerken 2 ci şahsın ram adresini ögrenemedigimizden ilk adamımızda işe yararken 2 ci adamamızda işe yaramamaktadır. 4 4 numaralı seçenek bir fonksiyonu birden fazla varlık kullanıyorsa bile tüm fonksiyonlar diger varlıkların kullandığı fonkisuonlarını içere alarak sadece bir tanesi çalışır. Diger varlıklar daki fonksiyonlar tamamen duruken sadece herhangi bir varlıkta sadece çalışır 1 tane fonksiyon. Diger varlıklardaki fonksiyonların hepsi iptal edilmiştir. 5 Aynı çagırımda örneklemeden birden fazla çagırım varsa güncül durumda geçerli durumda olanların benim tarafımdan yapılan örneklemeleri iptal etmekte. 4 numaradan farkı vir fonksiyonu birden fazla varlık kullansa bile varlıklarda birertane fonksiyon çalışır . 4 numaradaki gibi diger varlıkların fonksiyonları hepsi öldürülmez diger varlıkların örneklemerinide 1 düşürülür. 6 Aynı çagırımda örneklemeden birden fazla çagırım varsa güncül durumda geçerli durumda olanların karşıtaraftan yapılan diger örneklemeleri sona erdirmekte.
  • 94. 16 Leveldeki bütün fonksiyonları durdur. Proc_kill bir nevi olay katarlarında kendisinden önce gelen olayları iptal etmekte durdurmaktadır. Aşşagıdaki resimde ifade etmeye çalıştım. Đnkey inkey (pass_str); // type the password if(result == 13) // if we press Enter { pass_txt.visible = off; // hide the text } eror timer Time since the last timer() call in microseconds (1/1000000 sec). file_var_read randomize(); // starts a initial value x=random(100); // x becomes number between 0 and 99 time_factor
  • 95. d3d_lightres = 1; // improved dynamic lights high kalite total_ticks The time passed since start of the game, in ticks. Oyunun başlangıcından beri geçen süre. New debug code Let's take a look at the interesting values offered by the engine: - num_actions, number of currently running actions; - num_visents, number of visible entities; - num_visentpolys, visible model and sprite polys; - num_vismappolys, visible map and wmb polys; - d3d_texskins, memory used by models and sprites; - d3d_texbmaps, memory used by panels and "entity" definitions; - d3d_texsurfs, memory used by wmb entities; - d3d_texsmaps, memory used by the shadow maps; - d3d_texfree, available video memory. -d3d_lightres haraketli işiklarda yüksek kalite. action flickering_light { d3d_lightres = on; while (1) { my.lightrange = 70 + random(30); my.lightred = 150 + random(100); my.lightgreen = 150; my.lightblue = 50; waitt (2); } } Aum 16 Bunlar sistem hakkında bilgi veriyor mesala o anda çalışan fonksiyon sayısı gibi ekran kartının aloabilecegi mb falan vb. Breakable windows Read this article and you will find out how to create a window that breaks when you shoot it or when the player passes through it. The player should loose a part of its health if it does that, right? action breakable_glass { my.transparent = on; my.enable_impact = on; my.enable_entity = on; my.enable_shoot = on; my.event = glass_pieces; } The action above will be attached to your window entity and it will make it transparent and sensitive to impact, shoot or other entities. When one of these events is detected, function glass_pieces will run: function glass_pieces() {
  • 96. if (you == player) {player._health -= 20;} // decrease player's health if it breaks the window by passing through it my.passable = on; snd_play (breakglass_snd, 50, 0); my.skill10 = 0; my.invisible = on; while (my.skill10 < 15) { create (gibglass_mdl, my.pos, gib_glass); //kırık parça mdl dosyası animate var aum21 bak 2ci bi yöntemdaha var. my.skill10 += 1; wait (1); } ent_remove (me); } snd_tune (engine_handle, 25, 100, 0); // original frequency (100%) aum21 tank var onda yumuşak düşüş mermi rocket ve yumaşak dönme var. asker.pan+= ang(temp.pan-asker.pan)* time_step *0.2; BONE Bone Türkçede kemik anlamına gelmektedir. Yarattıgımız modelleri gerçek bir insan gibi kullanmak için bir çok yöntem vardır bunlardanda biri de modele kemik eklemektir. Kemigin birçok avantajı vardır bunlara deginirsek oyun zamanında kemiklere hitap ederek yönlendirme şansımızdır. Zira daha önceki örneklerimize bakarsanız hep modellerde hazır animasyonları kullanmıştık artık oyun zamanında real time modele hükmederek modelin istedigimiz bir uznunu kullanabilecegiz. Kemik oyun zamanında gözükmezler vede model tasarlarken sanki o kemigin etki edecegi yerleri ve şiddeti ayarlayarak model derisini gayet güzel şekilde hareket ettirtmekteyiz. ent_bonemove
  • 97. Ent_bonemove c_move gibi verdigimiz yöne boneyi hareket ettirmekte kullnıyoruz. Bone hareket ettirdigimizde ismini verdigimiz bone hareket ederken digerleri hareket etmemekte ve bu yüzden hareket edenle hareket etmeyen arasındaki deri sünmekte. ent_bonemove(ENTITY*, STRING* name, VECTOR* offset) ent_bonename Sıra numarası verdigimiz bonenin bize gerçek ismini vermekte. ent_bonename(ENTITY*,STRING*,var num) Ör: STRING* den; ent_bonename(my,den,0); error(den); ent_bonereset ent_bonereset(ENTITY*,STRING* name) Đsmi verilen bonenin orijinal haline dönmesinde kullanılır. ent_bonereset_branch(ENTITY*,STRING* name) Branch ise çocuk alt dallarının da resetlenmesinde kullanılır. ent_bonereset_all(ENTITY*) Varlığa ait tüm boneleri resetler. ent_bonerotate Boneleri döndürmekte kullanıyoz. Verdigimiz bone isminden sonrakileride döndürür ve döndürmeye bonenin dügüm noktasını baz alarak onun etrafında döndürür. ent_bonerotate(entity,string name,vector angle)
  • 98. ent_bonerotate_parent ent_bonerotate den farkı ent_bonerotate_parent boneyui döndürüken dügüm noktasından degilde bonenin gövdesini alarak döndürür bu yuzden kendi etrafında degilde yarı çapı bonenin gövde uzunluğu olan daire gibi döndürür. ent_bonerotate_parent(entity,string name,vector angle) ent_bones Varlıktaki bone dügüm sayısını geri döndürmekte. ent_bones (entity); ent_bonescale Bonenin büyüklügünü degiştirmekte kullanıyoruz bonenin büyüklügünü degiştirdigimizde haliyle dışındaki deride ona baglı olarak büyükmektedir.
  • 99. ent_bonescale(entity,string name,vector scale) Vector scale sırasıyla x,y,z nin büyüklüklerine hitap etmektedir. ang_for_bone Đsmini verdigimiz bonenin açısal degerlerini pan tilt ve roll degerlerini sırasıyla ögrenmemizi saglamaktadır. ang_for_bone(ANGLE*,ENTITY*,STRING*) ANGLE degeri sırasıyla pan tilt ve roll degerlerini geri döndürmekte. vec_for_bone Bonenin dünya daki kordinatlarını ögrenmemize saglamaktadır. vec_for_bone(VECTOR*,ENTITY*,STRING*) Vector ismini verdigimiz bonenin dünya kordinatlarını geri döndürmekte.
  • 100. PARTĐCLE BAŞLAGIÇ Particel diyince aklımıza ne gelmeli? Particel diyince aklıma gelmesi gereken ilk şey uçan küçük zerrecikler olmalı. Particel genellikle bu zerreciklerin birleşmesiyle meydana gelmektedir. Şöle nerelerde kullanabiliriz diye düşünürsek yagmur yapımında duman, ateş, füzenin kuyrugu, patlamalarda oluşan küçük zerrecilker vb. yerlerde 3d olarak kullanabiliriz. Şimdi bi particel oluşturmak için elimizde bu particeldan üretecemiz bir resim olması gerekli oluşturmak için mecbur tutulmamışsada güzel görünmesi için bu gerekli. effect (function, var number, VECTOR* pos, VECTOR* vel); function: Her framede (FPS) çagrılan fonksiyon. Number: üretilecek partical sayısı. Pos: üretilecek olan zerreciklerin posizyonları. Vel: vectorel ilk hızları yada beam uzunlugu. (MOVE aktifse hızı beam aktifse boyu olmaktadır) Şimdide bu fonksiyonun aldıgı parametrelere bakalım. Lifespan : particelin yaşam süresi karesi belirler. Zerre girilen sayı kadar fps yaşayacak. Dikkat: çagrılan fonksiyon sürekli çagrıldıgı için azalttıkça yeniden atayacak lifespani
  • 101. buyüzden yaşam süresinin o fonksiyondan çıkılmalı bunun içinde çocuk fonksiyon çagırarak diyer function ile zerre yaşadıkça her fps tekrarlayacagından tekrar lifespan deger almayacak bu yöntem ile ilk çagrılan fonksiyon birden fazla çalışacak(1-10) ama diger fonksiyona geçince çalışmayı bırakcak ve bölelikle sürekli boşuna tekrarlanmaycak hız kanacaz. vel_x: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE aktifse hızı beam aktifse boyu olmaktadır) vel_y: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE aktifse hızı beam aktifse boyu olmaktadır) vel_z: zerrenin hızı çabuklugu yada beam aktifse beam uzunlugu. (MOVE aktifse hızı beam aktifse boyu olmaktadır)
  • 102. Gravity: particelin yer çekimini aktif etmek için kullanılır default olarak 0 dır hızını ayarlamaya yarar. vel_z degiştirerek ilerlemekte .Hareket etmesi için particelin Move aktifleyin. Size: piksel yada siprite particelları boyutunu ayarlamak için kullanılır. Note: sonradan boyutlandırılan particiler çok yavaşlatmakta. Default olarak 4 tür. Bmap: particelin resmini atamakta kullanılır. Move: eger bu bayrak seçilmişse velocity(vel_x, vel_y, vel_z) vektör yönünde hareket yada gravity ile yarçekimi aktif olur böylelikle harekete geçer. Function(c-script) event(lite-c): bu işlev particelin davranışlarını yani özelliklerini ayarlamakta kullanılır. Beam: zerrelerin bir laser şeklinde velocity vektör yönünde oluşturulur bir düzene sokar Streak: Beam benzemektedir beamdan hızlıdır ama bakış birazdaha farklıdır sanki hareket bulanıklıgı vermektedir vede başka kullanım yeride benzer patlamalarda vermelerde kullanılır. Skills: 7 tane sikil vardır. Red: particalda kırmızı rengin kuvveti. Blue: particalda mavi rengin kuvveti.
  • 103. Gren: particalda yeşil rengin kuvveti. Bu renkler genellikle ortama gökyüzüne uygun hale getirmek için kullanılır. Alpha: alpha transparancy miktarı. Transparent, TRANSLUCENT: bu bayrak Transparent aktif pasifligini ayarlar. Overlay: Bu bayrak açık ise bir resimdeki alpha kanalındaki rgb (0 0 0) olan renkleri yok etmekte ve siyahın tonajına göre denk gelen yerleri şefaflaştırmakta. Overlayı kullanabikmek için resim dosyanında bir alpha kanalı olmasi gerekmektedir. Flare: Eger bir zerrenin perinin yada modelin TITREK-ĐŞĐK bayrağı, da koyulunur , varlık alfa saydamlığını varsayacak. Daha karanlık bölümler, daha parlak bölümlerden daha saydamdır. Bu yol patlamaları ışık etkileri yada kamera titrek ışıkları, üretilebilir. Eğer SAYDAM da ayarlanırsa aynı zamana , saydamlık tersine çevirilir i.e., daha parlak bölümler siyah duman için benzer, daha karanlık bölümlerden daha saydamdır. 16-dizgin yada 32-bit modlarında, ve sadece peri varlıkları için sadece valid. TITREK-ĐŞĐK bayrağı, varlığın ilk olarak eyleminin başlamasında açılmalı. Bütün varlıklar paylaşır aynı dosyasa sahip olmalı aynı alfasa saydamlığı. Eğer varlık dokusu bir alfa kanalını içerse , titrek ışık bayrağı varsayılan değer olarak bahse girilir.NOT:Flare c-script da vardir lite-c de yok. BRIGHT: Arka palanle kendisini harmanlar vede işik kaynagı varsa ona duyarlı şekilde davranır alpha kanalıda varsa onuda şefaflaştırır siyahın tonuna görevede resimde de olan siyah yerleri şefaflaştırır. Her ikiyi karıştırmanın yerine arka plan üzerinde varlık yada zerre harmanlar, alfa kanal dokular yada saydamlığı ile birleşimde. Renkler ilave etmesi bu yol ve varlık, benzer yangın yada kıvılcımlar, aydınlatılan sanar. Varlık KARANLĐK ile birleşimde, düzeyde normal güneş ışığı ile diği gibi bir ortalama ortam ışığını alır. Bright kullanabikmek için resim dosyanında bir alpha kanalı olmasi gerekmektedir. Bright en büyük özelligi arka plana göre kendisini adepte etmesi sanki arkaplanla bütünleşiyor. Fikret DURU fikretduru@gmail.com xdsoft_programing@hotmail.com www.oyunyapali.com www.acknexturk.com