Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

1.397 Aufrufe

Veröffentlicht am

Veröffentlicht in: Unterhaltung & Humor

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

  1. 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. 2. shadow – TTF gölgelendirme yapar. outline- TTF yazıları belirgin hale getirir. Text function unda “string” rakam atayamıyor.
  3. 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. 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; }
  5. 5. ÖRNEKLER: 1-)
  6. 6. 2-)
  7. 7. 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
  8. 8. 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:
  9. 9. 4-) YATAY VE DĐKEY KAYDĐRMA ÇUBUKLARI Kaydırma çubuklarına aldıgı parametrelere batkımızda=
  10. 10. 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:
  11. 11. 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.
  12. 12. 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.
  13. 13. 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.
  14. 14. Resim yada animasyonlu resim ekleyebeliriz. Sprites örnek olması için aşşagıda bir uygulama var.
  15. 15. 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.
  16. 16. 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
  17. 17. 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;
  18. 18. 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.
  19. 19. 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
  20. 20. 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);
  21. 21. 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);
  22. 22. 10-)Camera Camera.aspect //camerayı tersini alma veya sündürme. Yani yatay dikey piksel boyut oranını belirleme.
  23. 23. 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 .
  24. 24. 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:
  25. 25. 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.
  26. 26. 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
  27. 27. { 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.
  28. 28. {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;
  29. 29. 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) {
  30. 30. //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.
  31. 31. Adam kendi yönünde saat yönünde dönmekte pan değeri 0 ile 360 derece arasında bir deger almakta.
  32. 32. 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
  33. 33. 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.
  34. 34. 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.
  35. 35. 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)
  36. 36. 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)
  37. 37. 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ı.
  38. 38. 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 :
  39. 39. 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
  40. 40. ,”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.
  41. 41. 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.
  42. 42. Ş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).
  43. 43. 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.
  44. 44. 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);
  45. 45. 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.
  46. 46. 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.
  47. 47. 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));
  48. 48. } 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.
  49. 49. 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.
  50. 50. • 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
  51. 51. 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()
  52. 52. { 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 .
  53. 53. 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Đ
  54. 54. 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
  55. 55. 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.
  56. 56. 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.
  57. 57. 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. ☺
  58. 58. 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.
  59. 59. 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));
  60. 60. 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.
  61. 61. 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.
  62. 62. 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);
  63. 63. --------------------------------------------------------------------------- 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*)
  64. 64. 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ı.
  65. 65. 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.
  66. 66. 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
  67. 67. 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) {
  68. 68. temp= path_spline(my,my.x,yurume); yurume+=time_step; wait(1); } }
  69. 69. 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.
  70. 70. 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 :
  71. 71. 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);
  72. 72. 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*);
  73. 73. 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ı
  74. 74. 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);
  75. 75. 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);
  76. 76. 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) ;
  77. 77. 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.
  78. 78. 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ı:
  79. 79. 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);
  80. 80. ö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:
  81. 81. 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.
  82. 82. 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
  83. 83. 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
  84. 84. 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*);
  85. 85. 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 }
  86. 86. 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:
  87. 87. 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.
  88. 88. 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.
  89. 89. 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
  90. 90. 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() {
  91. 91. 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
  92. 92. 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)
  93. 93. 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.
  94. 94. 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.
  95. 95. 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
  96. 96. 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)
  97. 97. 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.
  98. 98. 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

×