You are on page 1of 198

Iindekiler

Giris ve Motoru tanimak


Degiskenler
Fonksiyonlar
Bitmaplar Paneller
Digitler ve Window
Butonlar ve Sliders
Dizgiler ve Yazilar
3B koordinatlar
Cisimler, objeler
Davranislar
Isaretiler
II else yapisi
Klavye
Fare
Hata Ayiklama
Ileri dzey hata ayiklama
Nesneleri hareket ettirme
Gamestudio'da Iizik
Sprite kullanimi
Model animasyonu
Bone Animasyonu 1
Bone Animasyonu 2
Degiskenler 2
Multiplayer
ACKNEXTURK
Ons:
Bu eviri normalae kitap a:enine sahip aegilai. Ancak baktim eviriler bir kitap kaaar u:un srm benae
hepsini birletirmeye karar veraim. Herhalae u anaa GameStuaioyu en iyi bilen Trk Quaaraxas
tarafinaan evirilmeye balanan ancak altinci aerste evirilmesi birakilan, orfinali George Pivru tarafinaan
ya:ilmi bu Lite-c aerslerini Trkeye evirme ilemini 8 Kasim 2009 tarihinae tamamlaaim. Su anaa
Gamestuaio programlama aili hakkinaa bulabilecegini: en aetayli Trke kaynak. Benim tavsiyem bu
kaynaga balamaaan nce C ya aa C programlama ailini grenmeni:. Ben C tavsiye eaiyorum nk
C , C ailini ae kapsaaigi iin si:e aaha fayaasi olacaktir. Ayrica bu programlama aillerinaen bir tanesini
grenmeni:, bu kaynagi iki gn ierisinae hi:li bir ekilae grenmeni:i saglayacaktir. Ancak unutmayin bu
kaynak Temel Lite-c programlama bilgisi iermekteair. Daha ayrintili bilgi iin yine George Pirvu
tarafinaan ha:irlanan Acknex User Maga:ine (AUM) ve Gamestuaionun kenai Manualine bakmani:
gerekmekteair. Koalari kopyala yapitir yerine kenaini: ya:arak uygulamani: harcaaigini: vaktin bir ok
aaha verimli gemesini saglayacaktir. Son olarak Quaaraxasa Gamestuaioaaki abalarinaan aolayi
teekkr bor bilirim.
MACHERA
Aiklamalar:
Bu kaynakta Quadraxas'in bazi ek dersleri ile birlikte 24 tane Lite-c(WED ve MED'den de anlatimlar
iermektedir) dersi bulunmaktadir.Joystik dersi gerek duyulmadigi iin evrilmemistir. Dersler orjinali ile
ayni sirada ilerlemektedir. Quadraxas ilk 6 dersi hazirlamistir. Quadraxas'in dersleri iin gerekli dosyalar 'Q-
dosyalar klasrnde bulunmaktadir.Benim hazirladigim dersler iin ise kaynagin orjinalini asagidaki
linkler kismindan indirmeniz gerekmektedir. Orijinal kaynaktaki Workshop 07 klasr ve sonrasindaki
klasrlerde bulunan kod ve kaynaklari benim derslerim iin kullanabilirsiniz. Dersler iin Gamestudio'nun
son srmn indirmeniz bazi kodlama degisiklerinden dogacak sikintilarin nne geecektir. Indirme linki
yine linkler kismindadir.
Linkler:
Machera'nin dersleri iin Orijinal Lite-c Workshops : http://server.conitec.net/down/litec.zip
Gamestudio A7 7.80, 30 gnlk deneme srm: http://server.conitec.net/down/gstudiosetup.exe
Acknexturk anasayIa: http://www.acknexturk.com/
Conitec Gamestudio anasayIa: http://www.3dgamestudio.com/
DIKKAT! Bu kaynak tamamen cretsiz olup dileyen herkes kullanabilir. Kaynagin baska yerlerde
yayinlanmasi ise http://www.acknexturk.com/lite-c-workshop linkine ynlendirmek kaydiyla serbesttir.
Direk yayinlama KESINLIKLE YASAKTIR! Orijinal kaynagin tm haklari George pirvu'ya aittir.
Gamestudio Contiec GmbH Tm haklar sakldr.
Gamestudio Conitec GmbH All Rights Reserved.
ACKNEXTURK
Ders 1: Motoru 1animak
8u yaziyi okuyorsaniz buyuk lhLlmalle LlLe-C free veya A7 surumlerlnden blrlnl kurmu;sunuz
demekLlr. 8a;laLLakl llkglll yerde Manual" ve SLu ScrlpL LdlLor" gruyorsunuz.
Manual : 1um LlLe-C fonkslyonlarini ve aiklamalarini leren dkumanLasyon. lnglllzce olarak
moLorda bulunan Lum fonksylonlarin kullanimini anlaLir. 8u belge 1urke ye Lercume edllecek.
ScrlpL LdlLr lse glrl; yazisinda grulen kodlari yazdigimiz,derledlglmlz haLalarini glderdlglmlz
edlLr.
Modellerlnlzl yapmak lln MLu(Model LdlLor) kullanablllrslnlz. Lger A7 kurduysaniz
beraberlnde gelml; olmali. ucreLslz LlLe-C surumunu kurduysaniz glrl; yazisindakl llnkden MLu l
lndlreblllrslnlz.
LveL, ;lmdl scrlpL edlLru (SLu) ain. llle->Cpen Liklayin ve CameSLudlo veya LlLe-C lree nln
kurulu oldugu klasre gelln. work" lsmlnde blr klasr olmali glrln ve llnden small.c" lslmll dosyayi
ain.
////////////////////////////////////////////////////////////////////////////
// small.c - small llLe-C example
////////////////////////////////////////////////////////////////////////////
vold maln()
[
// Load Lhe level named "small.hmp"
level_load("small.hmp"),
// now creaLe Lhe "earLh.mdl" model aL x = 10, y = 20, z = 30 ln our 3u world
enL_creaLe("earLh.mdl", vecLor(10, 20, 30), nuLL),
// nuLL Lells Lhe englne LhaL Lhe model doesn'L have Lo do anyLhlng
}
?ukaridakllerl gruyor olmalisiniz. 1urke kar;iligi:
////////////////////////////////////////////////////////////////////////////
// small.c - kuuk llLe-C rnegl
////////////////////////////////////////////////////////////////////////////
vold maln()
[
// "small.hmp" lslmll levell yukle
level_load("small.hmp"),
// "earLh.mdl" modellnl 3u dunyanin x = 10, y = 20, z = 30 konumunda olu;Lur.
enL_creaLe("earLh.mdl", vecLor(10, 20, 30), nuLL),
// nuLL moLora modelln hlblr;ey yapmayacagini syluyor
}
8urada ye;ll renkLe yazilan ve 1urke'ye evlrdlglmlz kisimlar yorum(commenL)" dlr.
?orumlar, programcinin yazdigi kodlari aiklamasini, Lakimdakl dlger programcilara noLlar birakmasini,
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
ali;masini lsLemedlgl kodlari devre di;i birakmasini veya unuLmamak lln noL almasini saglar. 8unlar
program derlenlrken es gelllrler. uerleylcl lln hlblr mana lermeze ve yorumun lerlgl derlemeyl ve
programi eLkllemez. ?orumlar ali;Lirilmaz sadece koda bakan lnsanlar lln anlamlidir. uerlenlrken
dlkkaLe alinmaz. 2 ;ekllde yorum yazablllrslnlz.
- 8lrlnclsl ;eklldekl glbl // (lfL /" , shlfL+7) koydukLan sonra. // dan sonra yazacaginiz meLln
yorum oldugunu anlayablleceglnlz ;ekllde edlLr Larafindan renklendlrllecekLlr.
- lklnclsl /* ve */ arasina yorum yazmak . // sadece Lek saLirda yorum yazmamiza lmkan
saglar. ok saLirli blr yorum yazarken veya blr kod keslmlnl devre di;i birakmak lsLedlglmlz bunlari /*
ve */ arasina aliriz. 8unlarda yorum oldugu anla;ilacak ;ekllde renklendlrlllr.
Aslinda yorumlari saymazsaniz numuzdekl kod 4-S saLirlik blr kod. 8una ragmen bu Lamamen
ali;abllen blr llLe-c programi! LdlLrun usL kismindakl ara ubugundan dugmeslne basarak
ali;Lirmayi deneyln. 5u grunLuyle kar;ila;mi; olmalisiniz.
8u rnek blr levelln nasil yuklendlglnl ve ob[enln nasil oldugunu gsLerlyor. kodumuz hlblr
kuLuphane eklemedlglmlzde(nasil eklendlglnl greceglz) oLomaLlk olarak eklenen kuLuphaneler
sayeslnde, alL+enLer lle Lam ekran moduna geeblllr, fS lle zunurluk degl;Llreblllrslnlz. 5lmdlllk hl
8lr ;ey anlamami; olablllrslnlz kl, dogal olanida bu, endl;elenmeyln. Penuz hlblr;ey anlaLmadim
zaLen. Per;eye numuzdekl derslerde deglneceglz. ,)
Siradakl ders: uegl;kenler
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
L|te-C Ned|r?
LlLe-C kisaca CameSLudlo oyun gell;Llrme pakeLlnln moLoru Acknex'ln programlama dllldlr.
1eorlde normal C dlllnden hlblr farki yokLur, fakaL moLora zel blr kuLuphane, derleylcl ve edlLor
bulunmasindan dolayi bazi nokLalarda farklilik gsLereblllr.
Acknex kuLuphanesl moLorun yeLeneklerlnln blr llsLesl olarak du;unuleblllr. 8u kuLuphaneyl
oyunumuza(programimiza) ekleyerek moLorun buLun zelllklerlnl kullanablllrlz. kisaca kuLuphaneler
programimizin programda kullanilan fonkslyon/zelllk/yeLeneklerl bllmeslnl saglayan eklerdlr.
uerleylcl lse kodumuzu maklne koduna dnu;Lurup yazdigimiz kodlari .exe hallne geLlren yazilimdir.
Ld|tor
LdlLr kodlarimizi yazdigimiz gell;ml; blr meLln edlLru andiran blr araLir. ScrlpL LdlLor lsml
verllen ara ;u ;ekllde grunur:
LdlLrun kullanimi dlger edlLrlere gre baslLLlr. Ayarlardan renklerl ve fonLu degl;Llreblllrslnlz.
Motor
kullanacagimiz moLor CameSLudlo kurulumuyla gelen Acknex oyun moLoru. MoLor oyun
yapiminda lhLlya duyulabllecek blrok yeLenege sahlpLlr.(llzlk, arpi;ma Algilama,2d ve 3d zelllkler,
MulLlplayer, Shader uesLegl vb.). MoLor ulrecLx9 kullandigi ve exe derledlgl lln ;u an sadece
Wlndows lln oyun gell;Llrmede kullanilablllyor. 2Cen Cyun SLudyosu ' nun yapmi; oldugu kabus22
ve C48oboL oyunlarida bu moLoru kullanmakLadir.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
Ders|er
Perhangl blr moLoru kullanmanin ve lsLedlglmlz oyunu yapmanin programlamadan geLlglnl zaLen
blllyoruz. Acknex moLorunu kullanabllmek llnde LlLe-C yl kullanabllmek gereklyor. Lger zaLen C blllyorsaniz
dogru yerdeslnlz. uerslerl hizli blr ;ekllde Lamamlayarak yolunuza koyulablllrslnlz. Lger daha nce hl
programlama yapmadiysaniz endl;elenmeyln. ?ava; ba;lar ve programlamadan korkmazsaniz ba;langi
sevlyeslnl aLlaLmak zor olmayacakLir. 8u a;amadan sonrada gerlsl orap skugu glbl gellr. 8a;langi sevlyeslnl
aLlaLLikLan sonra bu l;l yapmak hem eglencell hem de merak uyandiricidir.
Lger numuzdekl 24 kuuk dersl lzlersenlz, daha nce hl programlama yapmami; olsaniz blle
ba;langi sevlyeslnln usLunde LlLe-C greneblllrslnlz. Per ders lln yakla;ik 1 saaLe lhLlyaciniz olacak ama emln
olun dersler blLLlglnde bunu yapLiginiza pl;man olmayacaksiniz. uerslerln odaginda oyun programlama var zlra
LlLe-C ok buyuk oranda bllglsayar oyunu programlama lln kullaniliyor. 8u yuzden ba;langi ve hemen usLu
a;amalari lln LlLe-C nln bu zelllklerl oyun programlama yeLeneklerl uzerlnde duracagiz. Ayni zamanda C dlll
hakkinda bllgl vereceglz ama C kisminda fazla derlne lnmeyeceglz. 1eorlde ve praLlkLe LlLe-C ve C blrblrlne ok
benzer oldugundan geerll C bllglnlz varsa bu derslerl daha kisa surede sadece MoLor speslflk kisimlarini
grenerek Lamamlayablllrslnlz.
Per ders Lam ali;an kodda lerecek. 8u kodlari ali;Lirabllmek lln en az A7.07 veya ucreLslz LlLe-C
1.07 verslyonu gereklldlr. Lger LlLe-C den ali;maya ba;layacaksiniz, A7 Lrlal surenlzl kullanmak yerlne, LlLe-C
ucreLslz surumu Lerclh edeblllrslnlz. ucreLslz surum zelllk kisiLlamadir ama ba;langi lln yeLerlldlr ve sure
kisiLlamasi yokLur. WLu kullanimina geeceglnlz zaman 1rlal surum kullanmaya ba;larsiniz. MLu (Model LdlLr)
ucreLslz blr yazilimdir. LlLe-C free ve ucreLslz MLu ;u adreslerden lndlrlleblllr:
A7 ueneme Surumu : hLLp://server.conlLec.neL/down/gsLudlo_seLup707.exe
LlLe-C lree : hLLp://server.conlLec.neL/down/llLec_seLup.exe
Model LdlLor lree: hLLp://server.conlLec.neL/down/med_seLup.exe
Ders 8a|ik|ari ]u ]ek||de:
MoLoru 1animak
uegl;kenler
lonkslyonlar
8lLmaplar ve aneller
Sayilar ve encereler
SLrglnler,yazilar ve fonLlar
ozlsyon,ai,boyuL
Cb[eler
uavrani;lar
olnLerlar
lf-Llse kullanimi
klavyeyl kullanmak
Mouse kullanmak ve Mouse LvenLlerl
!oysLlck kullanmak
8uglardan kurLulmak
llerlduzey uebugglng
Cb[e ParekeLl
llzlk MoLoru
SprlLe ve Anlmasyonlu SprlLelar
Modeller ve Anlmasyonlu Modeler
llerl uuzey Anlmasyon, kemlkler(8one)
1he 8one CollecLor
Clobal ve ?erel uegl;kenlerl Anlamak
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
Ders 2: Deg|ken|er
8lr degl;ken bllglsayarinizin belleglnde yer edlnlr ve belll blr lsme sahlpLlr. llnde belll sayilari
saklayablllr ve bu lsml sayeslnde ula;ilir/kullanilir. Crnegln,
var merm| = 7,
var sag||k,
var hak = 3, ]] oyuncunun 3 hakki var
8u blrka kuuk saLir lln syleyeblleceklerlmlz:
1) uegl;kenler kullanilmadan nce var anahLar kellmesl kullanilarak Lanimlanmalidir. Lger
Lanimlamadan nce sag||k = 100, dersenlz, moLor sagllk kellmeslnln ne oldugunu bllmedlglnden
kodunuz derleme sirasinda haLa verlr ve ali;maz.
Not. Notmol c JllloJekl lot,looq,floot,Jooble qlbl ooobtot kellmeletJe qeetllJlt.
2) uegl;kenlere llk deger aLayablllrslnlz. var merm| = 7, dedlglnlzde merml degl;kenl
Lanimlanir ve llnde 7 degerlnl LuLar. Ama bunu yagmak ;arL deglldlr. var sag||k, yazdigimizda sagllk
degl;kenl Lanimlanir ama blr llk degerl yokLur.
3) kodumuza yorum" ekleyeblllrlz. var hak = 3, ]] oyuncunun 3 hakki var da // dan sonrakl
kisim yorumdur ve ne yazarsa yazsin kodun ali;masinda blr degl;lkllk meydana geLlrmez. 8unu blr
ncekl dersLe aiklami;Lim.
4) Per Lanimlama l;l , (nokta|i v|rg|) lle blLer. ogu yenl ba;layan bunlari koymayi unuLLugu
lln garlp haLalar alir.
S) var lle Lanimlanan degl;kenler en fazla 6 hanell(+en fazla 3 vlrgulden sonra) sayi LuLablllr.
?anl var degl;kenler en fazla 999999.999 en az -999999.999 olablllrler. Lger daha buyuk/kuuk
sayilara lhLlyaciniz varsa c/c++ dakl dlger degl;ken Lurlerlnl(lnL,long,double vb.) kullanablllrlsnlz. 8u
ders serlslnde var" uzerlnden gldeceglz.
6) uegl;kenler blr harf veya _ lle ba;lamak zorundadir. uegl;ken lslmlerl rakam lle ba;layamaz
Parf,sayilar ve _ di;inda slmge ve 1urke karakLerler(C,,;5,il,gC,uu) leremez.
var _zeka,
var para,
var c4_say|s|,
var #89zs, ]] sembo| |er|yor
var 12.savasc|, ]] sayi ||e ba|ami
var sag|ik, ]] 1rke karakter.
?e;ll olanlar geerll kirmizi olanlar geerslz degl;ken lslmlerldlr.
7) uegl;ken lslmlerl buyuk/kuuk harf duyarlidir.
var neadShotSay|s|,
var headshotsay|s|,
var nLADSnC1SAISI,
uegl;kenlerlnln her blrl farkli degl;kenler olarak algilanir.
8) Son olarak, degl;kenlerlnlze manLikli lslmler vermek her zaman yarariniza olacakLir.
var sadasd, var _x_azx_1, var |33212, var xtwq,
glbl lslmler yelne
var konum, var puan, var ka|kan,
glbl degl;kenler kullanmak kod yazmanizi ve lslmlerl haLirlamazini kolayla;Lirir.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
ekala, bu kadar Leorl yeLer blrazda bu degl;kenler nasil l;llyor onu grellm.
8u dokumanla beraber gelen ders2.c dosyasini SLu lle ain.
Ayarlarinizin dogru olup olmadigini konLrol eLmek lln, CpLlons-> references-> LnvlromenL
sekmeslne gelln ve en alLLakl use CurrenL llle for 1esL 8un" seeeglnln l;areLll olduguna emln olun.
8u seenek LesL run" (ara ubugundakl slyah ok) dugmeslne basLiginizda o an aik olan dosyanin
ali;Lirilmasini saglar. Lger ayarlariniz Lamamsa LesL run" dugmeslne Liklayin ve kodu ba;laLin.
MoLor ali;acak ve kar;inizda kirmizi blr ekran bellrecek. kirmizi olmasina aldirmayin kod da
byle ayarlandigi lln kirmizi oldu. korkmayin llerlkl derslerde nasil farkli renk ayarlandigini greceglz.
enceremlz:
?eLerlnce heycanlandirici degll :u 1ab a basin ve konsola ain(8unu programlamadik Lablkl, ncekl
dersLe kodumaza ba;ka blr kuLuphane eklemezsek sLandarL zelllklerln bulundugu blr kuLuphane
eklenlr deml;Llm. 1A8 a basinca ailan konsol bu kuLuphanenln eserl. 1ab Lu;u sol LarafLakl CapsLock
Lu;unun uzerlndekl). konsola
a = S, yazip enLere basin, 1A8 a Lekrar basip konsolu glzleyln. a ve c S oldu.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
1A8 a Lekrar basin ve varolan yaziyi slllp yerlne b = 3, yazip LnLer a basin.
Anlamli gelmeye ba;ladi mi? C , a lle b nln Loplami glbl duruyor. a ve lln farkli sayilar deneyln
lkna olacaksiniz ,) LSC ye basarak moLor pencereslnl kapaLin ve moLorumuzu ufak blr hesap maklnesl
yapan koda bakmaya ba;layalim...
////////////////////////////////////////////////////////////////////
var a = 0,
var b = 0,
var c = 0,
/////////////////////////////////////////////////////////////////////
AnLL* panulsplay =
[
dlglLs(3S, 10, "a = 0.f", *, 1, a),
dlglLs(3S, 19, "b = 0.f", *, 1, b),
dlglLs(3S, 28, "c = 0.f", *, 1, c),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
funcLlon maln()
[
vldeo_mode = 1, // grunLuyu 320x200 e ayarlar
screen_color.red = 1S0, // ve arkaplanini kirmizi yap.
whlle (1)
[
c = a + b,
walL (1),
}
}
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
Clamaz!!?!! 8u da ne? Merak eLmeyln blz kodun sadece mav| olan kismiyla llglleneceglz. ulger
kisimlar llerlde greceglmlz, yazilari ve degl;kenlerl ekranda gsLerme l;lnl yapiyor. ?anl blzlm
llgllendlglmlz kisimlar:
var a = 0,
var b = 0,
var c = 0,
8uraya kadar olan kismi dersln ba;inda grdugumuz baslL degl;ken Lanimlari. Pepslne Lanimlanirken
llk deger olarak 0 (sifir) verllml;. llk ali;Lirdigimizda Lum degl;kenlerl 0 olarak grmemlzln sebebl bu.
ArLik blr degl;kenl oyunumuzda kullanirken nasil Lanimlayacagimizi blllyoruz.
c = a + b,
Pmm... 8uda olduka baslL c degl;kenlnl a ve b degl;kenlerlnln Loplamina e;lLllyor. kuuk blr deney
yapin ve c = a + b, dekl +(arLi) l;areLlnl -(eksl) lle degl;Llrln, ali;Lirin(LesL run) ve a lle b ye degerler
verln.
8ekledlglmlz glbl ali;iyor. ArLik Loplama yerlne ikarma l;leml yapiliyor ve c ye e;lLlenlyor. ArLik llLe-c
nln degl;kenlerlnl grendlk. uegl;kenlere llk deger aLanablleceglnl syleml;Llk degll ml? 8akalim
gerekLen dogru mu bu? kodda degl;lkllk yapin ve ;u hale geLlrln(sifirlar yerlne farkli degerler glrln):
var a = 20,
var b = 1S,
var c = 0,
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
MoLor yenl degerlerl okudu ve llk ali;mada 20 den 1S ikarip c ye e;lLledl. Ayni ;ekllde arpma lln *
blme llnde ] l;areLlnl kullanablllrslnlz. c = a + b, yerlne daha karma;ik blr;eyler yazablllrdlk ama bu
kadar yeLerll, slsLeml anladiginizi Lahmln edlyorum. 8lrazda ba;ka ;eylerden bahsedellm.
funcLlon maln ln alLindakl
vldeo_mode = 1, // grunLuyu 320x200 e ayarlar
screen_color.red = 1S0, // ve arkaplanini kirmizi yap.
SaLirlarini grdunuz mu? LlLe-c de lkl e;lL degl;ken vardir nceden tanim|i ve ku||anici tanim|i. 8azi
degl;kenler moLor programlanirken Lanimlanmi;Lir, bunlar nceden Lanimli degl;kenlerdlr ve
moLorun bazi zelllklerlnl konLrol ederler. Crnegln v|deo_mode nceden Lanimli blr degl;kendlr ve
moLorun ekraninin zunurlugunu bellrler(benlm rneglmde 320x200). 8u degl;ken 1 lle 11 arasida
deger alir.(Pangl degerln hangl zunurluge denk geldlglnl grmek lln kod uzerlnde vldeo_mode a
Liklayin ve edlLrun alL kismindakl Command Pelp" e bakin.). screen_co|or lse zel blr Lur(vekLr -
llerde greceglz) degl;kendlr ve 3 Lane (red - green -blue ) deger alir. screen_color red(kirmizi),
green(ye;ll) ve blue(mavl ) uzerlnden ekran renglnln degl;Llrlmeslnl saglar. 8en sadece red(kirmizi)
blumunu kullandim, kendlnlz dlger gelerlede oynayarak lsLedlglnlz rengl ayarlayablllrlsnlz.
scteeo_colot.teJ = 150, nln alLina scteeo_colot.qteeo= 150, ve scteeo_colot.bloe = 150, ekleyln ve
1S0 degerlerlyle (herblrl farkli olablllr) oynayarak rengl degl;Llrmeyl deneyln. Anlayamadiysaniz
merak eLmeyln vekLrlere sonra deglneceglz. Cnceden Lanimli degl;kenlerln Lam llsLesl Manual" de
bulunablllr.
lazla yerle;medlyse merak eLmeyln llk ba;La anlamak zordur ve bu kadar bllglyle vereblleceglmlz
rneklerde ok kisiLli oldugundan Lam anlayamami; olablllrslnlz. llk kez okuyorsaniz blr kez daha
okuyun ok daha fazla yerle;ecekLlr. (8azi fllmlerl 2. kez lzledlglnlzde daha ok anlamaniz glbl.)
Siradakl ders: lonkslyonlar da gru;mek uzere,
lyl ali;malar, - Cuadraxas
www.acknexLurk.com
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
Ders 3: Ionks|yon|ar
8u dersLe programlama yaparken en sik kullanacagimiz gelerden fonkslyonlari greceglz. 8lr
rnekle ba;layalim,
funct|on top|ama_yap()
{
a = 3,
b = S,
c = a + b,
}
lonkslyonlar var glbl moLor gelerlnl leren LlLe-C komuLlari dlzlsldlr.
8u blrka kuuk saLir lln syleyeblleceklerlmlz:
1) lonkslyonlar funct|on anahLar kellmeslnl Laklp eden blr lslm ve blr lfL paranLez ()
kullanarak Lanimlanir. aranLezler fonkslyona ek parameLreler gemek lln kullanilir ama ;u anda blz
paramLre kullanmadigimiz lln aralari bo;.
Not. Notmol c JllloJekl lot,looq,floot,Jooble qlbl ooobtot kellmeletJe qeetllJlt. lookslyoolot
N1l1* , 51klNC* qlbl motot objeletlolJe JooJoteblllt. o JooJotoleo soytlot vot olotok
Jooet. ooobtot kellmesloe motot objeletl JooJotoleblllt.(uooJotme tetoto oolottlocok.)
2) lonkslyonun lerlgl { } paranLezlerl arasidir. 8uraya fonkslyonun gvdesl, fonkslyonun ll
vb. de denlr.
3) lonkslyonun gvdesl blr veya daha fazla llLe-c deylml lerlr. ueylmler , (nokLali vlrgul) lle
blLer.
4) uegl;ken lslmlerl Lanimlamadakl kurallar fonkslyonlar llnde geellrdlr.
S) 8lr fonkslyon ve blr degl;ken ayni lsme sahlp olmamalidir. PaLalara neden olur.
5lmdl ya;imiza gre Loplam ya;adigimiz gun sayisini hesaplayan blr fonksylon yazmayi
deneyellm. Cnce 8lrka degl;ken Lanimlamamiz gerekecek :
var yas|m = 19, ]]yi| o|arak yaim.
var y||dak|_gun_say|s| = 36S, ]]b|r yi|dak| gn sayisi
var top|am_gun, ]]bunu hesap|ayacagiz, ka gn yaadigimiz.
Penuz daha nce grmedlglmlz blr ;ey yapmadik. 3 Lane degl;ken Lanimladik, lklslne llk deger
verdlk ve blrlne vermedlk. ?e;ll yazilarin yorum oldugunu unuLmayin. ,
funct|on anahLar kellmeslyle ba;layacagimizi blllyoruz. 8en fonkslyonun adina gun_hesapla
koyuyorum.
funct|on gun_hesap|a()
{
aranLezlerl koymayi unuLmadim ve { ekledlm. ArLik fonkslyonumun lerlglnl yazablllrlm.
?a;adigimiz gun sayisini hesaplayacagimiza gre ya;imiz lle blr yildakl gun sayisini arpmamiz gerek.
?anl:
top|am_gun = 19 x 36S
5lmdlde 19 ve 36S yerlne nceden bellrledlglm degl;ken lslmlerlnl yazarsam:
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
top|am_gun = yas|m x y||dak|_gun_say|s|
LlLe-c ye benzemeye ba;ladi ama lkl nemll nokLa:
- LlLe-c de (ve C,C++,!ava,P glbl dlllerde) arpma yapmak lln x degll * kullaniriz.
- ?lnde bu dlllerde her l;lem ve Lanimlama , lle blLer deml;Llk.
5lmdl buna gre duzenleme yaparsak:
funct|on gun_hesap|a()
{
top|am_gun = yas|m * y||dak|_gun_say|s|,
}
lonkslyonum sadece bu l;l yapacagi lln arLik l;l blLLl ve yapacagi l;lemlerl yazdigim kismi yanl
gvdeslnl } kapaLLim.
8u fonkslyonun ali;ip ali;madigini deneyebllmek lln dersln yanina ders3.c dosyasini
ekledlm. 8u dosyayi sed lle ain, ;yle blr kod lle kar;ila;acaksiniz:
#lnclude <acknex.h>
#lnclude <defaulL.c>
////////////////////////////////////////////////////////////////////
var yaslm = 19,
var ylldakl_gun_saylsl = 36S,
var Loplam_gun, // hesaplayacagimiz sayi
////////////////////////////////////////////////////////////////////
AnLL* pulsplay =
[
dlglLs (10, 10, S, *, 1, Loplam_gun),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
okLa kari;ik degll. 8lraz nce bahseLLlglmlz 3 degl;ken ve hala grmedlglmlz blr AnLL.
5lmdlllk sadece bunun ekranda Loplam_gun degl;kenlnl gsLerdlglnl bllmenlz yeLerll. 8lrka ders
sonra anellerln ne oldugunu greceglz. 5lmdl konumuz fonkslyon oldugundan ve sonucu grebllmek
lln ekranda yazdirilmasi gerekLlglnden bunu ekledlm.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
?azdigimiz fonkslyonu ders2.c nln alLina ekleyellm. 5unu elde edeceglz:
#lnclude <acknex.h>
#lnclude <defaulL.c>
////////////////////////////////////////////////////////////////////
var yaslm = 19,
var ylldakl_gun_saylsl = 36S,
var Loplam_gun, // hesaplayacagimiz sayi
////////////////////////////////////////////////////////////////////
AnLL* pulsplay =
[
dlglLs (10, 10, S, *, 1, Loplam_gun),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
funcLlon gun_hesapla()
[
Loplam_gun = yaslm * ylldakl_gun_saylsl,
}
5lmdl (LesL run) dugmeslne basarak kodumuzu deneyellm. ali;Li... Ama hlblr ;ey
olmadi. Sadece slyah blr ekran ve blr sifir. lonkslyonu dogru yazdigimizdan emlnlz pekl problem ne?
lonkslyonlar LanimladikLan sonra l;lerlnl yapabllmek lln kullanilmalari (agrilmalari) gereklr.
Aynen blr arabanin fren yapmasi lln frene basmak gerekmesl glbl. Arabanin fren yapabllme kablllyeLl
vardir ve gerekll donanim arabada mevcuLLur ama frene basmadika araba yava;lamaz. 8lzde burada
funcLlon gun_hesapla() yi yazarak arabamiza gun hesaplamak lln gerekll donanimi verdlk ama henuz
arabamizin bu zelllglnl kullanmadik. ekl bunu nasil yapacagiz? 8lr ok fonkslyonum olsa program
hangl l;leml nce yapar, sirasini nasil bellrlerlm?
LlLe-C ,C,C++,[ava glbl dlllerde komuLlar ma|n() adi verllen zel blr fonkslyondan l;lenmeye
ba;lar. maln lsml nceden Lanimlidir ve bu fonkslyonu yazdigimizda LlLe-C saLirlari l;lemeye buradan
ba;layacagini blllr. Aynen dlger Lum fonkslyonlar glbl lkl paraLez [ } ler ve gvdeye sahlpLlr. ?azdigimiz
oyun/program maln ln llndekl(gvdeslndekl) llk saLirdan ba;lar ve sonrakl saLirlardan devam eder.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
maln fonkslyonunu kodumuza ekleyellm:
#lnclude <acknex.h>
#lnclude <defaulL.c>
////////////////////////////////////////////////////////////////////
var yaslm = 19,
var ylldakl_gun_saylsl = 36S,
var Loplam_gun, // hesaplayacagimiz sayi
////////////////////////////////////////////////////////////////////
AnLL* pulsplay =
[
dlglLs (10, 10, S, *, 1, Loplam_gun),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
funcLlon gun_hesapla()
[
Loplam_gun = yaslm * ylldakl_gun_saylsl,
}
funcLlon maln()
[
screen_color.red = 128,
gun_hesapla(),
}
8lr;eyler uyandirdi mi? l;lemler malnden l;lenmeye ba;ladigina gre frene basmak
lsLedlglmlzl buradan sylememlz gerek. screen_color.red = 128, daha nce yapLigimiz glbl ekrani
kirmizi yapiyor.
Malnln llne ekledlglmlz gun_hesapla(), saLiri blzlm fonkslyonumuzu agirmamizi sagliyor.
lonkslyonlar agrilirken herhangl blr anahLar kellme kullanmazlar. 8lz zaLen gun hesapla fonkslyonu
Lanimladigimiz lln arLik moLor onun ne oldugunu blllyor ve blz gun_hesapla(), dedlglmlzde
gun_hesapla lslmll fonkslyonun llk saLirindan ali;maya ba;liyor. , vlrgul koymayi unuLmuyoruz. 5lmdl
Lekrar ali;Liralim. Aldigimiz grunLu:
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
ve fonkslyonumuz ali;Li.
lonkslyonlar ve degl;kenler konusunda nemll blr nokLa: 8lldlglmlz glbl degl;kenlerl
kullanmadan nce Lanimlamamiz gereklyordu. Aynisi fonkslyonlar llnde geerll. ?azdigimiz kod blr
klLap glbl en ba;indan okunmaya ba;lar ve moLor malnl grdugun, l;Le maln bunun ne oldugunu
blllyorum" der ve ali;Lirmaya ba;lar. Malnln orLasinda gun_hesapla(), dlye blr fonkslyon agrisi lle
kar;ila;irsa ve blz bu fonkslyonu malnden sonra Lanimladiysak veya Lanimlamadiysak, moLor
gun_hesapla da ne? 8llmlyorum." der ve haLa verlr. Ama eger malnden nce Lanimlarsak zaLen
oraya kadar okudugu lln gun_hesapla nin ne oldugunu blllyordur, fonkslyonun gerekLlrdlgl l;lemlerl
yapar.
ekl ya blr fonkslyonu kullandigimiz yerden sonra Lanimlamak zorunda kalirsak veya A ve 8
adinda lkl fonkslyonumuz varsa ve A 8 yl, 8 A yi agiriyorsa? lonkslyonlar A-8 ;ekllnde siralarsak 8
aisindan problem yokLur ama A fonkslyonu llnde 8 agrisini grdugunde 8 ye henuz
gellnmedlglnden ne oldugunu bllemez ve haLa aliriz. 8-A ;ekllnde yaparsak da 8 aisindan problem
olu;ur. 8unu zmek lln protot|plerl kullaniriz.
Cncellkle gun_hesapla()[ .... } fonkslyonunu malnln alLina (malnden sonra) alalim. ve nasil blr
haLa lle kar;ila;acagimizi grup, bu haLayi proLoLlp kullanarak zellm.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
#lnclude <acknex.h>
#lnclude <defaulL.c>
////////////////////////////////////////////////////////////////////
var yaslm = 19,
var ylldakl_gun_saylsl = 36S,
var Loplam_gun, // hesaplayacagimiz sayi
////////////////////////////////////////////////////////////////////
AnLL* pulsplay =
[
dlglLs (10, 10, S, *, 1, Loplam_gun),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
funcLlon maln()
[
screen_color.red = 128,
gun_hesapla(),
}
funcLlon gun_hesapla()
[
Loplam_gun = yaslm * ylldakl_gun_saylsl,
}
gun_hesapla fonkslyonunu maln ln alLina aldik. ali;Lirdigimizda alacagimiz haLa:
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
uerleylcl gun_hesapla ya denk geldl ve gun_hesapla ya daha nce rasLlamadigindan ve ne
oldugunu bllmedlglnden haLa verdl. ekl proLoLlp nedlr? nereye ve nasil yazilir?
#lnclude <acknex.h>
#lnclude <defaulL.c>
funct|on gun_hesap|a(), ]]protot|p| buraya ek|ed|m
////////////////////////////////////////////////////////////////////
var yaslm = 19,
var ylldakl_gun_saylsl = 36S,
var Loplam_gun, // hesaplayacagimiz sayi
////////////////////////////////////////////////////////////////////
AnLL* pulsplay =
[
dlglLs (10, 10, S, *, 1, Loplam_gun),
flags = vlSl8LL,
}
/////////////////////////////////////////////////////////////////////
funcLlon maln()
[
screen_color.red = 128,
gun_hesapla(),
}
funcLlon gun_hesapla()
[
Loplam_gun = yaslm * ylldakl_gun_saylsl,
}
roLoLlpler fonkslyonumuzun gvdesl olmayan Lanimlaridir. roLoLlp derleylclye byle blr
fonkslyonun var oldugunu ama henuz Lanimlamadigini syler. roLoLlpler(ayni zamanda
fonkslyonlarda) ba;ka blr fonkslyonun llnde yer alamaz. Plblr [ } arasinda deglldlr. 8unun di;inda
proLoLlpler herhangl blr yere yazilablllr(Lablkl agrildigi yerden nce :) ) ama sayfanin en ba;ina
yazilmasi hem l;lnlzl kolayla;Lirir hemde duzenll olur. 8lr fonkslyonu slldlglnlzde proLoLlplerl nerdeydl
dlye aramaniza gerek kalmaz. roLoLlpler usLLe gruldugu glbl funcLlon anahLar kellmeslnl
fonkslyonumuzun adini ve () lerlnl lerlr ve nokLali vlrgul lle son bulur. [ } lermez. l;Le bunlara
roLoLlp" veya fonkslyonun ba;ligi denlr.
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
ekala ;unlar ne demek:
#|nc|ude <acknex.h>
#|nc|ude <defau|t.c>
8unlar llk dersLe kisa olarak bahseLLlglmlz, kodumuza ba;ka kodlari ekleme l;lnl yapiyor.
lnglllzcede lermek manasina gelen lnclude" kellmesl yardimiyla ba;ka kodlari kendl kodumuza
ekleyeblllrlz. 8u saLirlar l;leLlleblllr saLirlar deglldlr. 8unlar derleme l;lemlne ba;lanmadan nce
derleylclye bu kodlari benlm koduma ekle dememlzl saglar. ve derleylcl de sankl o dosyalardakl
kodlar blzlm kodumuzda Lam olarak lnclude kullandigimiz yerde yaziliymi; glbl davarnir ve o ;ekllde
derler. Acknex.h dosyasinda moLorda nceden Lanimli olan Lum fonkslyonlarin proLoLlplerl yer alir.
8u sayede blz moLorda Lanimli blr fonkslyonu kullandigimizda byle blr fonkslyon oldugunu blllr ve
bunlari ali;Lirir. (Acknex.h La proLoLlplerl olan fonkslyonlari moLor aik kaynak kodlu olmadigi lln
gremeylz. Acknex.h da proLoLlplerl bulunan Lum fonkslyonlar derlenml; halde gamesLudlo
klasrundekl acknex.dll" dosyasinda bulunur.)
defaulL.c nln lse blzlmde yazablleceglmlz herhangl blr llLe-c doyasidir. 8u dosyada her
programi LesL ederken l;lmlze yarayacak kalipla;mi; fonkslyonlar bulunu. lS e basinca zunurluk
degl;mesl, esc ye basinca moLorun kapanmasi, f11 lle lsLaLlsLlk ve lS panelelnln ikmasi, kamera
sablLse 0 a basip harekeLe gelrllebllmesl glbl genel fonkslyonlar lerlr. ?azigidigimiz programlar lln
hayaLl deglldlr. Lklenmesl ;arL deglldlr.
8u seferllk bu kadar yeLer, parameLre alabllen fonkslyonlari da anlaLacakLim fakaL bu ders
yenl ba;layanlar lln yeLerlnce uzun ve yorucu oldu blle. 8lr dahakl sefere bu dersln devami oalrak
kisa blr ;ekllde parameLre alan fonkslyonlari anlaLip, sonrakl dersLe aneller ve 8lLmaplar"
konusundan devam edeceglz.
Siradakl ders: arameLre Alabllen lonkslyonlar da gru;mek uzere,
lyl ali;malar, - Cuadraxas
www.acknexLurk.com
www.acknexLurk.com - Cuadraxas. LlLe-C uerslerl
C S
D I D D

u l C

C
A
?

A

8
8
nc1ude acknexh
nc1ude de1au1tc

1uncton gunhesap1a prototp buraya ek1edn


var yasn
var y1dakgunsays
var top1angun hesap1ayacaginiz sayi


^uLl p0sp1ay

dgts top1angun
11ags v1S18lL




1uncton nan

screenco1orred
gunhesap1a


1uncton gunhesap1a

top1angun yasn y1dakgunsays


AnLL 5
8
v 5
C S
L


1uncton nan

screenco1orred
gunhesap1a
yasn yasini yap
gunhesap1a



L
l
?
u

A
A8AML18LLL8
1uncton nan

screenco1orred
gunhesap1a
gunhesap1a



5

l

8

?A5 v
8
1uncton gunhesap1avar yas

top1angun yasn y1dakgunsays


8

u
C S
C

A
C
A

1uncton gunhesap1avar

top1angun y1dakgunsays


A

nc1ude acknexh
nc1ude de1au1tc

1uncton gunhesap1a prototp buraya ek1edn


var yasn
var y1dakgunsays
var top1angun hesap1ayacaginiz sayi


^uLl p0sp1ay

dgts top1angun
11ags v1S18lL




1uncton nan

screenco1orred
gunhesap1a
gunhesap1a


1uncton gunhesap1avar yas

top1angun yas y1dakgunsays


5 L gunhesap1a ve
gunhesap1a 8


C S
8

1uncton gunhesap1avar yas
n 1uncton gunhesap1avar

A
D
C

C
8

8 v
A

nc1ude acknexh
nc1ude de1au1tc

1uncton gunhesap1a prototp buraya ek1edn


var y1dakgunsays
var top1angun hesap1ayacaginiz sayi
var top1angun


^uLl p0sp1ay

dgts top1angun
dgts top1angun
11ags v1S18lL




1uncton nan

screenco1orred
gunhesap1a
gunhesap1a


1uncton gunhesap1avar yas

top1angun yas y1dakgunsays

C S
5
8


8

5
1uncton nan

screenco1orred
gunhesap1a
gunhesap1a


8



L

1uncton gunhesap1avar yas

top1angun yas y1dakgunsays


8
5
1uncton gunhesap1avar yas

var donduru1ecekdeger

donduru1ecekdeger yas y1dakgunsays

return donduru1ecekdeger

l

return donduru1ecekdeger
l

C S
l
8

gunhesap1a
gunhesap1a
8


u ?

top1angun gunhesap1a
top1angun gunhesap1a
Z



S

1uncton gunhesap1avar yas

return yasy1dakgunsays

8









8
C S
NC1LAk kNLkLLk
1uncton top1anavar brncvar knc

return brncknc

?
5

8 1
u
S ?
u
5
5








l
C






C S
D 8
8
8
LC

k Z
8 1CA uuS
8

u S
A S18lnC8l1MAAnLL C
8

8l1MA
8I1MA
8l1MA


u



5 8l1MA
8I1MA

A
Ln1l1?1Lx1
u

8


P?
u


P 8
u A
8



C S

u
8
LC


k Z
8 1CA uuS
8

C







C S

k u

////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
////////////////////////////////////////////////////////////////////
BMAP* first_pcx = "first.pcx"; // ilk bmapm
PANEL* pan_ilkpanel = // ilk panelim
{
pos_x = 0;
pos_y = 0;
layer = 1;
bmap = first_pcx;
flags = OVERLAY | SHOW;
}
/////////////////////////////////////////////////////////////////////
function main()
{
video_mode = 7;
screen_color.blue = 150;
}


C S
L u


8 k

A 8C8
1
Hizli Not: flaglar, objelerin(panel,entity vb) kapatilip ailabilen,(veya ayarlanip resetlenebilen),
nitelikleridir. !leriki derslerde detaya inecegiz.



PANEL* pan_ilkpanel =
{
pos_x = 0;
pos_y = 0;
layer = 1;
bmap = first_pcx;
flags = OVERLAY | SHOW;
}
l ANLL 8l1MA
8
A
M

C AnLL 8


C S
8MA
8
8MA
L
WE>



8
v
x ?

L


C S


L L
L


CVLkLA SnCW
u

CVLkLA ? 8C8

SnCW M
l L L
8
1
CvL8LA? CvL8LA?
l CvL8LA?


8 CvL8LA? ALlA
A u L A k

A CvL8LA?









C S



u
SPCW
C

P
AnLL

l CvL8LA?LlCP1
l SPCW
l

SPCW SPCW u
Z SPCW SPCW



C S
W<
A
8C8
k !C
l A M

S M
A
u k
S
C


A k

A



C S
CPAnnLLS C

? k l A 1 8



C S
CPAnnLLS 8C8 L
8


l L














C S
S CPAnnLLS A


C S
C

l S A 11CA
C S

A C
S

1



C S
8




8MA P
AnLL


SPCW

A


C S
t'

8


C
8

S
PANEL* first_pan =
{
digits (410, 200, 2, *, 1, sys_seconds);
flags = SHOW;
}

8




digits(x,y,format,font,kat_say,deiken);
digits (410, 200, 2, *, 1, sys_seconds);

AnLL 8 ?



8 L

L
C
?
l L u 8
u

u
C
l

digits(x,y,format,font,kat_say,deiken);

C S
S


L 8


P

A ?

8




C S
t
W u
8 5
C

n


u

P A u






C S

A


8

S

v W

A
u

C S
1





C S
8 5 ?
8 S

var yukseklik = 0;
PANEL* first_pan =
{
bmap = "frame.pcx";
window (40, 10, 178, 160, "height.pcx", 0, yukseklik);
flags = SHOW;
}

8 l
u u
W

?



C





C S


5



l











C


C

8

l
C
C S

digits(x,y,format,font,kat_say,deiken);

8 L

L
C
?
l L u 8
u

8



L










5

5





L

5


u

C S
D 8 S
8

u 8


8
?

u
1


?
u




C S





8 8l1MA

SCn8A






8 AnLL






C S


5
8 u
n
u
M
L
1









C S
v











nuLL



AnLL





nuLL nuLL
CvL8LA? SPCW

C
5
L

l
l

8

C



L 8 l


C S


NULL NULL

S NULL nuLL

S
A u
8 8
CvL8LA?
S
1CA
L
u

S k
k
C


8

8 C

C S

S

1 S










8MA







C S

AnLL






CvL8LA? SPCW



A


P
A



5




C S
S






v


8
S




8
Workshop 7 Dizgiler ve yazlar (Strings and Texts)
Fanellerin, digirlerin vL. Nasil kullanilacagini arrik grendik. Eger oyunlarda yazi gsrermek isriyorsak
srringler(Dizgiler) ve rexr(yazilar)i kullanmamiz gerekmekredir. Ve raLiki yazilarimizin onca karmaik eyin
arasinda daha da grnr olmasi iin fonr kullanimina dikkar ermemiz gerekmekredir. ayni zamanda oyun
uygulamamiz aliirken panellerin,rexrleri ve diger eylerin dinamik olarak nasil degiririlecegini Lu dersre
grenecegiz.
a)Strings (Dizgiler)
Srring, harf, sayi ve semLollerden oluan karakrerler dizisidir. Ire sizlere Lirka rnek,
STRING' oyuncu_srring = machera",
STRING' Lenim_cok_eski_srringim = Len havalidan daha da havaliyim!",
STRING' oyuncunun_canavarla_ranismasi = imdi l! Daha sonra seni ldrmeye harciyacak zamanim yok!",
STRING' mchra123456 = a+%&/345",
STRING' resr_srringi = ", //Lo srring
STRING' acknexrurk = #100", //Lu sirring 100 karakrer saklar.
Sadece yukaridaki rneklere Lakarak Lile ok ey greneLiliriz. $imdi aagidaki rneklere Lakalim,
1.) Her srringin ismi STRING ranimlayicisindan sonra Lir yildiz iareri eklendikren sonra yazilir. Isimden sonra
Lir eirrir simgesi eklenmelidir.
STRING' oyuncu_srring =
1.)Srringde olacak eyler (harf,sayi ve karakrerler) " rirnak iarerleri arasina yazilmalidir.
2.) Srringlerimize nceden karakrerler dizisi ekleyerek ranimlayaLilir veya Lo srring ranimlayip iini
karakrerlerle daha sonra dolduraLiliriz.
3.) Bir srring kullanici rarafindan zel olarak Lelirlenmi karakrer dizisine sahip olaLilir.rnegin STRING*
acknexturk '#100; stringi 100 karakter saklayacak biimde tanimlanmistir.
4.) Her lite-c iIadesinde oldugu gibi stringleride tanimlamayi tamamladigimizda '; (noktali virgl) ekleyerek
iIademizi sonlandirmaliyiz.
5.) String isimleri ile degisken isimleri ayni olabilir. Ben kendi stringlerime _str eklemeyi seviyorum ancak sizin buna
ihtiyaciniz yok.
Stringler ekranda kendilerinden bir sey gsteremezler. Bu sekilde yazilarak ekranda grnmezler. TEXT iIadesinin
iinde tanimlanmalari gerekmektedir.
b)Texts(Yazlar)
textler(yazi) bir Ya da birka stringi ekranda gstermeye yarayan objelerdir. Iste bir text rnegi;
TEXT` first_txt

pos_x 300;
pos_y 300;
layer 3;
font bir_font; //nceden ranimlanmii Lir fonr
string(benim_stringim);
flags SHOW;
]
panellere ne kadar ok benziyor degil mi? Iyi haber bu tanimlama gerekten ok basit. Hadi simdi text objesinin
zelliklerine bir bakalim.

ACKNEXTURK
pos_x ve pos_y textin konumunu ekran znrlgne gre sol st kseden uzakligi belirler. Daha nceden de
grendiginiz gibi eger posx 300 olursa sol st kseden yatayda 300 piksel uzaga konumlandirmis oluruz.
Layer katman hangi elementin daha stte olcagini tanimlar. rnegin pozisyonlari ayni olan iki yazidan birinin layer
numarasi 2 digerinin numarasi 3 ise 3 olan 2 nin zerini kaplayacaktir.
Font ; FONT` arial ~arial_font.pcx; seklinde tanimlanmis yazi tipidir. Klasik Times New Roman, Arial black vb..
eger Iont tanimlanmazsa motorun kendi Iontu kullanilir (Built-in Iont)
string daha nceden STRNG` string_ismi ~bla bla; ile tanimladigimiz string ismidir. string(string_ismi);
stringler bir PANEL elementi olan digitler gibi TEXT elementidir. Bir Ya da birden Iazla stringi element olarak TEXT n
iine ekleyebiliriz.
Flags SHOW; yazilarin grnr olmasini saglar.
ok basit degil mi? Yazilarin ekranda grnmesini bekleyemeyecegim! Hadi simdi scrit07.c yi aalim ve neler varmis
bir bakalim!
////////////////////////////////////////////////////////////////////
#include acknex.h
#include defaulr.c
////////////////////////////////////////////////////////////////////
STRING' aloha_srr = 'Welcome ro Faradise Island!',

TEXT' greerings_rxr =
[
pos_x = 300,
pos_y = 250,
srring (aloha_srr),
flags = SHOW,
]
////////////////////////////////////////////////////////////////////
funcrion main()
[
video_mode = 7,
screen_color.Llue = 150,
]
aloha_str adinda bir string tanimladigimizi gryorsunuzdur. STRING' aloha_srr = 'Welcome ro Faradise Island!',
rirnak iarerleri arasina Lireyler kelemeyi unurmayin ki yazilariniz grnsn. Texr ranimimiz ok Lasir hadi
aliriralim!
Evet artik string ve textler hakkinda grenmemiz gerekn seyleri grendiik. Sira geldi dinamik olarak degisen objeleri
grenmeye.
c)Dinamik olarak degiyen objeler(Dinamically changing objects)
yeni birseyler grenmeye hazir misiniz? Hadi main Ionksiyonuna birka satir ekleyelim. Kodumuz asagidaki gibi
grnecektir.(kirmizi kodlar eklenmis eklenmis kodlardir)

ACKNEXTURK
////////////////////////////////////////////////////////////////////
#include acknex.h
#include defaulr.c
////////////////////////////////////////////////////////////////////
STRING' aloha_srr = 'Welcome ro Faradise Island!',

TEXT' greerings_rxr =
[
pos_x = 300,
pos_y = 250,
srring (aloha_srr),
flags = SHOW,
]
////////////////////////////////////////////////////////////////////
funcrion main()
[
video_mode = 7,
screen_color.Llue = 150,
vair (-3),
greerings_rxr.pos_x = 500,
vair (-3),
greerings_rxr.flags = 0,
]
Script07.c 'yi bir kere daha alistiralim. Yazinin saga dogru hareket ettigini greceksiniz. Yazi yeni yerine geldiginde
birka saniye durup yine yer degistirecektir. Bu yerdegistirmelerin main Ionksiyonuna ekledigimiz kodlarla alakali
oldugunu tahmin etmek g olmasa gerek. Hadi simdi bu yeni kodlari biraz inceleyelim.
vair (-3),
greerings_rxr.pos_x = 500,
vair (-3),
greerings_rxr.flags = 0,
herseyden nce wait(-3); motorun 3 saniye beklemesini saglayan bir nceden tanimlanmis Ionksiyondur.
LtIen burada dikkat edin nk bir sonraki cmle btn dersin iindekien nemli cmle ve bu cmlenin rnegi en
nemli rnek olacaktir. nokta metodu kullanarak (dot method) bir objeye zellik/durum ekleyebiliriz. Mesela PANEL
ve TEXT zelliklerini objeye eristirmek gibi.
Obje.zellik
bizim rnegimizi wait(-3); den sonraki ilk iIade oluyor.
greerings_rxr.pos_x = 500,
imdi Lurada greerings_rxr Lizim oLjemiz pos_x ise onun x eksenindeki pozisyonu oluyor. Dikkar ederseniz
oLjemiz Lir TEXT oLjesi. Daha nceden oLjemize Lir x pozisyonu vermirik. pos_x = 300, imdi Luradan Lakarsak
main fonksiyonunda ise moror alimaya Laladikran 3 saniye sonra (vair(-3),) greerings_rxr'nin x pozisyonunu 500
olmasini greerings_rxr.pos_x = 500, ifadesi ile isriyoruz.umarim anlamisinizdir. Daha ayrinrili Lilgiyi manualde
LulaLilirsiniz.pekala en son olarak Lu inceleyecegimiz 4 sarirlik kismin son saririna Lir Lakalim.
greerings_rxr.flags = 0,
Lu sarir Lir Laka nceden ranimlanmi degikenlerden flags'i 0 yapiyor. Flags 0 olunca TEXT oLjesinde daha
nceden yazdigimiz flags = SHOW, ifadesini reserliyor. Burda reserleme yazinin grnmemesini sagliyor. Eger
TEXT iindeki flagi, flags = TRANSLUCENT, yazip sonra reserleseydik Lu seferde saydamligi ipral olacakri.

ACKNEXTURK
Eger Luraya kadar hereyi anladiysaniz, Lir panel olururup, Lu panele iki kk Luron ekleyip, Lu Luronlara Lizim
greerins_rxr yazimizin yerini degirirecek fonksiyon ekleyerek gzel Lir grnr olururaLilirsiniz degil mi! $imdi
Liraz ara verip sonrasinda yukaridaki kk uygulamayi yapmayi denemiyorsunuz!
Fekala aramizi verdikren sonra vorkshop'a devam edeLiliriz.
Fanelleri,rexrleri,enriryleri(daha sonra Lakacagiz) nokra merodu(dor merhod) ynremiyle konrrol edeLiliyoruz. O
zaman Lunlar hakkinda Lirka rnek verelim
display_pan.flags = 0, //display_pan'in rm flaglarini siifrliyor.
resr_pan.flags |= SHOW,//resr_pan isimli paneli gsrerir
(hi_rxr.psrring)0] = nevsrring_srr,//korkurucu giLi grnyor ,Lunu daha sonra zecegiz.- hi_rxr'e yeni Lir srring ekler.
error_pan.pos_y = 300,//error_pan isimli panele yeni y" pozisyonu veriyor.
vizard.z = 200,//vizard adli enriry'nin z koordinari degerini 200 yapar.
Dikkarinizi ekmirir TEXT raniminda font bir_font; iIadesi vardi. Ancak rnek kodumuzda byle bir yoktu ve
zerine yorumda yapmadik.aslinda daha nce deginmistik ama yeniden hatirlatayim, su ana kadar yazdigimiz yazilarin
hepsi motorun kendi Iontunu kullaniyordu. Kim istemez Times New Roman kullanmayi?
d) Fonts(Yaz tipleri)
Iontlar klavyeye basarak olustudugumuz karakter tiplerinin set olarak dizilmis halidir. Iki tip Ion kullanilmaktadir.

a) dogru tip Iontlar(true type Iont): bunlar windowsta kullandigimiz Iontlar.
b) bitmap Iontlar. Bir bitmap dosyasindan okunabilen karakter setidir.
True type fonts (dogru tip fontlar)
hepimizin bilgisayarinda yklenmis pek ok tip Iont vardir. Fontlari amak iin C:\WINDOWS\Fonts dizinini
bulmaniz yeterlidir. Syle bir ekran grmeniz gerekir;

ACKNEXTURK
eger bir Iont rnegine iIt tiklarsaniz btn karakterleri Birka rneklerle greceksiniz.
Bu standart Ion tipidir. Hadi dogru tip Iont tanimimina bir bakalim;
FONT`benim_font_ismim ~bu_fontun_windowstaki_gerek_ismi#ykseklik(tip); //dogru tip Iont
benim_font_ismim , lite-c de kullanmak iin windowstaki Ionta verdigimiz isim. POINTER.
Bu_fontun_windowstaki_gerek_ismi ,windowsta C:\WINDOWS\Fonts dizininde bulunan Iontlarin gerek ismi.
Ykseklik bu Iontun byklg. Tipki Word'deki gibi.
Type Iontun tipi, b harIi bold(kalin) i harIi italik ve bi de bolditalik olmus oluyor.
Hadi simdi bir true type Iont rnegi grelim.
FONT`arial_font ~Arial#20b; //Arial tipinde, kalin ,20 birim byklgnde bir Iont.
Bitmap fontlar
burada dikkat edilmesi gereken karakterlerin genislikleri. Normalde i harIi m harIinden daha dar olmasi gerekir. True
type Iontlarda bu byledir. Ancak bitmap Iontlarda durum degisir. M ile i ayni genislige sahip olurlar. Asagidaki
resimde durumu daha net anlayacaksiniz;
resimdeki kirmizi izgilerin izilmesinin nedeni karakterlerin ayni genislige sahip olduklarinin gsterilmesidir. Simdide
izgiler olmadan ayni resime tekrar bakalim.

ACKNEXTURK
Bitmap Iont tanimina bakalim;
FONT` benim_font_ismim ~bitmap_ismi; // sabit genislikte bir Iont
benim_font_ismim yine true type Ionttada dedigimiz gibi lite-c de kullanacagimiz Iont ismi. POINTER
bitmap_ismi kullanilan bitmapin gerek ismi. Ya 11 sayi , ya 32x4 karakter ya da 32x8 karakter olabilir.
Simdide bir rnege bakalim;
FONT`adventure_font ~adventure.pcx ; //Iont iin adventure.pcx dosyasi kullanilir.
Hersey iyi gzelde bitmap nedir? Eger bitmap Iontu kulanirsaniz bir alpha kanalinin zerine kendi izdiginiz
karakterlerden olusan resim kullanmalisiniz. Hazirladiginiz Iontun alIanmerik karakterleri mutlaka scripte uymak
zorundadir. Asagida bir rnek bulunmaktadir;
her satirda 32 karakter olmali. Bunu 4 ile arparsam 32x4 128 karakter ve yahutta 8 satir olursa 32x8 256 karakter
olmalidir. Eger harIleri kullanmak istemezseniz kk bir bitmapda kullanabilirsiniz. rnegin asagidaki rnete 1 satirda
11 karakter vardir.
NEMLI NOT! Bu rneklerdeki (11 , 128 ve yahutta 256 tane karakter) degerler karakte byklgne gre degisir.
Eger 10x20 piksel byklgnde karakterlere sahip olan bir Iont yapmayi dsnyorsaniz ve 4 satirda satir basina 28
karater olarak dsnyorsaniz sizin bitmapiniz byklg 320x80 piksel olacaktir anladiniz mi? Eger bu kurala
uymazsaniz bitmap Iont olusturmada byk Iacia yasarsiniz.
Bitmap Iont hazirlamak biraz zor degil mi? Bitmap Iont yapmaya baslamadan nce CONTIEC'in download kisminda
Iont generator programini bulabilirsiniz. Iontun ismini ve byklgn setikten sonra generate islemi otomatik olarak
Iontu olusturacaktir.
Iki tip Iontun artilarina ve eksilerine bir bakalim
FONT OLUSTURMA ARTI EKS DGER
True type Ihtiya yok Degisken genislik tekrenk Sadece windowsta
ykl Iontlari
kullanabiliriz
Bitmap Zaman kaybi Degisik renkler Sabit genislik Her trl sekil
sembolleri
kullanabiliriz sadece
hayal gc ile sinirli.
Ama hangi tip Iontu kullanacaksiniz. True Ya da bitmap Iont? Eger pcnizde ykl ise true type Iont harika oluyor. teki
taraItan bitmaplar her pcde gsterilebilir nk sizoyuna bu Iontu eklemeis olacaksiniz.
Hadi simdi bu Iontalrin hangisi gzel grnyo bir bakalim ve hangi Iont tipini kullanacagimzi seelim. Bana gre
ikisinide ayni projede kullanamak daha mantikli gibi geliyor.
Simdi script07_2.c yi aalim ve neler varmis bir bakalim.

ACKNEXTURK
////////////////////////////////////////////////////////////////////
#include acknex.h~
#include deIault.c~
////////////////////////////////////////////////////////////////////
STRING* teststr "I like to write programs!";
FONT* systemIont "system.pcx"; //sabit genislik. Her karakter 10x12 piksel
FONT* arialIont "Arial#25b"; // True Type, Arial, boyut 25, kalin
TEXT* Iixedwidthtxt

posx 200;
posy 250;
Iont systemIont;
string(teststr);
Ilags VISIBLE;
}
TEXT* truetypetxt

posx 200;
posy 280;
Iont arialIont;
string(teststr);
Ilags VISIBLE;
}
////////////////////////////////////////////////////////////////////
Iunction main()

videomode 7;
screencolor.blue 150;
}
////////////////////////////////////////////////////////////////////
Bu script iki Iakli Iont tanimi ieriyor. Ve bu Iarkli Iontlari ayni yaziya test_str uyguluyoruz. Script072.cyi
alistiralim.
Bu bitmap olayinin tam inandirici olmadigini dsnyorum. Workshop7 klasrnn iindeki system.pcx resmini
inceleyebilirsiniz.
Iste bu bitmap system.pcx oluyor ve karakterleri bu bitmap ile yazdik.

ACKNEXTURK
Daha nceden de dedigimiz gibi motor karakter yerlerinde ne oldugunu dsnmez.sadece o karakteri ekrana basar.
Asagidaki resim Alain Brgeon'un multiplayer workshoplarinda kullanilmistir. ACKNEXUNLIMITED dan
indirebilirsiniz.
Eger bu Iontun ismi icons.bmp olsaydi durum syle olurdu;
FONT`icons_font ~icons.bmp;
bu Iontu kullanan bir panel tanimlayalim;
PANEL bir_panel

pos_x 0;
pos_y 0;
digits (410,200,1,icons_font,1,picture);
flags OVERLAY [ SHOW;
]
eger picture degiskeninin degeri 2 olsaydi beyaz roket, 3 olsaydi kalp , 4 olsaydi kirmizi roket olacakti. Byle devam
eder gider.
Kk bir soruya hazirmisiniz? Son rnegimizdeki teststr'lerin Iontlari motor alistiktan 3 saniye sonra degissin yani;
3 saniye sonra ;
sorunun cevabi ok basit tabikide... main Ionksiyonuna 3 tane satir ekleyecegiz!
Function main()

......
wait(-3);
Iixedwidthtxt.Iont arialIont;//2 yazi iin Iontlari degistir
truetypetxt.Iont systemIont;
}
DERS SONU

ACKNEXTURK
3B Koordinatlar (Pozisyon, a ve uzatma)
Eger srekli kod yazmakran sikildiysaniz sizin ii gzel Lir haLerim var, Lu dersre sadece Llm ykleme kodu
olacak. Bu dersimizde oLjelerin 3B Dnyadaki pozisyonu, ailari ve uzama mikrarlari hakkinda Lilgilenecegiz.
Yalniz Lu ders iin A7 Exrra ve zeri Lir srme ihriya vardir. nk rek Laina Lire-c free World Edir (WED)
Larindirmaz. Ama eger elinizde yoksa sadece okuyun 3B koordinarlar hakkinda Lilgi sahiLi olmu olursunuz.
Fekala, Workshop8 klasrnn iindeki vork08.vmp'yi aalim.
Sade plana sahip Lir oda gryoruz. Daha gzel grnmesi iin, Build Luronuna riklayip, nmze gelen
ekranda OK a Lasip Luild errikren sonra Run deyip Llmmz aliririyoruz.
ok da kr grnmyor degil mi! Feki Lu Llm hakkinda Liraz daha Lilgi almaya ne dersiniz!
Eger Llm pozisyon kodu yazmadan Lalarirsaniz, moror, oyunu her aliririnizda (0,0,0) koordinarlarina
yerleecekrir. $imdi Llm aliirken F11 ruuna Lasalim ve degiiklikleri grelim.

ACKNEXTURK
Ilk kolon ekran znrlgn gsreriyor.(800x600). FFS (frame rare per second) degeri olduka yksek nk
oyunu aliriran Lilgisayar orralama seviyede ve saniyede renderlenen poligon sayisi 204K (204.000).
x,y,z,pan,roll,rilr ifadeleri ise kamera koordinarlari ve Lu kameranin ai degerlerini gsreriyor. imdi 0 ruuna Lasin
ve klavyenin yn (oklar) rularini kullanarak kamerayi odanin iinde harekerlendirin. Ben kamerayi Lir kisim
hareker errirdim ve ire sonu,
Lu kammera pozisyonu daha iyi nk odayi daha geni aidan gryor. Dikkar ederseniz Liraz nce Lahserrigimiz
ai ve koordinar degerleri degiri. Feki odamiza ekleyecegimiz Lir oLjenin koordinarlarinin isredigimiz giLi
oldugunu nasil anlayacagiz! Aagidaki resme Lir Lakalim.

ACKNEXTURK
TOF(ST) ekranindan y ve z eksenleri ynnde cismin pozisyonunu degirireLilirken, SIDE(YAN) ve
BACK(ARKA) ekranlarinda ayni zamanda z ekseni ynndede degirirme yapaLiliyoruz. Buna alimak gerek
nk Lunu kullanmak zorundayiz.
WED de Llmmzde Lulunan Lir Lloga sag riklayip properriesi seelim. Sol alrra o Llogun properries ekrani
gelecek. Ordaki sekmelerden posirion kismina riklayalim.
World posirion kisminda WED edirre gre x,y,z koordinarlarini gsrerir. Bu ne demek! Wed edirrn kendi
koordinar sisremindeki pozisyonu. Local posirion kismini aarsak, posirion kismi oLjenin gruLa gre pozisyonuu
olur. Rorare kisminda ki ailar ise EULER AILARIDIR. Euler ailarina Lakalim,
Fan ve rilr aisi roll aisi
aik yeil olan yerler koordinarlar.Lu dnler uagi merkezinden dndryor. Yani kendi ekseni errafinda. Hadi
imdi Lu uagi Llmmze ekleyelim. Bunu yapmak iin TOF ekraninda saga riklayalim ve add add model
yolunu izleyerek mig.mdl'i ekleyelim. (Dikkar! Bizim ekleyecegimiz model vorkshop klasrnde oldugu iin yani
WED dosyasiyla ayni klasrde oldugu iin mig.mdl grnyor. Ayni yerde degilse grnmez. Eger ekleyeceginiz
model ayni klasrde degilse srreki arauLugundan oLjecr load enriry kismindan ekleyeceginiz modelin dizinine
gideLilirsiniz.)

ACKNEXTURK
Lenim uak odaya Liraz kk kari. Sizde Lyk gelmire olaLilir ancak Lyk ihrimalle sizdede kk gelecekrir.
Uagimizi LylreLilmek iin iki rane edirleme roolu Lizim iimize yarar. Edir Lox ve Scale ancak Lunlari
kullanmadan da yani deger vererekre Lu iremi yapaLilecegimiz yer var neresi ! TaLiki de oLjecr properries.
Local posirions kisminda Scale degerini ykselrirseniz uagin Loyu arracak klrrseniz uagin Loyuru azalacakrir.
Dikkar Lu Loyur degiimi dzenli olacakrir. Yani uak deforme olmadan ekil degirirecekrir.
Son olarak Llmmz resr ermek iin Workshop08 klasrnden scripr08.cyi aip hi ellemeden resr run
diyeLilirsiniz.
DERS SONU

ACKNEXTURK
Enriries (Cisimler,varliklar)
Enriryler Llmlerinize ekleyeceginiz 3B oLjelerdir. 4 rip enriry vardir. Modeller, Resimler(Sprire),Harira enriryleri
ve Terrain(arazi) enriryleri. Manualde enriryler hakkinda derayli Lilgi LulaLilirsiniz. Bu vorkshopra kullanimlari
hakkinda ufak ipulari verilecekrir.
Model enriryler
Modeller, Bazi 3L yazilimlarda rasarlanan (3DS MAX(AUTODESK),MAYA(AUTODESK) vL...) ve iinde
animasyon , kaplama depo edecilen gamesrudio iin mdl formarinda olmasi gereken enrirylerdir. Modellere zel
karakrerler iin ihriyacimiz vardir. (dman,lamLa vL)
eger para kazanmaya ynelik Lir oyun rasarladiysaniz, poligon sayisini dikkare almaniz gerekir. Eger her
karakreriniz Linlerce poligon rairsa ok hizli Lir Lilgisayara ihriyaciniz var demekrir. Hadi sizin paraniz var ve iyi
de Lir Lilgisayara sahipsiniz, peki ya mreriler! Sizin oyununuzu alirirmak iin yeni Lir Lilgisayar mi alacaklar!
Hi sanmiyorum. Eger dnyayi sallayacak oyununuz yoksa kimse Lyle Lir ey yapmaz.
Eger gerekren para kazanmak isriyorsaniz oyununuzu ok iyi planlamaniz gerek. Ne kadar canavar ayni anda
grnecek! kullanacagim agalar 2d resim mi olmali vL.....
dnyadaki Lir ok insanin yava Lilgisayari var. geri u anda ok ucuza 4 ekirdeklii 4gL ramli Lilgisayar
alinaLiliyor ama neyse. Biz yle kaLul edelim. Fekala imdi Lir srrareji oyunu yapiyorum ve oyunun orralama her
Lilgisayarda alimasi iin Lir Llmde maksimum 200.000 poligon (hadi rekrar syleyelim)a ihriyacim var.
hariramda 250 rane Lirim olacak. Buda 250 model demek. O zaman 200.000/250 = 800 rane poligonu rek Lir
modele uygulayacagim. Anladiniz mi! TaLi her modelin ayni poligon alcagini varsayarasak Lyle.
Folgion sayisini olaLildigince dk rurmak her zaman iin en dogru fikirdir. aagidaki resme Lir Lakalim.
Iki askerde gzel grnyor. Ancak sagdaki modelin poligon sayisi soldakinden 250 rane daha az. Bu az poligon
sayisi Lize 200.000 poligon roplaminda ram 307 model gsrermeme izin veriyor.
NEMLI NOT: normalde modellere frame rare'e Lagli olarak ekranda grlr. (FFS) eger sizin 300 rane
dmaniniz var ancak ekranda ayni anda 10 rane dman gryorsaniz endielenmeyin, moror frame rare'i yksek
rurmak iin ekranda 10 rane model gsrermek gerekrigini dnr.
Herkes ok yksek poligon sayisna sahip model yapaLilir ancak gerek modelci olaLilecek en dk poligon
sayisinda en iyi grnme sahip modeli yapandir.lrfen harirlayin Lir oyunda sadece karakrerler Lilgisayarin
kaynaklarini kullanmaz. ElLerre Laka eylerde hafiza yiyecekrir. Iyi haLer AUM da oyununuzu nasil oprimize
edeceginiz hakkinda pek ok makale ve kod rnekleri LulaLilirsiniz!

ACKNEXTURK
Fekala imdi MED edirrde Lir model aip file model properries kismina ulaalim. Modeldeki poligon sayisi
numLer of faces kisminda yazmakradir.
Sprire enriryler
Sprire'lar Lir resim programi rarafindan yapilmi 2L resimlerden Laka Lir ey degildir. Bunlar 3L oLjeler degildir
sadece kagir giLi resimlerdir. Bunalr paneller, iarerler ve Lazi zel efekrler iin kullanilir. Bunlari Lazi sahre 3d
oLjeler iinde kulllanLiliriz. imler,aliliar, agalar vL .....
kullandiginiz resim programinda (FHOTOSHOFADOBE) Lir resim yapin ve onu pcx,Lmp,rga Ya da dds olarak
kaydedin.dikkar edin kayderriginiz yer leveliniz ile ayni yer olsun. WED edirrde herhangi Lir grnm ekranina
sag riklayip add add sprire yolunu izlediginizde aagidaki giLi Lir grnr olumali.
Her sprire saydam kisimlara sahip olaLilir. Bunu daha nceden de anlarmirik alfa kanallari sayesinde yapiyoruz.
Alfa kanalai RGB = 0,0,0 odlugu Llmdr. Aagidaki resmin Llmde nasil durduguna Lir Lakalim.

ACKNEXTURK
Eger oyuncu o duvarin zerine ziplyamayacaksa normal Lir 3L oLje kullanmanin HiLir manrigi yok. Sprire'da ayni
ilevi daha az hafiza harcayarak grecekrir. Sprirelar aagidaki yollarla Llme yklenirler.
Ynelimli Sprirelar duvara izilmi resim giLidirler.
Eger Lir ynelimli sprire'in errafinda dnerseniz sadece 2d oLje greceksiniz. Bunlar duvar sirami kan, veya
duvara izilmi eyler iin kullanilirlar.
Yz srekli oyuncuya dnen sprire'lar.
Bunlar sahre 3L oLjeler iin idealdir. Ayrica Lunlar srandard sprirelardir. Ne kadar erraflarinda dnerseniz dnn
yz hep size dogru olacakrir.
Yz srekli oyuncuya dnen sprire(srandarr) nasil yapilir! Cevap ok Lasir herhangi Lir grnm ekranina sag
riklayip add add sprire yolunu izleyerek eklediginiz her sprire srandarr sprirerir.
Feki ynelimli sprirelari nasil ekleyecegiz! Sprireimizi normal olarak ykledikren sonra properries kismindan
posirions local posirionsu aip aisini degiririyoruz. 0,0,0 ailari srandarr sprirelar iin kullanir.murlaka
sprireiniza Lir ai verin.eger 0,0,0 aisinda olmasini isriyorsaniz ynelimli sprireinizin ainin Lirini 0.001 yapip
degirireLilirsiniz.

ACKNEXTURK
Harira enriryleri
harira enriryleri WED edirrde hazirlanmi , kari ve vmL uzanrisi eklinde kayirli geomerrik 3B oLjelerdir. Map
enriryleri kapilar,duvarlar, hareker edeLilir ve yok olaLilir oLjeler olarak level parasi eklinde kullanilaLilirler.
Ancak Lunlar derlenmi Llmden Lalka Bir ey Lizlere sunmazlar. Eger mororun alimasi esnasinda Loyu ekil
vL. GiLi degiimler uygulamak isriyorsak modeller , sprirelar Lizim iin daha uygun olur. Bir map enriry
olururmak iin WED edirr aip cismimizi WED edirrn imkanlari dahilinde hazirlayip vmp olarak
kaydedeLiliriz. 3DGS:\prefaLs klasrnde pek ok hazir vmL dosyasi LulaLilirsiniz.
Arazi enriryleri
Arazi enriryleri MED de hazirlanan ve Lir kaplama ile kaplanmi Lir sr poligondan oluan 3B oLjelerdir.

ACKNEXTURK
Bu kaplama arazi iin yollar imenler, kayaar iereLilir. Hadi imdi yukaridaki hariranin kaplama ile kaplanmi
haline Lir Lakalim.
Bu resim MED edirrden alinmirir. Harira u andaki haliyle oyun oynamak iin uygun duruyor. Ve nceki
halinden ok daha gzel.
Arazileri MED edirrn MAGNET aracini kullanarak veya Laka Lir programda hazirlanmi heighr map kullanarak
olururaLilirsiniz. Heighr map gri ronlamaya sahip Lir resimdir aagida rnegi mevcurrur.
Bu resim MED edirrde arazi enrirysine dnrrld. koyu kisimlar alak aik kisimlar ise yksek yerleri
gsreriyor.
Araziler .hmp olarak kaydedilirler. Ancak mororun Lrn versiyonlari iin kullanilamazlar. WED edirrde level
Lloklari kullanarakra arazi olururaLilirsiniz. Aagida rnegi mevcur.

ACKNEXTURK
WED edirrn help kisminda Lu enrirylerin olururulmasi hakkinda derayli Lilgiye ulaaLilirsiniz. Bizim
gsrerdigimiz merodlar Lunlardan Lirkai oluyor.
Levele Lir enriry ekleme ilemi herhangi Lir grnm ekranina sag riklayip aagidaki resimdeki yollari izleyince
yapiliyor.

ACKNEXTURK
Feki Scripr yazarken ekleme nasil olacak! enr_creare ifadesi Lizim iin Liilmi kafran oluyor.
enr_creare(machera_mdl,remp,srarr_machera),// macherayi olururur.
Buradaki machera_mdl ENTITY poinreri ile isimlendirilmi Lir modeldir. $yle yani,
ENTITY' machera_mdl _
[
rype = machera.mdl",
layer = 10,
viev = camera,
x = 20,
y= 10,
z=-15,
]
kodu aiklamak yerine nasil alirigini gsrermek isriyorum. nk kod karmaik degil aliiksiniz arrik.
Neden WED de olururdugumuz Llme sonradan enriry eklemek isreriz. Mesela kurunlar. Siz areleme ruuna
Lasriginizda olumasini isriyoruz. Ire Lu rr durumlar iin scriprimize enr_creare ifadesi eklemek en manriklisi.
Enriryler enriry ranimi ile olururulurlar. Bunlarin kendilerine zg zellikleri vardir. Flayer rarafindan
grleLilirler ancak ram olarak 3d dnya iin ayni ey geerli degildir. Bu enriryler 3L model olaLilirler ancak asla
levelde Lulunan Laka eye arpip, dokunmazlar. Bu zellikle cisim asla duvarin iine girmeecekrir. Bu da Lizim
iin arri Lir zellik.
Bu vorkshopu Liririrken son Lir raLlo gsrermek isriyorum .Lu raLloyu okuyun ki hangi enriry'i ne iin
kullanaaginizi iyi sein. Yeil uygun kirmizi uygun degil demek.
ENTITY MODEL SFRITE MAF TERRAIN
Dosya formari
mdl Fcx,Lmp,rga vmL hmp
Yapildigi program
med Resim programi WED MED
Karakrerler iin uygun
(akrr vL)
Aralar iin uygun(oro,
rank)
Ekolojik canlilar (aga ,
ali)
Kapilar, asansrler iin
uygun
Silahlar iin uygun
zel efekrler iin uygun
YikilaLilir oLjeler iin
uygun
Hareker edeLilir
dneLilir
Boyuru degieLilir

ACKNEXTURK
ACTONLAR
action bir entitye baglanabilen bir Ionksiyondur. Bu entity, oyuncu, kapi, asansr vb. Pek ok sey olabilir. Bu entityler
Spritelar, Harita entityleri, Araziler(terrain) veya modeller olabilir. Actionlari program olmadan WED de behaviour
dedigimiz panelle kontrol etmeyi de grenecegiz.
Pekala hadi baslayalim. Entitylere actionlari iki sekilde baglayabiliriz. Programlama veya WED de bulunan behaviour
paneli.(geri behaviour paneline action eklemek iin kodlama yapmak gerek.)
ekleme yntemi; ilk nce script dosyamizin iine gerekli scriptleri yazip sonuna .c uzantisi olacak sekilde kaydediyoruz.
rnegin machera.c. Ancak dikkat edelim kaydettigimiz yer level'imizle ayni klasrde olmali. Kaydettikten sonra WED
de Iile ~ map properties kismini aiyoruz.

bu blmden ortadaki yildizli kagit butonuna tiklayip kaydettigimiz scripti projemize ekliyoruz. Sonra WED de
ekledigimiz karaktere sag tiklayip behaviour paneline tikliyoruz. Kodumuza yazdigimiz actionlar orada asagidaki
resimdeki gibi grnecektir.
Tabi wedde action eklemek kolay ama action kodlarini nasil yazacagiz? Iste bunun iin kainilmaz yolumuz olan
actionlarin nasil yazilidgini grenme vakti geldi. Hadi baslayalim.
action say ekle()

a+b 5;
]
function say ekle()

a+b 5;
]
actionlar ile Ionksiyonlar olduka benzerler. Aralarinda sadece 3 Iark var. birinicisi bir Ionksiyon bir deger dndrebilir
ancak aactionlar deger dndremezler. Ikinci Iark action WED de behaviour panelinde grnp entitye eklenebilirken
Ionksiyonlar bu islevleri gereklestiremez. n Iark action entitye baglanirsa oyun alistirildiginda otomatik olarak
alisir. Ama Ionksiyonun alismasi iin agirilmaya ihtiyaci vardir. Bu da bizim istedigimiz zaman agirilmasina olanak
verir.
Bir entityi kontrol etmek istediginizde mutlaka action kullanin. Ve entitylerle alakadar olmak istemiyorsaniz Iuntion
kullanin. (yukaridaki rnek iki sayinin toplanmasi)
hazirmisiniz? Workshop10 klasrnn iindeki script10.c'yi aalim.
///////////////////////////////////////////////////////////////////////////////////
#include acknex.h~
#include deIault.c~
///////////////////////////////////////////////////////////////////////////////////
action rotateplane()

ACKNEXTURK

while (1)

my.pan my.pan 0.1;


wait (1);
}
}
Iunction main()

videomode 7;
levelload ("work10.wmb");
vecset(camera.x,vector(-500, 0, 100)); // kamerayi x -500, y 0 ve z 100 koordinatlarina yerlestir.
}
Ve scripti alistiralim.
Uak dnyor! 8. workshoptan hatirlarsaniz uak pan aisini degistirerek dnyor.
Kodun bazi blmleri ok kolay. Zaten zerindede pek ok kez aiklama yaptigimiz kodlar bunlar. Hadi dikkat etmemiz
gereken blmlerden biri olan main Ionksiyonuna bir bakalim.
function main()

video_mode 7;
level_load ("work10.wmb");
vec_set(camera.x,vector(-500, 0, 100));
]
yine 8. workshoptaki hangar levelini ykledik arkadaslar. Ilk kodumuzda baslangi video znrlgn ayarladik.Iakat
bu seIere oturup levelin yklenmesini seyretmeyecegiz. nk level 2 boyuttan 3 boyuta gidermis gibi ykleniyor. Bir
ok Ionksiyonu birden dzenlememiz gerekebilir.
Main Ionksiyonun son kodunda kameranin pozisyonunu x -500, y 0, ve z 100 koordinatlarinda belirliyoruz.
Burada vec_set iIadesini kullaniyoruz. vecset camera.x degerini vector iIadesini iindeki x,y,z koordinatlarina
esitliyor. (Nokta methodu gibi) vecset le yazdigim bu kodu vecset kullanmadan asagidaki gibide yazabilirdim.
camera.x -500;
camera.y 0;
camera.z 100;
ve bu sekildede alisacakti. Burada ltIen dikkat edin bu rnekte sadece camera.x kullaniyoruz. vecset camera.x
degerini vektre kopyalarken vector parantezleri iine camera.y, camera.z olarak kopyaliyor. Degisiklikleri anlamak
iin camera.x ', camera.y olarak Ialan degistirin. vecsetin basit iIadesini iki vektr birbirine esitlemek olarak
syleyebiliriz.

ACKNEXTURK
Hadi simdi uagimiza baglanmis actionu inceleyelim.
action rotate_plane()

while (1)

my.pan my.pan + 0.1;


wait (1);
]
]
simdi bu kisa , ama grenmek iin baslayalim. While(1) nedir? Bazi Ionksiyonlar ve actionlar'in oyun uygulamalarinda
srekli periyod boyunca alismasi gerekebilir. Bazilarininda atiyorum oyun aildiginda direk kapanmasi gerekebilir. Iste
while(1) burada srekli periyodu sagliyor. Yani bu uak sonsuza dek dnecek anlamina geliyor.
While bir kosul dngsdr. Yani kosul sinama degimi dogru olduka dng devam eder.. Asagidaki yazima bir
bakalim.
while(loyul snama degimi)

// kyeli parantezlerin iindeki ifadeleri tekrar et.


]
while(1) dngsnde 1 1 oldugu iin her zaman dogrudur. Srekli kosul saglandigi iin while iindeki iIadeler
sonsuza dek alisacaktir.Bir de asagidaki rnege bakalim;
var n -5;
while(n ! 0)

n + 5;
]
burada da n sayisi 0 oluncaya kadar dngye devam et diyor. Ilk basta tanimladigimiz n degiskeni -5 degerine
sahipti.dngde ise bu deger 5 artirilacak ve dngnn kosulu da n sayisinin 0 olana kadar dnmeye devam etmesiydi.
Ancak dngde n sayisi direk 5 artirildigi iin dng duracaktir.
Neyse biz kendi while kismimiza dnersek my.pan my.pan + 0.1; iIadesi bizim pan aimizi 0.1 derece artir anlamina
geliyor. E dngde srekli dogru olacagina gre uagin pan aisi srekli artacaktir. Burada dikkatinizi ekmek istedigim
nokta bu iIadeyi my.pan +0.1;olarak ta yazabilirsiniz.
Peki wait(1); iIadesi nedir? Bu iIade dng gereklesirken motorun 1 Irame beklemesini ve alisan sistemi gvence
altina almasini sagliyor . Her while(1) blogunun son satirina wait(1); eklenmek ZORUNDADIR.
Wait, multitasking
hi multitasking diye bir sey duydunuz mu? Multitasking ayni anda bir ok uygulamayi alistirabilme zelligidir. Yani
siz bu workshopu okurken ayni anda youtube'dan mzik dinliyor, msn'den chat yapabiliyorsaniz bu multitasking
sayesinde olur.
Iste ayni sey while iinde geerli. Motoru alistirdiginizda while kismi hi durmayip dnecek, dnecek dnecek ve yle
bir an gelecekki windows bu uygulamayi dndremeyecek yani gncelleyemeyecek, bunun sonucunda motor da
donacak.
Peki windowsun neIes almasi iin biz bu while dngsn nasil duraklatacagiz? ok basit sadece dngmzn sonuna
wait(1); iIadesi ekleyecegiz.
Hadi biraz da Irame ve Irame rate'lerden konusalim. Siz oyun oynarken bilgisayarinizda hizla geen resimlerden baska
bir sey grmezsiniz. Eger bilgisayariniz saniyede 50 Irame gsterebiliyorsa sizin Irame rate'iniz 50 FPS olur.iste wait
iIadesi PC saniyede 50 resim gsterdiginde dngnn duraklayip tekrar baslamasina olanak verir.
Burada saka yok arkadaslar. Eger while iIadesinin iine wait(1); yazmazsaniz motor kecektir. Ve
CTRLALTDELETE kombinasyonu ile programi sonlandir yapmak zorunda kalacaksiniz.

ACKNEXTURK
Zaman kullanm
oyununuzu alacak oyun severlerin bilgisayarlarinin Iarkli Iarkli odugunu biliyorsunuz. Iste bu yzden oyuununuz her
bilgisayarda Iarkli Irame rate oraninda alisacaktir. Peki bu size nasil bir sikinti getirecek? Hadi simdi ok yavas bir
bilgisayari simule ederek oyunumuzu alistiralim. Bunun iin main Ionksiyonuna asagidaki gibi bir kod eklemesi
yapiyoruz.
Function main()

fps_max 20;
video_mode 7;
level_load (~work10.wmb);
.....
Ipsmax 20; kodu bizim Irame rate oranini 20'ye sabitliyor. Akici Irame rate siniri 50 Ips dir. Simdi bu kodu alistirin
ve uagin ne kadar yavas dndgne bakin!
Oyun aikken tab tusuna basalim ve fps_max 60; yazalim ve entere basalim. Uagin dns hizlandi! Benim
bilgisayarimda 20 Ips'de 100 saniyede tam dns yaparken , Ips 60 olunca bu sre 30 saniyeye dst. Genelde
msterilerinizin bilgisayarlari yavas olacak ve oyununuz benzer Irame rate oranlarinda alisacaktir. Ama unutmayin
onlarin paralarida Iazla olmayacak . Peki biz onlari nasil memnun edecegiz?
Iste altin kural!: oyununuz en donanimli bilgisayarda ok iyi alisirken ortalama bir bilgisayardada makul bir
perIormansla alismali. Conitecin lite-c sinden iyi bir ikarmis olabilirsiniz ancak bu is ogu ekran kartindada
alistigindan emin olmalisiniz.peki bunun iin neler yapabiliriz bir bakalim.
-yeni nesil bir ekran karti'nin reklamini yaparak oyununuzu satabilirisiniz. Eger oyununuz ok satarsa ekran karti
reticisi size ykl bir miktar para deyebilir.(RN: HalI LiIe 2 Valve ile ATI)
-veya 2010 yilinda ikacak bir bilgisayara gre oyununuzu hazirlayabilirsiniz. Oyunun kutusuna 2010 yili geldiginde
ona gre sistem gereksinimleri yazabilirsiniz.
Pekala hadi rnegimize dnelim. Frame rate hizli ve yavas bilgisayarlarda Iark edecek ve uagimizin dns hizi Iarkli
donanimdaki bilgisayarlarda Iarkli olcak. Bunun iin Irame rate'i dsk tutmaya kalkissak (rn: 20 Ips) bu seIede hizli
bilgisayarlar iin durum kt olacak. Yksek tutsak hizli bilgisayarda iyi dsk bilgisayarda yavas alisacak yine
olmayacak.
Biz bu uagi Iarkli bilgisayarlarda ayni hizla nasil dndrecegiz?
Iste zm! Uagimizin acitonunda uIak bir dzenleme yapcagiz.
Action rotate_plane()

while(1)

my.pan my.pan + 2`time_step;


wait(1);
]
]
kodumuzu kaydedelim ve yeniden alistiralim. Dikkat edin uak kendi etraIinda 10 saniyede dnecek.
Pekala simdide main Ionksiyonundaki Ipsmax degerini 200 yapalim.
Himm . Uak yine kendi etraIinda 10 saniyede dnd. Biliyorum Ipsmax'i 20 den 200'e ikardim. Hadi bu seIer biraz
daha kasalim ve Ipsmax degerini 5 yapalim!.
Himm uak biraz kasintili dnyor nk Irame rate'i 5 yaptim. Ama yine de tam dns 10 saniyede gereklestiriyor.

ACKNEXTURK
Kodun bu yeni versiyonunda uagin dns hizi Irame rate'den etkilenmiyor. Istediginiz kadar Iarkli degerler yazin uak
yine ayni srede dnecektir. Peki timestep'deki gizem ne ? Nasil alisiyor?
timestep degiskeni son Iramein sresini saat tiklamalari(TICKS) seklinde bize veriyor. Saat tiklamasi dedigim sey de
ne? Saat tiklamasi bize 3b oyunlarin saniyede 16 Irame'le alismasindan kalan bir miras. Bir saat tiklamasi saniyenin
1/16'sina tekabul ediyor. Yani 0.0625 saniye Ya da 62.5 milisaniye!. Bu degeri acknex motoruyla zaman kullanirken
aklimizda tutmakta Iayda var. timestep ile Irame rate arasindaki baginti
time_step 16/fps
yani oyunda 16 kare gsterildiginde, Irame sresi 1 tick olmus oluyor. Yani timestep 1. iIt Irame rate'de (32 Ips) bu
kk saat tiklamasi degeri 0.5 oluyor. timestep'in Irame rate ile olan baglantisina dikkat edelim. Hadi simdi bizim
kodumuza bir bakalim.
my.pan my.pan + 2`time_step;
Ipsmax degerine 200 vermistik. Bu deger bizim uagin dns hizi iin nemli. Hesaplama yaparsak timestep deger
16/200 0.08 olacaktir. Uak 0 derece ai ile dnmeye baslarken aisi 2*0.08 0.16 derece her karede artacaktir.
Simdi dsnelim 1 saniyeye biz 200 degerini vermistik. O zaman uak saniyede 200*0.16 32 derece dnecektir.
Hatirlayalim bir tam dns 360 derece olduguna gre uak bir tam dns 360/32 11.25 saniyede tamamlayacaktir.
Hadi simdi Iarkli bir degere bakalim. Ipsmax degeri 5 olsun. 16/5 3.2. timestep 3.2 olacak. 2*3.2 6.4 bizim her
Irame deki ai artisi olacak. 5 Irame 1 saniye idi o zaman 5*6.4 32 derece olacak. uak 360/12 11.5 saniyede bir
tam tur atacak.
Eger bir bilgisayar oyununda bir seyi dndrmek, hareket ettirmek istiyorsaniz bu dns Ya da hareket hizini timestep
degeri ile arpamaniz gerekmektedir.asagidaki rnege bakalim;
action cismi_hareket()

while(1)

my.x + 1;
wait(1);
]]
my.x 1; kisa yazmindan bahsetmistik. Simdi biz onu my.x + 1`time_step; olarak degistiriyoruz. Bu tr rnekleri
ilerleyen derslerde greceksiniz.
Herneyse moveentity() actionuna dnelim. Ipsmax degerini ne yazarsak yazalim Iarkli bilgisayarlarda ayni sekilde
islevi gereklestirecek ancak sre ayni iken bilgisayarin gsterebildigi Irame rate oranina bagli olarak perIormans
degisecektir.
Gamestudio'da uzunluklar quant degeri ile llr. Peki 1 quant ka cm dir? Pekala, bu oyununuzun zelligine gre
degisir. Mesela bir Ips oyununda 1 quant 1 cm iken bir strateyi oyunununda metreler ile iIade edilebilir. Genellikle 1
quant 1 inch 2.54 cm denebilir.
Peki quant degeri Irame rate lere gre degisir mi? Eger timestep kullanirsaniz degismez. Asagidaki hesaba bakalim.
Bir pcde oyun 100 Ipsde alissin. Digerindede 25 Ips de.
16/25 0.64 timestep.1. pc
16/100 0.16 timestep.2.pc
uzaklik zaman x hiz.
Zaman 1 tamestep olsun.
1.pc iin; 1*0.64*25 16 quant 2.pc iin 1*016.100 16 quant. Bu da demek oluyor ki ayni timestep degerlerinde
ayni uzaklik olacagidir.
Biraz kaIaniz karismis olabilir. Ancak bir iki kere okudugunuzda daha iyi anlayacaksiniz. Su bir gerek eger my.z 2;
yerine artik my.z 2*timestep; yazmak zorunda oldugumuz. Zaten timestep ile ilgili pekok rnegi daha sonraki
workshoplarda greceksiniz.

ACKNEXTURK
PONTERS
Pointerlar bir objenin ismini saklarlar. Yani objeye zel isim verirler. aadaki
resimdeki gibi bir pong programn lite-c ile yapmak istiyorsunuz diyelim;
Soldaki cismi(hava diski desek olur) biz kontrol edeceiz. Sadakini ise bilgisayar
kontrol edecek ama sorun u ki biz bunu derleyiciye(SED editr) nasl
anlatacaz?
te burada pointera ihtiyacmz var. Bilgisayarn kullanaca objeye pointer ile
zel isim verebiliriz(ya da tanmlayabiliriz)
rnekler;
ENTITY* bilgisayar_hava_diski;
STRNG* oyun_ismi;
PANEL* oyun_bitti;
BMAP* can_resmi;
Ve en son olarak,
var * machera_sayisi;
Evet pointer tanmlamas objelerin tanmlanmas ile olduka benzer ama cismin
ierii olmadan. Kodumuza kk bir yldz * ekleyince pointermz hazr
demektir. Pointer herhangi bir objeye,stringe,panelvb uygulayabiliriz.
Pekala uygulamal olarak grmek iin workshop.11 den scrip11.cyi aalm.
Biri mavi dieri krmz iki tane model var. te imdi pointer farkn greceiz.
Tab tuuna basn ve wizard.x = 300; yazn.
Krmz olan ne kt, Neden? Nedeni pointer fark hadi imdi script11.c ye
bakalm.
////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c> klasik header dosyalar
////////////////////////////////////////////////////////////////////
ENTITY* wizard; pointerla wizard isminde entity tanmladk.
////////////////////////////////////////////////////////////////////
function main()
{
video_mode = 7;/ 800x600 video modu
level_load ("work11.wmb"); work.11.wmbyi level olarak ykle
}

action wizard_with_pointer() wizard_with_pointer isimli action wed
editrde behaviour ile cisme verilir.
{
wizard = me; wed editrde action verilen model wizard olacak.
my.ambient = 100; action verilen modelin yayd k 100 kuvvetinde
}

action wizard_simple() wizard_simple isimli action
{
my.ambient = 100; action verilen modelin yayd k 100 kuvvetinde
}

Evet arkadalar ilk satra bakacak olursak daha nceden belirttiimiz gibi
wizard isminde bir pointer tanmladk. Bu farkl bir isimde olabilirdi mesela
machera_oyuncuda diyebilirdik her ey bize bal.(tabi isim yazma kurallarna
bal kalarak) imdi wizard_with_pointer actionuna bakalm;
lk satrda wizard = me; demi. Bu ne demek? Me = ben demek. Yani wizard ben
olacam anlamna geliyor. Neticede actionu bir cisme uygulayacaz ki me kodu
wizard objesinin bu cismin olmasn sylyor. lk wizard pointer olarak
tanmladmzda hangi cismin wizard olaca belli deildi. Bir alttaki satrda
yazan my.ambient = 100; ise benim yaydm n 100 kuvvetinde olmas
gerektiini sylyor.burada my = ben demek. Aradaki fark daha iyi anlamak
iin;
Evet arkadalar krmz cismi wizard olarak tanlmamtk. Eer
wizard_with_pointer() actionunda my.ambient = 100; satrn silersek sadaki,
silmezsek soldaki gibi bir wizardla karlarsnz.
Sra geldi bir sonraki actiona yani mavi modele uyguladmz wizard_simple()
actionuna.
Bu action mavi iin uyguland ve iine wizard konulmad yani bu model wizard
olmayacak.bu arada arkadalar my bir pointer aracdr. Daha ncede belirttiim
gibi my = benim demektir.
zetle nasl pointer ekliyoruz?
ENTTY* my_girl; gibi bir pointer tanmlyoruz ve sonra istediimiz actiona
My_girl = my; gibi bir ekilde ekliyoruz.
hadi Biraz daha kurcalayalm. imdi main fonksiyonundan nce aadaki kodu
ekleyelim;
function move_up()
{
wizard.z += 5;
}
Move_up adnda bir fonksiyon tanmladk. Wizard.z += 5; wizard isimli cismi 5
birim yukar kar analmndadr. DKKAT! Eer eittir iaretinden nce art
yazmasaydk wizardn z koordinat eksenindeki deeri 5 olacak anlamna
geliyordu. Atyorum eski deeri 100 ise artrmak yerine 5 deerine wizard
yerletirecekti.
imdi main fonksiyonun iine en alta on_u = move_up; kodunu yerletirelim. Bu
kodun anlam oyuncu u tuuna basarsa move_up fonksiyonunu aktif et demektir.
DKKAT! Move_up yazarken sonuna () parantezleri koymadk dikkat edin.
Orada tanmlamyoruz sadece u tuuna basldnda bunu uygula diyoruz. Evet
bunlar da ekleyince kodun son hali
//////////////////////////////////////////////////
ENTITY* wizard;
//////////////////////////////////////////////////
function move_up()
{
wizard.z += 5;
}
function main()
{
video_mode = 7;
level_load ("work11.wmb");
on_u = move_up;
}
action wizard_with_pointer()
{
wizard = me;
my.ambient = 100;
}
action wizard_simple()
{
my.ambient = 100;
}

Olmaldr. Bu derste bitti arkadalar. Herkese iyi oyunlar!!!!
MACHERA
F ELSE BRANCHNG (EER EER YLE DELSE AILIMI)
Eer benim notlarmn ortalamas 70 den yukar ise;
1. bu sene tatil yapabilirim. Yok eer 70in altnda ise;
2. bu sene evde ders alacam.
Bu 3 cmle if else branchinge gzel bir rnek arkadalar hadi imdi bunu koda
dkelim.
if(not_ortalamas > 70) // ortalamam 70den yukar ise
{
Tatil_yap();
}
Else // eer deilse yani 70in altnda ise
{
Evde_ders_calis();
}
yukardaki koddan da anlalaca zere bir ifadenin deiik durumlara gre
verecei tepkileri derleyiciye anlatmak iin if-else branching olduka sk
kullanlmaktadr. Bunu her ey iin kullanabilirisiniz.
YAZILIMI;
f(bir eyler doru)
// yazlan komutlar 1 satr ise parantez konmaz
Else
//yine tek satr ise parantez yok
Ancak;
f(bir eyler doru)
{
Yazlan komutlar Birden fazla satr ise { konur.
}
Else
{
Yazlan komutlar Birden fazla satr ise { konur.
}
Else anlayacanz zere if de doru olann olmamas ya da yanl olmas
durumu.
Pekala imdi ksaca bir zet geelim if- else olduka basit nk;
1. if yaznca ( ) parantez iinde doru olan durumu yazarz
2. { } parantezlerin aras(birden fazla satr ise) doru ya da yanl olan
durum olunca ne olacan yazarz.
3. eer bu durumdan farkl ya da yanl bir durum yoksa else yazmayz!!!
4. eer tam tersi varsa else ile birden fazla satrda yazlacaksa {} ile yazarz.
5. else parantez () konmaz.
Evet arkadalar artk rendik. Hadi imdi workshop12 den script12.c yi aalm
ve kodu incelemeye balayalm.
////////////////////////////////////////////////////////////////////
var weight = 300;
STRING* fluffy_str = "Fluffy!";
STRING* skinny_str = "Skinny!";
////////////////////////////////////////////////////////////////////
TEXT* weight_txt =
{
pos_x = 300;
pos_y = 230;
flags = SHOW;
}
/////////////////////////////////////////////////////////////////////
function main()
{
video_mode = 7; //
screen_color.blue = 1; //
while (1)
{
if (weight > 200)
(weight_txt.pstring)[0] = fluffy_str;
else
(weight_txt.pstring)[0] = skinny_str;
wait (1);
}
}
Kod kark deil. Weight isimli var tipinde bir deiken tanmladk ve deerine
balang olarak 300 dedik.birde yine pointerla weight_txt tanmladk.
Pozisyonunu ve alaca flag belirledik. 2 tane STRNG tanmadk (pointerla)
Fluffy! , Skinny! ve bu yazlar bir fontla ekranda gsteriyoruz. Kodun ilgin.
Olan ksm main fonksiyonunda while(1) ile balayan ksm.
While(1) in anlam udur 1 olduu srece aadaki {} parantezler arasndaki
durumu gerekletir.
Tabi while fonksiyonunu durdurmak gerekiyor. Yoksa sonsuza kadar gider oyun
motorunu tkayabilir. Onun iin wait(1); yazyoruz.
Biz asl iimiz olan if else bakacak olursak
if (weight > 200)
(weight_txt.pstring)[0] = fluffy_str;
else
(weight_txt.pstring)[0] = skinny_str;
Anlam u;
Eer weight 200 den bykse nokta metoduyla weight_txti fluffy_str olarak
gster. ancak weight 200 den byk deilse weight_txti skinny_str olarak gster.
Dikkatinizi ekerim if dede else dede tek satr kod olduu iin {} parantezler
kullanmadk.
Tahmin ettiinizi dnyorum, pstring bir yaz aracdr. Yazlar nokta metodu
ile ekranda gstermeye yarar. (weight_txt.pstring)[0] bu bizim ilk sringinimize
eriir. (weight_txt.pstring)[1] bu da yaznn ikinci stringine eriir ve devam
yazdka gelir. Daha ayrntls 7. workshopta. Genellikle tek stringle
"(some_txt.pstring)[0] = some_string;" kodunu kullanrz.
imdi scripti altralm;
Yukardaki yazy grdnz dimi? imdi tab tuuna basalm ve weight = 100;
yazalm. Ve entera basalm. Ne oldu aadaki yaz grnd dimi?
Neden byle oldu nk if else ksmnda wight in 200 den kk ve ya byk
olma durumlarnda ne olacan nceden yazmtk. Hadi biraz ekleme yapalm
koda;
f (weight > 200) den nce u kodu ekleyelim;
f (weight == 0)
sys_exit(NULL);
sadece bunu eklesek yeter. Anlam weight 0 olursa program kapat. Kodun son
hali yle grnmeli;
////////////////////////////////////////////////////////////////////
var weight = 300;
STRING* fluffy_str = "Fluffy!";
STRING* skinny_str = "Skinny!";
////////////////////////////////////////////////////////////////////
TEXT* weight_txt =
{
pos_x = 300;
pos_y = 230;
flags = SHOW;
}
/////////////////////////////////////////////////////////////////////
function main()
{
video_mode = 7; //
screen_color.blue = 1; //
while (1)
{
if(weight == 0)
sys_exit(NULL);
if (weight > 200)
(weight_txt.pstring)[0] = fluffy_str;
else
(weight_txt.pstring)[0] = skinny_str;
wait (1);
}
}
Bu kodu da ekleyip program altrp tab tuuna bas weight = 0; yazarsanz
program kapanr. Burada dikkatinizi ekmek istediim nokta else yazmadk yani
0 olmazsa ne olacak ksm. nk gerek yok tek bana if ile de yazlabilir.
Ancak bir nokta var. if(weight == 0) da == ne?
Lite-c ve dier programlama dillerinde operatrler vardr. Bunlar karlatrma
yaparlar. Yani onlara karlatrma operatr diyebiliriz. == anlam weight
0a eittir. Dir. Aada listesi var
DURUM OPERATR RNEK
ki ey birbirine eitse == f(a==b)
Biri tekinden bykse > f(a>b)
Biri tekinden byk
yada eitse
>= f(a>=b)
Biri tekinden kkse < f(a<b)
Biri tekiden kk ya
da eitse
<= f(a<=b)
Biri dierine eit deilse != f(a!=b)
rnekte if yazan ksmda while,for vb eylerde kullanlabilir. Sonu olarak!
DKKAT!
Eer if(weight = 0) yazsaydk kesinlikle yanl olacakt! Bu ok sk yaplan bir
hatadr doru olan
if(weight == 0) budur!!!!!
Son olarak biraz daha komplike bir if durumu yazarsak;
f((ali*veli)/mehmetin_yasi == cemrenin_evi*(haticenin_kopegi/2)) mesela bu da
komplike bir if durumudur.
Bu derste bu kadar arkadalar.
MACHERA!!!!
3
USNG THE KEYBOARD (KLAVYE KULLANIMI)
Yaplan oyunu bir ekilde kontrol etmek gerekir dimi? Bunun iin
fare,klavye,joystik,XBOX 360 gamepade, dualshock 3 game pad, wii mote.. vb.
ite gamestudioda bunlar yapmak iin ufak kodlar gerekir. Bu derste klavye
iin olanlardan bahsedeceim.
Pekala, 3 tip tu kontrol var birincisi ;
1. key_a, key_b, key_shift, key_space, key_pause, key_f1 vb. demek ki
tuumuzu nasl tanmlyoruz?
Key yazdktan sonra bir alt izgi ve sonra tuun ismi. te bu!
yi hota ben editrde bu tuun aktif olduunu nasl anlayacam?
if(key_a ==1)
{
Bla,bla,bla,bla ..
}
Yani A tuuna basnca ifte yazan iler olsun demek.
2. lite-c nin iinde her tuun bir says vardr. O saylar yazarak tuu tanmlarz
aadaki koda bakn;
30 == key_lastpressed; imdi bu kodda 30 says klavyede A tuuna basld
anlam veriyor. key_lastpressed bir fonksiyon ve A tuuna basarsak deeri 30
oluyor.
if(30 == key_lastpressed) // Aya baslrsa..
{
Bla,bla,bla,bla ..
}
Ancak bu yntem baz olaand sonular karabiliyor. rnein siz
basmasanzda programn srekli ayn tua baslyormu gibi tepki vermesi. Daha
detayl bilgi iin AUMa bakn.
3. if(key_a == 1) nn yapt ii yapan bir fonksiyon vardr. on_(tuun ismi).
Pekala bu nasl iliyor diyeceksiniz yle ;bizim bir fonksiyonumuz olsun;
function benim_arabam()
{
Bla,bla,bla
}
te imdi aadaki kodla h tuuna basnca bu fonksiyonu aktif edeceiz,
on_h = benim_arabam; aslnda buraya pointers dersinde deinmitim. h
bildiimiz h tuu, yani h ye basarsan benim_arabam fonksiyonunu altr.
Evet valla workshoptan daha detayl anlattm buralar hadi imdi workshop13
dosyasndaki script13 altralm.
Bende byle bir ekran kt. W ve S yukar aa A ve D tuu saa sola, 1 daha
parlak gkyz 2 ise parlakl eski haline dndrme ve son olarak R ise
kameray tekrar balang durumuna getirmeye yarar.evet tular da
rendik.hadi imdi kodu inceleyelim.
////////////////////////////////////////////////////////////////////
#include <acknex.h> // headerlar
#include <default.c>
////////////////////////////////////////////////////////////////////
ENTITY* my_sky;// my_sky isimli entity

function bright_lights() // bright_lights fonksiyonu
{
vec_add(my_sky.blue,vector(10, 10, 10));// 10 birim krmz yeil mavi
vektrleri my_sky entitisine parlaklk etkisi verecek ekilde ekle
}

function dim_lights()
{
vec_add(my_sky.blue,vector(-10, -10, -10)); 10 birim krmz yeil mavi
vektrleri my_sky entitisine koyultma etkisi verecek ekilde ekle
}

function main()
{
on_1 = bright_lights;// 1e baslrsa bright_lights fonksiyonu
on_2 = dim_lights; // 2 ye baslrsa dim_light fonskiyonu
level_load ("");// bo level ykle
my_sky = ent_createlayer("blood_gorge+6.tga", SKY | CUBE | SHOW, 0);//
my_sky fonksiyonuna blood_george+6.tga resmini gkyz formatnda kbik
olarak ve grnr olarak 0 kaplama numarasnda ekle.
while (1)
{
if (key_w) camera.tilt += 2 * time_step; // wye baslrsa 2 birim yukar kaldr
if (key_s) camera.tilt -= 2 * time_step; //sye baslrsa w nin tersi
if (key_a) camera.pan += 2 * time_step;a ya baslrsa 2 birim sola
if (key_d) camera.pan -= 2 * time_step;d ye baslrsa 2 birim saa dndr.
if (19 == key_lastpressed) // eer r ye baslrsa
{
camera.pan = 0; // yukar aa ve
camera.tilt = 0; // saa sola alarn 0 yap.
vec_set(my_sky.blue,vector(128,128,128)); //ortalama parlaklkta gkyz
olutur.
}
wait (1);
}
}
ilk nce gzel bir gkyz nasl hazrlanr ondan konualm. Pekala
ent_createlayer bir komuttur(ben fonksiyon derim) ve bunun anlam farkl
katmanlardaki(layerlardaki) resimlere birka tane entitynin tutturulmasn
salar. Sky ise gkyzdr ve bir katman entitysidir. 6 tane zel resmin bir araya
gelmesi ile kresel gkyz havas yaratmaya yarar. Biz bu sky entitysini 0nc
katmana koyduk. SKY | CUBE | VISIBLE flaglar yaptmz skyn grnr
olmasn salar.
Hadi imdi while ksmna bakalm. lk drt satr yukarda belirtmitim.dikkat
ederseniz key_s ve ya dier 3 n dedikten sonra == 1 yazmadk. Neden == 1
yazyoruz nk o ekilde doruluu kontrol edilmi oluyor. Eer yanlarna == 1
eklerseniz bir eyin deimediini greceksiniz.ve camera.pan += 2 *
time_step;in aslnda camera.pan = camera.pan + 2*time_step olduunu drt
satr ksaltmak iin
camera.tilt += (key_w - key_s) * 2 * time_step;
camera.pan += (key_a - key_d) * 2 * time_step;
de kullanlabileceini unutmayn.bu arada dikkatinizi ektimi bilmem ama
aslnda bu 4 satr kod WASD LE KONTROL EDLEN FPS KAMERASI! Yani
eer tu yerine daha sonraki derslerde belirteceimiz farenin kullanmn
koyarsak gayet gzel bir kameramz olacak!!!!
vec_set (my_sky.blue, vector(128,128,128)); da aslnda my_sky.blueda bluenun
etksisi yok nk rengi veren 128,128,128 bunlar mavi krmz yeil deerleri.
Hepsi birbirine eit olunca beyaz olduunu biliyorsunuz.
Dersin bandada belirttim. on_1 ve on_2 de 1 tuuna basarsan bright_lights , 2
tuuna basarsan dim_lights fonksiyonlarn altr.
on_1 = bright_lights;
on_2 = dim_lights;
yine brigt_lights ve dim_lights da skyn parlakln etkileyen vektrler kondu.
Ders bu kadar. yi oyunlar
MACHERA!!!!!
FARE KULLANIMI
Farenin ne kadar nemli olduunu anlatmaya kalksam her halde 20 sayfalk bir
makale hazrlamam gerekirdi. Onun iin direk olaya dalyorum. Lite-cde bug
olmadan kullanabileceiniz 4 tane fare modu vardr. Bu modlardan herhangi
birini aktif etmek iin aadaki kod gerekir;
mouse_mode = 0; // burada 0,1,2 ve 4 rakamlarndan birini kullanabiliriz.
Tabi hemen tekrarlayalm, mouse_mode nceden tanmlanm bir deikendir
hakknda daha fazla bilgi iin manuale bakabilirsiniz. (SED editrde F1e bas)
Pekala imdi bu mouse_modeun ald deerlere tek tek bakalm;
mouse_mode = 0; fare imleci ekranda grnmez ve bir vektr olan mouse_force
farenin hareketine gre deerini deitirir.(kamera kullanlabilir) Shooter ve
otomobil yar oyunlar iin idealdir.
mouse_mode = 1; fare imleci ekranda grnr ve yine mouse_force vektr
farenin hareketine gre deerini deitirir.(kamera kullanlamaz)
Birincil/ncl aksiyon oyunlar , rol yapma oyunlar iin idealdir.
mouse_mode = 2; bu modda imle grnr ancak mouse_force farenin
hareketine gre deerinin deitirmedii iin kamera kontrol edilemez. Sadece
objelere tklanabilir.(strateji ve masa tipi oyunlar iin idealdir.)
mouse_mode = 4; fare imleci Windows imlecine gre hareket eder.
Pekala ne gzel modlarmzda rendik. Hadi imdi script14.c yi aalm.
Vay be! Fare ile kameray istediimiz gibi dndryoruz ya!
Pekala imdi de klavyeden M tuuna basalm bakalm ne greceiz?
bir hedef noktas piyasaya kt! stelik hedef noktas fare hareketine gre yer
deitiriyor. Hadi imdi bir daha klavyeden M tuuna basalm ne greceiz?
Evet imdide bir imle gryoruz. Ancak imle hareket ederken kamera hareket
etmiyor? Evet arakdalar M tuu 3 tane fare modunun nasl altn grmek
iin kullanlr. Dikkatiniz ektiyse birka satr kod ile olduka karmak ileri
yapabiliyoruz aslnda bu motorun ne kadar esnek odluunu gsterir bizlere.
Pekala fazla vakit kaybetmeden script14.c ye bir bakalm;
////////////////////////////////////////////////////////////////////
#include <acknex.h> // klasik header dosyalar
#include <default.c>
////////////////////////////////////////////////////////////////////
BMAP* cursor_pcx = "cursor.pcx"; // cursor_pcx isminde cursor.pcx
resminin olduu Bitmap tanmladk.
BMAP* crosshair_pcx = "crosshair.pcx"; // yine ayn ekilde
crosshair_pcx isminde bitmap tanmladk.
////////////////////////////////////////////////////////////////////
function change_mouse_mode()
{
mouse_mode += 1; // fonsiyon aktif olursa mouse_mode eski
deerinden 1 fazla olan modda olacak.
mouse_mode %= 3; // fonsiyon aktif olursa mouse_mode eski
deerinin 3 blmnn kalan says modunda olacak.
if (1 == mouse_mode) // eer mouse_mode 1 ise
mouse_map = crosshair_pcx;// mouse_map crosshair.pcx
if (2 == mouse_mode)// eer mouse_mode 2 ise
mouse_map = cursor_pcx;// mouse_map cursor.pcx olacak.
}

function main()
{
video_screen = 1;// tam ekranda altr
video_mode = 7;//800x600 de altr.
level_load ("work14.wmb");// work14.wmb2yi blm olarak ykle
on_m = change_mouse_mode;// m tuuna baslrsa
change_mouse_mode fonksiyonunu aktif et.
while (1)
{
mouse_pos.x = mouse_cursor.x; // mouse_pos.x in deeri ile
mouse_cursor.xin deeri ayn olacak.
mouse_pos.y = mouse_cursor.y; mouse_pos.y in deeri ile
mouse_cursor.yin deeri ayn olacak.
camera.pan -= mouse_force.x;//camera.pan n deeri mouse_force.x
in deerine gre deiecek
camera.tilt += mouse_force.y;/camera.tiltin deeri mouse_force.yin
deerine gre deiecek.

wait (1);
}
}
Kod kark grnmyor. Hadi inceleyelim;
Pekala imdi BMAP bir pointer biliyorsunuz ve biz cursor.pcx dosyasna bu
pointer ile cursor_pcx ismini verdik. Bir alt satrdaki kodda da ayn ilemi
uyguladk.
imdide change_mouse_mode fonksiyonun iindeki kodlara bakalm;
mouse_mode += 1; in ne demek olduunu biliyorsunuz ancak ben yinede tekrar
edeyim. Bu ifade aslnda mouse_mode = mouse_mode + 1; demektir. Program ilk
altnda mouse_modea bir deer vermediimiz iin standart deer 0 ile
balayacaktr. Ancak eer fonksiyon aktif olursa eski deerin zerine 1 ekle
anlam kmaktadr.
Bir alt satr koda bakarsak yeni bir ey gryoruz % yzde iareti.
mouse_mode %= 3;
Programlama dillerinde yzde iareti modler aritmetik ilemleri iin kullanlr.
Modler aritmetik ne diye soracaksanz bir saynn baka bir sayya
blndnde kalann bulma diyebilirim. Gerek matematik ileminden
bakalm
64 = 4 (mod 10) ite burada 64 10a blersek 4 kalann verir.
Neyse geelim matematii ve devam edelim. Peki biz niye bu modler aritmetii
kullandk? Biz burada 3 tip mouse_mode ( 0,1 ve 2) kullandk. Ama
mouse_modeun 0.1 ve 2 den fazla deer almasn nlemek. Burada 3 blendir ve
kalan hibir zaman blenden byk olamaz o zaman sadece 0,1 ve 2 deerlerini
alacak. Atyorum 3 deil de 8 olsayd 0,1,2,3,4,5,6 ve 7 deerlerini alabilirdi.
Buray anladnz umuyorum.
f yaplarnn olduu 2 satr geiyorum daha nceki derslerden anlarsnz. Ancak
yukardaki kodda krmz yazan yerde yinede akladm.
Pekala main fonksiyonuna bakalm imdi.
video_screen = 1; oyunun direk tam ekranla balamasna yarar. Evet bu kadar
basit. Eer deeri 0 olursa siyah ekran grrsnz yani oyun grnmez 1 olursa
tam ekran 2 olursa da pencere modu olur. Yine alt+enter kombinasyonu da bu ii
grmektedir.
Alttaki satrda video_mode = 7; bildiiniz gibi 800x600 znrlk iin
geerliydi. Eer oyununuzun pencere eklinde almasn istiyorsanz ya
video_screeni 2 yapn ya da o satr silin.
Level_load da work14.wmbyi level olarak ykle diyor.
on_mde ise hatrlarsanz klavye dersinde on_(klavye tuu ismi)da eer tua
baslrsa karsnda yazan fonksiyonu altr demekti. yani m ye basarsanz
change_mouse_mode fonksiyonunu aktif et demektir.
imdi de while(1) blounun olduu ksma bakalm;
mouse_pos.x = mouse_cursor.x; burada fare imlecinin x eksenindeki hareketini
kontrol ediyoruz. mouse_pos farenin ekranda bulunan pikseller zerindeki
pozisyonunu tanmlayan bir vektrdr. mouse_cursor ise imlecin ekranda
bulunan pikseller zerindeki pozisyonunu ayarlayan vektrdr.
yine y deerleri iinde ayn ey geerlidir. daha iyi anlamak iin ;
mouse_pos.x = 200;
mouse_pos.y = 300; deerlerini verirsek;
resimdeki koordinatlarda fare oluacaktr.sra geldi son 2 satra;
camera.pan -= mouse_force.x; de camera.pan; kamerann yatayda dnmesi,
camera.tilt ise dikeyde dnmesi anlamna geliyor. resimli anlatrsam eer;
grdnz gibi yeil renkli ksm yukar aa ynde dn mavi renkli ksm ise
yatay ynde dn gsteriyor.(ksm dediim yerler taral alan) mouse_force.x
ise bu dnmeyi salayacak vektrdr arkadalar.(yatayda) eer fareyi
durdurursanz mouse_force deeri 0 olacaktr. zaten deer 1 ile 1 arasna
deimektedir. dikkat ederseniz fareyi hareket ettirdiinizde ekran ayn oranda
oynamyor. bunu bile bile deitirmedim ancak sizin yapabileceinizi
dnyorum.
yeni bir eyler deneyelim birazda;
imdi main fonksiyonunda camera.tilt += mouse_force.y; satrnn altna ve
waitten nce aadaki kodlar ekleyelim;
if (mouse_left)
camera.ambient += 1;
if (mouse_right)
camera.ambient -= 1;

imdi scripti altralm. her ey ayn grnyor olmal.(kesinlikle olmal)! imdi
fareye bir sa tklayalm ekran bir anda parlad dimi? hadi bir de sol tklayalm
ekran bir anda karard dimi? bunu artk anlamzdr diye dnyorum.eer
fareye sol tklarsan ekran parlakl 1 artsn eer sa tklarsan ekran parlakl 1
azalsn demek.
phiuuu!!!! baya uzun oldu ama daha 2. blm var.
Mouse etkileimleri
yukarda da okuduunuz gibi bizim fare cisimlerle etkileime girecek kapasitede
ya da motor onu etkileime girdirtebiliyor diyebiliriz hadi imdi script14_2.c yi
aalm da ne oluyor bir grelim;
imleci krmz ve ya yeil elemann zerine getirince bir anda etrafa melek gibi
k sayor. peki orada ne oluyor?
event function (olay fonksiyonu) fare imlecinin cisme dokununca ya da tklannca
cismin bir tepki vermesini salayan fonksiyondur.burada bu etki cisim k sam
olarak grlyor.imdi script14_2.c yi bir inceleyelim;
////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
////////////////////////////////////////////////////////////////////
BMAP* cursor_pcx = "cursor.pcx";
BMAP* crosshair_pcx = "crosshair.pcx";
////////////////////////////////////////////////////////////////////
function highlight_event()
{
if (event_type == EVENT_TOUCH) // the wizard was
touched with the mouse?
{
my.ambient = 100; // the make it look bright
my.lightrange = 200; // and generate light on a radius of
200 quants!
}
else // the wizard isn't touched anymore
{
if (event_type == EVENT_RELEASE) // the mouse was
moved away from it?
{
my.ambient = 0; // then restore its initial ambient
value (zero)
my.lightrange = 0; // and stop it from generating light
around it
}
}
}

action wizard_lights() // this action is attached to both
wizards
{
// make the wizard models sensitive to mouse touching and
releasing
my.emask = ENABLE_TOUCH | ENABLE_RELEASE;
// run function highlight_event the wizards are touched or
released
my.event = highlight_event;
}

function main()
{
video_screen = 1; // start in full screen mode
video_mode = 7; // use a screen resolution of 800 x 600 pixels
level_load ("work14_2.wmb"); // load the level
mouse_mode = 2; // show the mouse pointer
mouse_map = cursor_pcx; // set the mouse pointer bitmap
while (1)
{
mouse_pos.x = mouse_cursor.x; // allow the mouse pointer
to move
mouse_pos.y = mouse_cursor.y; // on the x and y axis
wait (1);
}
}
birka yeni kod olmas normal olur dimi? imdi wizard_lights actionuna bir
bakalm;
my.emask = ENABLE_TOUCH | ENABLE_RELEASE;
ilk nce burada obje.objenin zellii kod stilinin uygulandn hatrlatalm
emask ne ie yarar? burada emask actionun eklenecei cisme ENABLE_TOUCH
yani dokunulmay aktif et ve ENABLE_RELEASE yani fare imleci cismin
zerinden uzaklatysa anlamn verir. anladnz m? wizard_lights actionu
oyunun iinde donmu halde bekleyen krmz ve mavi elemana verilecek,
verilince de iki elemanda dokunulduunda bir eylem gerekletirebilir ve fare
imleci kaybolabilir halde olacak. inallah anlamsnzdr. my.event =
highlight_event; de ise benim olaym highlight_event fonksiyonu olacak anlam
kyor. yani fare imleci bana dokunursa (illa fare deil) highlight_event
fonksiyonunu tetikle demektir. fonksiyona bakacak olursak;
function highlight_event()
{
if (event_type == EVENT_TOUCH) // the wizard was touched with the mouse?
{
my.ambient = 100; // the make it look bright
my.lightrange = 200; // and generate light on a radius of 200 quants!
}
else // the wizard isn't touched anymore
{
if (event_type == EVENT_RELEASE) // the mouse was moved away from it?
{
my.ambient = 0; // then restore its initial ambient value (zero)
my.lightrange = 0; // and stop it from generating light around it
}
}
}
burada event_type nceden tanmlanm bir deikendir. zaten trkeside olay
tipi demektir. yani olay tipimiz EVENT_TOUCH yani dokunulma olursa (imle
cisme dokunursa )yaydm n deeri 100, salan n deeride 200 olsun
demektir. eer olay tipimiz dokunulma olmazsa ve olmayan durumda imle
cismin zerinden uzaklatysa benim yaydm k 0, ve salan k da 0 olacak
anlam vardr. biraz kark oldu buras ama sitede sorarak ta anlayabilirisiniz
diye dnyorum. daha fazla s iin AUM 54 e bakn arkadalar. bu derste bu
kadar joystiki evirmeyeceim gerek yok diyorum ve ondan sonraki ders olan
hata ayklama yani DEBUGGNG 1 dersinde grmek zere.
MACHERA
DEBUGGING (HATA AYIKLAMA)
Artk nasl kod yazlacan biraz olsun biliyoruz. deikenler, fonksiyonlar
pek ok eyi nceki derslerde renmitik. Ancak kod yazlrken her ey byle toz
pembe gitmez elbet hatalar olacaktr.(Hem de bir sr) bu dersimizde kodlarn
bozuk kodlarn (buglarn) nasl ayklanacan anlatmaya alacam.
pekala bu kadar sohbet yeter hadi scrip16.cyi aalm;
///////////////////////////////
#include <acknex.h>
#include <default.c>
var energy = 100;
function decrease_energy()
{
energy -= 40;
if (energy < 70)
vec_set(screen_color,vector(255,0,0));
if (energy < 30)
vec_set(screen_color,vector(0,0,255));
if (energy == 0)
sys_exit(NULL);
}
function main()
{
screen_color.blue = 0;
screen_color.green = 255;
screen_color.red = 0;
on_d = decrease_energy;
}
imdi ismi energy olan bir deiken gryorsunuz ve main fonksiyonunda tuhaf
kodlar. screen_color da ne?
hatrlarsanz (2. derste) screen_colorun ekrann rengini ayarlyordu. ve bu ekran
rengini bir vektr tanmlyordu. VEKTR nedir? vektr aslnda fizikten
bildiimiz 3 boyutlu uzayda bulunan oklardr. burada da deikenlere benzeyen
ancak tek deilde 3 farkl deeri ayn anda alabilen komuttu. bu deer (x,y,z)
olarak 3 boyutlu uzaydaki koordinat deerleri idi. screen_colorda x deeri
maviyi, y deeri yeili ve son olarak z de krmz deeri gsteriyordu. eer
deerler 0 olursa rengin en koyu hali yani siyah, 255 olursa rengin en ak hali
yani beyaz olacaktr. (255,255,255) = beyaz, (0,0,0) = siyah. en son olarak eer bir
deer atyorum krmz 255 olur dierleri de 0 olursa tam krmz renk grnr.
yine uzattm neyse main fonksiyonunda grdnz gibi krmz ve mavinin
deeri sfr yeilin deeri ise 255 yani en baskn yeil renginde ayarladm. yani
program yeil renkle balayacak. eer programda D tuuna basarsanz daha
ncede dediim gibi on_d kodu ile karsnda yazan decrease_energy
fonksiyonu tetiklenecektir. imdi decrease_energy(Trkesi enerjiyi_azalt)
fonksiyonuna bakalm;
function decrease_energy()
{
energy -= 40;
if (energy < 70)
vec_set(screen_color,vector(255,0,0));
if (energy < 30)
vec_set(screen_color,vector(0,0,255));
if (energy == 0)
sys_exit(NULL);
}
hatrlarsanz ilk satrda energy deikenimize 100 deerini vermitik.
decrease_energy fonksiyonuna bakarsanz ilk satrda energy -= 40; demi. yani
energyyi 40 azalt.(DKKAT! 40 a eitle deil nnde eksi var) o zaman her Dye
basmzda energy 40 azalacak ve 70 den aa olursa mavi,30 da aa olursa
yeil, 0a eit olursa da sys_exit(NULL); yani program kapat olacak. imdi
scripti altralm;
yeil ekran grnd. hadi imdi bir kere Dye basalm;
bu da gzel imdi de mavi oldu. (Kodda yle ayarladk)imdi bir daha Dye basn.
mthi! kodumuzu kusursuz iliyor imdi bir daha Dye basalm!
hmm belki aral geni tuttuum iin byle oldu ya da tua tam basamadm. bir
daha Dye basalm!
hayr bu sefer olmad. aral da bu kadar geni tutmadm. programn kapanmas
lazmd
Program koddaki bir hatadan dolay almad. bunu dzeltmemiz gerek. imdi
program kapatalm. ve SED editrde WATCH ksmna tklayalm.
watch ksmnda oyun alrken deikenlerin deiimini gerek zamanl grme
ansna sahipsiniz gznz burada olsun.
hadi imdi tekrar script16.cyi altralm ancak bu sefer DEBUG RUN
tuuna basarak altracaz. imdi watch ksm grnecek ekilde programmz
altralm.
altrdktan sonra yukardaki gibi olmas gerekiyor ki watch ksmn
grebilesiniz. (benim ekran 22 ben sknt ekmiyorum eer kk monitre
sahipseniz sknt ekebilirsiniz.)
pekala imdi watch ksmnda alttaki boluk yerine sa tklayp add watch
diyelim.
evet buraya takip etmek istediimiz
deikenini ismini yazacaz. biz energy
isimli deikeni takip edeceiz. o zaman
variable name ksmna energy yazyoruz.
(tabi ki bu srada program alyor.)
eer debug run demeden altrrsanz
ve ya program almadan add watch
deyip energy eklerseniz daha sonra
program altrsanz bile energy deeri deimez.)
grdnz gibi energy nin deeri
u anda 100. imdi bir kere D tuuna basalm ve energy deerine bakalm.
program doru alyor energy deeri 40 azald ve 60a dt. Ekran mavi
burada u anda sorun yok.
imdi bir kere daha D ye basalm.
basnca ekran krmz ve energy deeri 20 oldu. bizim istediimiz bir kere daha
Dye basnca programn kapanmas.bir kere daha basalm Dye
program kapanmad? energy deeri de -20 oldu. dikkat ettiniz mi? -20. bakalm
biz if ksmna ne yazmz;
if (energy < 70)
vec_set(screen_color,vector(255,0,0));
if (energy < 30)
vec_set(screen_color,vector(0,0,255));
if (energy == 0)
sys_exit(NULL);
if(energy == 0)
sys_exit(NULL);
yani eer energy deeri 0 olursa program kapat. fakat bizim energy deerimiz 0
olmad ki. direk 20ye geti bylece hatay bulmu olduk. imdi kodun
dorusunu yazalm.
if (energy < 0)
sys_exit(NULL);
yani eer energy deeri 0 dan kk olursa program kapat. imdi kodu tekrar
altrp deneyin.altn greceksiniz.(Dikkat kodu deitirdikten sonra
mutlaka tekrar kaydedin!!!!)
aslnda bu ok kolay oldu kendinizde grebilirsiniz ama rnek bu ekildeydi
arkadalar. bir sonraki ders ADVANCED DEBUGGNG (ileri dzey hata
ayklama)da grmek zere
machera
LER DZEY HATA AYIKLAMA (ADVANCED DEBUGGNG)
bir nceki derste lite-cde ki watch yardmyla hatal kodlar nasl aykladmz
ok basit bir rnekle de olsa rendik. Yalnz dikkatinizi ekmitir sadece
variable yani deikenleri izledik. peki bir nesne (entity) izlemeyi istemez
misiniz? isteriz heralde o zaman direk olaya dalalm.
hadi imdi script17.c yi aalm;
#include <acknex.h>
#include <default.c>
ENTITY* plane;// plane isminde bir entity
action rotate_plane() // rotate_plane isminde action
{
plane = me; plane nesnesi actionun verildii kii
my.ambient = 100; plane ambiyans 100 kuvvetinde
while (1)
{
my.pan += 3.5 * time_step; // yataydaki dn 3.5 zaman atlamas
if (my.pan == 360) eer pan 360 derece olursa
sys_exit(NULL); program kapat
wait (1);
}
}
function main()
{
level_load ("work17.wmb"); work.17 wmbyi level olarak ykle
vec_set(camera.x, vector(-500, 0, 100)); -500 x,0 y ve 100 z koordinatlarnda
camera.x vektrn koy.
ent_create("mig.mdl", vector(0, 0, 0), rotate_plane);rotate plane
fonksiyonunu kullanan 0,0,0 koordinatlarnda mig.mdl modelini olutur.
}
workshop 10 dakine benzer bir kod ile kar karyayz. ENTTY pointer ile
plane olarak isimlendirdiim bir cisim ekledim ve bu cismin ambiyansn 100
olarak belirledim. son olarak bu cismim kendi etrafnda 360 derece dnnce
program kapatmasn syleyen if yaps ekledim. daha fazla uzatmayalm ve
script17.c yi altralm!!!
imdi programa bakarsak uak kendi etrafnda 360 dereceyi defalarca dnmesine
ramen program kapanmyor.imdi program esc tuu ile kapatalm. ve klasik
olarak
watch ksmna yukardaki gibi planei ekleyelim. ve program DEBUG RUN
da altralm.
planenin ald deerler grnyor. bizi ilgilendiren ksm ang:(107,0,0) ksm.
ang; angle demek onunda Trkesi a demek.
imdi angle deeri dikkat ederseniz 360 derece olmuyor. 360 dereceye yakn
deerlerle atlama yaparak dnmeye devam ediyor. yani a atlamas ok byk.
imdi bunu kltmemiz gerek. bunun iin lite c de
OPTONS>PREFERENCES>ENVORMENT ksmn aalm.
update watches every ms. bu ne demek? ekledimiz watchn deerleri belli
aralklarla gncellenerek deiir. burada da o gncellemenin ka milisaniyede bir
olacan gryorz. imdi 500 ms deerini 200 ms yapalm ve OK a tklayalm.
tekrar DEBUG RUN da program altralm ve planenin ang(a) deerine
bakalm.
dikkat ederseniz daha hzl ve daha kk aralklarla gncelleniyor deil mi? bu
kt bir ey deil. peki bundan sonra ne yapacaz? artk kodumuzu biraz
kurcalamann zaman geldi. kapatalm program. debug run ayn zamanda stop
debugging tuu ile de durdurabilirsiniz. pekala imdi while ifadesinin iindeki
ilk satra farenin sol tuu ile tklayp F9 a basalm. satrn rengi krmz olmal.
peki biz bylelikle ne yaptk? script dosyasnn iine sadece bir kr krlma
noktas ekledik. lanet bir krlma noktas peki ne ie yarar bu krlma noktas ?
kodu altralm grelim (debug runda)
whooo!! uak dnmyor. nk krlma noktas olarak belirlediimiz kod
uamzn dnmesini salayan koddu.ancak kod btnyle alyor. o zaman
buradan unu karabiliriz.
krlma noktas derleyici belirlenen krlma noktasna gelene kadar yukardan
aa kodu okur ve belirlenen koda geldiinde o kodu okumadan program
durdurur.
pekala program debug runda alrken imdi single step(tekil adm) tuuna
basalm.(ksayol tuu F10)
ne oldu? uak biraz dnd dimi? ka derece ? 14 derece.(watcha bakn yazyor!)
peki single step yapnca ne oldu? programa bir adm attrm olduk. yani uak
200 milisaniyede bir 14 derece dnecek anlamna geliyor. 14 derece? if ksmna ne
yazmtk?
if (my.pan == 360)
sys_exit(NULL);
yani a 360 derece olunca program kapat. iyide 360 14e tam blnmez ki.
hatay bulduk peki nasl dzelteceiz?
1.yol:
bu workshopta yazan yol derece 360 a ok yakn geiyor. a ya 360tan byk
ya da 360 tan kkken kapansn yani le;
if (my.pan >= 360)
sys_exit(NULL);
ya da
if (my.pan <= 360)
sys_exit(NULL);
2.yol:
ya da kendimize bir step belirleyelim. o zaman actiondan nce
var my_time_step = 0.01; diyelim. sonra my.pan yazan ksma;
my.pan += 3.6*my_time_step; diyelim. burada kendi time_stepimizi belirledik.
olduka gzel deil mi? burada derece 360a eitlenecektir. 2. yolda kodun action
ii ve action ncesi son hali;
var my_time_step = 0.01;
action rotate_plane()
{
plane = me;
my.ambient = 100;
while (1)
{
my.pan += 3.6 * my_time_step;
if (my.pan == 360)
sys_exit(NULL);
wait (1);
}
}
ENTTY ZLENMES (WATCHNG ENTTES)
pekala entity izlemenin bir baka gzel yolu daha var. bu gerekten hayat
kurtaracak bir yntem. biz buna watched diyoruz. altrmak iin iki yol var
birincisi;
ilk nce debug run ve my.pan = 3.5*time_step; satrnda F9 a basarak krmz
yapmtk onu da kapatn. imdi normal olarak kodu altrn
her ey normal uak falan dnyor. imdi SHIFT + F11 e basn. uak durdu
dimi? pekala imdide fare imlecini uan zerine getirin ve bir tk yapn
aadaki grnt olumal;
vaaaaaoovvvv!!! ok karizmatik bir grnt oldu. pekala ilk yolu bitirdik sra
geldi ikinci yola;
ikincisini kod ile yapacaz. watched kodu entity izlenmesine yarar. rnei
aadaki gibi
watched = plane.mdl;
yani plane.mdli izle. ama bunu nasl aktif edeceiz tabi ki klavyeden ya da
fareden bir tula. o zaman;
action iindeki while ksmna waitten nce ;
if(key_h == 1)
watched = me;
yani hye basnca beni izle.
pekala ikinci yolu da rendik. imdi ayrntya dalalm. sol stteki yazlar biraz
zor gryor olmalsnz biraz daha byk grmek iin main fonksiyonunda
video_screen = 1; yazn. (tam ekran).
ilk satrda mig.mdl modelini, 2.satrda seilen modelin pozisyonu ve alarn
aklyor.4.satrda hangi actionu alm onu belirtiyor.5.satrda modelin
materyalini(shaderlar iin) aklyor.
artk yoruldum cidden zor ders. pekala son zm yolunu da yazalm.
burada script17.c yi ilk atnz haldeki durumundan bahsedeceim.
my.pan == 3.5*time_step; de 14 derece artyordu ve 360 dereceye ok yakn
geiyordu. ya eksik ya fazla; eer 360 saysn 14a blersek 10 kalann verecek. o
zaman 360-10 = 350 bu say 360 dan kk en byk 14 le blne bilen say. ve
ya 350+14 = 364 bu sayda 360 a en yakn 360dan byk 14e blnebilen say.
o zaman;
360 dan kk iin if ksm;
350 says iin ;
if(my.pan >= 350)
364 says iin
if(my.pan >=364) olacaktr.
bu derste bitti bir sonraki ders grmek zere
NESNELER HAREKET ETTRME(MOVNG ENTTES)
whoo! ders 18deyiz. gayet gzel gittik be. Bence bu ders ok nemli arkadalar.
Neredeyse her oyun trnde kullanmak zorunda olduunuz bir ilemi ieriyor.
bu dersten sonra bir rakiplerinde olduu bir drag yar bekliyorum. neyse hadi
derse balayalm.
Gamestudioda nesneleri hareket ettirmek iin 3 tane yol vardr. (cisim derken
model , sprite ve harita nesnesi)
1.Direk nesnenin pozisyonunu deitirerek.
2.c_move komutu ile hareket ettirme.
3.fizik motorunu kullanarak yerekimi kanunlar dahilinde hareket ettirme.
Nesnenin pozisyonunu deitirerek hareket ettirme
Batan syleyeyim. Bu yol ok basit arkadalar. Alt st bilmeniz gereken
matematiksel 3 boyutlu dnyadaki x,y ve z koordinat eksenleri. O zaman ne
duruyoruz script18.cyi altralm.

hmm.. bir koridor ve yar arabasna benzeyen bir model. bu ok basit bir
level arkadalar.
hadi imdi klavyeden S tuuna basalm ve olacaklar grelim..
aboov! araba hareket ediyor!! stelik glgeli alanlardaki tepkisi de gzel.
izliyoruz arabay
ne i? araba gitti bu ite bir bit yenii var. Hadi scrip18.cyi aalm.
///////////////////////////////
#include <acknex.h> // headerlar
#include <default.c>
///////////////////////////////
function main()
{
level_load ("work18.wmb");// work18.wmbyi ykle
}
action move_me()
{
while (!key_s) wait (1); oyuncu S tuuna basana kadar bekle
while (1)
{
my.x += 15 * time_step;// x ekseninde cismi 15 zaman
atlamasnda hzlandr.
wait (1);
}
}
pekala. Bir kere scriptteki main fonksiyonu ii bo olanndan sonra
grebileceiniz en basit fonksiyondur. ne i yapar? blm ykler.
Asl cmbn olduu yere move_me actionuna bakalm.
Actionlar cisimlere WEDde aktarlyorlar.(ezbere biliyoruz) o zaman hemen bir
alt satra geelim.
while(!key_s) wait(1); satr bu satr aadaki gibide yazlabiliyor
biliyorsunuz..
while(!key_s)
wait(1);
peki.. while(!key_s) ne demek? while biliyorsunuz. () parantezleri iindeki bir
ey doru olmal ki {} parantezler iindeki olay srekli devam etsin. burada da S
tuuna baslana kadar bekle diyor. ancak buras yle de yazlabilir
while(key_s != 1) wait(1); yani? klavye konusundan biliyorsunuz tularn aktif
olmas deerlerinin 1e eit olmas anlamna geliyordu. yani S ye baslana kadar
bekle diyor.
pekala srada 1. yol iin en nemli satr var.
while(1)
{
my.x += 15*time_step;
wait(1); }
peki ne anlama geliyor bu? my benim demek biliyorsunuz. o zaman burada
benim x deerimi 15 birim artr diyor. benim olan kii kim? actionun WED de
aktarld nesne. okey buray anladmza gre kodumuza my.x satrnn altna
my.z += 3*time_step; ekleyelim. pekala imdi bu kodu altralm.
yine S tuuna basalm.
cismimiz ykseliyor !!!!..neden nk nk arabaya ve kamera alarna gre z
ekseni ykseklik oluyor aadaki resimde bu koordinat eksenleri var.
kt haber u.. bu cisim sonsuza kadar hareket edecek. neden? nk cisimde
fiziksel zellikler(vektrler vb) yok. burada sadece modeli hareket ettiriyoruz.
bunu hangi cisme uygularsanz uygulayn yine duvar geecektir.
c_move komutu ile hareket ettirme.
bu komut cisme arpma fizii vermektedir. yani anlayacanz cismimize bu
kodu uygularsak cisim duvarlar delip gemeyecektir. hadi script18_2.c yi
altralm.
her ey ayn . fazla uzatmadan S tuuna basn
cisim durdu !!! duvar yalad. ve gerek bir cisim hareketine sahip oldu.
cismin bu hareketi yapmas iin gereken kodu kark ve uzun olduunu
dnebilirsiniz ancak tek satr kodla bu ii haletlik. script18_2.cyi aalm.
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////
function main()
{
level_load ("work18.wmb");
}
action move_me()
{
while (!key_s) wait (1);
while (1)
{
c_move(me, nullvector, vector(15 * time_step, 0, 4 *
time_step), GLIDE);// ite o tek satr kod!!!!
wait (1);
}
}
bu arada SED de options > prefenences>enviorment >use the current file for
test run semeyi unutmayn yoksa script18.c ye devam ediyor olursunuz.
c_move(me, nullvector, vector(15 * time_step, 0, 4 * time_step), GLIDE); bu kod
cisme fizik verdi. c_moveun kullanm aadaki gibidir.
c_move(nesne_ismi,greli_hz,gerek_hz,hareketlenme_tipi);
c_move : nesneleri hareket ettirmek iin gereken kodun ismi. her zaman
kullanlr.
nesne_ismi: hangi nesneyi hareket ettirmek istiyorsak onun ismini yazyoruz.biz
kodumuzda me yazdk nk actionu uygulayan medir.
greli_hz: yne gre hz demek daha doru olur. yani otomobilin n hzlanma
vektr ile hep ayn ynl olacak.kodda nullvector kullandk. peki nedir
nullvector? nullvector , vector(0,0,0) ile ayndr. yani hareket salamayan ama
dinamiklik salayan vektr.
gerek_hz: cismin ynn deil ,gerek hzn tanmlar. greli hzda cisme yn
vererek hzlandryorduk. atyorum cismin yn (10,20,30) vektrnde olsun.
cismin gerek hz ise (3,0,0) olsun. burada cisim yne bal olmakszn 3 x birim
vektrnde hareket edecektir. dnaynn x,y,z eksenlerine gre hz demek daha
doru olur. birazdan resimlerle greceiz.
hareketlenme_tipi: nesnenin duvarlarda nasl tepki vereceidir. rnein kodda
GLIDE yazdk. yani yala dedik. dikkat ederseniz cisim tavana arptnda
kayyordu. ite bu kaymay salayan glidedr. bir kan aklayaym.
IGNORE_PASSABLE : cisimlerin iine girilebilirliini engeller.
IGNORE_MODELS: iine girileribilir deillerse girilebilirlii salarlar.
daha fazlas iin manuale bakn.
hadi imdi gerek_hz ve greli hza resimle bakalm.bir yar oyunu aada
grnyor.
mavi arabaya biraz dikkatli bakalm. imdi ona yazacamz action aada.
action blue_car1()
{
while(1)
{
c_move(me,nullvector,vector(3,0,0),GLIDE);
wait(1);
}
}
imdi yazdmz actionu mavi arabaya eklersek hareketlenmesi aadaki gibi
olacak;
pekala ne oldu imdi? otomobilin n dzelmeden yanlaya yanlaya hareket etti.
ite bu gerek hz oluyor. ama otomobile aadaki gibi bir action verirsek;
action blue_car2()
{
while(1)
{
c_move(me,vector(3,0,0),nullvector,GLIDE);
wait(1);
}
}
aadaki resimdeki gibi olacak;
yani cisim kendi x dorultusunda gidecek. uzayn x dorultusunda deil. sanrm
artk anlamsnzdr ancak neden lite-c yapmclar hem greli hem de gerek hz
kullanmlar?
pekala bunun nedeni bazen kodun ok kark olabilmesidir. Mesela
blmlerinden biri Sibirya da(Sibirya, Rusyann Ural dalarndan byk
okyanusa uzanan topraklardr.) geen bir FPS oyunu yapalm. mesela oradaki
rzgarlar ok gldr. biz dz gitmek isterken bizi baka tarafa doru
gtrecek rzgar olacaktr. ite bu rzgar GEREK HIZ vektr kendi
yrymz ise GREL HIZ vektr ile ifade ederiz.
c_move(my,vector(3,0,0),vector(0,-1,0),GLIDE);
mesela yukardaki kodda my olan ey araba olsun. greli hzda x ynnde 3
brm vektr kuvveti ile hareket ediyor. ayn zamanda -1 birim y ynndede
baka bir kuvvet etki ediyor. mesela bu kuvvet merkez ka kuvveti olabilir.
aadaki resme bakn;
yukarda daha iyi anlayacanz umuyorum , greli hz cisme etki eden ona yn
veren hzd yani biz gaza basp yn tularn kullandmzdaki hz. gerek hzda
ise merkezka kuvveti. (dnyann yerekiminden kaynaklanan virajlarda bizi
dar iten kuvvet.)
Evet artk anlatma ksm yeter. bu kadar rnekten sonra anlamsnzdr. imdi
workshop 18 klasrnde homework18(acknex map file) dosyasn an.(eer
WED editr varsa)
kutu eklindeki basit bir odann iinde bir araba gryoruz. burada ilk nce
yapmamz gereken otomobilin zerine sa tklayp propertiesi seip BBOXn
seili olup olmadn kontrol etmek. bu zellii setikten sonra araba duvara
arpnca yzeyi elips eklinde oluyor ve yalama yapyor. ok nemli bir arpma
zelliidir. eer WED yoksa Lite-c de while ksmnn altna c_setminmax(me);
yazarak da kontrol edebilirsiniz.
evet imdi program altrn. A ve S tularna basarak otomobilin pan alarn
ayarlayabiliyoruz. (googledan bakn EULER AILARI) imdide home18
scriptine bakalm.
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////
function main()
{
level_load ("homework18.wmb");
wait (2);
vec_set(camera.x,vector(0,-480,1000)); // Kamerann konumu
vec_set(camera.pan,vector(90,-68,0)); // Kamerann as
}
action my_car()
{
while (1)
{
c_setminmax(me);// (wed olmayanlar iin) BBOX
/
if (key_a)// A ya baslrsa
my.pan += 3*time_step; // pan asn 3* zaman atlamas
artrarak devam et
if (key_s)
my.pan -= 3*time_step; // ayn ilemin azaltmal olan
if (key_space ) // eer boluk tuuna baslrsa
c_move (my, vector(15*time_step, 0, 0), nullvector, GLIDE);//
beni 15*zaman atlamal x vektrnde devam et.(her saniye 15 birim x i artr.)
wait (1);
}
}
pekala kodumuzda kamerann asn ve konumunu vektrlerle belirttik.
c_setminmax(me); de WED olmayanlar iin BBOX salyordu. peki space tuuna
baslrsa ne oluyor?
greli hzn ksmna cisim x ynnde her saniyede 15 birim artan vektrle
ilerlet.(akas bu srenin her saniye olduunu dnmyorum.) zelliinde bir
vektr koyduk. gerek hza ise vec(0,0,0) yani nullvector koyduk. yani cisme
bizim kontrolmzde olmayan bir vektr etki etmiyor. en son olarak ta cisim
duvarlar yalamas iin GLIDE flagn yerletirdik.
evet ders ok uzun oldu ben yoruldum bu derste bu kadar. dikkat ederseniz
tepeden grnl yarn kodlar tam olarak verilmemi. bence arabann rengini
deitirerek (MED editrde manage skins ten yaplr) 3 tane araba treterek
(yartada gsterilmi) basit bir drag yar yapabilirsiniz.
MACHERA!!!!!
Lite-c Iizik dersi

GumeStudio sitesinden lite-c workshops`u indirin
http:[[server.conitec.net[down[litec.zip
Zip dosyusInIn iindeki zip dosyusInI uIp workshop 1q`yi uIn.
Lite-c kodunu uIn.

[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
=include <uckne.h> Klusik heuder tunImlumu
=include <deIuult.c>
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
VICTOR bull_speed; top hIzI iin gerekli vektr.
INTITY bull; bull isminde entity tunImlur

Iunction muin{)

Ips_mu = 1qo;
level_loud{"roller.wmb"); [[ roller.wmb isminde blm
ykler
bull = ent_creute {"bull.mdl", vector{-qoo, o, 1oo), NLLL);
[[ duhu nce bull ismini verdigimiz entity`i -qoo{),o{y),1oo{z)
koordinutlurIndu hibirey yupmudun{NLLL) oluturur.
ph_setgruvity {vector{o, o, -S6)); [[ z ynnde -S6 birim
kuvvette yer ekimi oluturur.
phent_settype {bull, PH_RIGI, PH_SPHIRI); [[ Iizik
verecegimiz topun cinsinin, eklinin ne olucugInI tunImlur
phent_setmuss {bull, , PH_SPHIRI); [[ cisme kresel tipte
kg ugIrlIk verir.
phent_setIriction {bull, So); [[ So birim byklgnde
srtnme kuvveti verir.
phent_setdumping {bull, qo, qo); [[ zIplurken ve yu
yukurIdun uugI derken urptIktun sonru ne kudur
zIpluyucugInI uyurlumu.
phent_setelusticity {bull, go, o); [[ elustikligi uyurlur.
while {1)

bull_speed. = g {key_cur - key_cul); [[ topun ok
iuretleri tulurI ile hureket etmesini suglur.
bull_speed.y = g {key_cuu - key_cud); [[ -y
dogrultusundu g set hIzlundIrmu verir.
bull_speed.z = o; [[ dikey eksende herhungi bir hIz
vermez.
phent_uddtorqueglobul {bull, bull_speed); [[ topu tork
yuni ivmelenme verir.
cumeru. = bull. - oo; [[ kumeruyI topun oo birim
gerisinde tutur.
cumeru.y = bull.y; [[ kumerunIn y ekseni koordinutI ile
topun ki uynI degerde.
cumeru.z = 1ooo; [[ kumeruyI 1ooo birim z ekseninde
yerletirir.
cumeru.tilt = -6o; [[ kumeru 6o derece uugI bukur.
wuit {1);
]
]
Vektrler 3 boyutlu uzayda bulunurlar. Ball_speed vektrde 3 boyutlu
uzayda bunduuna gre 3 eksen vektr vardr. Ball_speed.x, ball_speed.y
ve ball_speed.z.normalde illa bir cisim oluturmak iin ENTTY * ball
yazlmaz. Direk ent_create fonksiyonunu kullanarakta cisim
oluturabilirsiniz. Ama buradaki ama oluturacamz cisme zel isim
vererek yaplacak dier ilemlerden muaf tutulmasn salamak. Fps_max
= 140; ta ise amacmz hzl bir bilgisayar ile yava bir bilgisayarn oyunu
farkl frame per secondlarda(fpslerde) almasn engellemek. Etkisini
daha net grmek iin lite-c dosyasnda bu satr silen bir daha derleyin.
ph_setgravity (vector(0, 0, -386)); de yine bu fonksiyon bir vektr
oluturuyor. Daha ncede belirttiim gibi vektrn 3 bileeni var. X,y,z
burada -386 birim ynnde yerekimi veriyor. Y ve x de yerekimi yok.
Eer x ynne de 600 birm yer ekimi ekleseydik oyun aldnda cisim
direk hareket edecekti. Eksenleri daha iyi anlamanz iin aada pozitif
ynerini gsteren bir resim var:
phent_settype (ball, PH_RIGID, PH_SPHERE); bu fonksiyonla cismimizin
dnya zelliklerini sralyoruz. Entity nin ismi ball d. Sonra cismin kat ve
ii dolu bir cisim olduunu syleyen PH_RIGIDi yazdk. Objenin eklini
ise PH_SPHERE ile tanmladk. Burada cismin kresel olduunu
sylyoruz. Deitirme yaparsak oraya PH_BOX yazalm ve tekrar
derleyelim. Cismin hareketinde zorlanma var fark ettiniz deil mi? Direk
kresel olduunu syledik. Peki sorabilirsiniz cismimiz ekilsiz ordaki
tanmlamalara uymayan olsayd ne olacakt? O zaman cismimize
PH_POLY. Ekler ve ona polihedron muamelesi yapardk. phent_setmass
(ball, 3, PH_SPHERE); kresel arlk merkezi tipinde 3 kg arlk verdik.
Burada ball yine entity ismi. phent_setfriction (ball, 80); ile ball adl entity e
80 birim byklnde srtnme kuvveti verdik. Normalde srtnme
kuvvetinin herhangi bir birimi yoktur ancak burada gamestudionun kendi
birimleme sistemiyle srtnme kuvveti verdik. phent_setdamping (ball, 40,
40); ile cisme lineer ve asal olarak yere vurdunda ve ya saa sola hareket
etme asndan damping verdik. Deerlerle oynayarak daha net
grebilirsiniz. phent_setelasticity (ball, 50, 20); bu fonksiyonla topumuza
zplama verdik. 50 zplama faktrmz yada zplama oran diyebiliriz
arttka elastiklii artacak ve pinpon topuna dnecektir. 20 ise minimum
hz. Burada anlatmak istenen eer topun dikey hz 20 den azsa top yere
arptnda zplamayacaktr.
ball_speed.x = 25 * (key_cur - key_cul);
ball_speed.y = 25 * (key_cuu - key_cud);
ball_speed.z = 0; burada ir tua basarsanz o tuun deeri derleyicide 1
olur. Mesela key_cur a bastnz onun deer 1 oldu ancak key_cula
basmadnz iin onun deeri 0 1-0 =1. 25*1 deerinde pozitif x ynnde
top hareket edecekti. Eer tam tersi olsayd 0 -1 = -1 olacakt ve top -1*25
hznda x ynnde hareket edecekti . ayn kodu ylede yazabilirdik:
ball_speed.x = 25 * (key_cur);
ball_speed.x = -25 * (key_cul);
ball_speed.y = 25 * (key_cuu);
ball_speed.y = -25 * (key_cud);
ball_speed.z = 0; yukar aa hareket etmemesi iin zye 0 verdik.
phent_addtorqueglobal (ball, ball_speed); bu fonksiyonla arkadalar topa
ball_speed vektrleri ynnde ball isimli entitye global tork verir. Birde
cisme verilen lokal tork var onuda aadaki kodla deneyebilirsiniz aradaki
fark zmek adna kod aada:
phent_addtorquelocal(ball, vector(ball_speed.x,ball_speed.y,ball_speed.z));
peki dersi yaptktan sonra ne yapalm? Kp ve farkl ekillerde cismlerle
deneme yapabilir arabaya benzer cisim koyarakta kk bir araba yar
yapabilirz. Ben size daha deiik bir oyun yapacam rnei sitede
gstereceim!
MACHERA Y OYUNLAR!!!!
SPRTES , ANMATED SPRTES
Neden spritelara ihtiyacmz olduuna pratik bir rnekle bakalm;
Jonas Noel tarafndan yaplm bir level tasarmndan grnt. ndirmek iin
Gamestudio download sayfasna bakabilirsiniz. u anda resim gzel grnyor
bir de aadakine bakalm;
Pekala benzer bir resim ancak ufak bir fark var deil mi? Ik kresi gitmi halde
dikkatinizi ekiyor mu? te bunlarn hepsini spritelar ile salayabiliyoruz.
Sprite yapmak iin bir resim dzenleme yazlm kullanabiliriz. Ben GIMP ile
yaplan anlatacam. (hem kullanl hem de bedava!)
Pekala GIMPi ayoruz. Atktan sonra sol stten dosya > yeni diyerek yada
CTRL+N tu kombinasyonu ile yeni bir alma ortam oluturuyoruz. nmze
gelen pencerede genilii 100 ve ykseklii 400 olarak belirliyoruz ve resmi
oluturuyoruz.
Ara kutusundan blend toolu seiyoruz. (kova simgesinin solunda) sonra
hibir deiiklik yapmadan aadaki resimdeki gibi resim oluturuyoruz.
resmi olutururken yanda grdnz gibi oluturuyoruz.
Nasl yapacaz?
Fareyi resmin alt tarafna getiryoruz ve yukar doru basl
tutarak ekiyoruz. stteki mor + imleci kadar gtrdkten
sonra brakyoruz. Aadaki resim olumal.
imdi bu resme lamba aydnlatmas vereceiz.
Onun iinde perspective toolu seiyoruz.
Setikten sonra resmin zerine 1 kere
tklyoruz ve resmin st kelerinde oluan
kutular birbirlerine aadaki resimde
olacak ekilde yaklatryoruz. lemi
bitirdikten sonra alan
perspektif isimli
kutucuktan dntre
tklyoruz.Evet artk
Spritemz hazr. imdi
sol stten Dosya > farkl
kaydete tklyoruz.
Resmin ismini ve
kaydedeceimiz yeri
belirledikten sonra
resmin formatn
TARGA olarak
belirliyoruz. nmze
gelen iki ekranda ilkini
export ikinicisini ise
kaydete tklayp ilemi
tamamlyoruz. imdi
nasl blme ekleyeceiz
ona bakalm.
WED editr ap aadakine benzer bir blm oluturun.
Umarm anlalmtr. Oluturduktan sonra Object > Load entityden. Arama
seeneimi Sprite files olarak deitirip resminizin bulunduu dizini bulup
resminizi ykleyin. Resim bende byk olutu. Eer sizde de yle olduysa resme
tklayp scale arac ile resmi klt ve tam n zerine yerletirin. Ve resmin
Properties ksmndan Bright sein . resmi grecek ekilde kamera ekledikten
sonra build edip run deyip altrn.
Yukardaki resim gibi bir grnt olumal. Nasl ama ok daha gereki olmu
deil mi? Ben ok beendim akas.(RESM ALPHA KANALI EKLENM
HALDEDR!)
ANIMATED SPRTES
Olay ilk nce bir grelim deil mi hadi imdi script20.cyi aalm.
Bulank halde ve animasyonlu acknex rules yazan bir yaz. Pekala bu yaz 29
frameden oluan bir resim nasl bir ey grmek istiyorsanz GIMP ile
logo+29.pcx an ve bakn. Hadi imdi E tuuna basalm;
Bir patlama efekti! Vay canna hem de ok kaliteli. Baka bir patlama
istiyorsanz tekrar E tuuna basn ve bir daha izleyin.
Evet iki tip animasyon vardr.biri dng dieri tek vuru animasyonu. Tek vuru
animasyonlar patlama efekti gibi sadece bir kere oluabilen animasyonlar.
Mesela e tuuna basarak yaptmz patlama efekti sadece bastmzda oluyor.
Animasyonlu grafik aadaki gibi oluyor;
Bu Bitmap 5 tane kareye sahip yani 5 film karesi. Oyun motoru bu bitmaplar
soldan grntlemeye balyor ve sa tarafta sonlandryor.
Pekala nasl animasyonlu grafik oluturacaz? Baz bedava spritelar ACKNEX
UNLMTEDda bulabilirsiniz. Veya bir resim program ile kendinizde
oluturabilirsiniz. Pekala oluturmak iin tek bir frame in bykln
belirliyorsunuz rnein 128x32 piksel byklnde 4 frame oluturacaksanz
Bitmap bykl 512x32 piksel olmal nk 128x4 = 512 anladnz m?
Resimleri yan yana koyunca bu ekli alyor.
Her sayda frame ile animasyonlu grafik oluturabilirsiniz. Ne kadar ok frame
olursa o kadar kaliteli efektler elde edersiniz. Fakat bunlar ekran kart
hafzasndan bir miktar yerler. rnein bir pcx formatnda 256x128 piksel
byklndeki animasyonlu grafik 256x128x2 = 65,536 byte yani 64 kb hafza
yiyecek. Eer animasyon 16 kareli olursa 65,536x 16 = 1mb ekran kartndan
bellek yiyecektir.
Unutmayn bir sprite tekrar tekrar kullanabilirsiniz. Eer 1 mb video kartndan
yiyen bir sprite 10 defa kullanrsanz ekran kart 1 spritea 1mb harcadktan
sonra dierine geecek ve o 1 mb getii spritea harcayacak. Yani buradan
karlacak sonu byk bir patlama m yapmak istiyorsunuz? Spritenz
paralara ve hepsini birbirine yakn olacak ekilde kullann!
nemli olan son ey spritelara verilecek isimler. Lite-c grnt okuyamyor
bunun iin lite-cye bunu anlatmamz gerekiyor. Nasl olcak yle olacak;
fire+5.dds,
lightning+32.tga,
my_explosion+12.bmp
ne demek isteimi anladnz m? Burada isim + dan sonraki rakam kare saysn
belirtiyor. Grntl olarak bakarsak;
Eer muzzle.pcx olarka WED de gsterirsek uzanm grnt yani animasyonlu
sprite deil ancak muzzle+5.pcx olarak yazarsak animasyonlu grnt oluur.
Spritelar iin bmp. Pcx. Tga. Dds. Formatlarn kullanabilirsiniz. Spritelar iin
en ideal olan TGA formatdr. PCX ve BMP en az hafza kullanan formatlar. Bu
formatlar 16 bit resim saklyor.
Hadi imdi olayn kod ksmna bakalm bunun iin script20.cyi aalm bakalm;
///////////////////////////////
#include <acknex.h>
#include <default.c> // klasik headerlar
///////////////////////////////
action acknex_loop() // acknex_loop actionu
{
while (1)
{
my.frame += 0.8 * time_step; // 0.8 time_step framei artr
if (my.frame >= 30) my.frame -= 29; eer framemim 30
dan byk yada eit olursa framei 29 azalt.
wait (1); //srekli dndr.
}
}
action explosion() // explosion actionu
{
my.ambient = 100;
my.flags |= BRIGHT; // parlak flag
while(1)
{
while (!key_e) wait (1); // eye baslana kadar
for (my.frame=0; my.frame<12; my.frame += 0.7 *
time_step) wait (1); framemim 0 dan balayacak ve 0.7 artarak 12den
kk ilk sayda bitecek.
}
}
function main()
{
vec_set(sky_color,vector(1,1,1)); // tamamen siyah gkyz
level_load(""); // load empty level
ent_create("logo+29.pcx", vector(300,100,0),
acknex_loop);//acknex_loop ve
ent_create("explo+11.tga", vector(300,-100,0),
explosion);//explosion actionlarn gerekletirecek resimleri olutur.
}
Hadi imdi acknex_loop actionuna bakalm;
While blounun iinde my.frame +=0.8; demi. Yani frami 0.8 artr. Bu
animasyonun hzdr. Rakam deitirerek hzda deitirebilirsiniz.birde eer
frame 30 olursa 29 azalt demiiz. Buda animasyonu baa sar anlamn veriyor.
Burada dikkat etmeniz gereken while blounun iinde olunca motor kapanana
kadar srekli olarak devam eden animasyonu gsteriyor. Buna dikkat edelim.
kinci ksm ise srekli olmayan animasyonumuz yani patlama ile ilgili ksm;
lk satrlar biliyorsunuz ancak for ksmna bakalm;
for (my.frame=0; my.frame<12; my.frame += 0.7 * time_step) wait (1);
for(balang;son;deiim)
{
Bir eyler yap
}
Yani frame deeri 0 dan balayacak ve 0.7 artarak devam edecek 12den kk
en yakn sayda duracak. Yani 11 Anladnz m? Burada 0.7 animasyon hz
sakn unutmayn. Fordan sonraki wait ise motorun kmemesi iin.
Tabi kide baka zmde var o da; (okumayn!)
my.frame = 1;
while (my.frame < 12)
{
my.frame += 0.7 * time_step;
wait (1);
}

Forun yapt iin aynsn yapyor arkadalar. Ancak bu biraz tembellie kaar
haberiniz olsun.
Bu derste bu kadar arkadalar.
MODEL ANMASYONU
Bir oyun yapyorsanz modelde kullanmanz gerekecek. rnein bir fps
oyununda multiplayer oynarken rakibinizi donuk halde grmek istemezsiniz
deil mi? Aadaki resme bir bakalm;
Bu mealenin alevinin hareketsiz durmas ok sama olur deil mi? Hadi imdi
animasyona bir bakalm;
Pekala modellere animasyonu bedava olarak sunulan MED ile verebiliriz. ki tip
animasyon var arkadalar.
1. Vertex animasyonu (modelin frame kullanarak oluturduu animasyon)
2. Bone animasyonu
lk tipimiz olan vertex animasyonu spritelara benzer hadi imdi bir modelin
animasyon karelerine bakalm;
Bu animsyonlar bir isim dahilinde (walk,run,) ve dng iinde ve ya tek vuru
animasyonu olarak oynamaktadr.
Normal bir modelin animasyon kareleri aadaki gibidir.
Bu ksma MED den edit > manage frames den girebilirsiniz. imdi
isimlendirmeyi az ok anlamsnzdr. yle bir durum daha var mesela 2 tip
lm animasyonunuz var. Bunlar nasl ayracaz birinin ismi lma dierinin
ismi lmb ve atyorum lma1 . lma30a kadar animasyon devam
ediyorsa u animasyon 30 kare lmb1. . lmb5 olarak devam ediyorsada
lmb animasyonu 5 kare olur.
Ne demek istediimi daha iyi anlamak iin script21.cyi aalm ve altralm;
Soldaki eleman yry animasyonunu yapyor sadaki ise saf saf bekliyor.
Ancak birka saniye beklersek;
Gryorsunuz adam lm animasyonunu oynatt! Hadi imdi bu scripti
aklayalm.
///////////////////////////////
#include <acknex.h>
#include <default.c>// Klasik headerlar
///////////////////////////////
var walk_percentage; // walk percentage isminde deiken
var death_percentage;// deathd percentage isminde deiken
function main()
{
video_mode = 7;
level_load ("work21.wmb");
wait (2); level yklenene dein 2 saniye bekle
camera.z = 120; camera ykseklii
camera.tilt = -15; //euler cinsinden kamera as
}
action walking_guard()
{
while (1)
{
ent_animate(my,"walk",walk_percentage, ANM_CYCLE);
//walk animasyon dngs
walk_percentage += 3 * time_step;//animasyon hz
wait (1);
}
}
action dead_guard()
{
wait (-5);// 5 saniye bekle
while (1)
{
ent_animate(my, "death", death_percentage, 0); tek vuru
lm animasyonu
death_percentage += 3 * time_step;// animasyon hz
wait (1);
}
}
Walking_guard acitonuna bakalm;
While(1) kullanyoruz nk animasyonun srekli olmasn istiyoruz. Yeni bir
nceden tanmlanm deiken reneceiz ismi ent_animate
ent_animate(my,walk,walk_percentage,ANM_CYCLE);
bu kodun anlam iinde yazld actionun eklendii cisme (my), walk
animasyonunu ,walk_percentage yzdesinde ,dng olarak (ANM_CYCLE)
oynat.
Tabi my yerine bir entity tanmlaypta koyabilirdik. rnein;
ENTTY * machera_guard = machera_guard.mdl
Sonra entity ksmna (myn olduu ksm) machera_guard yazarz.
walk ise animasyon ismi. Walk1,walk2,walk3 diye gidiyor..
nemli ksm walk_percentage
Bu animasyon yzdesi oluyor. Yani 0 olunca animasyon 1. frame den balyor ve
100 olunca da son framei oynatyor. Dikkat ederseniz sanki ok fazla frame
varm gibi duruyor. Halbuki yok. Lite-c kendi iinde animasyonu yumuatyor
ve gze ho grnmesini salyor. Eer animasyonu MED editrn iinde
oynatrsanz fark grebilirsiniz.
Oynatmak iin MED de
lk nce aadaki e tklayn. Sonra ayni hizadaki simgesine
tklayn.
Walk_percentage += 3*time_step; ise walk percentage art hzn gsteriyor.
Yani animasyon hzn.Eer bu kod olmazsa animasyon oynamaz dikkat
edelim.nk deerin ne kadar artacan bilmeyecek lite-c.
ANM_CYCLE ise animasyonun nasl oynayacan belirliyor. Eer
ANM_CYCLE yazmasak animasyon bir dng iinde oynamayacakt. Daha
detayls iin MANUALe bakn.
Model animasyonu hakknda bilmeniz gerekenler bu kadar daha ak olmas iin
imdide one-shot(tek vuru)animasyonumuzun olduu dead_guard actionuna
bakalm.
action dead_guard()
{
wait (-5);// 5 saniye bekle
while (1)
{
ent_animate(my, "death", death_percentage, 0); tek
vuru lm animasyonu
death_percentage += 3 * time_step;// animasyon hz
wait (1);
}
}
Evet koddan grdmz gibi bu eleman animasyona balamadan nce 5 saniye
bekleyecek. Biliyorsunuz waitin iine yazlan negatif deerler beklemeyi iaret
eder.
While(1) dngs kullandm. Bu dngyle karakter animasyonu srekli
oynayacakt fakat ben dngsz animasyon kullandm. Buda bouna ilemci
gcnden yemek oluyor. Bunun iin gzel bir zm aada;
action dead_guard()
{
wait (-5); // wait for 5 seconds
while (death_percentage <= 100) // death_percentage sadece
0 ile 100 arasnda deer alacak
{
ent_animate(my, "death", death_percentage, 0); tek vuru
lm animasyonu
death_percentage += 2 * time_step; lm animasyonu hz
wait (1);
}
}
Bu ekilde dngnn srekli kullanlmamasn saladm. Bylece ielmci
gcnden de tasarruf etmi oldum. Kk oyunlar iin nemli deil ama byk
tasarml oyunlarda bu tr kod deiiklikleri OPTMZASYON adyla hayati
nem tarlar. BU DERSTE BTT SON OLARAK;
Yrme animasyonumuza hareket eklemek istermisiniz?
action walking_guard()
{
while (1)
{
ent_animate(my,"walk",walk_percentage, ANM_CYCLE); /
c_move(me,vector(2*time_step,0,0),nullvector,GLIDE);
walk_percentage += 3 * time_step;//animasyon hz
wait (1);
}
}
LER DZEY MODEL ANMASYONU (BONES)
nceki workshopta animasyonlar frame (kare) lere gre yaplyordu. te
yrme ,koma , zplama diye gidiyordu. Zplama 5 frame ,koma 10 frame vb
peki zplama VE komay ayn anda yaptrmak istersek ne yapmalyz ? Pekala
zpko isimli ayr bir animasyonda yapabilirsiniz ve ya lite-c de sadece kodlarla
animasyonlar kombine ederek birlikte oynatabilirsiniz. Pekala bir noktaya
deinmek gerekiyor ;
Pekala workshop 22de script22.cyi ap altralm.
Dikkat edin bu robot bir programclk sanat. imdi bu robot bildiimiz while
blounun iinde yrme animasyonunu bir gzel dndryor. sterseniz 0
tuuna basp robota biraz daha yaklaabilirsiniz, imdi space tuuna basn
bakalm ne olacak?
Bizim robot yine yrme animasyonunu oynatyor ancak ayn anda silahnn da
ynn deitiriyor.eer space tuuna basmay brakrsak silah tekrar yerine
dnecek.
Pekala bone farkn daha da iyi grmek iin robot.mdli MED editrde ap edit
> manage framesden yrme ve dnme isminde iki farkl animasyonun
olduunu greceksiniz. te biz iki animasyonu lite-c de birletirip
oynatabiliyoruz. Dikkat edin! Yrdn gibi bir animasyon yok.
Hadi script22.cyi inceleyelim.
////////////////////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
var walk_speed;
var turn_speed;
function bones_test()
{
my.pan -= 180; // robota nden bak
while(1)
{
ent_animate(my, NULL, 0, 0); // btn animasyonlar
resetle
walk_speed += 1.5 * time_step;// yrme hzn 1.5
step artr
ent_animate(my, "walk", walk_speed, ANM_CYCLE); //walk
animasyonunu oynat
if (key_space && (turn_speed < 100)) // spacee baslr
ve turn_speed 100den kk olursa
turn_speed += 10 * time_step; //dn hzn
artr
if (!key_space && (turn_speed > 0))spacee
baslmam ve turn_speed 0 dan bykse
turn_speed -= 10 * time_step; //dn hzn azalt
if (turn_speed > 0) // dn hz olursa
ent_animate(my, "turn", turn_speed,
ANM_ADD); // turn animasyonunu oynat.
wait(1);
}
}
function main()
{
level_load (""); //bo level ykle
wait(2); // level yklenene kadar 2 saniye bekle
ent_create("robot.mdl", vector(400, 0, -50), bones_test);//
cismi bones_test fonksiyonunu uyguluyacak ekilde koordinatlarda
olutur.
}
Main fonksiyonu bo bir level yklyor ve 2 saniye bekledikten sonra
belirlediimiz kordinatlarda bones_test fonksiyonunu uygulayacak ekilde
oluturuyor.
Tabi ki can alc nokta bones_test fonksiyonu. Fonksiyonun ilk satrnda EULER
AILARI na gre pan asn -180 derece yaparak kamerann robotun n
tarafna dnmesini salyoruz. Pekala imdi while ksmna bakalm;
lk satrda nceki derstende bildiimiz ent_ent animate fonksiyonu var.
ent_animate (my,NULL,0,0) peki bu ne alaka? yle bir alakas var bu kod
modelimizin btn animasyonlarn sfrlyor. Yani btn pozisyonlar modelin
orijinal haline geliyor. SONU: eer BONE kullanan bir modelin animasyonu
zerinde alyorsanz mutlaka ilk nce o modelin animasyonlarn
SIFIRLAYIN. Eer bone yapm ve anime ettirilmesi hakknda daha fazla bilgi
edinmek istiyorsanz Game Design Tutorialin MED ksmn okuyun.
Pekala ikinci satrda gryorsunuz walk_speed isminde bir deiken var bu
deiken animasyonun hzn kontrol etmeye yaryor. ent_animate geen dersten
bildiiniz iin alt satr geiyorum.
imdi nemli ksmlardan if blm;
if (key_space && (turn_speed < 100))
turn_speed += 10 * time_step
if (!key_space && (turn_speed > 0))
turn_speed -= 10 * time_step;
if (turn_speed > 0)
ent_animate(my, "turn", turn_speed, ANM_ADD);
bu ksm space tuuna basp basmadmz kontrol etmeye yaryor.
ilk satrda;
eer space tuuna baslrsa ve turn_speed deeri 100 den kk olursa
turn_speed deeri 10*time_step; artacak anlam var gibi grnyor ancak gerek
yle deil;
dikkat ettiyseniz ilk baa var turn_speed isminde bir deiken atadk var
deikene herhangi bir deer vermedik. Deer vermediimiz iin if iinde ki
turn_speed< 100 ifadesi eer turn_speed 100 den kk olursa DEL
turn_speed deeri 100 olsun anlam verir. Yani kesin bir nicelik. Yine ayn
ekilde 3. satrda turn_speed > 0 var buradada turn_speed> 0 olsun demi
oluyoruz. Bylece turn_speed 0 < turn_speed < 100 eklinde bir ifade alyor. 5.
ksmada if(turn_speed> 0 ) demiiz. bunu dememizdeki ama st ifadelerde
turn_speede bir aralk verdik ancak turn_speedin aralk deerinde ne
yapacan belirtmedik. Bunu belirlemeye yaryor. yani;
turn_speed>0 olduu durumda turn animasyonunu turn_speed yzdesinde
ANM_ADD modunda oynat.
Daha ak olmas iin resme bakn;
Peki bu ANM_ADD da ne?
Ent_animatete mod var. ANM_SKIP , ANM_ADD, ANM_CYCLE . geen
derste ANM_CYCLE sylemitim. Vertex animasyonlarnda kullanlan
frameler iin gereken moddu. ANM_ADD ise bone animasyonlar iin gereken
moddur.yani gidip oraya ANM_CYCLE yazarsanz olmaz.BONE iin kesinlikle
ANM_ADD olmaldr. Animasyona yeni bone alar eklemeye yarar.bunun
anlam yrme animasyonu oynarken dnme animasyonu da ayn anda oynar. 2.
ent_animatte yrme animasyonunu belirtmitik buna ekleme yapyor.
zetle if ksmlar iin;
3 ent_animate direktifi var.
Birincisi btn animasyonlar her karede resetliyor.
kincisi robota walk animasyonunu oynattryor.
ncs bu oynayan animasyona space tuuna basldnda turn
animasyonunun eklenmesini salyor.
BONES BLM 2 (BONE COLLECTOR)
Bone dersinin ikinci ksm ile karnzdaym. Artk normal bir lite-c kullancs
deiliz. Bone kullanmn daha iyi renmek iin bu derste ent_bonerotate
direktifi ve pose hakknda konuacaz. Bu zellikler bone ile geldiinde ok
nemli oluyorlar.
Hadi script23.c yi aalm.
#include <acknex.h>
#include <default.c>
var walk_speed; //robotu yrme hzn saklayan deiken.
ANGLE bone_angle; //bu vector EULER olarak pan,roll ve tilt alarn
saklyor.
BMAP* crosshair_pcx = "crosshair.pcx"; //bu Bitmap bizim hedef noktamz
olacak
////////////////////////////////////////////////////////////////////////////////////
function rotate_bone()
{
my.pan = -180; //kamera robota nden bakacak
while(1)
{
walk_speed += 2 * time_step; // walk_speedi 2*time_step;
aralklar artr.
ent_animate(my, "walk", walk_speed, ANM_CYCLE); // cisme
walk animasyonunu oynattr.
bone_angle.pan = (mouse_pos.x - screen_size.x / 2) / 10; // pan
asn -40dan +40 a deitir.
bone_angle.tilt = (screen_size.y / 2 - mouse_pos.y) / 10; // tilt
asn -30 dan +30 adeitir.
bone_angle.roll = 0; //roll asn deitirmeye ihtiya olmad
iin 0 yazyoruz.
ent_bonereset(my,"CA4");
ent_bonerotate(my,"CA4", bone_angle); // CA4 isimli boneyi
dndr.
wait(1);
}
}
function main()
{
video_mode = 7; // 800x600 piksel ekran ayarla
level_load (""); // bolevel ykle
wait(2); level yklenene kadar 2 saniye bekle
ent_create("robot.mdl", vector(400, 0, -50), rotate_bone); // ve robot
modelini olutur.
mouse_map = crosshair_pcx; // hedef noktas bitmapn mousea
entegre et.
mouse_mode = 2; // Mouse imlecini olutur. (hedef noktas oluyor)
while (1)
{
vec_set(mouse_pos, mouse_cursor); // Mouse pozisyonunu
srekli gncelle
wait (1);
}
}
Main fonksiyonu bo bir level yklyor , robot cismini oluturuyor ve
crosshair_pcx pointeri ile adlandrdmz crosshair.pcx resmini grnr olarak
Mouse imleci resmi olarak atyor. Vec_set, fare imlecini tanmlayan
Mouse_cursoru fare pozisyonunu tanmlayan Mouse_posa eitliyor ve srekli
gncel kalmas iinde while direktifi iinde yazlyor. Eer 14. ders olan fare
dersine baktysanz . 4- 5satr fare imleci hareket kodu yerine tek satr bu kod
daha kolay oluyor.
Hadi yeni bone fonksiyonunu aklayalm.
function rotate_bone()
{
my.pan = -180;
while(1)
{
walk_speed += 2 * time_step;
ent_animate(my, "walk", walk_speed, ANM_CYCLE);
bone_angle.pan = (mouse_pos.x - screen_size.x / 2) / 10;
bone_angle.tilt = (screen_size.y / 2 - mouse_pos.y) / 10;
bone_angle.roll = 0;
ent_bonereset(my,"CA4");
ent_bonerotate(my,"CA4", bone_angle);
wait(1);
}
}
Bu fonksiyonun ilk satrlar geen derstekine benziyor. Yine kamera robota
nden bakyor ve robot walk animasyonunu oynatyor. Ancak bu sefer bone
animasyonunu SIFIRLAMADIK . neden ? nkelimizde ANM_ADD yok ama
ANM_CYCLE var. ANM_ADD de mutlaka her framede animasyonlar
sfrlamak gerekir tekrar hatrlatmak isterim.
Bunlar takip eden 3 satr kod isefare pozisyonuna gre alar ayarlamaya
yaryor.
bone_angle.pan = (mouse_pos.x - screen_size.x / 2) / 10;
bone_angle.tilt = (screen_size.y / 2 - mouse_pos.y) / 10;
bone_angle.roll = 0;
burada grdnz gibi biz bone_angle isimli bir a vektr(ANGLE)
tanmladk. ANGLE yine nceden bildiimiz VECTOR a benzer bir vektr. Yine
onunda x,y,z deerleri var ancak bu x,y,z deerleri ok eklinde vektr deilde
asal vektr tanmlyor. Hadi bunlar naslm grelim.
ekran znrln 800x600 piksel olarak belirledik. Buda demek oluyor ki
yatayda 800 dikeyde 600 piksel hareket alan var. lk direktife bakarsak;
bone_angle.pan = (mouse_pos.x - screen_size.x / 2) / 10;
burada bir forml sz konusu. Fare imlecinin .x pozisyonu (mouse_pos.x) 0dan
ekran znrln maksimum x deeri arasnda bir deer alr yani
DEKEN. screen_size.x bildiimiz gibi 800 piksel ve SABT. O zaman formle
koyarsak rnein Mouse_pos.x = 600 olsun;
bone_angle.pan = (600 (800/2))/10 o da 20ye eit olacak. Ancak 20 neye eitti?
Bone_anglen PAN as deerine. Maksimum piksel deerlerine bakarsak
(800 (800/2)) = 40; ve (0 (800/2)) = -40; yani a deeri 40 -40 arasnda bir
deer alacak.
kinci direktif biraz farkl;
Neden farkl nk yukardan aa 600 piksel var. Buda a deerini etkileyecek
anlamna geliyor. Eer formllerde yerine koyarsanz (size brakyorum
hesaplamay) -30 ile +30 arasnda bir deer aldn greceksiniz. Bu ne asnda
eitti? TLT asna.
Son olarak roll asna ihtiyacmz olmad iin deerleri sfrladm.
Hounuza m gitti? Hadi script23.cyi altrnda robotun silahnn asnn nasl
deitiini grn.
Pekala dndrme kodlarn grdk ancak dndrecek bonelar eklemedik.
Hemen aadaki 2 satr koda bakalm.
ent_bonereset(my,"CA4");
ent_bonerotate(my,"CA4", bone_angle);
ilk satr CA4 isimli silah bonesini resetlemeye yaryor. yani onu animasyonsuz
haline getirmeye yaryor.ikinci satr ise onu bone_angle deerinde dndrmeye
yaryor. aadaki resimde CA4 bonesinin standart pozisyonu var.
hadi imdi direktifin genel yazlmna bakalm.
ent_bonerotate (uygulancak_cismin_ismi , bone_ismi , dn_as);
uygulanacak_cismin_ismi = biz robot.mdli belirlemitik. Ent_createde yazmtk
onun iin my yazyoruz.
Bone_ismi = dndreceimiz bonenin ismi. Biz CA4 belirledik.
Dn_as = ismini yazdmz bonenin dn as. Biz bone_angle isimli bir
deikenle deer verip CA4 dndryoruz.
Ent_bonereset kullanmamzdaki ama ne? Eski oluan a ve animasyon
deerlerini sfrlamak. rnein oyuncu 30 derecelik bir a yapt x ekseninde.
ancak bu deer artarak 35 derece oldu. ite burada eski framedeki a deeri
sfrlanmad iin 30+35 = 65 derecelik bir a alglayacak bilgisayar. Script23.c
de buna ihtiya yok nk walk animasyonu zaten resetleme ilemini yapyor.
Bu ders ok nemliydi. Gerekten ok nemli. Yapacanz oyunlarda inanlmaz
kullanl olacaktr bu ders hatim edin!!!!!
MACHERA
DEKENLER 2
Bu derste Global ve lokal deikenleri reneceiz. kinci dersi hatrlasanz
deikenlerden bahsetmitik. O derste global ve lokal deikenlerden bahsedilmedi
nk yeni balayanlar iin biraz ard.
Aslnda global deikenleri srekli kullanyorsunuz. Lokal deikenlerden bahsetmek
iinse fonksiyonlara ve actionlara ihtiyacm olacak. O zaman hadi script24.c yi ap
altralm.
Siyah bir blm ierisinde dnen gzel bir dnya grmekteyiz. imdi kodlara
bakalm;
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////
var rotation_speed = 0.1;
function mother_earth()
{
while (1)
{
my.pan += rotation_speed * time_step;
wait (1);
}
}
function main()
{
vec_set(sky_color,vector(1, 1, 1)); // siyah gkyz
level_load ("");
wait (2); // level yklenene kadar bekle
ent_create("earth.mdl", vector(400, 0, 0), mother_earth);
}
Pekala basit bir script. Bizim dnyann pan as 0,1*time_step dnerek deiiyor
nk rotation_speed adl deikenimizin deeri 0.1. tahmin edeceiniz gibi bu bir
global deikendir. Bu deiken herhangi bir action Ya da fonksiyonun dnda
tanmland. Daha nceden de sylediim gibi nceki btn workshoplarda bilmeden
de olsa global deikenleri kullandk. Pekala imdi script alrken tab tuuna basalm
ve aadaki satr yazalm.
rotation_speed = 5;
dnyann dn hz biraz daha artt deil mi? (50 kat kadar) . Konsolu kullanarak
krenin hzn ayarlayabiliyoruz nk bu deiken btn fonksiyonlar ve actionlar
tarafndan biliniyor. Ne global deiken ama !
Lokal deikenler ise tanmlamalar ile birlikte fonksiyon veya action iinde bulunan
deikenlerdir. Hadi imdi global deikenimizi local deiken yapalm. Nasl
yapacaz? Rotation_speed isimli deikenimizi mother_earth fonksiyonunun iine
while dan nce yazarak yapacaz. Yaniaadaki gibi;
function mother_earth()
{
var rotation_speed = 0.1;
while (1)
{
my.pan += rotation_speed * time_step;
wait (1);
}}
Hadi imdi scripti tekrar altralm.
Dnya yine eskisi scripti ilk altrdmz haldeki gibi dnyor.yine tab tuuna
basarak konsolu ap aadaki satr yazalm;
rotation_speed = 5;
bu sefer dn hz deimedi. nk deikenimiz lokal bir deiken olduu iin
konsol fonksiyonun iine giremedi ve dn hz deimedi.
Pekala lokal deikenlerin gzel zellikleri nelerdir? Neden srekli glocal deikenler
kullanmyoruz? Bunu renmek iin script24_2.c'yi ap altralm.
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////
function mother_earth()
{
var rotation_speed = 0.1;
if (my.y < 0)
rotation_speed = 20;
while (1)
{
my.pan += rotation_speed * time_step;
wait (1);
}
}
function main()
{
vec_set(sky_color,vector(1,1,1)); //siyah gkyz
level_load ("");
wait (2); // wait until the level is loaded
ent_create("earth.mdl",vector(400,-100,0),mother_earth);
ent_create("earth.mdl",vector(400,100,0),mother_earth);
}
mother_earth fonksiyonu iinde rotation_speed isminde bir lokal deiken tanmaldk.
Soldaki krenin dn hz 0.1 sadaki krenin dn hz ise 20. bizim mother_earth
fonksiyonu iki kere arlyor biri soldaki kreden dieri sadaki kreden. Ama
mother_earth fonksiyonu iki farkl deerde alyor. Nasl oluyor renmek iin
kodun en can alc yerine bakalm.
function mother_earth()
{
var rotation_speed = 0.1;
if (my.y < 0)
rotation_speed = 20;
sadaki krenin y deeri -100 soldaki krenin y deeri ise 100. sadaki kre iin
if(my.y < 0) ksm doru soldaki kre iin ise doru deil. Doru olan ksmda
dndrme hzn 20 yaparken doru olmayan ksmda 0.1 de kald iin krelerin
dnme hz farkl oluyor.
Bu derste bu kadar.
MULTPLAYER OYUNLAR
hadi imdi ok basit bir lite-c oyun kodlarna bakalm. Bu oyun kodu daha sonra
multiplayer'a da evrilecektir. Script25.c'yi aalm.
////////////////////////////////////////////////////////////////////////////
//ok basit bir single player lite-c oyunu.
////////////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
action player_move() //oyuncuyu kontrol et.
{
var walk_percentage = 0;
while (1)
{
my.pan += (key_a - key_d)*5*time_step; //oyuncuyu A ve D tular ile dndr.
var distance = (key_w - key_s)*5*time_step;
c_move(me, vector(distance,0,0), NULL, GLIDE); //W ve S tular ile hareket ettir.
walk_percentage += distance;
ent_animate(me,"walk",walk_percentage,ANM_CYCLE); // oyuncuya animasyon
ekle
wait (1);
}
}
function main()
{
level_load ("multiplayer6.wmb");
vec_set(camera.x, vector (-600, 0, 100)); //uygun oyuncu kamera pozisyonu.
ent_create ("redguard.mdl", vector (100, 50, 40), player_move); //ve krmz askeri
olutur.
}
Scripti altrn. WASD tular ile karakteri hareketlendirip ynlendirebilirsiniz.
Level yklemesi ve oyuncu action'u size imdi tandk gelmeli nk stnkr
zarinden geeceim. Main fonksiyonu level yklyor, camerann pozisyonunu
belirliyor , ve player_move actionu eklenmi bir redguard.mdl karakterini 100 x, 50 y,
ve 40 z koordinatlarnda oluturuyor. player_move actionu A ve D tular ile karakteri
dndrrken , W ve S tular ile de ileri, geri karakteri hareket ettiriyor. Burada yeni
olabilecek ey yrme mesafesinin ayarlanmas. Karakterin hareketinin animasyona
uygun bir eekilde olmas iin walk_percentage'i while'n iinde tanmladmz
distance deikenine eitleyerek karakteri distance deikeni btklnde bir
vektrle hareket ettirdik.
Pekala, karakterimiz her taraf ri olaan bir odada tek bana yryor. Bu pek
heyecanl bir oyun deil. Karakterimizin bir eyler yapabilecei birarkadaa ihtiyac
var. bu arkada salamak iin GAMESTUDO A7.7 commerical ya da daha st bir
srmne ihtiyacnz olacak. imdi multiplayer'a giri yapalm. Hadi script25_1.c 'yi
aalm.
////////////////////////////////////////////////////////////////////////////
// basit bir LTE-C lan oyunu
////////////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
action player_move() // oyuncuyu client'te kontrol edip server'da hareket ettir.
{
var walk_percentage = 0;
while (1)
{
if (my.client_id == dplay_id) { // bu if'in iindeki kod sadece player'n clientinde
alr.
my.skill1 = key_w - key_s; //ileri geri hareket
my.skill2 = key_a - key_d; //dnme
send_skill(my.skill1,0); //skill-2'yi server'a yolla.
send_skill(my.skill2,0);
}
if (connection & CONNECT_SERVER) { // bu if'in iindeki kod sadece server'da
alr.
my.pan += my.skill2*5*time_step; // skill2'yi kullanarak oyuncuyu dndr.
var distance = my.skill1*5*time_step;
c_move(me, vector(distance,0,0), NULL, GLIDE); // skill1 kullanarak oyuncuyu
hareket ettir.
walk_percentage += distance;
ent_animate(me,"walk",walk_percentage,ANM_CYCLE); // animasyon ekle
}
wait (1);
}
}
function main()
{
if (!connection)
error("Start as server or client!");
else
while (dplay_status < 2) wait(1); // bir oyun alncaya ya da biroyuna katlncaya
kadar bekle.
dplay_localfunction = 2; //actionlar server ve client'te altr.
level_load ("multiplayer6.wmb");
vec_set(camera.x, vector (-600, 0, 100)); // uygun kamera pozisyonu
if (connection & CONNECT_SERVER) // oyunun server'da almasna bir rnek.
ent_create ("redguard.mdl", vector (100, 50, 40), player_move); // krmz
oyuncuyu olutur.
Else // olmazsa balanm client'de alr.
ent_create ("blueguard.mdl", vector (-100,-50, 40),player_move); // mavi oyuncuyu
olutur.}
nann ya da inanmayn bu tam ilevli alan bir multiplayer oyun rneidir. Bu
gamestudionun multiplayer'da yapabilceklerini renmemiz konusunda bize biraz
yardmc olacak. ACKNEX motoru server ve client'lerin ayn bilgisayar zerinde
altrma olanan bize tanmaktadr. yani iki ya da bilgisayara gerek olmadan tam
ilevli bir multiplayer oyun yazp deneme frsat sunmaktadr.
Bu sefer direk siyah altrma tuuna basmak yeterli olmayacak. Server ve client
altrmay ayarlamamz lazm. Server modda altrmak iin motora -sv -cl iznini
vermeniz gerekir. Bunun en basit yolu SED'de options > prefences'i amak.
lk nce server' balatacaz. Cilent ve server'a tkladktan sornra ok'a basp
altryoruz. Pencerenin alp oyunun almasn bekliyoruz. Oyun alrken tekrar
prefences ksmna gidiyoruz ve server seeneini kaldryoruz ve sadece client seenei
seili durumda olacak . Tekrar motoru altryoruz. eer SED de eski model
taklyorsanz options ksmna ilk nce -sv -cl sonra da sadece -cl yazmanz gerek. Eer
her eyi doru yaptysanz moturun iki tane penceresini aadaki gibi grmeniz
gerekir.
WASD tularn kullanarak karakterleri dndrebilir ve hareket ettirebilirsiniz. Tular
sadece aktif olan pencerede alacaktr. Server penceresine tkladnzda krmz
client penceresine tkladnzda ise mavi oyuncuyu hareket ettireceksiniz.
Kodu aklamadan nce byk ihtimalle nemli bir soru aklnza taklmtr. Client-
server'da ne? Manual'in multiplayer ksmnda bunlar hakknda bilgi bulabilirsiniz.
Fakat ben ksa versiyonunu yazaym: server clientlerden gelen isteklere yant veren
ok mtevazi bir yazlm uygulamasdr. Client ise bu hizmeti kullanan mteri oluyor.
Bu kadar yeter.
yukardaki resimde gayet basit bir anlatm mevcut. Client server'a bir ey sorar
talep eder, server'da client'e bunun cevabn hizmetini verir. Aadaki resim server
client uygulamalar iin ayrntl aklama ierir.
Grdnz gibi client'ler direk birbirleri ile balant kuramamaktadrlar. Bu bir
peer-to-peer balants deildir. 1.oyuncu bilgiyi direk olarak ikinci oyuncuya
yollayamamaktadr. Client'ler ne zaman bilgi deiimi yapmak isterlerse serverlar
kullanmak zorundadrlar. Hadi bir multiplayer oyun hayal edelim. 1.oyuncu ,
3.oyuncuya ate etmek istiyor. 1.oyuncu kurun koordinatlarn server'a yolluyor.
Server player3'n koordinatlar ile kursun koordinatlarn karlatryor. Eer
1.oyuncunun kurunu 3. oyuncunun koordinatlaryla eleiyorsa server 3.oyuncunun
salk deerini azaltyor.
Hadi imdi scriptimize bir bakalm.
if (!connection)
error("Start as server or client!");
else
while (dplay_status < 2) wait(1);
nceden tanmlanm deikenlerden olan connection; multiplayer uygulamasn
server olarak altrmak iin 1'e (CONNECT_SERVER),client olarak altrmak iin
2'ye (CONNECT_CLENT), son olarak server ve client'in ayn anda almasn
salamak iin 3'e eitleniyor.(-sv -cl). Eer server bulunamazsa connection deikeni 0
oluyor ve oyun single player alyor. Bu genellikle client'in serverdan nce
altrlmas yznden oluyor. Bu durumda size bir hata mesaj verilecektir.
Eer connection deeri 0 olmazsa server client'ten nce altrlm ve client server'a
balanm demektir. Bu durumda dplay_status deikeninin 2 Ya da daha st bir
deere eit olmasn beklememiz gerek. dplay_status bir gerisaym deikenidir fakat
says artabilir. 2 nin anlam server'a bir tane client balanm demektir.
dplay_localfunction = 2;
dplay_localfuntion'a 2 deerini verince (bunun anlam) btn oyuncu action'lar dier
clientlerde de alcak. Eer herhangi bir deer vermezsek bu actionlar sadece
serverda alacaktr. Ve clientler grmeyecektir.
Level yklendikten , kamera pozisyonu ayarlandktan ve bir server Ya da bir clientte
altmza baktktan sonra krmz ya da mavi oyuncuyu oluturuyoruz.
if (connection & CONNECT_SERVER)
ent_create ("redguard.mdl", vector (100, 50, 40), player_move);
else
ent_create ("blueguard.mdl", vector (-100,-50, 40),player_move);
burada connection & CONNECT_SERVER bir durumdur. Motor tek bana server
olarak altnda(connection = 1) ve ayn zamanda server ve client olarak altnda
(connection = 3) bu durum dorudur. Eer connection == CONNECT_SERVER
yazsaydk bu durum sadece connection = 1 olduunda doru olacakt. Tek bana &
iareti zelliklerinin ne olduklarna bakmadan iki durumu karlatrmaya
yaramaktadr.
Pekala hadi imdi multiplayern asl gizli zelliine yani player_move actionuna bir
bakalm.
action player_move()
{
var walk_percentage = 0;
while (1)
{
if (my.client_id == dplay_id) {
my.skill1 = key_w - key_s;
my.skill2 = key_a - key_d;
send_skill(my.skill1,0);
send_skill(my.skill2,0);
}
......
player_move actionu net'e bal btn bilgisayarlarda alacaktr. Buna
dplay_localfunction = 2; ile kararverdik. Yani buradan karlacak sonu bizim
actionun server'dam clien'temi alacana karar vermemiz gerektii olacak.
Ve son durumda oyuncunun client_id'si (client kimlii = my.client_id) client'in
id'si(dpaly_id) ile benzerliini belirtmi olduk.
Son durumdan sonraki satrlarda Client oyuncunun kontrol ettii tularn bilgilerini
yollayabilmektedir. Fakat bu direk oyuncuyu hareket ettirmez. Bir multiplayer'daki
tm player hareketleri server'da olmak zorundadr. Sadece bu ekilde btn
arpmalar,collisonlar'n oyunculara uyumluluu garanti altna alnmaktadr.
KURAL 1- Hareket normal olarak server'da gerekletirilir.
Bunun anlam btn client'ler grsel olarak hareket ederken (NPC) dier herey serve
r zerinden halledilmektedir. Client'in kendisi dnme ve ilerleme hareketlerini kendisi
server'a yollarken , bunlarn Skill1 ve skill2 yardmyla yapmaktadr. send_skill
fonksiyonu skill'leri server'a gnderme ilemini yapacaktr. Bantgeniliini korunmak
iin gvenli olmayan yoldan (SEND_UNRELIABLE) saniye bana sadece 32 defa
gnderme oranyla (SEND_RATE) gnderiyoruz. Bunun sonucunda skill1 ve skill2
serverda client'te ald deerlerin aynsn alacaktr.
KURAL 2- bilgi skill'ler,deikenler ve entity'ler tarafndan server ve clientler
arasnda normal olarak paylalr.
Bunun iin ,entity'lerin grsel parametreleri ve pozisyonlar dnda send
fonskiyonlarn kullanrz. bunlar Server ve teki clientler arasnda otomatik olarak
gncellenmektedir. Bununla birlikte leveldeki gncellemeleri tutmak iin baka send
fonskiyonlarna ihityacmz yok nk bu motor tarafndan otomatik olarak
gerekletirilmektedir.
Biz skill1 ve skill2 yi sadece hareket ve dnme iin kullandk. Ama gerek bir oyun iin
melme , zplama vb. Seyleri yapmak iin baka skillerde kullanabilirsiniz. Hadi
imdi server bu bilgilerle ne yapyor bir bakalm.
if (connection & CONNECT_SERVER) {
my.pan += my.skill2*5*time_step;
var distance = my.skill1*5*time_step;
c_move(me, vector(distance,0,0), NULL, GLIDE);
walk_percentage += distance;
ent_animate(me,"walk",walk_percentage,ANM_CYCLE);
}
bu kod eer server alyorsa , oyuncunun client'inden skill1 ve skill2 deerlerini
almay salyor.
Yeni bir multiplayer oyun yapmak iin bilmemiz gerekenler bu kadar. Acaba yeni nesil
bir MMORPG yazmaya balayabilirmiyiz? Bu sorunun cevab iin , server' client'ten
nce altrn ve ama client'ialtrmadan nce F11 tuuna basarak statik paneli
altrn. te imdi yeni client'lerii server'mza bekleyebiliriz. Yenii client'ler
gelmeden nce bi server player'n (krmz oyuncu) harekeet ettirin yoksa gelen client
hareket edemeyebilir.
Bps grntsne bakalm.
GEREK BR ONLNE OYUN YAPIMI
yazdmz LAN oyunu online almak iin tam olarak hazrlanm deil. Pekala
online ile LAN oyunu arasndaki farklar nelerdir onlara bakalm.
-ip komutu ile bir server ip'si alp client'i altrdmzda internet zerinden de
oyunumuzu oynayabiliriz. Ama ok fazla oyuncu ile oynamak fazla elenceli
olmayacaktr. Bunun nedeni bant genilii(BANDWDTH) ve gecikme
sresi(LATENCY) dir.
Bant geniliinin anlam internet balantsnn saniye bana maksimum ne kadar byte
desteklediidir.
Gecikme sresi ise erilen internet zerinde bir noktadan bir noktaya gitmeleri iin
gereken sredir. Bant genilii server ve client aras trafik younluundan , kt
yazlm scriptlerden veya oyuna gereinden fazla oyuncu girip oyunun
yavalamasndan dolay daralabilmektedir.
Latency nemli miktarda lag ekleyebilir. Bunu anlamak iin rnein bir fps oynarken
sola hareket tuu olan A ya basldnda tepki sresinin ge olmas sylenebilir.Baz
aslsz iddialara ramen, motor internet bant genilii ve gecikme sresinin altnda
kalmamaktadr.
Fakat imdiki scriptimizde baz etkiler ve onlarn efektleri var. online oyunlarda hzl
data transferleri ve onlarn abuk etkilerini grmek iin baz ipular vardr. Hadi
imdi script25_2.c'ye bakalm. Scriptte koyu yeil ile yazanlar bant genilii ve lag iin
modifikasyonlardr.
////////////////////////////////////////////////////////////////////////////
//basit bir LTE-C online oyunu.
////////////////////////////////////////////////////////////////////////////
#include <acknex.h>
#include <default.c>
function on_client_event() //client server'a bal olmadnda balanty sonlandr.
{
if (event_type == EVENT_LEAVE) sys_exit("Disconnected!");
}
function player_remove() //balant olmadnda oyuncuyu kaldr.
{
if (event_type == EVENT_DISCONNECT) ent_remove(me);
}
action player_move() //oyuncuyu kendi client'inde kontrol et,server'da hareket ettir,
ve btn clientlerde anime et.
{
my.event = player_remove;
my.emask |= ENABLE_DISCONNECT;
my.smask |= NOSEND_FRAME; //animasyon yollama

var walk_percentage = 0;
var skill1_old = 0, skill2_old = 0;
while (1)
{
if (my.client_id == dplay_id) //oyuncu bu client tarafndan m oluturuldu?
{
if (key_w-key_s != my.skill1) {//tulara basld m?
my.skill1 = key_w-key_s;
send_skill(my.skill1,0); // tu bilgisini gvenilir modda yolla.
}
if (key_a-key_d != my.skill2) { // dndrme tuuna basld m?
my.skill2 = key_a-key_d;
send_skill(my.skill2,0); // dndrme tu bilgisini gvenilir modda yolla.
}
}
if (connection & CONNECT_SERVER) // serverda m alacak?
{
if (my.skill1 != skill1_old) { //eer hareket deiirse
send_skill(my.skill1,SEND_ALL); // hareket deiikliinibtn client'lere yolla
skill1_old = my.skill1;
}
if (my.skill2 != skill2_old) { // eer dnme deiirse
send_skill(my.skill2,SEND_ALL); // dnme deiikliini btn client'lere yolla
skill2_old = my.skill2;
}
}
my.pan += my.skill2*5*time_step; //oyuncuyu skill2 kullanrak dndr.
var distance = my.skill1*5*time_step;
c_move(me, vector(distance,0,0), NULL, GLIDE); // skill1 kullanrak oyuncuyu
hareket ettir.
walk_percentage += distance;
ent_animate(me,"walk",walk_percentage,ANM_CYCLE); // oyuncuyu anime et
wait (1);
}
}
function main()
{
if (!connection) { //-cl veya -sv -cl ile balamazsa
if (!session_connect(app_name,"")) //lokal sunucuda client bulunamazsa
session_open(app_name); // server olarak bala.
}
do { wait(1); }
while (dplay_status < 2); // sezon alana ya da balanlana kadar bekle
dplay_entrate = 4; //16 tklama/4 = 4 . saniyede 4 defa gncelleme
dplay_smooth = 0; // lm veriye gerek yok.
dplay_localfunction = 2;
level_load ("multiplayer6.wmb");
vec_set(camera.x, vector (-600, 0, 100)); // uygun kamera pozisyonu
if (connection & CONNECT_SERVER) { // serverda alan oyun iin rnek
video_window(0,0,0,"Server");
ent_create ("redguard.mdl",vector(100,50,40),player_move); // krmz oyuncuyu
olutur.
} else { // Ya da bal client'ten devam et.
video_window(0,0,0,player_name);
random_seed(0); // btn player pozisyonlarna izin ver.
ent_create ("blueguard.mdl",vector(-100+random(200),-
50+random(100),40),player_move); // mavi oyuncuyu olutur.
}
}
stteki script LAN oyununun online oyun olmaya ak durumda olduunu gsteriyor.
Ana fikir btn clientler cisimleri direk hareket ettirip dndrken , serverlar ise
bilgileri(skill) aktarr. u anda cisim gncellemeleri dk frekansl ve sadece dn ve
hareketlerin senkronizasyonlar iin kullanlyor. Bu metodun 3 avantaj vardr;
birincisi az bant geniliine ihtiya duyulmas.
kincisi lag fazla olmuyor ve hareketler direk grnyor.
Ve ncs oyuncu acitonununekirdei single player ile ayn ve multiplayer'a
evrilmesi kolay.
Main fonksiyonunun ilk satrlar sadece GAMESTUDO'nun pro kullanclar iin
uygundur.
if (!connection) {
if (!session_connect(app_name,""))
session_open(app_name);
}

bu lokal bir sunucunun sezonudur ve eer herhangi bir server bulunamazsa oyunca
server olarak balanacaktr. Bu ekilde commanda line options'tan srekli -sv -cl
yazmamz salanr. DKKAT! Siz pro edition'a sahip deilseniz direk command line
options'tan -sv -cl yazarak gvenli balant kurun.
dplay_entrate = 4;
dplay_smooth = 0;
bunlar main fonksiyonundaki dier iyiletirmelerdir. dplay_entrate ile oyuncunun
gncelleme orannn 4 rate'a dryoruz. nk u anda gncelleme orann sadece
senkronizasyonlar iin kullancaz. Ve ayn sebepten dolay Dead reckoning sistemine
de ihtiyacmz var. bunun iinde dplay_smooth'u 0 a eitliyoruz. Yoksa oyuncunun
gemi hareketine karacakt ve lag olacakt.. Cilent ismi (Ya da sadece server)
video_window fonksiyonu ile isim ubuunu gsteriyor. Ve son olarak mavi oyuncu
level'de rastgele bir yere yerletiriliyor.
Dikkat edin do...while ksmn sezon gncellemesi ve sezona katlm iin kullandk.
Hadi imdi iki yeni event fonksiyonuna bir gz atalm.
function on_client_event()
{
if (event_type == EVENT_LEAVE) sys_exit("Disconnected!");
}
bu client eventi. Eer client server'a veri gnderip cevap alamazsa bu event
tetiklenecektir. Ayn zamanda internet balantsnn kopmas veya server'n kmesi
durumlarndada bu tetiklenme olacaktr.
function player_remove()
{
if (event_type == EVENT_DISCONNECT) ent_remove(me);
}
client eventine benzer olan bu eventte balant koptuunda veya server'dan cevap
alnamama gibi durumlarda bu eventin tetiklenip oyuncunun serverdan kaldrlmasn
salamak amalanmaktadr.
action player_move() // control the player on its client, move it on the server, animate it
on all clients
{
my.event = player_remove;
my.emask |= ENABLE_DISCONNECT;
my.smask |= NOSEND_FRAME; // don't send animation

......
oyuncuya NOSEND_FRAME flag' ekleyerek animasyonun server'a gdip baka
clientlere ulamasn engelleyerek bant geniliinden tasarruf etmi olduk.animasyon
datas saniye bana 6 byte gncellenirken , eer 100 kii server'a girerse
NOSEND_FRAME saniye bana 4 byte' saklayacak bu ekilde 200.000 bsp server
trafii bo kalp kullanma alm olacak!.
Ama , server animasyon gncellemelerini yollamay durduu zaman clientler
animasyon gncellemelerini yapmaya devam ederler. Buraya daha sonra deineceiz
nce hareket ksmna bir bakalm.
if (my.client_id == dplay_id)
{
if (key_w-key_s != my.skill1) {
my.skill1 = key_w-key_s;
send_skill(my.skill1,0);
}
}
skill1 de kayt altna alnm tular burada karlatryoruz. Ve sadece tua basm
deitiinde server'a veri yollama ilemi yapmasn salyoruz. Neden? nk online
yunde gnderilen her veri bizim iin ok nemli. Skill1 'i SEND_RATE olmadan
gvenli modda yollamak zorundayz. Hala tu deiimi server client arasnda bant
geniliinden olduka yer kaplamakta. te yandan ok fazla tu kullanp oluacak bu
sknty engelleyip bant geniliinden tasarruf etmek iin iki tuu tek bir skill iine
saklarz. Tek skill 32 bit yer kaplarken bunu rahatlkla sktrp 2bit hale getirip 30
bitten fazla alan kazanma ansmz olur.
if (connection & CONNECT_SERVER)
{
if (my.skill1 != skill1_old) {
send_skill(my.skill1,SEND_ALL);
skill1_old = my.skill1;
}
if (my.skill2 != skill2_old) {
send_skill(my.skill2,SEND_ALL);
skill2_old = my.skill2;
}
}
tabi bizim oyunucun hareketini teki client'lerede haber vermemiz gerek. Bunun iin
server zaten balant kurmu btn clientlere bilgiyi yollayarak bant geniliinden
tasarruf etmi oluyoruz.
my.pan += my.skill2*5*time_step;
var distance = my.skill1*5*time_step;
c_move(me, vector(distance,0,0), NULL, GLIDE);
........
bu ne? Daha nce btn hareketlerin serverda olduunu belirtmitik. Ama imdi
dnme ve yrme hareketleri direk olarak client'ten salanacak. Bu sava lag iin.
First person shooter oyunda kamera oyuncu ile birlikte hareket eder. Sadece dnme ve
yrme hareketlerinin bilgisini server'a yollayp pozisyonun ve alarn
gncellenmesini beklersek kamera ihtimalle ikinici Ya da nc etkide bize cevap
verecektir. Bu kabul edilebilir bir durumdur. Bylece oyuncuyu hareket ettirdiimizde
en yakn tepki cevabn alm oluyoruz.
Harika bir MMORPG (devasa evrim ii rol yapma oyunu) nasl yaplr? Hadiinternet
trafiini hesaplayalm. Dnyann eitli yerlerinden 100 kiinin servermza
balandn dnelim ve bunlarn 30 tanesi ayn anda hareket ediyor olsun. Kodda
da yazdmz gibi gncelleme orann saniye bana 4'e drmtk. Bunun
sonucunda oluacak trafik 30 farkl poziston x 11 byte x 100 client x 4 gncelleme =
saniye bana 132.000 byte olaca anlamna geliyor. Tabi bunun zerine bir sr fakl
cisimler , efektler eklenince durumu siz dnn. Yani buradan karlacak sonu.
Evdeki internet balants ile oluturulan serverdan MMORPG olmayacadr.
Son dersle workshoplar bitti arkadalar. Burdan sonra AUM'a geebilirim. Unutmay
wokshoplar TEMEL gamestudio ve programlama bilgisi ieriyor. Herkese iyi
almalar.

You might also like