Unformatted Document Excerpt
Coursehero >>
California >>
California State University, Monterey Bay >>
CS 3220
Course Hero has millions of student submitted documents similar to the one
below including study guides, practice problems, reference materials, practice exams, textbook help and tutor support.
Course Hero has millions of student submitted documents similar to the one
below including study guides, practice problems, reference materials, practice exams, textbook help and tutor support.
ME Java Mimarisi Temel Tanmlar :
Java ME : Java Micro Edition eitli cihazlar iin tanmlanm bir grup belirtim ve teknolojidir. Java ME belli snflardaki cihazlar iin bir grup konfigrasyon ve profillere blnmtr. J2ME olan eski ismi Java ME olarak deitirilmitir. CLDC(Connected, Limited Device Configuration) : Java MEnin en yaygn konfigrasyonudur. CLDC 512 KBtan ufak hafzas ve snrl a balants olan aletler iin tasarlanmtr. CLDC KVM olarak adlandrlan JVM(Java Virtual Machine)i ve uygulamalar iin temel olan bir takm ktphaneleri belirler. MIDP : Mobile Information Device Profile Java ME nin bir profilidir. CLDC nin stndeki bir profil olarak yer alr ve uygulamann yaam dngs, kullanc grafik arabirimleri, iletiim a ve kalc depolama ile ilgili ktphaneleri ierir. Middlet : MIDlet MIDP profili iin yazlm uygulamalara verilen isimdir. Middlet Suite : MIDletler MIDlet Suite'ler olarak paketlenir ve datlr. Bir MIDlet Suite bir veya daha fazla MIDlet ten oluabilir. MIDlet Suite .jar ve.jad olarak 2 dosyadan meydana gelir. .jad uzantl dosya tanmlayc dosya, .jar uzantl dosya MIDlet, kullanlan ktphaneler, kaynak dosyalar gibi dosyalar ieren ariv dosyasdr. Java Platformlar :
Java ilk olarak avuii ve tanabilir cihazlar iin tasarlanm fakat sonralar eitli sebeplerden dolay k amacndan uzaklamtr. Java, Java ME ile k gnlerindeki amacna geri dnmektedir. Gnmzde Java platformu 3 ana kategoriye ayrlr: Standart Edition (Java SE) : Daha ok kiisel bilgisayarlara ve temel sunuculara ynelik bir takm standartlar ierir. Enterprise Edition (Java EE) : Sunuculara ynelik gelitirilen bir takm standartlar ierir. Micro Edition (Java ME) : Cep telefonlar, kablosuz el cihazlar, kiisel dijital asistanlar ve benzeri kaynaklar kstl cihazlar iin gelitirilen standartlar ierir. Konfigrasyon ve Profiller :
Jave ME eitli konfigrasyon ve profillere blnmtr. Konfigrasyonlar JVM(Java Virtual Machine) detaylarn ve belli snftaki cihazlarla kullanlabilecek temel ktphaneleri tanmlayan belirtimlerdir. Mesela 512KB bellekten az hafza alan ve snrl bir a balants olan cihazlarn konfigrasyonu CLDC olarak adlandrlr. CLDC lere rnek olarak baz cep telefonlar ve avu ii bilgisayarlar(PDAs) verilebilir. Daha fazla bellee ve ilemci gcne sahip, srekli a balants olan dier konfigrasyon ise CDC olarak adlandrlr (Connected Device Configuration). Bunlara rnek olarak ise Sharp Zaurus avu ii bilgisayarlar verilebilir. Profiller uygulama gelitirmeye daha yetkin bir ortam sunabilmek iin konfigrasyonun zerine tanmlanan ktphanelerdir. Konfigrasyon java sanal makinesi (JVM) ve temel ktphaneleri tanmlarken, bir uygulama gelitirilirken ihtiya duyulabilecek yetkinlikte ktphaneleri tanmlamaz. Profiller bu alanda uygulamann yaam dngs, kullanc arabirimi ve kalc bellek ktphanelerini ierirler.
MIDP Programlama, MIDletler :
MIDlet Yaam Dngs : Midletler 3 durumda bulunabilir: duraan (paused), etkin (active), l (destroy). Bir MIDlet yaratld ve balatld zaman duraan moddadr. Eer MIDlet yaplandrcsnda(constructor) kural d bir durum oluursa (exception) MIDlet l durumuna geer. MIDletler etkin durumdan duraan durumuna pauseApp( ) methodunu tamamladktan sonra geebilirler. Veya etkin konumdan duraan duruma startApp( ) methodunu tamamladktan sonra geebilirler. MIDletler l konumuna destroyApp(boolean unconditional) methodunun tamamlanmasndan sonra geerler. Bu method MIDlet kulland kaynaklar serbest brakr ve gerekli temizleme ilemlerini yapar. Aadaki bo ablon, eclipsede projeye yeni MIDlet eklenince gelen ablon snftr. import javax.microedition.MIDlet.MIDlet; import javax.microedition.MIDlet.MIDletStateChangeException; public class Deneme_J2me extends MIDlet { public Deneme_J2me() { // TODO Auto-generated constructor stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub } } // Snf Sonu
MIDP API Spesifikasyon zellikleri : MIDP 2.0 spesifikasyonuna (JSR-118) uyan aadaki asgari zellikleri tar: MIDP implementasyonu iin minimum 256 KB Rom hafza (bu CLDCnin gereksinimlerine de ektir), Java alma zaman heap hafzas iin 128 KB, En az yazlabilir kalc 8 KB hafza, kalc veri ynetimi iin, En az 96x54 piksellik ekran, Giri kapasitesi iin tutakmlar, klavyeler veya dokunmatik ekranlar. ki ynl network balants, mmknse intermittent. MIDlet Suiteler ve Uygulama Tanmlayclar :
Bir veya daha fazla MIDlet MIDlet Suite denen JAR uzantl dosyalara paketlenir. Her JAR dosyasnn ieriini tanmlayan JAD uzantl uygulama tanmlayc dosyas vardr. JAR ve JAD uzantl dosyalarn cep telefonlarna indirilebilmesi iin bu dosyalarn indirilecei web sunucular zerinde aadaki MIME tiplerinin tanmlanmas gerekmektedir:
.jar application/java-archive .jad text/vnd.sun.j2me.app-descriptor
Ayrca uygulama tanmlaycsndan dinamik olarak deer almak iin MIDlet iinden getAppPropoerty(String key) methodu da kullanlabilir. Bylece JAR dosyasn deitirmeye gerek kalmadan JAD dosyas zerinden baz deiiklikler ile MIDletimizin eitli ilevlerini deitirebiliriz. rnek bir JAD dosyas: MIDlet-1: MerhabaDunya, , example.hello.HelloWorldMIDlet MIDlet-2: ZiplayanYazi, , example.hello.BouncingTextMIDlet MIDlet-Jar-Size: 7822 MIDlet-Jar-URL: HelloExamples.jar MIDlet-Name: HelloExamples MIDlet-Vendor: Ozgur Yazlm MIDlet-Version: 1.0.1 ZiplayanYazi-BaslangicYazisi: MIDlet ler elenceli! MIDlet Yaam Dngs :
MIDP uygulamalar aadaki MIDlet snfndan tretilerek oluturulur. MIDlet snfnn metotlarnn ve davranlarnn bir sonucu(reflection) olan zel bir yaam dngs vardr. Uygulama Yneticisi (Application Manager), bir para ara baml olarak, MIDletin kurulumu, almas ve yaam dngsn kontrol eder. Bir MIDlet, kendi class dosyasnn bulunduu araca tanmas ile kurulur. class dosyalar, Java Ariv (JAR) dosyalar iine paketlenmi olmaldr. Bu dosyadan bata bir adet te JAR dosyasnn iindekileri gsteren tanmlayc bir dosya (.jad uzantl) olmaldr. Bir MIDlet aadaki durumlar arasnda gider: 1. MIDletin altrlmas durumunda bir (instance-nesne) oluturulur, yaplandrcs altrlr ve Paused durumuna geer. 2. MIDlet, uygulama yneticisi startApp( ) metodunu ardktan sonra Acive konumuna geer. 3. Uygulama Yneticisi, pauseApp( ) metodunu ararak almay askya alabilir. Bu MIDleti tekrar Paused durumuna dndrr. MIDlet, notifyPaused( ) metodunu ararak Paused durumuna kendi bana da girebilir. 4. MIDlet Paused durumunda iken, uygulama yneticisinin startApp( ) metodunu tekrar armas ile Acive konumuna geri dnebilir. 5. Uygulama Yneticisi, destroyApp( ) metodunu ararak almay durdurabilir, MIDletin yokedilmesi, garbage koleksiyonlarnn boaltlmas vs. termizlik ilerini balatr. Bir MIDlet, kendini notifyDestroyed( ) metodunu ararak da sona erdirebilir.
Uyandrma ars stei :
MIDletin belli bir sre sonunda altrlmas iin gereklemede esasen bir zellik bulunmaktadr. Bu metot tuhaf bir cins yer olan javax.microedition.io.PushRegistry iinde tanmlanmtr. Gelen network balantlarna cevap olarak PushRegistry nin dier metotlar MIDletin almas ile devreye girebilir. Aadaki metot PushRegistry isteini verilen MIDleti istenilen zaman zamanda uyandrmasn(almasn) salar: public static long registerAlarm(String midlet, long time) throws ClassNotFoundException, ConnectionNotFoundException CLDC 1.0da Float (Ondalkl, Kayan Say) Tipi Bulunmamaktadr :
CLDC 1.0, float (ondalk/kayan say) tiplerini desteklememektedir. Bu float ve double ilkel/temel tiplerin kullanlamamas demektir. Buna bal olarak uygun sarmalayc(wrapper) snflar da (java.lang.Float ve java.lang.Double) ayrca kullanm ddr. Kayan say kullanm uygulamanzda nemli ise yazlm ile gerekli destei alabilirsiniz, bunun iin gerekli gerekleme http://home.rochester.rr.com/ohommes/MathFP/ de bulunmaktadr. CLDC 1.1de Float (Ondalkl, Kayan Say) Tipleri Dahil Edilmitir :
CLDC 1.1de temel ve sarmalayc tipler iin float ve double tip destekleri ilave edilmitir. eitli dier snflar da bu tipler iin yeniden dzenlenmitir. Object(Nesne) finalize Bulunmamaktadr :
Java SEde finalize edilme ilemi, nesnenin garbage koleksiyonuna gnderilmesi srecinde gerekli temizleme, yok edilme mekanizmalarn anlatmaktadr. Besne Finalize ilemi de garbage koleksiyonundan nce nesnenin geri alnmas durumudur. CLDCde bu mekanizma bulunmamaktadr. Kaynaklar temizlemek iin finalize( ) metodu kullanlabilir. Bu kapasitesi snrl aralar iin, hafza ve ilem gcn arttrmak iin iyi bir fikirdir. finalize( ) metodu garbage koleksiyonu alrken kullanlamaz ve nezaman alacan tam olarak bilemeyebilirsiniz. Reflection Bulunmamaktadr :
CLDCde Reflection APIsi bulunmamaktadr. CLDC/MIDPnin son hedefi olan olduka kk aralar iin olduka basitletirilmitir. Ama bir ok kullanc zaten dorudan Reflection API kullanmamaktadr. Bunun bulunmamas, Remote Method Invocation (RMI) kullanmnn da olmamas demektir. RMIn olmamas JINInin de olmamas, iskelet MIDP uygulamalarnda JINInin altrlamamas demektir.
Doal metotlar da CLDCde desteklenmemektedir. MIDP phesiz dahili native metotlar, kendi iindekiler gibi destekler. Uygulama yeni native metotlar tanmlayamaz. Java SE ile CLDC snflar arasndaki farklar okmu gibi grnebilir ama kolayca 3 kategori altnda gruplanabilir: 1. java.io paketinden budanm dosyalardan tr lokal dosya sistemi ierii bulunmamaktadr. Bu File, FileInputStream, FileOutputStream snflarna uygun Reader ve Writer snflar, RandomAccessFile ve eitli destekleyici snflarn dahil olmasdr. Eer bir araca veri kalc yerletirme (persistence) ihtiya duyarsanz, javax.microedition.rms paketindeki API kullanmalsnz. Baz aralar, bir dosya sistemi zellikleri iin opsiyonel bir API kullanabilir: Dosya Balant Opsiyonel Paketi The File Connection Optional Package (JSR 75). Ek olarak baz aralar kalc veri kullanmnda Kiisel Bilgi Ynetimi Personal Information Manager (PIM) olarak da kullanlabilir (JSR 75in bir blm). 2. Object Serialization, CLDCde desteklenmemekte dolaysyla serialization arayz ve eitli nesne snflarnn kullanmnn mmkn olmad anlalmaktadr. 3. Sonuta J2SEde bulunan bir ok faydal nesne snflarn, mesela StreamTokenizer gibi faydal snflar, hafzas kstl olduu iin mobil cihazlara ilave edilmemi olabilir. Bu snflar kullanmak iin uygulamanza dorudan katarak kullanmay isteyebilirsiniz ama kopyalamadan evvel lisanslama kstlamalar gibi yasal ve teknik problemlerin olduunu unutmamalsnz. Collections (Kolleksiyonlar) : Java SE Collections API snflar tamamiyle desteklenmemi olabilir ama eski dost Vector ve Hashtable snflarnn kullanm ufak kstlamalar ile ayn kalm ve MIDP ile kullanlabilmektedirler. Kullanc Arayz Oluturulmas :
Bir ok MIDP uygulamas bir ok farkl arata deiiklikler yaplmadan altrlabilmesi amacyla yazlmaktadr. Bu kullanc arayzlerinin hazrlanmasn daha da zora sokan bir alandr nk her cihazn ekran boyutlar, renk seenekleri vs. farkllklar gsterebilmektedir. Daha da fazlas kimi cihazlarn giri birimleri de klavya, dokunmatik ekran, kayan dmeler vs. gibi farkllklar da gstermektedir. MIDP tarafndan tannan minimum ekran boyutu 96x54 piksel ve renk derinlii 1 bittir. Buna karlk MIDPnin st snrlar ak braklmtr. Yeni tip ekranlar, klavye tipleri vs. iin st snr cihazlarn gelitirilmesi ile aktr. Geni yelpazedeki cihazlar iin daha MIDP ile daha yumuak, tm cihazlar da alacak uygulamalar oluturabilmek, iin 2 yol vardr: 1. Abstraction (Soyutlama): Kullanc arayzlerini soyut ifadelerle belirlemeyle somut bir eyler yaparken MIDP gereklemesine dayanmaktr. Mesela bu soft dmenin stnde Next yazsn gstermektense arayzn buna ilikin Next Command salamasdr. 2. Discovery : Uygulama alma zamannda arac kefeder ve programatik olarak arayz buna uyarlar. rnein ekran byklnn alma zamannda elde edildikten sonra kullanc arayzn buna gre leklendirmektir. MIDP APIleri her iki yolu da destekler. Soyutlama daha ok tercih edilen bir yntemdir nk daha az kod barndrr ve MIDP gereklemesini daha performansl altrr. Baz durumlarda rnein oyunlarda daha belirgin bir kullanc arayzne ihtiya duyulabilir; bu tip uygulamalarda ikinci metoda gre cihazn verecei tepkileri ve davranlar kefedip ona gre uyarlama yaplmaldr. MIDP dizayn uygulamalrda her iki metodun kartrlp kullanlmasn mmkn klar. En Tepeden Baz Kavramlara Kubak Bir Gz Atalm :
MIDP kullanc arayz snflar javax.microedition.lcdui ve javax.microedition.lcdui.game paketlerindedir. MIDlet tarafndan grntlenen cihazn grnm, MIDletin getDisplay( ) fabrika metodundan elde edilmi Display snfnn bir nesnesi(instance ?) tarafndan salanr. Displayin yaam dngsndeki ana amac, Displayable snfnn nesnesi olarak olarak tanmlayabileceimiz, geerli grntlenenleri tutmaktr. Eer Displayi resim sehpas(easel) olarak dnrseniz, Displayable nesnesini de benzer bir ekilde bu resim sehpasnn stndeki resim tuvali(canvas-branda bezi-) olarak dnebilirsiniz.
MIDlet, grnt ieriini, Display nesnesinin setCurrent( ) metoduna Displayable nesnesini geirerek deitirir. Bu tipik bir MIDletin temel fonksiyonudur: 1. Bir Displayable gster, 2. Girdi iin bekle, 3. Daha sonra srada ne gsterileceine karar ver, 4. Tekrar gster.
Displayable, kullanc arayzlerinin eitli tiplerinin gsterdii alt snflarn kk bir ailesine sahiptir. Aadaki ekilde javax.microedition.lcdui ve javax.microedition.lcdui.game paketleri iindeki Displayables snfndan tremi snflar grlmektedir:
Displayabledan treyen ocuk snflar, abstraction, discovery, genellemi kullanc arayzlerinin oluturulmasnda iki metoda uymas iin iki ana kola ayrlr. Screen snf soyut kavramlarla belirtilen grnmleri sunar. Bu ekranlar mesela mesela combo box(aa kayan seenek kutusu), Listler, menuler ve dmeler gibi standart kullanc arayzleri ihtiva eder . ekilde grld gibi 4 adet alt snf geni eitli ilevsellikler sunar. Kendine ghas grnmler iin Canvas snfnn alt snf GameCanvas kullanlabilir. Bu daha ok MIDletin izim yapabileceini farzedebilirsiniz ama kullanc girilerinin, daha ho kontrollerin nasl grnd ve ynetilmelerini de kapsar. Canvas destek metotlar, MIDletinizin evresini renmesine izin verir rnein cihaz tarafndan desteklenmi ne tr olaylarn olduu gibi. Canvas stne kurulu kullanc arayz cihazn niteliklerini kefeder ve uygun grnmlerin oluturulabilmesi iin harekete geer. GameCanvas ise daha ok oyunlar iin fonksiyonellik zellikleri salayan arayzlerini kullancya salar:
Yukardaki ve bir nceki sayfadaki snflar Screenin 4 ocuunu gsterir. Soldan saa srasyla: (a)TextBox, (b)Alert, (c)List ve (d)Form Display Kullanm :
Display, cihaz ekrannn ynetir. Cihaz grnmne ait referans, statik getDisplay( ) metoduna referans olan bir MIDletin desteklemesi ile elde edilir. Genellikle bu MIDletin startUp( ) metodunda yaplr: public void startApp(){ Display d = Display.getDisplay(this); }
getDisplay( ) metodunu MIDletin yaplandrcsndan armay dnebilirsiniz, ama spesifikasyona gre getDisplay( ) metodu, yalnz MIDletin startApp( ) metodu baladktan sonra arlmaldr. Eer MIDlet, startApp( ) metodu balamadan nce arlrsa hata frlatabilir ve MIDletin almaya balamasn durdurabilir! Bir kere cihazn Display referans elde edildikten sonra, yalnzca gsterim amacyla bir eyler oluturulduktan sonra (Displayable nesnesi) , Displayin setCurrent( ) metotlarndan birine geirilmelidir. ..... public void setCurrent(Displayable next) ..... public void setCurrent(Alert alert, Displayable nextDisplayable) .....
kinci kullanmda geici bir mesaj (bir Alert Alarm) gsterilmesi iindir. Bu metot gncel olarak ne gsterildiine dair bir referans dndrr. NOT: MIDlet, kullancya grntlenmese bile geerli bir nesne geri dndrr. rnein bu cihazda ayn anda alan ok sayda MIDletlerde meydana gelebilir. NOT: Displayable arayz isShown( ) isimli, cihaz ekrannn gncel grnmne ait bir nesne olup olmadn gsteren bir metodu vardr. Ayrca Displayi farkl tipte grnmleri adapte etmek, uyarlamak iin uygulamalarn ihtiya duyduu yardmc olabilecek yetenekleri denemekte sorgulayabilirsiniz.
isColor( ) metodu cihazn renkli mi, gri tonlama m sonucunu vermesine gre numColors( ) metodu, cihaz tarafndan desteklenen farkl renklerin saysn gsterir. Display grinin 16 tonunu destekler. rnein isColor( ), false ve numColors( ) 16 dndrrse buna ularz. Ayrca cihazn destekledii transparan(saydamlk) desteini, numAlphaLevels( ) ararak saydamlk seviyesini reniriz. Minimum seviye 2, bize image(resim) pikselleri ile tam effaflk ve tam opaklk(donukluk) desteklendiini gsteren deerdir. 2den byk deerlerin geri dn alpha karmnn desteklendiini gsterir. getColor( ) ve getBorderStyle( ) metotlar, kullanc arayz emasnn sistemden renk ve izgi stillerinin alnmas iin kullanlmtr. flashBacklight( ) ve vibrate( ) metotlar araca uygun yanp snen k(fla) ve titreim zelliklerini gerekletirir. Commandlar ile Olay leme :
Command kullanc tarafndan tetiklenerek altrlan, swing(GUI) uygulamalarnda bulunan Button(dme) gibi dnlebilecek bileenlerdir. Dmelerdeki gibi bir bal (title) ile OK , Exit mesajlar gsterilir. Ekranda soft butonlarla, kayan dmelerle, dokunmatik ekran veya sesli tanma/yantlama sistemlerine gre ekranda nasl grndnn sizce nemi olmayabilir. Her Displayable kendi Command bileenlerinin bir listesini tutar. Aadaki metotlarla bu listeye eklenenbilir veya kartlabilinir: ... public void addCommand(Command cmd); ... public void removeCommand(Command cmd); Commandlarn Oluturulmas :
Nesnesi Command snfndan elde edilerek oluturulur. Oluturulurken bir isim, bir tip ve ncelik parametrelerine ihtiya duyulur. sim, genelde ekranda grnr. Tip parametresi yaygn kullanm command tipleri iindir. Aada gzken Coomand snfnda tanmlanm SABT deerlerden biri olmaldr: sim Anlam OK Bir seimin onaylanmas iin
CANCEL BACK STOP HELP SCREEN
Bekleyen deiikliklerin iptali iin Kullancy bir nceki ekrana tar alan bir ilemi durdurur Uygulama hakknda bilgilendirme iin Uygulamaya zel genel buton kullanmlar iindir.
Standart bir OK komutu aadaki gibi oluturulur: Command c = new Command("OK", Command.OK, 0);
Uygulamaya zel command aadaki gibi oluturulur: Command c = new Command("Launch", Command.SCREEN, 0);
Commandlarn nasl grnd MIDP gerekletirmesine baldr. Commandlar Sunn uzaktan eriim ara emlatrnde iki soft dmeye atanmlardr. Soft butonlar cihazn ekrannn altndaki sa ve soldaki seim butonlardr. Farkl zamanlarda farkl amalara hizmet edebilir. Soft dmelerden birine atanm birden fazla Command, uymadndan bir menu altnda toparlanacaktr. ncelik parametresi ekrandaki birden fazla Command olmas durumunda grnmdeki ncelii gsterecektir. Dk ncelik saylar daha yksek ncelie sahiptir. ncelik says 0 olan bir Command dorudan ekranda grnecek olan soft butona atanacaktr. Dier Commandlar ikincil bir menude ncelik srasna gre yukardan aa(!!!) bulunacaktr.
Commandlarda uzun etiketlerde desteklenmitir. Grntlenecek ksmn nasl ayarlanacana, boluklara vs. MIDP gereklemesi karar verecektir. Aadaki gibi bir ksa ve bir de uzun etiketli bir Command oluturulmutur: Command c = new Command("Run", "Run simulation", Command.SCREEN, 0);
Commandlarla ilgili bilgileri Command snfndan etiket iin getLabel( ), uzun etiket iin getLongLabel( ) ve command tipini de getCommandType() metotlar ile alabiliriz. Commandlar ile Etkileim:
Kullanc tarafndan arldklarnda(kullanlma durumunda) otomatik olarak herhangi bir ey almaz. Bir Displayable iinde kullanc tarafndan herhangi bir command arldnda listener isimli bir nesne arlm olur. Bu Java Beanlerin temel olay ileme formuna benzer bir ekilde alr; bir Displayable tek bir event kaynadr(! unicast event source ?). Kullancnn bir command ard her zaman Displayable bir olay tetikler(fires off !) . Olay dinleyici listener, CommandListener arayznn gerekletirdii bir nesnedir. Bir Displayable ile beraber kaydedilebilmesi iin aadaki metot kullanlr: public void setListener(CommandListener l);
Displayable, tek bir listener nesnesi alabildii iin tek bir olay (unicast event source) kaynadr. (oklu olay kaynaklar, oklu dinleyicilerin set.. metodun ziyade add.. metodunu kullanmas ile kullanlr.) Bir CommandListenern gerekletirilmesi iin bir metodun tanmlanmas gerekir: public void commandAction(Command c, Displayable s);
Bir Command gerekletiinde, Displayable kendisine kaytl olan dinleyicinin commandAction() metodunu arr.
Aadaki rnekte MIDletin TextBox Displayable nesnesi ile ekrana mesaj yazdrmas ve k iin sol soft butona metot atanmasn gryorsunuz. Displaye command eklenir ve buna ilikin setCommandListener( ) metodu ile Commanda basldnda arlacak ksm Listener metoduna i snf olarak yazlmtr. Eer bunu ayr bir metot olarak vermek istersek bu arayz snf isminde implement etmemiz gerekir, bu da commandAction( ) metodunun gereklenmesini gerektirir. import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Commander extends MIDlet { public Commander() { // TODO Auto-generated constructor stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { Displayable d = new TextBox("TextBox", "Commander", 20, TextField.ANY); Command c = new Command("Exit", Command.EXIT, 0); d.addCommand(c); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } }); Display.getDisplay(this).setCurrent(d); } }
notifyDestroyed ( ) metodu almay durdurur ve uygulamay sona erdirir. Tickers (Kayan Yaz) :
Ticker ismi, eski moda hisse senetlerinin kayan yazda bilgi vermesinde kullanlan kodlarndan (Tick) gelmektedir. Bu grntlenen Displayablen en stnde bir satrlk akan bir yaz iin kullanlmaktadr. Ayn ekilde akan bilgi, hisse deerlerinin mobil cihazla alnarak verilmesi gibi bilgilerde kullanlabilir. Ticker, bir String iin basit bir wrapper(sarmalayc) snfdr. Bir ekrana Ticker eklemek iin aadakini yapmalsnz: ..... Displayable d = new TextBox("TextBox", "Commander", 20, TextField.ANY); ..... Ticker ticker = new Ticker("This is the ticker message!"); d.setTicker(ticker);
.....
Screen :
Screen, kullanc arayzlerinin genelleip tredii tm snflarn temel snfdr. Bu snfn kendi metotlar yoktur, ama Displayabledan miras alr. Buna karlk Canvas oyunlar iin zellikle zelletirilmi arayzler iin temel snftr. TextBox :
TextBox kullancya bir adet String giriine izin verir. Aklnzda bulunsun, ok eitli MIDP aralarnda metin girileri skc bir ilemdir. Bir ok cihazn nmerik tu takm olduundan, tek bir harf karakteri iin bir ok kere nmerik tua baslmas gerekebilir. yi bir MIDlet asgari kullanc giriini gerektirmelidir. Bir TextBox 4 adet parametre ile oluturulur: public TextBox(String title, String text, int maxSize, int constraints);
String title parametresi ekran bal iin kullanlmtr. String text parametresi balangta ekranda gzkecek varsaylan metin ifadesi iindir. int maxSize parametresi girie izin verilecek en fazla karakter saysn ifade eder. int constraints parametresi kullanc giriinin snrlandrlmas, belirli tipte girilere izin verilmesi iin int tipindeki belirli SABTlerdir. Bunlardan belli balcalar aadadr: ANY : Cihazn destekledii herhangi bir tipte girie izin verilmesi iindir. NUMERIC : Girileri tamsay tipler ile snrlandrmak iin. DECIMAL : Kesirli say tiplerine izin verir. PHONENUMBER : Telefon numaras formatnda girie ihtiya duyulmasnda kullanlr. EMAILADDR : Giriin bir e-mail adresi olmas iin kullanlr. URL : Giriin bir web adresi olmas durumunda kullanlr. PASSWORD : Girilerin grntlenmeden yerine * asterisk karakterlerinin kt gvenlikle ilgili giri tipi. UNEDITABLE : Deitirilemeyecek, sabit tekst ifadeleri iin kullanlr. SENSITIVE : Kulancdan gelen girilerde baz giri emalar yazy otomatik tamamlayc zellie sahiptir(!) . NON_PREDICTIVE : Kullancn giriinin tamalanmas bitmeden giri emalarndan tahmini girileri getirmek iin(!). INITIAL_CAPS_WORD : Girilerde her kelime byk harfe evrilir. INITIAL_CAPS_SENTENCE : Girilerde her bir cmlenin ilk karakteri byk harfe evrilir. Eer herhangi bir kst kullanlmayacaksa ANY kullanlmal, bunun rakamsal karl da 0 olarak kullanlabilir: int constraints parametresinde baz sabitleri beraber mantksal OR operatr | ile birletirebiliriz. rnein aadaki gibi sadece e-mail adresini girebilelim ama girdiklerimiz ekranda grnmesin : Displayable d = new TextBox("Email", "", 64, TextField.EMAILADDR | TextField.PASSWORD);
Dndnz gibi mobil cihazlarda klavye zorluundan dolay, PASSWORD kullanm girilerin bir ok kere ayn tua baslmas gerektiinden dolay faydasndan ok zorluk karabilir.
(Blgesel Karakter Altkmeleri ) TextBox snfnda bulunan setInitialInputMode(String characterSubset) metodu ile istenen uygun metinin hangi giri modunda olduunu bildiririz. String parametresi J2SE java.lang.Character.UnicodeBlock paketinde bulunan sabitlerin bana UCB_ eklenmesi ile kullanlr. rnein UCB_BASIC_LATIN veya UCB_KATAKANA bu metoda geirilebilinir. Ayrca giri altkmeleri iin java.awt.im.InputSubset paketinde tanmlanan sabitlerin bana IS_ eklenmesi ile de kullanlabilir. rnein IS_LATIN veya IS_KANJI geerlidir. Son olarak MIDP_UPPERCASE_LATIN ve MIDP_LOWERCASE_LATIN ayr ayr tanmlanmlardr. ANY kullanlm ve setInitialInputMode("MIDP_LOWERCASE_LATIN") metodu arlmsa girilerin kk harf modunda balayacana izin verilir.
Alert Kullanm(Mesaj Ekranlar) :
Alert kullancya gsterilmesi iin bilgilendirici mesajdr. MIDP evreninde iki eit Alert bulunmaktadr: Zaman ayarl Alert, genellikle birka saniye ile snrl olarak gsterilir. Tasdik edilmesine ihtiya duyulmayan bilgilendirme mesajdr, ilem bitti gibi. Model (Modal) Alert, kullancnn grnceye kadar kalabilecek, kullancnn karmamas gereken mesaj. Olaylarn seimi sorulduunda faydaldr. Hazrmsnz? sorusuna Yes(Evet) veya No(Hayr) commands ile seenekleri sorabilirsiniz. MIDP Alertlar bir ikon ile beraber ilikilendirilmi olabilir, dur(stop) iareti, nlem ieren, soru iaretleri gibi. Hatta gereklemeye bal olarak ses dosyalaryla bile ilikilendirilebilir. Windowsun, MACOSun modal dialog boxes mesajlarna benzer. Aada tipik bir Alert grebilirsiniz:
Alert, javax.microedition.lcdui.Alert snfndan aadaki yapladrc rneklerine gre oluturulmaktadr: public Alert(); public Alert(String title, String alertText, Image alertImage, AlertType alertType);
kinci yaplandrc versiyonundaki parametrelerden herhangi bir veya hepsi birden null olabilir (Image snfnn u an bulunmamasn dnmeyin, daha sonra tartlacaktr). Zaman ayarl Alert, Varsaylan olarak kabul edilir ve varsaylan bir zaman am sresi deeri ile kullanlr. Varsaylan deeri getDefaultTimeout( ) metodunu ararak elde edebiliriz. Alertin zaman am sresini call setTimeout( ) metodunu kullanarak, zaman milisaniye cinsinden vererek kullanabiliriz. Zaman am parametresi FOREVER zel deerini alrsa Alertn modal olarak kullanlacan gsterir. Basit bir zaman ayarl Alert kullanm aadadr : Alert alert = new Alert("Sorry", "I'm sorry, Dave...", null, null);
Zaman am deerini ak bir ekilde 5 saniye olmas iin aadaki ekil kullanlabilir: alert.setTimeout(5000); Eer zaman ayarl yerine bir modal alert kullanlacaksa FOREVER zel deeri aadaki gibi kullanlr: alert.setTimeout(Alert.FOREVER);
Bu durumda mesaj ekranndan k MIDP gereklemesi otomatik olarak destekler. rnein Done command birimi bir soft butonla eletirilerek k salanmaktadr. Bu command DISMISS_COMMAND statik yesi tarafndan aa kartlmtr. Kendi command ilevlerinizi buna herzamanki gibi addCommand( ) metodu ile ekleyebiliriz. Bu metot ilk arldnda sistemin kendi Done command ilevi ortadan kalkar.
Alertn doal davran, klnca kendiliinden geerli olan mesajdan nceki ekrana dnlmesidir. Eer baka bir ekran gei isteniyorsa Displayin setCurrent( ) metoduna Alert nesnesini de ekleyerek iki argmanl overload halini kullanrz. Normal olan tek argmanl setCurrent( ) metodu bir nceki ekran tutar: Alert alert = new Alert("Oyun Bitti","Tm rnek Cumleler \n Bitti...",null,AlertType.INFO); alert.setTimeout( Alert.FOREVER ); display.setCurrent(alert,parent.menu); // parent: midlet snfmz, menu: displayable nesnesi, form, list gibi...
MIDP gereklemesi Alertn tipine gre (AlertType) nasl bir ses kacana karar verir. AlertType snf eriilmesi iin 5 farkl tipte statik ye deikeni salar: ALARM, CONFIRMATION, ERROR, INFO ve WARNING. Kullanm istee bal olan, bir Alert iaretisi de vardr. Varsaylan durumda bir iareti bulunmamaktadr ama Displayable Form nesnesine eklenebilen Itemlardan biri olan Gauge nesnesini (Daha sonra ilenecek olan Form konusunda geiyor) Alertin setIndicator() metoduna geirerek elde edebiliriz . Indicator, uzun ilemler veya network balants(internet) durumlarnda ilerlemeyi gstermesi asndan kullanldr. List ve Form Displayable Snflarnn Kullanm :
List Kullanm : Kullancya seilebilir bir listedeki maddelerden (elementde denilebilir) semesine izin veren TextBox ve Alertden sonra en basit Screen den tremi snf Listtir. Liste iindeki elementlerin gsterimi metin String, bir image veya ikisinin karm kullanlm olabilir. Tek seimin zorlanmasna veya bir ok elementin ayn anda seimini destekler. Listin Choice arayzndeki sabitlerle tanmlanm olan iki ana tipi vardr: MULTIPLE sabiti ayn anda birden ok elementin seilmesi gerektiinde kullanlr. Swing veya webdeki option dmelerine benzer. EXCLUSIVE ise listeden sadece bir tek elementin seilmesi durumu iin belirlenir. Radyo dmelerine benzer. oklu(MULTIPLE) veya tekli(EXCLUSIVE) kullanmlarnda seimlerin yaplp onaylanmasfarkl admlar gerektirir. Esasnda List, hangi tipte olursa olsun bir onaylama(confirmation) mekanizmas sunmaz, dier mekanizmalara (Command gibi) ihtiya duyulabilir. Her iki kullanmda seimler onaydan nce deitirilebilir, tekrar seilebilir. EXCLUSIVE kullanmnda gerekleme seim yaplrken yn tular ile yukar aa gezilebilmesine izin verir, sim tuu ile de onaylanmasn salar. MULTIPLE da ise yn tular ile yukar aa hareket edilebilir, seim tuu ile ilgili elementin seilmesi veya seimin iptali salanr. Onaylama bahsedildii gibi command kullanm ile yaplr. EXCLUSIVE kullanmnda ayrca daha fazla detay da bulunur: IMPLICIT sabiti, listenin men gibi kullanlabilmesini salar. Her bir element resim(image) veya metin(tekst) olabilir(veya ortak kullanm), Ok tular ile yukar-aa gezilip, seimin yaplmas ayn zamanda onaylanmas anlamna gelir, Command kullanmna gerek kalmaz. Commandlardaki gibi seim yapldnda bir event tetiklenir:
(a) EXCLUSIVE
(b) MULTIPLE
(c) IMPLICIT kullanm
IMPLICIT List Kullanmnda Olay leme:
IMPLICIT Listin seimi olduunda Listin CommandListener arayznn CommandAction metodu uygulanr. Bu metoda Command nesnesi ve Displayable nesnesi parametre olarak geirilir: public static final Command SELECT_COMMAND public void commandAction(Command c, Displayable s) { if (c == nextCommand) // ... else if (c == List.SELECT_COMMAND) // ... }
Ayrca setSelectCommand( ) metodunu da SELECT_COMMAND yerine kendi Commandlarnz iin belirlemekte kullanabilirsiniz. List Oluturulmas :
Bir balk ve bir liste tipi belirlenmesi ile oluturulur. Varsa image dosyalar ve tekst elementler kullanlabilir. Bunlar da yaplandrcya geirmeliyiz: public List(String title, int type) public List(String title, int type, String[] stringElements, Image[] imageElements)
StringElements parametresi null olamaz ama bo olabilir; bununla beraber imageElements parametresi array dizisi eleman olarak null ierebilir. Bu durumda sadece string ifadeleri grnr. Baz Listlerin ekranda grndnden daha fazla eleman olabilir. Dorusu ekranda grnen eleman says cihazdan cihaza deiebilir. Ama endielenmeyin, List gereklemesi tm elementlerin gsterilebilmesi iin yukar/aa kaydrma mekanizmalarna sahiptir. MIDlet gelitiricilerinin bu kaydrma zerinde kontrol bulunmamaktadr. Image(grnt)ler Hakknda :
javax.microedition.lcdui.Image snf MIDPde image kullanm iindir. Spesifikasyon PNG formatnda grnt dosyalar yklenebilmesini gerektirir. PNG format transparan (saydam) renk ve kaypsz sktrmay destekler. Image snfnn yaplandrcs bulunmaz ama nesne elde edilmesinde createImage( ) fabrika metodu kullanlr. 3 deiik yolla Image alnr: Aadaki ifade ile dorudan, MIDletin iinde olduu JAR dosyasndan ismi verilen PNG veri dosyas yklenir. Standart olarak bu tr dosyalar res klasrnde olursa yol belirtmeye gerek yoktur, baka bir dizin iinde ise yol belirtilir: public static Image createImage(String name); .... try { Image anImage = Image.createImage("/star.png"); }catch (java.io.IOException ioE) { System.out.println("Problem reading image"); } ....
2. metot ile Image tanmlanan bir veri dizisinden alnr. Verinin konumu diziden verilen parametre ile imageoffset ile alnr, imagelength uzunlu[unda veri alnr: public static Image createImage(byte[] imagedata, int imageoffset, int imagelength)
3. metotta Image bir InputStream stream(aknt) snfndan alnr: public static Image createImage(InputStream stream); .... private Image m_face = null; .... InputStream in = null; try { in = this.getClass().getResourceAsStream("face.png"); m_face = Image.createImage(in); } catch (Exception e) { m_face = null; } ....
Imageler dzenlenebilir(mutable) veya dzenlenemeyen(immutable) olabilir. Dzenlenebilir olanlar getGraphics() metodunun arlmas ile deitirilebilir ve imagein stne izilmesi iin geri dnen Graphics nesnesi kullanllr. Eer bu ilemler deitirilemez bir image stnde yaplmaya allnrsa IllegalStateException frlatr. Yukardaki rneklerle dzenlenemeyen(immutable) imageler elde edilir. Dzenlenebilir(mutable) image elde edilmesi iin aadaki metot kullanlr: public static Image createImage(int width, int height); Genellikle dzenlenebilir(mutable) imageleri ekran dnda izdirerek oluturursunuz, bunun nedeni eer cihazn ifte tamponlamasnn olmamas durumunda, bir animasyon iin titremenin azaltlmas iindir. Alert, ChoiceGroup, ImageItem ve List gibi snflara geirilebilen herhangi bir image dzenlenemeyen(immutable) image olmaldr. Dzenlenebilir(mutable) bir imageden dzenlenemeyen(immutable) image aadaki metot ile oluturulur: public static Image createImage(Image image);
Ayrca bir imagei baka bir imagein belli bir blmnden de aadaki metodu kullanarak elde edebilirsiniz : public static Image createImage(Image image, int x, int y, int width, int height, int transform);
Bu metot orjinal imagein sol st ke koordinat (0,0) alnarak (x,y) kordinat balang olmak zere genilik(width) ve ykseklik(height) deerleri (x,y) koordinatndan itibaren imagein bu tanmlanan ksm alnarak imagei belirlenmi bir dnm ilemine uygulayarak yeni bir dzenlenemeyen(immutable) image dndrr.
Mmkn olan dnmler transform parametresinde javax.microedition.lcdui.game.Sprite snfnda tanmlanan sabitlerle yaplr ve 90 derecelik dnmlerde bunlara dahildir. htiyacnz olan imagein boyutlarn nasl bilebilirsiniz ? Bunun iin Display size, eitli tiplerde imageler iin en uygun genilik ve ykseklik deerlerini dndrecek metotlar salar : public int getBestImageHeight(int imageType); public int getBestImageWidth(int imageType);
imageType parametresi Displayin u sabitlerinden bir olmaldr : LIST_ELEMENT , ALERT veya CHOICE_GROUP_ELEMENT. Bir List meydana getiriyorsanz imagelere ait elementler iin en uygun boyutu bulma amacyla Displayi sorgulatabilirsiniz. Bu yolla alma zamannda paketlenmi eitli boyutlardaki ikonlarnz arasndan en uygun boyutta olan seebileceinizi dnebilirsiniz. Bir Listin Dzenlenmesi :
List snf elementlerin eklenmesi, silinmesi, varolan elementlerin sorgulanmalar ve dzeltimleri gibi ilem iin eitli metotlar salar. List iindeki her elementin bir indeks numaras bulunur ve 0dan balar. set( ) metodu ile bir elemeti deitirebiliriz. append( ) metodu ile yeni bir element ekleyebiliriz. insert( ) metodu yeni elementi verilmi indeks numarasna ekler, bu elementin indeks numarasndan sonraki indeks saylar bir artar. public void set(int elementNum, String stringPart, Image imagePart); public void insert(int elementNum, String stringPart, Image imagePart); public int append(String stringPart, Image imagePart);
ndeks says ile bir element iin metin ve resim deerlendirilebilir. Benzer bir ekilde delete( ) metodu ile indeksi verilen bir element silinebilir. public public public public String getString(int elementNum); Image getImage(int elementNum); void delete(int elementNum); void deleteAll();
Yukardaki metotlardan deleteAll( ) ile List^den her element silinir. size( ) metodu ile Listin element saysn verir. Verilen Listin grnm ile ilgili sorumluluk MIDP gereklemesine aittir. Bununla ilgili metotlardan ilki setFitPolicy( ) metodu Liste elementlerin ekran geniliklerinin nasl ileneceklerini belirtir. Mmkn olabilecek sabit deerler (Choice snfndan gelen) aadadr: TEXT_WRAP_ON, uzun elementlerin birden ok satra yaylabilmesini ifade eder. TEXT_WRAP_OFF, uzun elementlerin ekran kenarnda krplmasn ifade eder. TEXT_WRAP_DEFAULT, gereklemenin varsaylan durumunu ifade eder. Dier bir yeni metot setFont( ) ile belirli bir List elementinin fontunun belirlenmesi iin kullanmna izin verir. Bir element iin geerli olan font getFont( ) metodunun arlmas ile geri dndrlr. List Seimleri le almak :
Verilmi indeks numaral List elemannn seilip seilmediini aadaki metot verir: public boolean isSelected(int index);
EXCLUSIVE veya IMPLICIT Listlerin her ikisinde de tek olarak seilmi list elemannn indeks numarasn aadaki metot verir :
public int getSelectedIndex();
Eer bu metodu oklu(MULTIPLE) Listlerden yaplan seimler iin kullanrsak -1 dndrr. :
Geerli seilmi olan List elementini setSelectedIndex( ) metodunu kullanrz:
programlama
ile
deitirmek
iin
aadaki
public void setSelectedIndex(int index, boolean selected); Son olarak List, topluca yaplan seimlerde, oklu listelerde(?) seimleri almak veya deitirmeye izin verir. Kullanlan diziler, List elemanlar boyutunda olmaldr: public int getSelectedFlags(boolean[] selectedArray_return); public void setSelectedFlags(boolean[] selectedArray); Listin imagelerle birlikte kullanmna ilikin bir rnek aadadr : import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class TravelList extends MIDlet implements CommandListener { private List mList; private Command mExitCommand, mNextCommand; public TravelList() { String[] stringElements = { "Airplane", "Car", "Hotel" }; Image[] imageElements = { loadImage("/airplane.png"), loadImage("/car.png"), loadImage("/hotel.png") }; mList = new List("Reservation type", List.IMPLICIT, stringElements, imageElements); mNextCommand = new Command("Next", Command.SCREEN, 0); mExitCommand = new Command("Exit", Command.EXIT, 0); mList.addCommand(mNextCommand); mList.addCommand(mExitCommand); mList.setCommandListener(this); } public void startApp() { Display.getDisplay(this).setCurrent(mList); } public void commandAction(Command c, Displayable s) { if (c == mNextCommand || c == List.SELECT_COMMAND) { int index = mList.getSelectedIndex(); Alert alert = new Alert("Your selection", "You chose " + mList.getString(index) + ".", null, AlertType.INFO); Display.getDisplay(this).setCurrent(alert, mList); } else if (c == mExitCommand) notifyDestroyed();
} public void pauseApp() {} public void destroyApp(boolean unconditional) {} private Image loadImage(String name) { Image image = null; try { image = Image.createImage(name); } catch (IOException ioe) { System.out.println(ioe); } return image; } }
Formlarla Gelimi Arayzler Oluturma :
Bir Form ekran, item lar olarak adlandrlan, kullanc-arayz kontrollerinin (Bileen-Aygt ?) istenilenlerinden seilmi koleksiyonunu ihtiva eder. Bir MIDin minimum boyutunun 96x54 piksel olduunu hatrlayalm. Bu boyuta hazrlanm ekranlarn smas zor olabilir. Formlar, ekran samadklarnda otomatik olarak kaydrlabilir olacaktr, bylece formlarla yaplm ekranlar ekran boyutundan bamsz dizayn edilebilir. Bununla beraber kaydrlabilir ekranlarnda kullanc dostu olmadklar, karklklara yol aabileceklerinden dolay Formlarnda mmkn olduunca ufak dizayn edilmesi gerekir. javax.microedition.ldcui.Form snfnn kendisinden kolayca elde edilir. Aada bir form oluturulmas grlmektedir: public Form(String title);
Esasnda bir Form, item larn bir kolleksiyonudur. Her item, Item snfnn bir nesnesi tarafndan temsil edilmektedir. Eer itemlarnz zaman iinde tek bir dizi olarak tutarsanz bunu formunuza aadaki yaplandrc aracl ile geirirsiniz: public Form(String title, Item[] items);
Form, Screen ve Displayable snflarnn alt snf olduundan balk title ve ticker zelliklerini de miras almtr NOT:/ zellikle ufak boyutlu ekranlarda tickerlar formlarla beraber kullanlmasndan kanmak isteyeceksiniz ? Tickerlar grnmn gncellerken kk aralarda ayrca pil arn da azaltabilirler. Form un tredii st snflardan (bykbabas) diyebileceimiz Displayable snf Commandlarn grnm ve Command olaylarn balatabilme yeteneklerini verir. Tekrar syleyelim, formlarla Commandlar kullanrken mmkn mertebe basit olmallar; bir ok durumda sadece bir Back (geri) ve Next (leri) Command kafi gelecektir. Herhangi bir Displayable ile bir Formun gsterimi iin basit strateji, basit bir oluturmak ve Display in setCurrent( ) metoduna parametre olarak geirmektir.Displayden daha byk bir formunuz varsa, Display iinde setCurrentItem( ) metodunu kullanmak isteyebilirsiniz. Bu metot sayesinde itemlar olan form grnr klnr, sonra da form kaydrlarak grnen aygta (item) odaklanlr. Itemlarn Dzenlenmesi :
Form gsterilirken dahi itemlar eklenebilir, karlabilirler. Itemlarn sralar nemlidir; birok MIDP gereklemesi itemlar bir formun tepesinden aaya doru, belkide soldan saa doru, ekran boyutuna samayacak kadar ok item olduunda form dey olarak aaya kaydrlarak gsterilecektir. Bir item formun altna eklemek iin aadaki append metotlarndan biri kullanlabilir. lki herhangi bir itemn eklenmesi iindir: public int append(Item item); Aadaki kullanmlar, sizi uygun artlar iin zorlar; sahne arkasnda bir StringItem veya bir ImageItem sizin iin oluturulmu olacaktr. public int append(String str); public int append(Image image);
Bir Formdaki her Itemn bir indeks says vardr ve 0 ile balar. Bir item belirli bir indeks numarasna yerletirebilirsiniz, bu ilem o indeksdeki item ile yer deitirmesine neden olur: public void set(int index, Item item); Alternatif olarak formun ortasna bir item eklemek isteyebilirsiniz, istenilen indeks saysna yerletirilebilmesi iin insert( ) metodu kullanlr. Sonra gelen itemlarn indeks saylar bir numara artar: public void insert(int index, Item item);
Bir Formdan bir Item kartmak iin delete( ) metodu kullanlr: public void delete(int index); Bir Formdan btn Itemlar tek kere de kartmak iin deleteAll( ) metodu kullanlr: public void deleteAll();
Eer bir forma ne koyduunuzu hatrlamyorsanz, itemlarn says ve hangisini alabileceimiz aadaki metotlarla yaplmaktadr: public int size(); public Item get(int index) Form Yerleiminin Anlalmas :
Varsaylan yerleim olarak Form, itemlar ekran sabiliyorsa soldan saa bir srada yerletirmeyi dener, ekrana smayan item yukardan aaya yerletirir: Item Deposu :
MIDP spesifikasyonu formlarla kullanlabilecek itemlarn kullanllarndan oluan bir alet kutusuna sahiptir. Aada bunlardan bazlarn aalm (bir ounu aklamadan geiyoruz, temel mantklarn ve en temel olanlarn gstermeye alalm). Item Snf :
Forma eklenen itemlar javax.microedition.lcdui.Item paketindeki snfndan alnmtr. Bu snfn getLabel( ) ve setLabel( ) metotlar vardr. Btn Itemlarn belirli alt snflar tarafndan gsterilsin gsterilmesin bir String etiketi(label) vardr. Itemlarn ayrca Displayable gibiCommand zellikleri de vardr. Bir formdaki item seilince itemn command formdaki commandlar ile beraber gsterilir.
rnein bir formda one, two, three, four olarak isimlendirilmi 4 adet String item vardr. three isimli 3. itemnDetails isimli bir Command vardr. Formun kendisinin de Exit Command vardr. lk bata Three seili olmad iin Details Command grnmez:
Three Item seilince Exit Commandnn yannda Details de grnr:
Item Commandlarnn dzenlenmesinin mant form Commandlarnn dzenlenmesine ok benzer. Itemn stndeki Commandlar addCommand( ) ve removeCommand( ) metotlar ile dzenleyebilirsiniz. NOT:/ Itema eklenen Commandlar iin Command tipi Item olmaldr, ama bu olmadnda bir exception vs. frlatlmaz. Bir Command listener(komut dinleyici), setItemCommandListener( ) metodu kullanlarak atanm olabilir. ItemCommandListener arayznn CommandListener arayzne benzer bir ekilde tek bir metodu vardr: public void commandAction(Command c, Item item);
Itemlar ayrca Default Command (varsaylan Command) destekler. Item, yerleim kontrol ile ilikilendirilmi alanlara sahiptir. Itemlarn minimum ve form iinde en uygun nasl grnecei iin tercih edilen boyutlar vardr. Minimum boyutunu getMinimumWidth() ve getMinimumHeight ( ) metodlar ile bulabiliriz. Bu boyutlar itemn ieriine bal olarak ierik deitike deiir. Bunu deitiremeyiz,. Buna karlk tercih edilen boyut iin varsaylan deer ykseklik ve genilik iin -1 zel deeri olursa, bunun anlam gereklemeye boyut ne olursa olsun ilgilenmiyorum, en uygun boyutu uygula demektir. Belirli bir pozitif deer iin genilik ve ykseklik setPreferredSize( ) metodu ile geirilmise boyutun kilitli olduunu ifade eder(?) getPreferredWidth( ) ve getPreferredHeight( ) metotlar bize setPreferredSize( ) metodu ile herzaman geirilen deerleri vermez. rnein setPreferredSize(-1, -1) ile kilitleri atysak gereklemenin salad deerleri getPreferredWidth( ) ve getPreferredHeight( ) metotlar ile salanr. Son olarak Item snf, getLayout( ) ve setLayout( ) metodlarnn kullanm gibi yerleim ynergelerini de kapsar. Bir tamsay ile temsil edilen yerleim deeri genellikle LAYOUT_2 sabitiyle yaplan kombinasyon ile yatay veya dey bir deerdir. LAYOUT_2 MIDP 2 kurallarnn dnda yerlemi gerekletirilen item iin bir gstergedir(flag). Aada yatay deerlere ait sabitler grnmektedir: LAYOUT_LEFT LAYOUT_RIGHT LAYOUT_CENTER Aada dey deerlere ait sabitler grnmektedir: LAYOUT_TOP LAYOUT_BOTTOM LAYOUT_VCENTER Ek olarak, bir yerleim deerine kltme veya geniletme dahildir. Kltme(Shrinking), bir itemn minimum genilik ve yksekliinin kullanlmas, geniletme(Expanding) ise itemn boyutunun doldurulabilmesi iin mmkn genilik veya satr yksekliine uzatlmasdr. Kltme ve geniletme ile ilgili sabit deerler aadadr: LAYOUT_SHRINK (genilik iin) LAYOUT_EXPAND (genilik iin) LAYOUT_VSHRINK (ykseklik iin) LAYOUT_VEXPAND (ykseklik iin) Son olarak bir itemn yerleiminde yeni satrdan nce veya sonra kullanlmasna gre LAYOUT_NEWLINE_BEFORE ve LAYOUT_NEWLINE_AFTER sabitlerinin kullanmda bulunmaktadr. Bu sabitler, form iindeki tekst ifadelerin bir sayfada yaylm gibi yerlemi olan itemdan nce veya sonra olmasna gre yeni bir satr iin istek bildirmenize izin verir.
Aada 3 adet farkl yerleim rnei grnmektedir: LAYOUT_2 | LAYOUT_LEFT | LAYOUT_NEWLINE_AFTER LAYOUT_2 | LAYOUT_CENTER | LAYOUT_NEWLINE_AFTER LAYOUT_2 | LAYOUT_RIGHT | LAYOUT_NEWLINE_AFTER
StringItem Item Snf :
StringItem snf basit tekst etiketleri temsil eder. Form form = new Form("Form Title"); StringItem stringItem = new StringItem("Label: ", "Value"); form.append(stringItem);
Dikkat:/ Baz MIDP gereklemelerinin StringItem etiketinde kullanlmak zere kendi : karakteri vardr, bu karakterin ift grnmesine neden olabilir. Emulatorlerin MIDP gereklemesinde : karakteri StringItem etiketlerinde otomatik olarak eklenmez.
StringItem etiketi veya deeri ekranda grnmemesi gerektiinde null kullanlabilir (Daha iyisi Formun append(String) metodunu kullanabilirsiniz). StringItem, Item snfndan setLabel( ) ve getLabel( ) metotlarn miras almtr. String deerinin dzenlenmesinde getText( ) ve setText( ) metodlar eriimde kullanlr. StringItem ve ImageItemn her ikisinin grnm appearence mode kullanlarak kontrol edilmi olabilir. appearence mode bir itemn URL gibi veya button gibi grnmesine izin verir. 3 adet grnm modu (tem snfnda) aadaki gibi tanmlanmtr: PLAIN, itemn normal durumunu gsterir. HYPERLINK, item bir URL olarak gsterir. Tipik bir action ile MIDletin platformRequest( ) metodu kullanlarak balant alabilir. BUTTON, item bir button(dme) olarak gsterir. Not:/ Bunun kullanm zellikle cihazlar stnde bulunmayan eylemlerin iaretilerinin hantal olmas ve bir buton grnmyle item kullanmak istediiniz zaman genellikle bir Command kullanlmalsnz (!). Son olarak StringItem snfnda getFont( ) ve setFont( ) metotlar da vardr. Spacer Item Snf :
Form iinde bo space boluk karakteri kullanmn gsterir. Dier Itemlardan farkl olarak alma srasnda odak(focus) kazanmaz ve Commandlar ile kullanlamaz, olaylar yoktur. Yerleim nedeniyle kullanlm olabilir. Btn ihtiya duyulan minimum genilik ve yksekliktir: public Spacer(minWidth, minHeight);
TextField Item Snf :
TextField item snf, dzenlenebilir bir string sunar. Aada TextFieldTitle etiketi ve text deerini ieren bir TextField bulunmaktadr:
TextField girileri kstlanp snrlandrlabilir. Bunun iin aadaki sabitler tanmlanmtr: ANY, her tipte girie izin verir. NUMERIC, giriler saylarla snrlandrlmtr. DECIMAL, saylarn kesirli ksmlar ile girilerine izin verir. PHONENUMBER, girilerin telefon numaras olmas iin. EMAILADDR, giriler bir e-mail adresi olmaldr. URL, giri bir URL olmaldr. Bu tahditler/snrlamalar tandk gelebilir; daha nce ilenen TextBox Displayable konusunda ayn sabitler kullanlmtr. TextBoxdaki bir ok kullanm TextField ile ayndr, PASSWORD, SENSITIVE, UNEDITABLE, NON_PREDICTIVE, INITIAL_CAPS_WORD ve INITIAL_CAPS_SENTENCE sabitleri kstlamalar ile OR operatr kullanlarak birletirilebilir. Bir TextField oluturmak iin bir etiket, metin deeri(varsaylan deer iin verilebilir, bo olmas iinse null verilebilir), maksimum uzunluk ve giri kstlarnn salanmas gereklidir: public TextField(String label, String text, int maxSize, int constraints);
TextBox snfnda bulunan setInitialInputMode(String characterSubset) metodu ile istenen uygun metinin hangi giri modunda olduunu bildiririz. String parametresi J2SE java.lang.Character.UnicodeBlock paketinde bulunan sabitlerin bana UCB_ eklenmesi ile kullanlr. rnein UCB_BASIC_LATIN veya UCB_KATAKANA bu metoda geirilebilinir. Ayn kullanm TextField snfnda da kullanlabilir. ImageItem Item Snf :
Formlrda ImageItem snfnn bir nesnesi tarafndan temsil edilen imageler(resimler) bulunabilir. ImageItemlarda birletii verinin eitli paralar bulunabilir: Image ile bir etiket(label) grntlenebilir. layout imagein yerleimini belirler. Image grntlenemediinde alternate text grntlenir. Bir ImageItem oluturulurken srasyla grntlenecek olan resim(image), etiket(label), yerleim(layout) ve yedek tekst(alternate text).
(Layout)Yerleim, Item snfndaki hazr yerleim sabitleri ile kontrol edilir. Ayrca ImageItemda kendi yerleim parametresi iin sabitlerde tanmlanmtr. LAYOUT_DEFAULT varsaylan yerleimdir. Daha fazla kontrol iin dey ve yatay deerler birletirilebilir. Yatay deerler LAYOUT_LEFT, _LAYOUT_CENTER, ve LAYOUT_RIGHT. Dey deerler LAYOUT_NEWLINE_BEFORE ve LAYOUT_NEWLINE_AFTER. ImageItem snfndaki sabitlerde eski MIDP versiyonlarnda geriye doru uyumluluk salanmtr. ImageItem, StringItem gibi grnm modlarn(appearance mode) destekler. DateField Item Snf :
DateField, zaman ve tarih girilerini olduka kolaylatran bir mekanizma sunar. Bir Datefield oluturabilmek iin bir etiket ve tip belirlenmelidir. DateField snfnda eitli tanmlar iin 3 adet sabit bulunmaktadr: DATE sabiti dzenlenebilir tarihi gsterir. TIME sabiti dzenlenebilir zamangsterir. DATE_TIME sabiti hem tarih hem de zamann gsterilmesi iindir. DateFieldn iki adet yaplandrcs vardr. lki varsaylan zaman kuan kullanrken ikincisi ak bir ekilde farkl zaman kuaklar tanmlanmasna izin verir: public DateField(String label, int mode); public DateField(String label, int mode, TimeZone timeZone);
Esasnda bir DateField, java.util.Date iin bir editrdr. DateClas snf, Date ve String arasnda evirim roln yapan daha ok Calendar snf gibi okunabilirlii arttrma roln alr. Aadaki Datefield snfnn metodlar kullanlarak Date snf tipinde tarih bilgisi alnabilir(get) veya verilebilir(set): public Date getDate(); public void setDate(Date date);
Aada eitli Datefield uygulama grntleri Sunn emulatrndeki grnd haliyledir:
(a)
(b)
(c)
(d)
Eer DateField grntlenmeden nce Date snf tipinde bir tarih, set metodu ile balangta verilmemise yukardaki (b)deki gibi grnr.
Gauge (aygt, lme aygt) Item Snf :
Gauge(aygt), tamsay bir deeri ifade eder. Nasl grnd gerekletirilmesine baldr. Genel olarak aadaki gibi grnr:
Gauge nesnesinin deeri, getValue( ) metodu ile alnabilmekte ve setValue( ) metodu ile dzenlenebilmektedir. Gauge nesnesinin deeri 0 ile en yksek bir deer arasndadr. Bu en yksek, maksimum deerini getMaxValue( ) metodu ile alabilir ve setMaxValue( ) metodu ile dzenleyebilirsiniz. Gaugen grn, deerinin tahmini yaklamna gre grselleir. nteraktif/Etkileimli(interactive) bir Gaugen deeri kullanc tarafndan ayarlanabilir. Tekrar edersek, nasl alaca eitli gereklemelere baldr. Sunn gerekletirilmesinde sa ve sol navigasyon tular(soft button) ile ayarlanabilir. Gauge yaplandrcsnn ak hali aadadr: public Gauge(String label, boolean interactive, int maxValue, int initialValue);
Aadaki rnekte maksimum deeri 24, balang deeri 2 olan, interaktif bir Gauge rnei bulunmaktadr: Gauge g = new Gauge("Power", true, 24, 2);
lerleme gsterilcisi gibi(swingdeki progress bar gibi) faydal olabilecek etkileimli olmayan 3 eit Gauge bulunmaktadr. Bu etkileimsiz Gauge aygt ve maksimum deeri ile bir download veya bir hesaplamadaki ilerlemeyi gstermesi iin kullanabilirsiniz. Etkileimsiz ve maksimum deeri bulunmayan Gauge aygtnn iki eidi vardr. Bu durumda maksimum deer yerine INDEFINITE kullanabilirsiniz. Gaugelar artan(incremental) veya devam eden(continuous) olabilir. Artan Gauge llebilir admlarn bir hareketini gsterir; nemli iler olduu her zaman uygulamanz Gaugei gncelleyecektir. Gauge deerini kendisi aadalerden biri ile gnceller: INCREMENTAL_UPDATING sabiti, henz tamamlanan bir eylere gre Gaugen tepki vermesi ile gncellenmesini ifade eder. INCREMENTAL_IDLE sabiti, Gauge deerinin artmasnn devam etmesi ama halen bir eyler olmamasn istediiniz anlamndadr. CONTINUOUS_RUNNING sabiti, Gaugen alma modunda devam eden Gauge olduuna iaret eder. CONTINUOUS_IDLE sabiti, henz bir gelimenin yaplmad devam eden Gauge iin kullanlmtr. ChoiceGroup Item Snf :
Form cephaneliindeki Itemlardan olan dier bir snf ChoiceGrouptur. Seimler iin bir liste sunar. Daha nce anlattmz javax.microedition.lcdui.List Displayable snfna ok benzer. Bu benzerlik raslantdan daha fazlasn ierir; tm metotlar ayn kaynaktan gelen ChoiceGroup ve List snflarnn her ikisi de, Choice arayznden tremitir. List konusunu okuduysanz ChoiceGroup hakknda hemen hemen hereyi zaten biliyorsunuz demektir nk aada greceiniz gibi yaplandrc metotlar bile ayn ekilde alr: public ChoiceGroup(String label, int choiceType); public ChoiceGroup(String label, int choiceType, String[] stringElements, Image[] imageElements);
choiceType tandk gelebilir, EXCLUSIVE veya MULTIPLE sabitlerinden birisi olmaldr, sabitler Choice arayznde tanmlanmlardr. Gerekte ise ChoiceGroup yaplandrclar IMPLICIT sabitine izin verilmemesi dnda ayndrlar. Bu ChoiceGroupun form iindeki itemlardan biri olmasn ama dier bir ekran olmamasn anlaml klar. Ayrca ChoiceGroupun combo-box veya aa kayan(drop-down) menye benzeyen POPUP tipi de vardr. ChoiceGroup, form iindeki dier elementler gibi grnr.
MULTIPLE
EXCLUSIVE Item Deiikliklerine Tepki :
POPUP
Form iindeki bir ok Item kullanc zerlerinde deiiklik yaptnda olaylar tetikler. Uygulamanz, aadaki gibi bir ItemStateListener a kaydedilen btn olaylar devaml dinler: public void setItemStateListener(ItemStateListener iListener);
ItemStateListener, tek metotlu bir arayzdr. Bu metot form iinde bir item her deitirildii zaman arlr.: public void itemStateChanged(Item item);
ChoiceGroup Item rnei : Aada ChoiceGroup ve Item olay ilemsini anlatan ksa bir rnek yer almaktadr: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class ChoiceGroupTest extends MIDlet implements CommandListener, ItemStateListener { private private private private Display display; // Reference to display object Form fmMain; // The main form Command cmExit; // Exit the form ChoiceGroup cg; // ChoiceGroup
public ChoiceGroupTest() { display = Display.getDisplay(this); // Create the choicegroup cg = new ChoiceGroup("Email Options", Choice.EXCLUSIVE); cg.append("Reply", null); cg.append("Forward", null); cg.append("Delete", null); // Create form, add objects, listen for events cmExit = new Command("Exit", Command.EXIT, 1); fmMain = new Form("Core J2ME-ChoiceGroup"); fmMain.addCommand(cmExit); fmMain.append(cg); fmMain.setCommandListener(this); fmMain.setItemStateListener(this); } public void startApp() { display.setCurrent(fmMain); } public void pauseApp() { } }
public void destroyApp(boolean unconditional) { public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(false); notifyDestroyed(); } }
public void itemStateChanged(Item item) { System.out.println("Inside itemStateChanged()"); if(item==cg)System.out.println(cg.getString( cg.getSelectedIndex())); } } Bu rnekte bir e seildiinde bir olay ilenmesini gstermek istedik. Bu seilen enin indeks numaras bastrlr.
Custom Item :
Daha spesifik, esnek, bize zg item, bileenlere ihtiya duyulduunda Custom itemlar kullanlabilir. Kendi itemlarmz yapabilmek iin btn gereken snfmz CustomItem snfndan tretmek ve 5 adet soyut metodunu gerekletirmeliyiz. Bu soyut snflardan aada gzken ilk 4 tanesi, kodun sorumluluunda bulunan alann ieriiyle itemn boyutlandrlmasn yapar. Custom itemn toplam alannda bir etiket ve snrlarda dahildir ama bu gerekletirilmenin sorumluluundadr. Custom itemnz bir tek ierik alanna kar sorumludur: protected int getPrefContentWidth(int height); protected int getPrefContentHeight(int width); protected int getMinContentWidth(); protected int getMinContentHeight();
lk iki metot, item ne byklkte olmasn istiyorsa tanmlanan deerlerini geri dndrr. MIDP gereklemesinde sizin Custom Item da ieren bir Form yerleim dzenlemesi yaparken tercih ettiiniz boyutlandrmay dikkate almayabilir ama gene de boyutlandrmay dener. Gerekletirme istenilen genilik ve ykseklik deerlerini bu metotlara geirerek sonuta itemn boyutlarnn ne olabilecei konusunda bir fikir verir. rnein gerekleme, itemn getPrefContentWidth( ) (genilik iin) metodunu arabilir ve ykseklik parametresi iin 18 deerini geirebilir. Bu gereklemenin itema ykseklik iin 18 atarsam geniliin ne olmasn istersin sormasdr. Sonraki iki metot, itemn minimum boyutlar hakknda geri dndrecei bilgidir. Bu itema izin verilen en kk boyuttur. 5. metot, somut CustomItem altsnf tarafindan tanmlanmas gereken, arldnda item ileyerek izen paint( ) metodudur. protected void paint(Graphics g, int w, int h);
Graphics nesnesi itemn ierik alan stne izgiler, ekiller yaz ve resim(image) izilmesinde kullanlr. Bu konu daha sonra sadece detayl olarak grafik ilem de ve oyun API ksmlarnda tekrar anlatlacaktr. Basit bir rnek gsterelim: import javax.microedition.lcdui.*; public class SimpleItem extends CustomItem { public SimpleItem(String title) { super(title); } // CustomItem abstract methods. public int getMinContentWidth() { return 100; } public int getMinContentHeight() { return 60; } public int getPrefContentWidth(int width) { return getMinContentWidth(); } public int getPrefContentHeight(int height) { return getMinContentHeight(); } public void paint(Graphics g, int w, int h) { g.drawRect(0, 0, w - 1, h - 1); g.setColor(0x000000ff); int offset = 0;
for (int y = 4; y < h; y += 12) { offset = (offset + 12) % 24; for (int x = 4; x < w; x += 24) { g.fillTriangle(x + offset, y, x + offset - 3, y + 6, x + offset + 3, y + 6); } } } }
Bu customItem snfndan tremi SimpleItem snfn kulanan MIDlet snfn yazalm: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class SimpleItemMIDlet extends MIDlet implements CommandListener { public void startApp() { Form form = new Form("SimpleItemMIDlet"); form.append(new SimpleItem("SimpleItem")); Command c = new Command("Exit", Command.EXIT, 0); form.addCommand(c); form.setCommandListener(this); Display.getDisplay(this).setCurrent(form); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command c, Displayable s) { if (c.getCommandType() == Command.EXIT) notifyDestroyed(); } }
Grnm aadaki gibidir:
Custom Item izimi (Painting) :
Graphics nesnesi paint metoduna 2 nedenle geirilir. 1. si CustomItemn ierik alannn yzey izimini temsil etmesi iin. 2. si bir ok eitli izim metotlar salar. Bu ksmda bu metotlardan bir ksm anlatlacaktr, drawString( ) tekst yazlarn izilmesinde, drawLine( ) dz izgi izilmesinde kullanlmas gibi. paint( ) metodu MIDP gerekletirmesince arlm kodun iindeki geri arma(callback) rneidir. Ne zaman Custom Itemn ekranda grnmesi gerekse otomatikman gerekletirme tarafndan arlr. paint( ) metodu, Custom Itemn dahil olduu form yerleim yaparken dier minimum ve dier tercih edilen boyut metotlarn ( getPrefContentWidth( ) gibi ) ortaya karr. Gereklemenin ii tm ekran gstermektir; Custom Item tarafndan igal edilen ekran parasnn gsterilmesi amacyla da paint( ) metodu arlr. Gereklemeye itemn ne zaman izileceini syleyemezsiniz; yalnz itemn bir formun paras olduunu ve ve sonra hereyin nasl grntleneceini kendisi zer. Eer custom Itemn grnn deitirmeye ihtiya duyulursa grntnn tazelenmesi iin repaint( ) metodunun arlmasn isteyebilirsiniz. izimin optimize edilebilmesi, daha iyiletirilebilmesi iin, yalnzca Itemn belli bir parasnn izilmesini arzulayabilirsiniz: repaint(int x, int y, int width, int height);
Cihazn look and feeling ile itemn grnm uyumunu salamada yardmc olacak bilgiyi veren 2 adet metot vardr. 1. si getColor( ) metodu Display snf iindedir. Bu metot aadaki sabitler salandnda bir rwenk ile temsil edilen bir tamsay(int) dndrr: COLOR_BACKGROUND COLOR_BORDER COLOR_FOREGROUND COLOR_HIGHLIGHTED_BACKGROUND COLOR_HIGHLIGHTED_ BORDER COLOR_HIGHLIGHTED_ FOREGROUND rnein geerli izim rengini sistemin highlighted foreground (klandrlm n zemin ?) ile deitirebilirsiniz: public void paint(Graphics g) { // Display mDisplay = ... int fhc = mDisplay.getColor( Display.COLOR_HIGHLIGHTED_FOREGROUND); g.setColor(fhc); // Draw stuff ... }
Benzer bir ekilde form iinde dier itemlarla Custom Item harmanlayarak herhangi bir tekst izdirmek isterseniz Font snfndan aadaki metot kullanlarak uygun bir font alnabilir: public static Font getFont(int fontSpecifier); Yalnz FONT_STATIC_TEXT veya FONT_INPUT_TEXT sabitlerinden birini geirerek bu metot, metin(tekst) iziminde kullanabileceiniz uygun bir Font nesnesini geri dndrr. Aadaki kod dzeltilebilir kullanc girili tekst izimi iin uygun fontun nasl kullanlacan gsterir: public void paint(Graphics g) { Font f = Font.getFont(Font.FONT_INPUT_TEXT); g.setFont(f); // Draw text ... }
Gsterim, Gizleme ve Boyutlandrma :
Bir CustomItem grnr yapldnda, ksmen grnr dahi olsa MIDP gereklemesi tarafndan CustomItemn showNotify( ) metodu arlr. Itemn izilmesi iin sonraki admn paint( ) metodunun arlmas olduunu tahmin edebilirsiniz. Benzer bir ekilde item daha uzun sre grnr kalmadnda(rnein kullanc item gzkmeyecek ekilde ekran kaydrdnda) CustomItemn hidenotify( ) metodu MIDP gereklemesi tarafndan arlr. Form ierii deitiinde yerleime bal olarak CustomItemn boyutu gerekleme tarafndan deitirilebilir. Bu durumda yeni genilik ve uzunluk deerleri ile CustomItemn sizeChanged( ) metodu MIDP gereklemesi tarafndan arlr. Gene benzer ekilde farkl boyuta ihtiyac olduuna karar verebilir. Bu durumda, gerekleme Form yerleimini tekrar dzenlemeye gerek duyduunda, gereklemeye sinyal veren CustomItem invalidate ( ) metodunu arabilir. Olay leme :
Bir CustomItem, tu ve pointer(? Klaem, zel tu, dokunmatik ekran) olaylarna aadaki metotlar override edilmesi (gerekleitrme/ezilme?) ile tepki verir: protected void keyPressed(int keyCode); protected void keyReleased(int keyCode); protected void keyRepeated(int keyCode); protected void pointerPressed(int x, int y); protected void pointerReleased(int x, int y); protected void pointerDragged(int x, int y);
Bu metotlar kullanc hareketlerine tepki olmas iin arlmlardr. keyCode parametresi Canvas snfnda tanmlanm sabitlerden olumutur: Bunlar KEY_NUM0 ile KEY_NUM9 arasnda, KEY_POUND ve KEY_STAR sabitleridir. CustomItem ayrca cihaza zel tular, cihazdan bamsz eylemlerle eleebilen oyun eylemleri(game actions) olarak adlandrlabilen kullanl bir mekanizmay destekler. gameAction( ) metodu bu elemeyi(mapping) gerekletirir. (Bu konu ayr bir blm olarak ilenmitir) Pointer geri arma(callback) metotlar bir koordinat iftini CustomItem ierik alan ile ilikilendirerek iareti(Pointer) olaynn konumunu salar. Cihazlar deiken yetenekler sahiptirler ve CustomItem olaylarnn eylemlerini tiplerinin kesinliine karar veremeyebilirler. Bir ok telefon rnein pointer olaylarn desteklemeyecektir. alma zamannda cihazn yeteneklerini kefetmek iin, CustomItemlar getInterActionModes() metodunu kullanr. Bu metot aadaki (CustomItemda tanmlanm) sabitlerin baz kombinasyonlarn geri dndrr: KEY_PRESS KEY_RELEASE KEY_REPEAT POINTER_PRESS POINTER _RELEASE POINTER _DRAG TRAVERSE_HORIZONTAL TRAVERSE_VERTICAL
Traversal Itemlar (eitli ynlere gei, iinden geerek seyahat ?) dnda (biraz sonra anlatlacak), getInterActionModes() metodundan dnen deerlerin kombinasyonu, muhtemelen dorudan CustomItem iinde gerekletirilmi geri arlara(callback) uyar. Her art altnda alrken, CustomItem oluturulmasnda bu bilgiyi kullanabilirsiniz. rnein hem tu hem de pointer olaylarnn her ikisini birden bir CustomItema bildiremeyen bir cihazn gereklemesi mmkn olmayan olaynda, ayr bir dzenleme ekrannda gerekletirmek iin item stnde bir Command salayabilirsiniz. Item Traversal (Item iinde gei, hareket) :
Formlar, form iinde seilmi olan bir itemda odak kazanma(focus) kavramn destekler. Traversal kullancnn bir itemdan dierine kayabilmesini gsterir. Bir ok durumda MIDP gereklemesi Form Traversal olaynn detaylarn ele alr. rnein Sun emulatrnde form iinde bir itemdan dierine yukar ve aa ok tular ile gidebiliriz. Odak(Focus) alan itemn etraf dz-kesiksiz, siyah bir snr ile evrelenmitir. Aada gsterilen formdaki eitli itemlar arasndan seilen 3.s odak kazanmtr:
imdiye kadar her eyin yolunda gitmesi(so far so good), aka ok gzeldir. Daha dorusu, aslnda CustomItem iinde bulunan varsaylan gerekleme, bir ok durumda sizin Traversal hakknda bile dnmek zorunda kalmamanz anlamna gelir. Peki dahili(internal) Traversal kavramn bir para dengesiz yapan eyler nelerdir? Baz itemlar item iindeki oklu seimlerin Traversal desteini destekler. Buna iyi bir rnek olarak ChoiceGroup item verilebilir. ChoiceGroup iinde seimler arasnda gezinmeniz veya Gauge aygtnda sa-sol dmeleri ile seviye arttrabilmeniz bir item iinde dahili Traversal kavramn anlatr. Dahili Traversal kavramnda iki metot traversal olaylarna sinyal gnderir. Bunlardan ilki traverse( ) metodu, kullanc bir itemn iine hareket ettiinde(traverse) arlr. Bu metot varsaylan deer olarak false dndrr ki bu itemn dahili traversal desteklemediini gsterir. kinci metot traverseOut( ) , kullanc her ne zaman item terkederse arlr. protected boolean traverse(int dir, int viewportWidth, int viewportHeight, int[] visRect_inout); protected void traverseOut();
NOT:/ lk bakta, her iki traversal metodundayken ve tu olay metotlarnn cihaz zerinde tulara basldnda CustomItema arlarn alndn zannedebilirsiniz. rnein eer aa ok tuuna baslrsa itema girilirse, traverse( ) ve keyPressed() metotlarnn her ikisinin de arlacan mit edebilirsiniz. Gerekte, gerekleme kesin tu ve traversal olaylarn tutar. Baz cihazlarn alternatif traversal kontrol dmeleri vs. olduunu unutmayn(hreketli top, tekerlek vs.), bu nedenle gerekleme (ve sizin CustomItemnz) olaylara farkl davran gsterebilir.
Traversali destekleyecek bir CustomItem yazacaksnz, traverse metoduna geirilen parametrelere dikkat etmelisiniz ve item i traversali destekleyecekse true geri dndrmelidir. traverse( ) metodu ve geirilen parametre bilgileri aadadr: dir kullanc tarafndan istenilen traversal ynne iaret eder. Bunlardan biri olabilir: Canvas.UP, Canvas.DOWN, Canvas.LEFT, Canvas.RIGHT veya CustomItem.NONE. viewportWidth ve viewportHeight parametreleri bu CustomItemn iinde olduu Form iindeki itemlarn uygun boyutlarna iaret eder (esasnda Formun ierik alann gsterir). Bu boyutlar, kullanlabilir ekran alan miktar ve bir itemn seimleri arasndaki ilikinin tespiti iin faydal olabilir. visRect_inout parametresi bir para tuhaf gelebilir. 4 elemandan oluan bir tamsay dizisidir. traverse( ) metodu arldnda visRect_inout parametresi, CustomItemn grnr ierik alan blgesini gsterir. traverse( ) metodu geri dndnde visRect_inout parametresi, item ierisindeki geerli olan seilmi seimin snrlarn iermelidir. Traversal mekanizmas, farkl cinsten traversallere destek salamas iin yeteri kadar esnektir. Baz cihazlar sadece dey Traversal zelliini desteklerken, bazlar da yatay Traversal zelliini destekler ve geri kalan her ikisini de destekler. Cihazn Traversal yeteneklerini, getInteractionModes( ) metodunun geri dndrd tamsay deer CustomItem.TRAVERSE_HORIZONTAL, CustomItem.TRAVERSE_VERTICAL sabitleri ile aadaki gibi ileme girerek dnen boolean tipi deikenlere gre yatay veya dey traversal yetenekleri olup olmad anlalr: // yaplandrc iinde ..... int interactionMode = getInteractionModes(); // horz ve vert, yukarda tanmlanm, // yatay ve dey boolean deikenlerdir. horz = ((interactionMode & CustomItem.TRAVERSE_HORIZONTAL) != 0); vert = ((interactionMode & CustomItem.TRAVERSE_VERTICAL) != 0); .....
Bu horz ve vert deikenlerinin her ikisininde true olmas durumunda hem yatay hem de dey Traverse olabilir denilebilir. traverse( ) metodunun itema ilk geldiiniz zaman odaklandnda arlacan hatrlayn. Bu metot true dndrrse, itemnzn Traversal ilerlemesi boyunca srekli olarak arlacaktr. Kullanc item dna ynlenip(traverses) ktnda traverse( ) metodu false dndrr. Bu gereklemenin i Traversalin sona erdiini farketmesini salar. Byk olaslkla gerekleme traverseOut( ) metodunu aracaktr ama bu yalnzca odak item dna ktnda olacaktr. Bu durum kullanc Formun balang veya sonuna eritiinde olumaz.
Traversal rnei : Traversal ile ilgili benim Sunn WTKsndaki demo rneklerinden CustomItemDemo rneinden biraz deitirdiim bir rnek bulunmaktadr. Uygulamada iki adet snf vardr. lki MIDlet snfmz va ana ekranlarn tanmland snftr: import javax.microedition.lcdui.*; import javax.microedition.midlet.MIDlet; public class MyCustomItemDemo extends MIDlet implements CommandListener { private static final Command CMD_EXIT = new Command("Exit", Command.EXIT, 1); private Display display; private boolean firstTime; private Form mainForm; public MyCustomItemDemo() { firstTime = true; mainForm = new Form("Custom Item"); } protected void startApp() { if (firstTime) { display = Display.getDisplay(this); mainForm.append(new TextField("Upper Item", null, 10, 0)); mainForm.append(new MyCustomItem("My Custom Item", Display.getDisplay(this))); mainForm.append(new TextField("Lower Item", null, 10, 0)); mainForm.addCommand(CMD_EXIT); mainForm.setCommandListener(this); firstTime = false; } display.setCurrent(mainForm); } public void commandAction(Command c, Displayable d) { if (c == CMD_EXIT) { destroyApp(false); notifyDestroyed(); } } protected void destroyApp(boolean unconditional) { }
protected void pauseApp() { } }
kinci snfmz CustomItemn bulunduu snftr: import import import import import import import import import javax.microedition.lcdui.Canvas; javax.microedition.lcdui.Command; javax.microedition.lcdui.CustomItem; javax.microedition.lcdui.Display; javax.microedition.lcdui.Graphics; javax.microedition.lcdui.Item; javax.microedition.lcdui.ItemCommandListener; javax.microedition.midlet.MIDlet; javax.microedition.midlet.MIDletStateChangeException;
public class MyCustomItem extends CustomItem implements ItemCommandListener { private static final Command CMD_SEC = new Command("Secim", Command.ITEM, 1); private Display display; private static final int UPPER = 0; private static final int IN = 1; private static final int LOWER = 2; private private private private private private private int int int int int int int rows = 3; cols = 3; dx = 50; dy = 20; location = UPPER; currentX = 0; currentY = 0;
// Traversal stuff // indicating support of horizontal traversal internal to the CustomItem boolean horz; // indicating support for vertical traversal internal to the CustomItem. boolean vert; public MyCustomItem(String title, Display d) { super(title); display = d; setDefaultCommand(CMD_SEC); setItemCommandListener(this); int interactionMode = getInteractionModes();
horz = ((interactionMode & CustomItem.TRAVERSE_HORIZONTAL) != 0); vert = ((interactionMode & CustomItem.TRAVERSE_VERTICAL) != 0); } protected int getMinContentHeight() { return (rows * dy) + 1; } protected return } protected return } protected int getPrefContentWidth(int arg0) { return (cols * dx) + 1; } protected void paint(Graphics g, int w, int h) { for (int i = 0; i <= rows; i++) { g.drawLine(0, i * dy, cols * dx, i * dy); } for (int i = 0; i <= cols; i++) { g.drawLine(i * dx, 0, i * dx, rows * dy); } int oldColor = g.getColor(); g.setColor(0x00D0D0D0); g.fillRect((currentX * dx) + 1, (currentY * dy) + 1, dx - 1, dy int getMinContentWidth() { (cols * dx) + 1; int getPrefContentHeight(int arg0) { (rows * dy) + 1;
// 1);
g.fillRoundRect((currentX * dx) + 1, (currentY * dy) + 1, dx - 1, dy - 1, dx,dy); // fillRoundRect(int x, int y, int width,int height, int arcWidth, int arcHeight) g.setColor(oldColor); }//paint sonu protected boolean traverse(int dir, int viewportWidth, int viewportHeight, int[] visRect_inout) { // Hem yatay hem dusey traversal if (horz && vert) { switch (dir) { case Canvas.DOWN: if (location == UPPER) { location = IN; } else { if (currentY < (rows - 1)) { currentY++; repaint(currentX * dx, (currentY - 1) * dy, dx, dy);
repaint(currentX * dx, currentY * dy, dx, dy); } else { location = LOWER; return false; } } break; case Canvas.UP: if (location == LOWER) { location = IN; } else { if (currentY > 0) { currentY--; repaint(currentX * dx, (currentY + 1) * dy, repaint(currentX * dx, currentY * dy, dx, dy); } else { location = UPPER; return false; } } break; case Canvas.LEFT: if (currentX > 0) { currentX--; repaint((currentX + 1) * dx, currentY * dy, dx, repaint(currentX * dx, currentY * dy, dx, dy); } break; case Canvas.RIGHT: if (currentX < (cols - 1)) { currentX++; repaint((currentX - 1) * dx, currentY * dy, dx, dy); repaint(currentX * dx, currentY * dy, dx, dy); } }//switch sonu } // yatay veya dusey traversal birinin desteklenmesi durumunda // Eger sadece yatay varsa sag veya sol tuslarla sola giderken yukari da cikilir, // saga gidilirken de sinira gelindiginde asagi gidilebilir
dx, dy);
dy);
else if (horz || vert) { switch (dir) { case Canvas.UP: case Canvas.LEFT: if (location == LOWER) { location = IN; } else { if (currentX > 0) { currentX--; repaint((currentX + 1) * dx, currentY * dy, dx, dy); repaint(currentX * dx, currentY * dy, dx, dy); } else if (currentY > 0) { currentY--; repaint(currentX * dx, (currentY + 1) * dy, dx, dy); currentX = cols - 1; repaint(currentX * dx, currentY * dy, dx, dy); } else { location = UPPER; return false; } } break; case Canvas.DOWN: case Canvas.RIGHT: if (location == UPPER) { location = IN; } else { if (currentX < (cols - 1)) { currentX++; repaint((currentX - 1) * dx, currentY * dy, repaint(currentX * dx, currentY * dy, dx, dy); } else if (currentY < (rows - 1)) { currentY++; repaint(currentX * dx, (currentY - 1) * dy, currentX = 0; repaint(currentX * dx, currentY dy, * dx, dy); } else { location = LOWER; return false; } } }//switch sonu } else {
dx, dy);
dx, dy);
// In case of no Traversal at all: (horz|vert) == 0 } visRect_inout[0] visRect_inout[1] visRect_inout[2] visRect_inout[3] return true; }// traverse sonu public void commandAction(Command c, Item i) { if (c == CMD_SEC) { display.flashBacklight(1000); display.vibrate(1000); System.out.println("SEC Secildi..."); } }//commandAction sonu }// MyCustomItem sonu} CustomItemn bulunduu kodlar biraz uzun gelebilir. Bu uygulamada CustomItem 50x30 piksel boyutlarnda dikdrtgenlerden oluan 3x3 lk bir zgara alannda gezilmesini gsterir. Orjinal uygulamada item iinde gezilirken iinde bulunulan dikdrtgenin iine, ii dolu farkl renkte dikdrtgen izilirdi. Bu uygulamada item iinde gezilirken iinde bulunulan dikdrtgenin iine,d dikdrtgene teet farkl renkte bir elips izilir. Hatrlayalm : Itemlarn ayrca Displayable gibiCommand zellikleri de vardr. Bir formdaki item seilince itemn command formdaki commandlar ile beraber gsterilir. Uygulamamzda CustomItemn iinde iken bir Command butonunu sada belirir(Seim) ve eylem olarak da cihazn titremesi ve ldamas gsterilmitir(1000 milsaniye): public void commandAction(Command c, Item i) { if (c == CMD_SEC) { display.flashBacklight(1000); display.vibrate(1000); System.out.println("SEC Secildi..."); } }//commandAction sonu = = = = currentX; currentY; dx; dy;
dx, dy deikenlerinin iinde bulunulan birim dikdrtgenin genilik ve ykseklik deerleri olduunu, Itemn genel boyutlarnn da bu dikdrtgenlerden olumu 3x3 boyutunda bir zgara eklini verdiini grrsnz. Itemn genel boyutu iin yukarda CustomItem konusunun banda anlatlm getMinContentHeight( ) , getMinContentWidth(), getPrefContentHeight(int arg0) , getPrefContentWidth(int arg0) metotlar kullanlr. Bu metotlar MIDP gereklemesi tarafndan arlarak CustomItem hazrlanr. Biz bu metotlarda mesela birim dikdrtgen genilii ile genel ka adetr dikdrtgen olacaksa(3) arptrr ve ereve iinde 1 ekleriz(!): .... protected int getMinContentWidth() { return (cols * dx) + 1; } protected int getPrefContentHeight(int arg0) { return (rows * dy) + 1; } ....
cols ve rows deikenleri zgarann ka satr ve ka stundan oluacan ifade eder( 3x3). dx ve dy deikenleri birim dikdrtgenin boyutunu verir(50x30). paint metodunda ilk nce rows kadar yatay izgi ve cols kadar da dikey izgi izilerek ana item ekli izilir. Hangi dikdrgende bulunuyorsak o dikdrtgenin iine ii dolu ve farkl renkte elips izilir: .... int oldColor = g.getColor(); g.setColor(0x00D0D0D0); g.fillRoundRect((currentX * dx) + 1, (currentY * dy) + 1, dx - 1, dy - 1, dx,dy); g.setColor(oldColor); ....
Traversal iin traverse( ) metodu uygulanr ilk nce yaplandrcda getInteractionModes( ) metodunun geri dndrd tamsay deer CustomItem.TRAVERSE_HORIZONTAL, CustomItem.TRAVERSE_VERTICAL sabitleri ile ileme girerek dnen boolean tipi deikenlere gre ( horz ve vert ) yatay veya dey traversal yetenekleri olup olmad anlalr. traverse( ) metodunda ilk nce yatay ve dey traverse yeteneinin her ikisinin de olmas durumunda ilenecek kodlar vardr. Metoda geirilen dir parametresine gre yn belirlenir ve ona gre iine gidilecei blge belirlenir ve tekrar bu hcre farkl renkteki elipse ile izilir. Bu metot, item iinde kaldmz srece hareket ettiimiz her zaman arlr ve paint metodunu da devaml ararak tekrar tekrar item izilir(eskisinin stne) ama her seferinde bulunulan hcre konumu deiecei iin bulunulan hcre iinde tekrar elips izilir: .... if (horz && vert) { switch (dir) { case Canvas.DOWN: if (location == UPPER) { location = IN; } else { if (currentY < (rows - 1)) { currentY++; repaint(currentX * dx, (currentY - 1) * dy, dx, dy); repaint(currentX * dx, currentY * dy, dx, dy); } else { location = LOWER; return false; } } break; ....
traverse( ) metodunda yatay ve dey traverse yeteneklerinden herhangi biri varsa hareket tek ynl olur: Yatay hareket varsa saa-sola gidilir, item snrnda sada bir alta, solda bir ste klr, yukar aa yetenekte de ayn hareket yukar aa tularnda kullanlr. .... else if (horz || vert) {
switch (dir) { case Canvas.UP: case Canvas.LEFT: if (location == LOWER) { location = IN; } else { if (currentX > 0) { currentX--; repaint((currentX + 1) * dx, currentY * dy, dx, dy); repaint(currentX * dx, currentY * dy, dx, dy); } else if (currentY > 0) { currentY--; repaint(currentX * dx, (currentY + 1) * dy, dx, dy); currentX = cols - 1; repaint(currentX * dx, currentY * dy, dx, } else { location = UPPER; return false; } } break; ....
dy);
Snrlardan dar klrsa traverse metodu false dndrr. visRect_inout parametresi 4 elemandan oluan bir tamsay dizisidir. traverse( ) metodu arldnda visRect_inout parametresi, CustomItemn grnr ierik alan blgesini gsterir. traverse( ) metodu geri dndnde visRect_inout parametresi, item ierisindeki geerli olan seilmi seimin snrlarn iermelidir. Uygulamada bulunulan blgeyi belirtmesi iin ilk iki parametre buna ait konumu, sonraki parametrelerde genilik ve ykseklik deerlerini verir, bizim rneimizde birim dikdrtgenin lleri olur: .... visRect_inout[0] visRect_inout[1] visRect_inout[2] visRect_inout[3] return true; }// traverse sonu = = = = currentX; currentY; dx; dy;
Custom(Hazr) Kullanc Arayz Programlamas (Dk Seviye Programlama) :
Bundan nceki ksmlarda genel kullanc arayzlerini grdnz. Bu arayzleri oyun veya zel kullanc arayzlerinin gelitirilmesinde uygun olmayabilir. Bu durumlar iin MIDP, cihazn ekran ve dier giri zelliklerine dk seviyede eriim salayan javax.microedition.lcdui.Canvas snfn sunar. Oyunlar iin ayrca javax.microedition.lcdui.game paketinde sprite animasyonlar ve katman temelli grafikleri iin Canvas snfnn daha rafine hali bulunur. Bu ksmda Canvas snfnn temelleri ve basit Graphics snf ile izimler anlatlacaktr. Canvas Snf :
Canvas, MIDP Custom(hazr) kullanc arayznn kalbidir. Kullanabilmek iin Canvasn bir alt snfn oluturmalsnz. Bu kullanma hazr olan Screen snfndan ayrlr. Bunu bir kenara brakrsanz Displayablen dier alt snflar ile ok gzel uyuur. Bir MIDlet, dzenli ekranlar ve Canvaslar kartrp eletirebilir. rnein bir oyundaki en yksek skorlar bir form ile, oyunun kendisini Canvas snfn kullanarak gsterebilirsiniz. Canvas snfnda nemli eyler olduundan MIDP tarafndan gerekletirilen olay ileme metodlar dahildir. Canvas Bilgileri :
Canvasn boyutlar hakknda bilgileri getWidth( ) ve getHeight( ) arlmas ile alabilirsiniz. Daha sonra greceimiz cihazn renkleri ile ilgili yetenekleri Display snfndaki metotlarn arlmas ile elde edilir. Faydal olabilecek tam-ekran modu da vardr. Baz Canvas gereklemeleri, cihazn durumu hakknda veya dier sebeplerle bilgilendirme amacyla kullanlabilir ekran boluunun tamamn kaplamayabilir. Eer cihaz Canvas iin alternatif bir tam ekran modu destei salarsa, setFullScreenMode(true) metodunun arlmas ile bunu kullanabileceksiniz. Bu tam ekran modunun kapatlmas veya almas durumunda, Canvasn Displayable snfndan trettii sizeChanged( ) metodunun arlmasna neden olur.
Canvasn gizlendii veya gsterildii MIDP gereklemesi tarafndan arlan olay ileme metotlarna ait zellikleri bulunur. Canvasn gsterildii her zaman showNotify( ) arlacaktr. Eer farkl bir Displayable gsterilecekse veya uygulama yneticisi farkl bir uygulama altrsa hideNotify() arlr. Boyama (resmetme?) ve Tekrar Boyama (Painting ve Repainting):
Canvasn ierii gsterilecei zaman paint( ) metodu arlr. Bu size zel Swing veya AWT bileenleri gelitirilmtandk gelebilir. Bir nceki blmde ilenen CustomItemda da ayn metodu kullanmtk. CustomItemlarn kullan Canvas ile ayn prensiplere dayanr. MIDP gereklemesi tarafndan paint( ) metoduna Graphics nesnesi geirilir. Graphics nesnesi, Canvas stne image(resim)ler, yaz, ekiller izilmesinde kullanlan metotlara sahiptir. Tipik bir Canvas uygulamas aadaki gibidir: import javax.microedition.lcdui.*; public class JonathanCanvas extends Canvas { public void paint(Graphics g) { // Draw stuff using g. } }
paint() metodunu dorudan ararak Canvasa istediiniz herhangi bir eyi izmesini syleyemezsiniz, nk metoda geirilecek uygun Graphics nesnesi bulunmamaktadr. Onun yerine MIDP uygulamasna Canvasn izilme/boyama zamann sylemelisiniz. Bunun yolu da repaint( ) metodunun arlmasdr. Aadaki metot Canvasa basite hereyi izmesini syler: public void repaint(); Dier metot Ekrann yalnz bu dikdrtgen blmn boyamak istiyorum demenin baka bir yoludur: public void repaint(int x, int y, int width, int height);
Eer izim ok karmaksa Canvasn sadece deiebilecek ksmlarn boyatarak zamandan tasarruf edilebilir. Bu teknie uygulamada clipping (krpma/kesme) denilir. repaint( ) tam olarak nasl alr? repaint( ) arldnzda, paint( ) metodu annda dorudan altrlamaz. repaint( ) arlmas, yalnzca boyamak istediiniz ekrann boyanmas iin MIDP gereklemesine iaret eder. Daha sonra, uygulama, Canvasn geerli tekrar boyama isteklerini servis eder. MIDP uygulamas, eitli tekrar boyama isteklerini birletirebilir. pucu : / Canvas, repaint( ) arldnda kendi kendini otomatik temizlemez(clear). Olann stne ekleme yapp, deitirmektense paint( ) metodu iinde ekran temizlemelisiniz. Nasl yaplacan daha sonra ilenecek FontCanvas uygulamasnda grebilirsiniz. Bir uygulama, Canvas nesnesi zerinde serviceRepaints( ) metodunun arlmas ile tm repaint isteklerini servis edilmesi iin gereklemeyi zorlayabilir. Bu metot, tm srada bekleyen, repaint istekleri servis edilmi olana kadar herhangi bir eyu dndrmez. Eer bu serviceRepaints( ) metodunu araceksanz, metot geri dnene kadar paint metodu kilitli olduundan nesne elde etmeye almamalsnz (!). Gerekte serviceRepaints( ) metodunu hi ihtiya duymayacaksnz; onun yerine Displayin callSerially( ) metodunu kullanabilirsiniz. ekiller, Yaz(Metin) ve Image(Resim) izilmesi :
Graphics snf Canvas stne ekillerin, yaz(metin) ve Image(resim) izilmesi iin eitli metotlar barndrr. Ayrca, kalem rengi, izgi stili gibi baz durumlar devam ettirilir(!). MIDPnin Graphics snf J2SEdeki Graphics ve Graphics2D snflarna benzer ama daha ufak versiyonudur. Koordinat Uzay :
Canvas stndeki tm izimler cihazn stndeki pikseller stne temel alnan bir koordinat sistemi uzaynda yer alr. Koordinat sisteminin orjininin (0,0), Canvasn sol st kesinde yerletii varsaylr. X koordinatlar sa el dorultusunda artarken, Y koordinatlar yukardan aa dorultuda artar: x
y
Bu koordinat sisteminin orjinini Graphics snfnn translate( ) metodunu ararak ararak deitirebilirsiniz. Bu geerli koordinat sisteminde verilen koordinatlara gre orjini ayarlar. Bu translate( ) metodu ile verilmi orjini ilk varsaylan orjine bal (relative-greli) olarak getTranslateX( ) ve getTranslateY( ) metotlarn ararak bulabilirsiniz. ekillerin izilmesi ve lerinin Doldurulmas :
Graphics, basit ekillerin izilmesi ve ilerinin doldurulmas iin metotlarn bir koleksiyununu ierir: ekillerin erevesinin izimi Dolu ekillerin izimi
drawLine (int x1, int y1, int x2, int y2)
fillTriangle
(int x1, int y1, int x2, int y2, int x3, int y3)
drawRect (int x, int y, int width, int height)
fillRect (int x, int y, int width, int height)
drawRoundRect (int x, int y, int width, int height, int arcWidth, int arcHeight)
fillRoundRect (int x, int y, int width, int height, int arcWidth, int arcHeight)
drawArc (int x, int y, int width, int height, int startAngle, int arcAngle)
fillArc (int x, int y, int width, int height, int startAngle, int arcAngle)
Bu metotlar ile yaplm basit bir rnek aadadr. lk snfmz PacerCanvas baz temel izimlerin ve ii dolu ekillerin izilmesini gsterir: import javax.microedition.lcdui.*; public class PacerCanvas extends Canvas { public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); for (int x = 0; x < w; x += 10) g.drawLine(0, w - x, x, 0); int z = 50; g.drawRect(z, z, 20, 20); z += 20; g.fillRoundRect(z, z, 20, 20, 5, 5); z += 20; g.drawArc(z, z, 20, 20, 0, 360); } }
kinci snfmz Pacer bu stteki snf kullanan bir MIDlettir: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Pacer extends MIDlet{ public void startApp() {
Displayable d = new PacerCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } } ); Display.getDisplay(this).setCurrent(d); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Bu rnei altrdmzda Sunn wireless emulatrnde aadaki gibi grnr:
Renklerle alma :
Graphics snf, geerli izim rengini ekillerin d snrlarn izmede, iini doldurmada ve metinlerin izilmesinde kullanmaya devam eder. Colors snf krmz, yeil ve maviden oluan 8 bitlik kombinasyonlarn her bir bileende(ekiller temsil edilmesini salar. Geerli izim rengini aadaki metot ile deitirebiliriz: public void setColor(int RGB);
32
Bu metoda gre krmz, yeil ve mavi renklerin kombinasyonu bir tamsay iine aadaki gibi sktrlmtr. : 24 [Unused] Red 16 Green 8 Blue 0
Dier bir uygun metot, krmz, mavi ve yeil iin 0 255 aralnda tamsaylar ieren 3 ayr parametre kabul eder: public void setColor(int red, int green, int blue);
Geerli izim rengini tamsay bir deer (iinde sktrlm olduundan) olarak getColor( ) ile alabilirsiniz. Baka bir yolla her bir bileeni(krmz, yeil, mavi) ayr ayr getRedComponent( ) , getGreenComponent( ) ve getBlueComponent( ) metotlarn kullanarak alabilirsiniz. Bir ok farkl cihaz, siyah-beyazdan balayan (1-bit renk olarak bilinen tanmlama daha ok sevilerek kullanlr) ve tam 24-bit renk boyunca gidebilen farkl renk destek seviyelerine sahiptir. Daha nce bahsettiimiz Display iindeki isColor( ) ve numColors( ) metotlar cihazn renk yetenekleri hakknda faydal bilgiler geri dndrr. Renkli olmayan, gri skaladaki cihazlar iin Graphics snf setGrayScale( ) gibi uygun bir metot salar. 0(Siyah) 255(Beyaz) aralnda bir tamsay deer geirilerek kullanlr. Geerli gri tonlamay getGrayScale( ) metodunu ararak alabilirsiniz. Eer geerli renk bir gri tonlama deilde renk ise dnen deer en iyimser tahminle geerli rengin parlakln verir (?) Graphicsin dier bir kullanl metodu getDisplayColor( ) metodudur. Bu metot alma zamannda istendiinde, cihazda grntlenecek olan rengin nasl alnacan syler. Bir rengi int tipine yedirirsiniz, ve ayn ekilde bir int tipi geri alrsnz. rnein WTKnn DefaultGrayPhone emulatrnde, saf yeil (0x00ff00) (onaltlk tamsay format) deeri gri tonlamada (0x959595) seviye deeri ile eleir. izgi Stilleri :
Graphics snf, geerli olan, fra stili(Stroke style) de denilebilen izgi stilini ekillerin d snrlarn ve dz izgi izmede kullanr. Graphics snfnda sabit olarak temsil edilen iki izgi stili seimi bulunur: SOLID varsaylandr. DOTTED (kesikli, noktal) izgilerdir. setStrokeStyle( ) metodu ile izgi stilini deitirebilir, getStrokeStyle( ) metodu ile de mevcut stil bilgisini alabiliriz: public void paint(Graphics g) { g.drawRect(20, 10, 35, 35); g.setStrokeStyle(Graphics.DOTTED); g.drawRect(20, 60, 35, 35); }
Yaz(Metin) izimi :
Yaz izimi skca tutturulabilecek(anchor) noktalar fikri etrafnda temellenmitir. Tutulabilecek, apa-kanca noktalar(anchor), yaznn tam olarak nereye izileceini tespit eder. Anchor noktalar yatay ve dey bir bileen olarak tanmlanmtr. Graphics snf yatay ve dey anchor(apa) noktalarn sabitler olarak tanmlar. Aada bir yazdaki anchor noktalar, yatay ve dey sabitlerinin bir kombinasyonu olarak gsterilmitir: TOP|LEFT TOP|HCENTER TOP|RIGHT BASELINE|RIGHT
Sin Wagon
BASELINE|LEFT BASELINE|HCENTER BOTTOM|LEFT BOTTOM |HCENTER BOTTOM |RIGHT
Yaz izebilmek iin, yaz metni, yerleim koordinat(lokasyon) ve anchor noktalarnn tipi gereklidir. rnein ekrann sol st kesine bir yaz yerletirebilmek iin anchor noktas TOP | LEFT ve lokasyonda 0,0 olmaldr. Metin ifade, bir String veya char tipindeki deikenlerin bir dizisi olarak belirtilmi olmaldr; bu bir ok dilde, uygun (glyph-kalp ?)lere sahip salanm fontlarla istenilen metni izdirebileceiniz anlamna gelir. Graphics, yaz izimi iin 4 adet farkl metot salar: public void drawChar(char character, int x, int y, int anchor); public void drawChars(char[] data, int offset, int length, int x, int y, int anchor); public void drawString(String str, int x, int y, int anchor); public void drawSubstring(String str, int offset, int len, int x, int y, int anchor);
Aadaki rnek Canvas stne eitli yazlarn nasl yerletirileceini gsterir: import javax.microedition.lcdui.*; public class TextCanvas extends Canvas { public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); // First label the four corners. g.drawString("corner", 0, 0, Graphics.TOP | Graphics.LEFT); g.drawString("corner", w, 0, Graphics.TOP | Graphics.RIGHT); g.drawString("corner", 0, h, Graphics.BOTTOM | Graphics.LEFT); g.drawString("corner", w, h, Graphics.BOTTOM | Graphics.RIGHT); // Now put something in the middle (more or less). g.drawString("Sin Wagon", w / 2, h / 2, Graphics.BASELINE | Graphics.HCENTER); } }
Bunun sonucunu gstermek iin bir de MIDlet snf yazmalsnz, daha nce kullanlan Pacer snfnda yukardaki TextCanvas snfn gsterecek ekilde deitirerek burda kullanabiliriz: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Pacer extends MIDlet{ public void startApp() { Displayable d = new TextCanvas(); d.addCommand(new Command("Exit", Command.EXIT, 0)); d.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { notifyDestroyed(); } } ); Display.getDisplay(this).setCurrent(d); } public void pauseApp() { } public void destroyApp(boolean unconditional) { }
} Uygulama altrlnca aadaki gibi grnr:
Font Seimi: MIDP fontlar font face, style ve size ile temsil edilir. MIDP fontlar iin ok fazla seenek yoktur. 3 adet faces kullanlabilmektedir. Bunlar Font snfndaki sabitler olarak tanmlanmlardr : FACE_SYSTEM, FACE_MONOSPACE ve FACE_PROPORTIONAL.
Stylelar da Font snfnda sabitler olarak tanmlanmlardr : STYLE_PLAIN, STYLE_BOLD, STYLE_ITALIC ve STYLE_UNDERLINE. Stilleri birletirebilir, kombine edebilirsiniz, bold(kaln) ve italic(eik) gibi. Font boyutu basite 3 adettir: SIZE_SMALL, SIZE_MEDIUM ve SIZE_LARGE. Aadaki gibi font boyu kk, eik stilli ve proportional face olan bir font oluturulmas bulunmaktadr: Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_ITALIC, Font.SIZE_SMALL);
setFont( ) metodunu ararak sonraki tekst ifadeler iin yeni bir font kullanlacan Graphics snfna bildiririz. Geerli olan font iin referans getFont( ) metodunu ararak alabilirsiniz. Ayrca bir font ile ilgili bilgileri getFace( ), getStyle( ), getSize( ) metotlarndan alabilirsiniz. Kullanm kolayl iin Fon ayrca isPlain( ), isBold( ), isItalic( ), isUnderlined( ) metotlarn da kapsar. MIDP implementasyonu ayrca bir varsaylan fontada sahiptir. Bunu Fontun static olan getDefaultFont( ) metodu ile alabilirsiniz. Aada bununla ilgili bir uygulama bulunmaktadr. lk snf Canvas gerekletiren snfmzdr: import javax.microedition.lcdui.*; public class FontCanvas extends Canvas { private Font mSystemFont, mMonospaceFont, mProportionalFont; public FontCanvas() { this(Font.STYLE_PLAIN); } public FontCanvas(int style) { setStyle(style); } public void setStyle(int style) { mSystemFont = Font.getFont(Font.FACE_SYSTEM, style, Font.SIZE_MEDIUM); mMonospaceFont = Font.getFont(Font.FACE_MONOSPACE, style, Font.SIZE_MEDIUM); mProportionalFont = Font.getFont(Font.FACE_PROPORTIONAL,
style, Font.SIZE_MEDIUM); } public boolean isBold() { return mSystemFont.isBold(); } public boolean isItalic() { return mSystemFont.isItalic(); } public boolean isUnderline() { return mSystemFont.isUnderlined(); } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); // Clear the Canvas. g.setGrayScale(255); g.fillRect(0, 0, w - 1, h - 1); g.setGrayScale(0); g.drawRect(0, 0, w - 1, h - 1); int x = w / 2; int y = 20; y += showFont(g, "System", x, y, mSystemFont); y += showFont(g, "Monospace", x, y, mMonospaceFont); y += showFont(g, "Proportional", x, y, mProportionalFont); } private int showFont(Graphics g, String s, int x, int y, Font f) { g.setFont(f); g.drawString(s, x, y, Graphics.TOP | Graphics.HCENTER); return f.getHeight(); } } Bu uygulamay gegsterecek bir MIDlet snf aadadr: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class FontMIDlet extends MIDlet implements CommandListener { private FontCanvas mFontCanvas; private Command mBoldCommand, mItalicCommand, mUnderlineCommand; public FontMIDlet() { mFontCanvas = new FontCanvas(); mBoldCommand = new Command("Bold", Command.SCREEN, 0); mItalicCommand = new Command("Italic", Command.SCREEN, 0); mUnderlineCommand = new Command("Underline", Command.SCREEN, 0); Command exitCommand = new Command("Exit", Command.EXIT, 0); mFontCanvas.addCommand(mBoldCommand); mFontCanvas.addCommand(mItalicCommand); mFontCanvas.addCommand(mUnderlineCommand); mFontCanvas.addCommand(exitCommand); mFontCanvas.setCommandListener(this); } public void startApp() { Display.getDisplay(this).setCurrent(mFontCanvas); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command c, Displayable s) { if (c.getCommandType() == Command.EXIT) {
notifyDestroyed(); return; } boolean isBold = mFontCanvas.isBold() ^ (c == mBoldCommand); boolean isItalic = mFontCanvas.isItalic() ^ (c == mItalicCommand); boolean isUnderline = mFontCanvas.isUnderline() ^ (c == mUnderlineCommand); int style =(isBold ? Font.STYLE_BOLD : 0) | (isItalic ? Font.STYLE_ITALIC : 0) | (isUnderline ? Font.STYLE_UNDERLINED : 0); mFontCanvas.setStyle(style); mFontCanvas.repaint(); } } Tekst Boyutunun lmleri :
Font snf tekstin boyutlar hakknda faydal bilgiler verebilir. nceki anlatlan ksmda bununla ilgili kullanlan metotlarn bir ksm verilmiti, bunlara ek olarak getHeight( )metodu kullanlan oklu satrlarda, bir satrn kullanlan pozisyonundan itibaren tm satr uzunluunu geri dndrr. Baselinen (Yaznn taban izgisi, en alttaki-bottom- stnde bulunan fontun altndan giden farazi izgi, konunun bandaki anchor noktalarn gsteren ekilde gsterilen, yazya teet giden, en alt ereve izgisinin stnde olan izgi ) konumunu renmek isteyebilirsiniz, bunun iin getBaseLinePosition( ) metodunu arabilirsiniz. Bu metot, metnin en tepesinden baselinea olan uzakl geri dndrr. Bununla beraber Graphicsde bulunan anchor noktalarnca salanan esneklikten tr muhtemelen baseline kendiniz bulmaya hi ihtiya duymayacaksnz. Metnin Boyutunun lilmesinde geriye kalan, eitli metin paralarnn geniliklerinin lmdr. Bu metotlardaki isim ve parametreler, Graphicsdeki metin izim metotlar ile ayndr: public public public public int int int int charWidth(char ch); charsWidth(char ch, int offset, int length); stringWidth(String str); substringWidth(String str, int offset, int len);
rnein izdirilen bir stringin etrafna bir kutuyu aadaki gibi izdirebilirsiniz: import javax.microedition.lcdui.*; public class BoxTextCanvas extends Canvas { private Font mFont; public BoxTextCanvas() { mFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_LARGE); } public void paint(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(0xffffff); g.fillRect(0, 0, w, h); g.setColor(0x000000); String s = "dolce"; int stringWidth = mFont.stringWidth(s); int stringHeight = mFont.getHeight(); int x = (w - stringWidth) / 2; int y = h / 2; g.setFont(mFont); g.drawString(s, x, y, Graphics.TOP | Graphics.LEFT); g.drawRect(x, y, stringWidth, stringHeight);
} } Bu uygulamaya daha nceki Mdletlerden birini uygulayn. Image(Resim)lerin izimi : Graphics snf bir image(resmin) izilmesi iin tek bir metot ihtiva eder: public void drawImage(Image img, int x, int y, int anchor);
Bu metot anchor noktalarn kullanr, anchor noktalar ayn ekilde tekst iziminde grdmz sabitlere benzer. Kullanlabilir anchor noktalar biraz farkldr. Baseline kavram tekste zg(spesifik) bir kavram olduundan, baseline, bir imagen dey anchor noktalar iin artk daha fazla seenek olamaz. Bunun yerine dey anchor noktalar VCENTER ek bir seenektir. Aada bir image iin kullanlabilir Anchor noktalarnn bir birleimini gsterir: TOP|HCENTER TOP|RIGHT
TOP|LEFT
VCENTER| RIGHT
VCENTER| LEFT
VCENTER |HCENTER BOTTOM|LEFT BOTTOM |HCENTER BOTTOM | RIGHT
Gelimi Image(Resim) leme(Render-resmetme) :
Graphics snfnda, bir imagen bir blgesinin resmedilmesi, izilmesi ve ayn zamanda muhtemel ilemelerde kullanlan drawRegion( ) metodu da bulunur: public void drawRegion(Image src, int x_src, int y_src, int width, int height, int transform, int x_dest, int y_dest, int anchor);
x_src, x_src, width ve height parametreleri, Graphicsin izim yzeyi stnde resmedilecek(ilenecek) olan image dikdrtgen blgesini gsterir. izilecek blge x_dest ve y_dest konumundan anchora, drawImage( ) metodunda olduu gibi izdirilir. transform parametresi, Sprite snfnda tanmlanm dnm/dndrme/eme sabitlerinden herhangi biri olabilir. Sprite snf daha sonra anlatlacak olan Game(Oyun) APInin bir parasdr. Bu sabitler aada listelenmitir: TRANS_NONE TRANS_ROT90 TRANS_ROT180 TRANS_ROT270 TRANS_MIRROR TRANS_MIRROR_ROT90 TRANS_MIRROR_ROT180 TRANS_MIRROR_ROT270
ROT dnmleri, kaynak imagei 90, 180 veya 270 derecelerde dndrr. MIRROR_ROT dnmleri, ilk nce imagein dey ekseni etrafnda ayna grnts gibi tersini yanstr, sonra, eer verilen a varsa ayna grnts alnm blgeyi aya gre dndrr. drawRegion( ) metodu, tek bir image iinde paketlenmi animasyon framelerinin(animasyon kareleri) kolay ilenmesi ve gsterimine izin verir. Tamsay Dizileri Olarak Imageler :
Tek bir rengin nasl bir tamsay olarak temsil edilebileceini anlatlan konularda grdnz. Bunun geniletilmesi ile bir image, iindeki bir tek piksel iin bir rengin bulunduu tamsaylarn dizisinde temsil edilebilir. Tamsay dizisinin bir image olarak ilenebilmesi aadaki metotla salanr: public void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean processAlpha);
Image data, offset te balayanrgbDatadizisine dahil edilmitir. Verinin birbirini takip eden satrlar, scanlength katsays tarafndan llm offsetlerde kapsanmtr. Image, x ve y de balayan, verilmi width ve height (genilik ve ykseklik) boyutlarnda ilenmi olacaktr(render). width ve scanlength arasndaki iliki ilk bata biraz karmaktr. Aadaki rnek aklamaya yardmc olabilir: int[] rgbData = { 0x123456, 0x123456, 0x000000, 0xffffff, 0x000000, 0x000000, 0x000000, 0xffffff, 0x000000, 0xffffff, }; g.drawRGB(rgbData, 3, 0x123456, 0xffffff, 0xffffff, 0x000000, 0xffffff,
0x000000, 0x000000, 0x000000, 0x000000,
0x654321, 0x654321, 0x654321, 0x654321,
0x654321, 0x654321, 0x654321, 0x654321
6, 10, 10, 4, 4, false);
Bu kod ok aada bytlm olarak gsterilen ok kk bir ekil gsterir. Dizinin ilk 3 eleman, offsetin 3 olarak geirilmesi ile yoksaylmtr. Ama imagegenilii(width) 4 pikseldir; verinin her bir satr, tamsay dizisindeki 6 pozisyon ile ayrlmtr. Image, (10,10) koordinatnda, (4,4) piksel boyutunda render edilecektir.
drawRGB( ) metodunun son parametresi processAlpha, tamsay dizisinin bir alpha (opacityefaf olmayan, opak, donukluk) bileeni olarak dnlp dnlmemesine iaret eder. Eer false ise imagedeki her pikselin tam opak olarak dnldn gsterir. Eer true olarak deerlendirilirse her bir pikselin opakl tamsay deerinin yksek bayt ksmnca belirlenir ve pikselin rengi izim yzeyinin rengiyle uyumlu olarak harmanlanm olacaktr. Bir alpha deeri 0 ise tam effaf, alpha deeri 255 ise tamamiyle opak olacaktr. Blitting (Blok halde Image transferi ekrann bir blgesinin dier bir blgesine kopyalanmas) :
Blitting, ekrann bir blgesinin dier bir ekran lokasyonuna kopyalanmas, baz oyun trleri iin ok nemli bir ilemdir. Graphics snfnda blitting iin kullanlacak bir metot vardr: public void copyArea(int x_src, int y_src, int width, int height, int x_dest, int y_dest, int anchor);
Bu metot ho bir ekilde kendi kendini aklar. Ekrann bir alann(blgesini kopyalar (x_src, y_src ve verilmi width, heght lleri ile belirlenen dikdrtgen), (x_dest , y_dest) konumuna ve anchor noktasna gre kopyalar. anchor daha nce aklanan drawImage( ) metodunda olduu gibi alr. Bu metot yalnz dorudan ekrana izilmeyen bir Graphics nesnesi stnde alr. Bir Graphics nesnesi, doublebuffered(ifte tamponlu) Canvas stnde alan, iyi bir ekilde izilen bir imagetr. GameCanvasn getGraphics( ) metodundan gelen bir Graphics nesnesi de ayrca alr. Buna karn, doublebuffered olmayan Canvas iin eer copyarea( ) metodu arlmsa, bir Graphics nesnesi IllegalStateException istisnasn atacaktr. Clipping (krpma) :
Bir dikdrtgen clipping shape (krplan ekil) Graphics muhafaza edilir. Clipping shapein dnda yer alan herhangi bir izim, clipping shapein snrlandrmas ile gsterilmeyecektir. Yalnz bir dikdrtgen alann kullanld stensil(stencil-ablon, mumlu kat kalb, anlonla izim vs.) boyunca boyama yaplmas gibidir. Bir oyun yazyorsanz oyunun, oyun alannda, krplan dikdrtgenin set edilmesi ile oluan, zerine izim yaplamayan snr bulunabilir. Geerli krplan dikdrtgeni getClipX( ), getClipY( ), getClipWidth( ) ve getClipHeight( ) metotlar ile bulabilirsiniz. Krplan dikdrtgeni yeniden dzenlemek isterseniz bunun iin kullanabileceiniz iki metot vardr. lk olarak aadaki metodun dorudan arlmas ile clipping dikdrtgen konum ve boyutu yeniden ayarlanr: public void setClip(int x, int y, int width, int height);
kinci kullanm imkan ile geerli olan clipping dikdrtgeni dier bir dikdrtgenle snrlandrlr. Aadaki metot geerli clipping dikdrtgen ve salanan dikdrtgenin kesiimini alr ve yeni clipping dikdrtgen dzenlemede kullanr: public void clipRect(int x, int y, int width, int height); Key Events (Tu Olaylar) :
Canvas olay ilemeyi dier Displayable snflarndan daha dk seviyede ele alr . Ama karlk veren Commandlar ekleyebilir, ayrca Canvasn cihazn kendine zel tular ile etkileecek metotlar seti dahildir: protected void keyPressed(int keyCode); protected void keyReleased(int keyCode);
Metoda geirilen keyCode parametresi byk ihtimalle Graphics snfnda tanmlanm sabitlerden biri olacaktr, KEY_NUM0 KEY_NUM9 arasnda ve KEY_STAR ve KEY_POUND dahildir. Cihazlar, cihaza zg tu kodlarn dndrebilecek, bundan daha fazla tulara sahip olabilir. Baz unicode karakterlerle tular arasnda ak bir elemenin olduunu dnebilirsiniz, ba kural ise bir tuun sahip olduu kodun unicode karakter deerine eit olduudur. Unicode elemesine sahip olmayan tular negatif deer kullanmaldr. Verilmi bir pozitif tu kodunun uygun unicode karakterini, tamsay tu kodunu chara tip zorlamas yaptrarak bulabileceiniz anlamna gelir. NOT: Tua basma(keyPress) ve tuu brakma(keyRelease) ayr olaylardr. Basma ve brakma arasnda geen zaman bir oyunda karakterin ne kadar yksee srayaca veya bir laser atnn ne kadar kuvvetli olacan belirtir. Cihaza ve MIDP gereklemesine bal olarak aaya doru tutulan tuun tekrar eden tu olaylarn ortaya karr. hasRepeatEvents( ) metodunun arlmas ile tekrar eden tular bulabilirsiniz. Eer tekrar edilmi tular destekleniyorsa, bu olaylarla keyRepeated( ) metodu arlm olacaktr. Son olarak, verilmi bir tuun tekst aklamasn getKeyName( ) arlmas ile bulabilirsiniz. Game Actions(Oyun Eylemleri) :
Tu kodlar kesin durumlarda faydal olabilir ama olduka belli bir cihaza zeldirler. MIDP bu durum iin game action denilen, kullanc tu olaylarn, oyunlar ve dier uygulamalar iin faydal olabilecek olaylara elemeyi daha kolay yapan, kullanc arabirimleri ile zelletirilmi basit bir soyutlama sunar. Kavram basittir: getGameAction( ) metoduna salanan bir tu kodu destei ile bir oyun eylemi alnr. Bu deerlerden bazlar : UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C veya GAME_D. Temelde oyun eylemleri cihaz stndeki fiziksel tularn, oyundaki butonlar gibi , bir video oyunu kurulmu cihaza elenmesi iin bir yoldur. Bir tu kodu iin oyun eyleminin bulunmas amacyla, tu kodu getGameAction metoduna geirilir. Ayrca bir oyun eylemi iin tu kodunu getKeyCode( ) metodunun arlmas ile bulabilirsiniz. Pointer Events (Gsterici Olaylar) :
Baz cihazlar bilhassa PDAlar bir pointer(gsterici) destekleyebilir. Popler Palm platformu, rnein dokunmatik ekran ve sivri bir aletle(stylus) ekranda seim etrafnda temellenmitir. Eer cihaz pointer olaylarn destekliyorsa hasPointerEvents( ) ve hasPointerMotionEvents( ) metodlarnn arm sonucu alma zamannda bulunur. Eer cihaz pointer olaylarn destekliyorsa aadaki metotlar pointera baslp brakld zaman arlmtr: protected void pointerPressed(int x, int y); protected void pointerReleased(int x, int y);
Eer cihaz pointer motion(hareket halinde olmas) olaylarn destekliyorsa, kullanc ekran etrafnda stylusu srklyorsa aadaki metot arlr:. protected void pointerDragged(int x, int y); Double Buffering (ifte Tamponlama) :
Double Buffering (ifte Tamponlama), izim ve animasyonlardaki titreme ve rpnma(flicker) hareketlerini azaltmak iin iyi bilinen bir tekniktir. Dnn, animasyonun her bir karesi(frame) ekran siler ve yeniden izer. Double Buffering olmazsa, ekran silinme ve yeniden izimler kt bir ekilde titreir. Double Buffering ile yeni frame(kare) ekran d bir imagee(buffer) izilir. Ekran dnda izim tamamlandnda, image ekrana yumuak, titreimsiz abuk bir geile izilmi olunur. Ekran d izimler hafza asndan fazla kaynak tketebilir ama animasyon kalitesindeki art ok etkileyicidir. MIDP gereklemesi varsaylan olarak Double Buffering salar. Canvasn ifte tamponlu olup olmadn isDoubleBuffered( ) metodunun arlmas ile bulabilirsiniz. Eer gerekleme ifte tamponlamay salamazsa bunu kendiniz yapmalsnz. Allahtan ar derecede zor deildir. Sre aadaki gibidir: 1. Ekran d bir image, statik Image.createImage(int width, int height) metodunun arlmas ile oluturulur. 2. Image iine izilecek bir Graphics nesnesini image stnde getGraphics( ) metodunun arlmas ile elde ederiz. 3. Graphics nesnesi kullanarak ekran d image iine bir eyler(stuff ?) iz. 4. Canvasn paint( ) metodu iinde drawImage( ) metodunu kullanarak ekran d image Canvas stne koyulur. Aadaki rnekte bir Canvas alt snfnda ekran dnda basit ir image oluturulmas ve gsterilmesi bulunmaktadr: import javax.microedition.lcdui.*; public class OffscreenCanvas extends Canvas { private Image mImage; public void paint(Graphics g) { if (mImage == null) initialize(); g.drawImage(mImage, 0, 0, Graphics.TOP | Graphics.LEFT); } private void initialize() { int w = getWidth(); int h = getHeight(); mImage = Image.createImage(w, h); Graphics g = mImage.getGraphics(); g.drawRect(0, 0, w - 1, h - 1); g.drawLine(0, 0, w - 1, h - 1); g.drawLine(w - 1, 0, 0, h - 1); } }
Animasyon ve MultiThreading(okKanalllk) : Herhangi bir grafik arayz ara takmnda olduu gibi, MIDP kullanc arayz snflar threding(ok kanall, ok grevli) programlamay biraz hile(veya hner) ile uygular. Kullanc arayz gereklemesi kullanc arayz metotlar ve ekran iziminin her ikisini de kendi sahip olduu thread(i paras) iinde ele alr. rnein kullanc cihaz zerinde herhangi bir tua bastnda Canvas alt snfnda keyPressed( ) metodu arlacaktr. Bu metodu aran thread i paras) MIDPnin kendisine aittir. Aslnda daha fazla, dikkatle ynetilmi olmaldr. MIDP gereklemelerinde ayn thread event metotlarnn arlmasnn yan sra paint( ) metodunu da arr. NOT:/ Btn olaya ynelimli kullanc arayz ara takmlarnda, sistemin kendi kullanc arayz thread fikri bulunmaktadr. AWT ve Swingte event dispatch thread olarak adlandrlmaktadr. Ayn kural uygulanmaktadr: Eer size ait olmayan bir thread iinde alyorsanz btn gnnz almayacaktr(!).
NOT:/ Size ait olmayan bir thread tarafndan arlm metotlar callback metotlardr. callback metotlar iin ana kural, uzun bir zaman aldklarndan hi bir ey yapmamanz gerektiidir. Theade sahip olmadnzdan almanzn icrasnda ok uzun sre tutmamalsnz. nk bu thread kullanc arayz operasyonundan sorumlu olduu iin, ar uzun hesaplamalarda tutulduunda uygulamanz cevap vermez(lobotomized ?) grnr gibi. rnein internetten veri aktardnz dnn. Bir Commanda yantta aadaki yaplmaldr: ..... public void commandAction(Command c, Displayable s) { if (c == mNetworkCommand) { // Create a progress screen, progressScreen. mDisplay.setCurrent(progressForm); // Now do the network stuff. // Oops! Users never see progressScreen. } // ... } .....
Problem ilerleme ekrannn gzkmeyecek olmasdr. commandAction( ) metodu kullanc arayz threadinden arlmtr, ayn thread boyama ve ekran ilemlerinden de sorumludur. Eer bu threadi uzun ilemlerinize balarsanz, thread ekran gncelleme ans bulamayabilir. Eer yaplmas uzun sren ilemleriniz varsa, bunun iin ayr bir thread oluturmalsnz. rnein NerWork eriimleri ayr bir threadde ele alnmaldr.
Kesinleen durumlarda, kullanc arayzne sizin tarafnzdaki kodu altrmasn sorma ihtiyac duyacaksnz. rnein bir animasyon gsteriyorsanz, animasyon frameleri(saniyede oynatlan kare says ?) ile ekran tazeleme(repaint) dnmlerinin e zamanl olmasndan emin olmak isteyebilirsiniz. Aksi halde muhtemelen para para izilen framelerin gsterilmesini sona erdireceksiniz. Display snfnn kullanc arayz threadi ierisinde kodunuzu altrabilmek iin bir mekanizmas vardr. Bir Runnable snf kabul eden mekanizma callSerially( ) metodudur. Kullanc arayz threadi hazr olduunda, tm yeniden boyama istek servisleri bitirilmi olduu zaman, kullanc arayz threadinden Runnable snfnn run( ) metodunun altrlaca anlamna gelir(???). Tipik bir animasyon aadaki gibi grnr: public class AnimationCanvas extends Canvas implements Runnable { public start() { run(); } public void paint(Graphics g) { // Paint a frame of the animation. } public void run() { // Update our state. // Now request a paint of the new frame. repaint(); Display.callSerially(this); } }
Animasyonu, basite run( ) metodunu armaya dnen start( ) metodu ile balatrsnz. run( ) ierisinde durumunuzu gncelleyip, yeni framein boyama istei iin repaint( ) arrsnz. Sonra, tekrar arlm olan boyama ii yapldnda istekte bulunulmas iin callSerially( ) metodu kullanlr. Bu teknik cihazn izin verdii llerde animasyonu hzlandrr. Bu durumlarda, tutarl frame gecikmesi ile ayr thread animasyonu kullanmn daha anlaml klar. Aadaki rnek uygulama bu teknii gsterir. Sweep ve SweepCanvas isimli iki snf bulunmaktadr. Sweep snf aslnda animasyonu gerekletiren SweepCanvas snfn gsteren bir MIDlettir. Uygulama altrldnda aadaki gibi grnr:
Sweep MIDlet snfnn kodu aadadr: import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class Sweep extends MIDlet { public void startApp() { final SweepCanvas sweeper = new SweepCanvas(); sweeper.start(); sweeper.addCommand(new Command("Exit", Command.EXIT, 0)); sweeper.setCommandListener(new CommandListener() { public void commandAction(Command c, Displayable s) { sweeper.stop(); notifyDestroyed(); } }); Display.getDisplay(this).setCurrent(sweeper); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} }
Ve SweepCanvas snfnn kodu aadadr: import javax.microedition.lcdui.*; public class SweepCanvas extends Canvas implements Runnable { private boolean mTrucking; private int mTheta; private int mBorder;
private int mDelay; public SweepCanvas() { mTheta = 0; mBorder = 10; mDelay = 50; } public void start() { mTrucking = true; Thread t = new Thread(this); t.start(); } public void stop() { mTrucking = false; } public void paint(Graphics g) { int width = getWidth(); int height = getHeight(); // Clear the Canvas. g.setGrayScale(255); g.fillRect(0, 0, width - 1, height - 1); int x = mBorder; int y = mBorder; int w = width - mBorder * 2; int h = height - mBorder * 2; for (int i = 0; i < 8; i++) { g.setGrayScale((8 - i) * 32 - 16); g.fillArc(x, y, w, h, mTheta + i * 10, 10); g.fillArc(x, y, w, h, (mTheta + 180) % 360 + i * 10, 10); } } public void run() { while (mTrucking) { mTheta = (mTheta + 1) % 360; repaint(); try { Thread.sleep(mDelay); } catch (InterruptedException ie) {} } } } Animasyonlara ilikin farkl alma seenekleri sunan Game API daha sonra anlatlacaktr. Bu yukardaki rnek GameCanvas kullanlarak tekrar yaplacaktr. Tu Olaylar, Tu Tekrar, Animasyon ve Image izimi ile lgili Detayl Bir Uygulama Aadadr :
Bu ksm bitirmeden animasyon, tu tekrar ve Image izimi ve tu olaylarnn bulunduu detayl bir rnei verelim. Bu uygula iin uygulamann res klasrnde face2.png isimli (20x20) boyutunda bir image dosyasnda glen adam figr bulunmaktadr(bunun yerine bir kare veya elips vs. de izdirebilirdik). Uygulama baladnda bu image ekrann ortasndadr, sa, sol, yukar ve aa yn tular ile bu image ilgili ynlerde hareket eder. Tua basma sresi arttka hz da artar. Animasyon olarak imagein kaymas verilebilir(!). Uygulamann ilk kod dostyas, Canvastan treyen, grafik olaylarn gsteren HappyFaceScreen snfn gsteren bir MIDlettir (HappyFace): import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class HappyFace extends MIDlet implements AppExiter {
protected void startApp(){ Display.getDisplay(this).setCurrent(new HappyFaceScreen(this)); } protected void destroyApp(boolean unconditional){ notifyDestroyed(); } protected void pauseApp() { } /** * Indicates that the app must exit. */ public void exitApp(){ destroyApp(true); } }
Uygulamann Canvastan treyen, grafik olaylarn gsteren HappyFaceScreen snf: import java.io.InputStream; import import import import import import javax.microedition.lcdui.Canvas; javax.microedition.lcdui.Command; javax.microedition.lcdui.CommandListener; javax.microedition.lcdui.Displayable; javax.microedition.lcdui.Graphics; javax.microedition.lcdui.Image;
/** * Since we are drawing on the screen and need to control the position * of the "cursor", we need to use the Canvas. We implement the paint() * method to perform the actual drawing, and the keyPressed() and * pointerDragged() methods for the movement. * <p> * We put an exit Command on the Canvas, so that we give the user the ability * to exit. So we need to implement CommandListener and add code to the * commandAction method. But now what? The destroyApp() method is protected, * we use our AppExiter interface to call the destroyApp() method. * <p> * There are other ways to do this, but this seemed to be the simplest. */ class HappyFaceScreen extends Canvas implements CommandListener, KeyRepeater { private static final int MAX_SPEED = 5; private int m_horizSpeed = 0; private int m_vertSpeed = 0;
private int private int
m_horizDir = 0; m_vertDir = 0;
// save some calculated values for speed private int m_maxX = getWidth() - 1; private int m_maxY = getHeight() - 1; private int m_imageWidth; private int m_imageHeight; // values we need for movement private int m_x = m_maxX / 2; private int m_prevX = m_maxX / 2; private int m_y = m_maxY / 2; private int m_prevY = m_maxY / 2; // objects necessary for app private AppExiter m_appExiter; private Image m_face=null; private KeyRepeat m_repeat = new KeyRepeat(this); private boolean m_painting = false; /** * The constructor assigns the AppExiter, load the image, and initialies * all the constants. It also adds the EXIT Command, and registers itself * as a command listener. */ public HappyFaceScreen(AppExiter exiter) { m_appExiter = exiter; InputStream in = null; try { in = this.getClass().getResourceAsStream("face2.png"); m_face = Image.createImage(in); } catch (Exception e) { m_face = null; } // calculate some constant values m_imageWidth = m_face.getWidth(); m_imageHeight = m_face.getHeight(); // add the EXIT command to the Canvas addCommand(AppExiter.EXIT); // register the Canavas as the listener for Commands, the action for // the Commands will be handled in the commandAction() method setCommandListener(this); m_repeat.start(); } /** * Draw all the objects on the screen. *
* @param g The Graphics object to be used for rendering the Canvas. */ protected void paint(Graphics g) { if (m_painting) return; m_painting = true; // delete the old face g.setColor(0xffffff); g.fillRect(m_prevX-m_imageWidth/2, m_prevY-m_imageHeight/2, m_imageWidth, m_imageHeight); // g.fillRect(0, 0, 100, 20); g.setColor(0); // draw the new face g.drawImage(m_face, m_x, m_y, Graphics.VCENTER|Graphics.HCENTER); // g.drawString(m_horizDir + ", " + m_vertDir, 0, 0, Graphics.TOP| Graphics.LEFT); // make the new position the old position m_prevX = m_x; m_prevY = m_y; m_painting = false; } /** * Called when a key is repeated. * * @param keyCode The key code of the key that was pressed. */ protected void keyRepeated(int keyCode) { if (hasRepeatEvents()) { performAction(getGameAction(keyCode)); } } /** * Called when a key is pressed. * * @param keyCode The key code of the key that was pressed. */ protected void keyPressed(int keyCode) { int gameAction = getGameAction(keyCode); switch (gameAction) { case UP: m_horizDir = -1; break; case DOWN: m_horizDir = 1; break; case LEFT: m_vertDir = -1; break; case RIGHT:
m_vertDir = 1; break; default: return; } m_repeat.startRepeat(gameAction); } /** * Called when a key is released. * * @param keyCode The key code of the key that was pressed. */ protected void keyReleased(int keyCode) { int gameAction = getGameAction(keyCode); if (gameAction == m_repeat.getGameAction()) { switch (gameAction) { case UP: case DOWN: m_horizDir = 0; break; case LEFT: case RIGHT: m_vertDir = 0; break; } } } /** * Called when a game action is to be performed. * * @param gameAction The game action that is to be performed. */ public void performAction(int gameAction) { // calculate new horizontal position m_horizSpeed += m_horizDir; if (m_horizSpeed < -MAX_SPEED) { m_horizSpeed = -MAX_SPEED; } else if (m_horizSpeed > MAX_SPEED) { m_horizSpeed = MAX_SPEED; } m_y += m_horizSpeed/2; // if the new horizontal position is beyond the limit, // then display it on the other side if (m_y > m_maxY) {
m_y = 0; } else if (m_y < 0) { m_y = m_maxY; } // calculate new vertical position m_vertSpeed += m_vertDir; if (m_vertSpeed < -MAX_SPEED) { m_vertSpeed = -MAX_SPEED; } else if (m_vertSpeed > MAX_SPEED) { m_vertSpeed = MAX_SPEED; } m_x += m_vertSpeed/2; // if the new vertical position is beyond the limit, // then display it on the other side if (m_x > m_maxX) { m_x = 0; } else if (m_x < 0) { m_x = m_maxX; } // we want to show the result, so we ask the canvas to repaint repaint(); } /** * Called when the pointer is pressed. * <p> * This method is for devices with pointers (PDAs). * * @param x The horizontal location where the pointer was released (relative to the Canvas). * @param y The vertical location where the pointer was released (relative to the Canvas). */ // this method is for devices with pointers (PDAs) protected void pointerPressed(int x, int y) { if (hasPointerEvents()) { m_y = y; m_x = x; repaint(); } } /** * Called when the pointer is dragged. * <p>
* This method is for devices with pointers (PDAs). * * @param x The horizontal location where the pointer was released (relative to the Canvas). * @param y The vertical location where the pointer was released (relative to the Canvas). */ protected void pointerDragged(int x, int y) { if (hasPointerMotionEvents()) { pointerPressed(x, y); } } /** * Indicates that a Command c event has occurred on Displayable d. * <p> * This is where we handle all the Commands that we know how. Everything * else is passed to the MIDlet (we defined it as a CommandListener as * well). * * @param c A Command object identifying the command. * @param d The Displayable on which this event has occurred. */ public void commandAction(Command c, Displayable d) { if (c == AppExiter.EXIT) { m_repeat.cancel(); m_repeat = null; m_appExiter.exitApp(); } } }
Thread snfndan treyen, (KeyRepeat) snf: public class KeyRepeat extends Thread { private boolean m_cancel = false; private long m_sleepTime = 50; private int m_gameAction = 0; private final KeyRepeater m_ui; /** * Creates a KeyRepeated object and saves the reference to the UI * in which the key repeat emulation shoudl occur. * * @param ui The UI in which the key repeat emulation shoudl occur. */ public KeyRepeat(KeyRepeater ui) { m_ui = ui; }
/** * Stops the thread. */ public void cancel() { m_cancel = true; } /** * Returns the game action currently repeated. * * @return The game action currently repeated. */ public int getGameAction() { return m_gameAction; } /** * Sets the amount of time between actions. * * @param sleepTime The amount of time to sleep between actions. */ public void setSleepPeriod(long sleepTime) { m_sleepTime = sleepTime; } /** * Start the key to be repeated. * * @param gameAction The game action that is to be performed. */ public void startRepeat(int gameAction) { m_gameAction = gameAction; } /** * Stop the key from being repeated. If the currently repeated key is * the same as the one that is to be stopped then stop; otherwise * ignore it, we must be repeating a different key. * * @param gameAction The game action that is to be performed. */ public void stopRepeat(int gameAction) { if (gameAction == m_gameAction) { m_gameAction = 0; } } /** * Perform the repetition of the key. */ public void run()
{ while (!m_cancel) { // yield to other threads if thereis no key to be repeated while (m_gameAction == 0 && !m_cancel) { Thread.yield(); } // perform the repetition of the last key m_ui.performAction(m_gameAction); // wait for a little bit try { sleep(m_sleepTime); } catch (InterruptedException e) { } } } }
KeyRepeater arayz(Interface) : /** * This interface is used for any object that wants to emulate repeating keys. */ public interface KeyRepeater { /** * Called when a game action is to be performed. * * @param gameAction The game action that is to be performed. */ public void performAction(int gameAction); }
AppExiter arayz(Interface) : import javax.microedition.lcdui.Command; public interface AppExiter { /** * Since many screens will be using the EXIT command then define it * onecd and make a public final. */ public static final Command EXIT = new Command("Exit", Command.EXIT, 1); /** * Indicates that the app must exit. */ public void exitApp(); }
Game(Oyun) API : Bu ksmda 2D oyun, grafik yazm ile ilgili oyun APIsinin zelliklerinin bir ksmn greceiz. Bu oyun apisinde 3D grafikler, animasyon vs. zellikleri bir nceki ksmda grdmz Canvas snfna gre(dk seviye grafik ileme) daha kullanl mekanizmalar salar. javax.microedition.lcdui.game 5 adet snftan oluan bir pakettir. Bu snflardan GameCanvas animasyon ve tu (polling) durumlarn yakalama metotlarn salar. Dier 4 snf, katmanlar(layers) ile eitli farkl elemanlardan olumu grntleri deerlendirir. GameCanvas snfnn Canvas snfnn stnde iki ana avantaj vardr. lki, sistemin grnt gncellendiinde paint( ) metodunu armasn beklemek yerine uygulamann tam bir kontrole sahip olmasdr. kincisi, gncellenen ekran blmnn kontrol edilebilmesi. GameCanvas ile Animasyonlarn Yrtlmesi :
GameCanvas snf javax.microedition.lcdui.Canvas snfndan, animasyon ve tu basm durumlar iin metotlarile beraber tremitir. GameCanvas snf Canvas snfndan farkl kullanlmtr: Canvas kullanabilmek iin alt snf olunmal ve paint( ) metodu tanmlanmaldr. paint metodu iinde ekran stnde grafik ileme(render) iin Graphics snfn kullanrsnz. Bir eyleri deitirip ekran gncellemek istediinizde repaint( ) metodunu arrsnz ve sistem sizin iin paint( ) metodunu tekrar arr. GameCanvas kullanabilmek iin alt snf olunmal (ondan tretilmeli). Ekrana izim yplmas iin getGraphics( ) metodundan dnen Graphics snfn kullanlr. Ekranda grnmesi iin gncelemeler yapmak istediiniz zaman ekran gncellemedii mddete bir eyler dndrmeyen flushGraphics( ) metodu arlr. Daha zel, ekrann belli bir blgesinin gncellenmesi iin flushGraphics(int x, int y, int width, int height) metodu kullanlr. public void flushGraphics(int x, int y, int width, int height);
GameCanvas, iinde oyun dngleri kullanlmas ile kolaylklar yapan model aadaki gibidir: Graphics g = getGraphics(); while(true) { // Kullanc girileri iin kontrol // Oyun durumunu gncelle. // g kullanarak bir eyler iz. flushGraphics(); }
GameCanvastan tretilebilmesi iin, yaplandrcdan GameCanvasn protected yaplandrcs arlmaldr. Bu yaplandrc, GameCanvas referans(instance) iin normal tu olay mekanizmasna gizlenmi olup olmamasna iaret eden tek bir boolean argman kabul eder. Normal tu olay mekanizmas, keyPressed( ), keyReleased( ) ve keyRepeated( ) metotlarnn callback mekanizmasna bavurur. Normal mekanizmann gizlenmesi, daha iyi performans alnmas sonucunu dourur. GameCanvas, tu olaylarn yant iin daha sonra greceimiz alternatif bir metot salar. GameCanvasn grafik iziminde nasl alacan gstermek iin daha nce verdiimiz SweepCanvas uygulamasn yeniden dzenleyelim. Alt snf paint( ) metodunu daha uzun(fazla?) override(st snfn kodunu ezerek deitirmez) yapmaz. Tm eylem, animasyonu yneten ayr bir thread iinde altrlan run( ) metodu iinde olur. run( ) metodu asl izimi yapan (eski paint metoduna denk, zde olan) render( ) metodunu arr: Aada SweepGameCanvas snf yeralmaktadr: import javax.microedition.lcdui.*; import javax.microedition.lcdui.game.*;
public class SweepGameCanvas extends GameCanvas implements Runnable { private boolean mTrucking; private int mTheta; private int mBorder; private int mDelay; public SweepGameCanvas() { super(true); //yaplandrc boolean parametre alr. mTheta = 0; mBorder = 10; mDelay = 50; } public void start() { mTrucking = true; Thread t = new Thread(this); t.start(); } public void stop() { mTrucking = false; } public void render(Graphics g) { int width = getWidth(); int height = getHeight(); // Clear the Canvas. g.setGrayScale(255); g.fillRect(0, 0, width - 1, height - 1); int x = mBorder; int y = mBorder; int w = width - mBorder * 2; int h = height - mBorder * 2; for (int i = 0; i < 8; i++) { g.setGrayScale((8 - i) * 32 - 16); g.fillArc(x, y, w, h, mTheta + i * 10, 10); g.fillArc(x, y, w, h, (mTheta + 180) % 360 + i * 10, 10); } } public void run() { Graphics g = getGraphics(); while (mTrucking) { mTheta = (mTheta + 1) % 360; render(g); flushGraphics(); try { Thread.sleep(mDelay); } catch (InterruptedException ie) {} } } }
nceki uygulamamzda Sweep snf aslnda animasyonu gerekletiren SweepCanvas snfn gsteren MIDletti. Bu MIDlet snfmzda SweepCanvas snfnn yerine SweepGameCanvas snf deitirilerek uygulama altrlabilir. Tu Durumlar iin Polling(Tu Durumlarn Yakalama) :
Canvas snfnda tanmlanm Tu olay callback metodlar iin pasif bir ekilde beklemek yerine, GameCanvas tularn geerli durumunu dndren bir metod sunar:
public int getKeyStates(); Bu oyunlar iin ekicidir nk uygulamaya daha fazla kontrol imkan verir. Canvastaki tu callback metodlarn gerekletirme amacyla sistemi beklemek yerine hemen cihaz tu durumlarn buldurabilirsiniz. getKeyState( ) metodundan geri dnen tamsay, 9 oyun olaynn her birini temsil iin 1 bit kullanr. (1) biti, bir tu basmna, (0) biti tua baslmamasna iaret eder. Bitlerin her biri GameCanvas iindeki sabitlerde gsterilmitir: GameCanvas Bit Sabitleri Uygun(karlk gelen !) GameCanvas Olay Action(Eylem) Sabitleri UP_PRESSED UP DOWN_PRESSED DOWN LEFT_PRESSED LEFT RIGHT_PRESSED RIGHT FIRE_PRESSED FIRE GAME_A_PRESSED GAME_A GAME_B_PRESSED GAME_B GAME_C_PRESSED GAME_C GAME_D_PRESSED GAME_D
Tularn geerli durumlarn ele geirme(polling denilen bir teknik), olay callback metotlarna gvenmek yerine farkl bir threadde alan, oyun dngs iinde kullanc olaylarn yantlayabilirsiniz. Daha nce gsterdiimiz GameCanvas dng(loop) rneini kullanc tu basmna yant veecek ekilde deitirip geniletelim: ..... Graphics g = getGraphics(); while(true) { // Check for user input. int ks = getKeyStates(); if ((ks & UP_PRESSED) != 0) moveUp(); else if ((ks & DOWN_PRESSED) != 0) moveDown(); // ... // Update game state. // Draw stuff using g. flushGraphics(); } .....
Halen dikkatli bir ekilde takip ediyorsanz, muhtemelen kullanc tua bast ve brakt zaman aralnda uygulamann ard getKeyStates( ) metoduna ne olduunu merak ediyorsunuzdur. Tu durumlar, sonraki getKeyStates( ) arsna kadar, bir tu basmn uygun bitin yerletirilmesi ve ubuk(stick, manivela joystick gibi) olarak yapan latched (almaya karn korunmu, kilitli) olur(!). getKeyStates( ) metodunu her zaman arabilirsiniz, latched deerleri tamamen temizlenmi olur. Layers(Katmanlar)n Anlalmas :
Game APInin bundan sonraki konular Layers(katmanlar) konusuna ayrlmtr. Layerlar, btn bir sahnenin oluturulmasnda birletirilebilecek grafik elementleridir. rnein, bir sahnedeki arka fon olarak dalar, ehir binalar ve n fonda daha kk eyler, insanlar, uzay gemileri arabalar herneolursa dnlebilir.
Layerlarn birletirilme teknii geleneksel el yapm animasyonlarn yapmna benzer. Arka fon ve n fon resimleri saydam cels(izim kad, effaf izim ortam vs. ?) stne izilerek, biri dierinin stne konulmu, son sahnenin oluturulmas amacyla fotoraflanmlardr. Game API iinde javax.microedition.lcdui.game.Layer snfnn rnei(nesnesi, referansinstance) bir katman sunar. Layer iki adet somut alt snf olan soyut bir snftr. Kendi kendisini ho bir ekilde aka tanmlamtr(straightforward). Bir lokasyonu(yerleim koordinat), boyutu, grnebilir veya grntlenemez zellikleri vardr. Lokasyon ve boyut zelliklerine aadaki kendini aklayan metotlarla eriebilirsiniz: public public public public public final int getX(); final int getY(); final int getWidth(); final int getHeight(); void setPosition(int x, int y);
Layer ayrca geerli pozisyonuna greli(oranl, nisbi) olarak yeni bir konuma tanabilmesi iin faydal bir metot sunar. Aadaki metoda Layern pozisyonuna gre ayarlanmas iin offset pikselleri (bulunulan konuma gre deiim lleri, farklar) geirilir: public void move(int dx, int dy);
Layern grnrlne getVisible( ) veya setVisible( ) metotlar ile eriilinir. Soyut olarak bildirilmi paint( ) Layern son metodudur. Alt snflar kendi grnmlerinin tanmlanmas iin bu snf override(yeniden yazarak, ezme, gerekletirme) yaparlar. Layerlarn Ynetilmesi : Game APIye Layerlarn ynetilmesi ile ilgili bir ok detay bizim iin yapacak bir LayerManager snfnn dahil edilmesi ok iyi olmutur. LayerManager oluturulmas iin sadece kendisinin argmansz yaplandrs arlr. LayerManagerin balca grevi layerlarn listesini belli bir dzende tutmaktr. Layerlar nden arkaya pozisyonlarna iaret eden bir indekse sahiptir. 0 pozisyonu en tepede, kullancya en yakn olanyken daha byk indeksler ok daha uzaa, aaya dorudur. (Layerlarn srasna bazen z sras da denilmektedir.) Layerlar listenin en altna aadaki metotla eklenmi olurlar: public void append(Layer l);
Bir Layer zel, belirli bir lokasyona ait indekse eklemek iin insert( ) kullanlr: public void insert(Layer l, int index); rnein bir Layer en tepeye, indksine 0 vererek araya sokabilirsiniz. LayerManager iindeki Layerlarn saysn getSize( ) metodunu kullanarak bulabilirsiniz. Kesin bir pozisyondaki Layer alabilmek iin getLayerAt( ) metoduna indeks saysn geiririz Son olarak, bir Layer Layer nesnesini remove( ) metoduna geirerek silebilirsiniz. LayerManager, izilmi olan sahnenin dikdrtgen blm olan pencere grnm kavramna sahiptir. Varsaym, bir utan dierine kapsaml sahnenin cihaz ekranna gre daha byk olmasdr, bylece her zaman yalnzca bir ksm izilmi olacaktr. Varsaylan pencere grnmnn orjini (0,0) ve olabildiince genitir. (Integer.MAX_VALUE genilik ve yksekliin her ikisi iin kullanlmtr). LayerManagern orjinine gre relatif(nisbi) olan x ve y koordinatlarnn geirilmesi ile pencere grnmn aadaki metotta ayarlayabilirsiniz: public void setViewWindow(int x, int y, int width, int height);
Gerekte LayerManagern Layerlar tarafndan paint( ) metodu arlmasyla sahne izimi gsterilmitir. public void paint(Graphics g, int x, int y);
Tiled(Yaylm;ini fayansn yzeyi kaplamas) Layerlarn Kullanm : Bir Tiled Layer, Tilelardan oluan bir paletten yaplmtr; banyonuzu yaptrken kullanacanz dekoratif, desenli, kare/dikdrtgen biimindeki fayanslar Tile(ingilizce anlam da ayn), bunlarn birletirilmesinden oluan katmana da Tiled Layer olarak dnebilirsiniz. Tilelar tek bir imagein eit boyutlu paralara blnmesinden olumutur. Bir Tiled Layer, Layer snfndan tretilmi paint( ) metodu kullanlarak bir Graphics nesnesi stne izdirilmitir. Herhangi bir dier Layer gibi, bir Tiled Layer da Graphics snfnn koordinat sisteminde geerli yerleiminde kendi kendisini izimini iler(render). Bundan baka dier Layerlar gibi bir LayerManagern paras olabilir ve LayerManager kendi paint( ) metodu ile ilenecei vakit Tiled Layer da otomatikman ilenmi olur. rnein aadaki 240 piksel genilik ve 96 piksel ykseklie sahip image, her biri genilik ve ykseklii 48x48 piksel oluan 10 adet kareye blnm olabilir. Tilelarn blnm hali ve numaralandrlmas aadadr:
1 2 3 4 5 6 7 8 9 10 Image stnde, ayn sonuca erimek iin deiik yollar, eitli yerleimler (Tilelarn image stnde dalm) yaplm olabilir. Mmkn olan dier iki tanesi aadadr: 1 1 3 5 7 9 2 2 4 6 8 10 Image stndeki Tilelarn her biri, arka fon, n fonda kullanlabilecek ekil, resim vs. olabilir. Bunlar ayr ayr da kullanlabilir. NOT:/ Tile indeksleri 1den balanarak numaralanrken, satr ve stun numaralar 0dan balar. Tiled Layern kendisi, her bir hcre bir Tile tarafndan doldurulmu, hcrelerden oluan zgara bir tablodur. Tiled Layern yaplandrcsnda satr ve stun numaralarn belirleyebilirsiniz. Bir Tiled Layern kesin boyutu aadaki gibi hesaplanr: genilik = [stun says] x [tile genilii] ykseklik = [satr says] x [tile ykseklii] Tiled Layer Oluturma ve Hazrlama(lk Deerleri) : Bir Tiled Layer oluturmak iin, satr ve stun numaralar, kaynak image(resim) ve Tile boyutlar yaplandrcda verilmelidir: public TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight); 3 4 5 6 7 8 9 10
Image ve Tile boyutlar statik bir Tile kmesini gsterir. Mevcut bir TiledLayer stndeki statik Tile kmesini aadaki metotla deitirebilirsiniz:
public void setStaticTileSet(Image image, int tileWidth, int tileHeight);
Bir TiledLayer iindeki satr ve stun saylar getColumn( ) ve getRows( ) metotlar ile geri alnm olabilir. TiledLayer boyutunu geri alnmas iin getCellWidth( ) ve getCellHeight( ) metotlar kullanlr.(Ama metot isimleri ok fazla tutarl deildir, bu alr, nk her bir piksel boyutu ile Tilelarn piksel boyutu ayndr.) Bir TiledLayer ilk oluturulduunda botur. Bir Tile bir hcreye atamak iin aadaki metot kullanlr: public void setCell(int col, int row, int tileIndex);
Bir TiledLayer hazrlanrken bo bir Tilea iaret eden, tm hcreler indeks 0 ile doldurulur. Belirli bir hcrenin Tile indeksi, satr ve stun saylarnn geirildii getCell( ) metodundan salanr. Eer ayn Tile (indeks nosu alnm olan) bir hcreler setine, satrna vs. atamak isterseniz fillCells( ) metodunu kullanrsnz. public void fillCells(int col, int row, int numCols, int numRows, int tileIndex);
Col, row, numCols ve numRows parametreleri belirlenmi Tile ile doldurulacak hcrelerin dikdrtgen bir blgesini gsterir. rnein fillCells(2, 0, 1, 2, 6) ifadesinde Tile 6, 3. stunun(2) 1. ve 2. satrlarna aanm olur.
Aada QuatschCanvas.java kaynak kodundan alntlanarak adapte edilmil olan, bir TiledLayer oluturma ve hazrlamann bir yolunu gsterimini yapmaktadr: Image backgroundImage = Image.createImage("/background_tiles.png"); TiledLayer background = new TiledLayer(8, 4, backgroundImage, 48, 48); background.setPosition(12, 0); int[] map = { 1, 2, 0, 0, 0, 0, 0, 0, 3, 3, 2, 0, 0, 0, 5, 0, 3, 3, 3, 2, 4, 1, 3, 2, 6, 6, 6, 6, 6, 6, 6, 6 }; for (int i = 0; i < map.length; i++) { int column = i % 8; int row = (i - column) / 8; background.setCell(column, row, map[i]); }
Bu kodun rettii TiledLayer, kaynak imagein kullanm aadadr:
Animated Tiles(Hareketli Tilelar) :
Hareketli bir Tile alma zamannda deitirilmi olmas iin elenmi olan sanal bir Tiledr. Ama ayn eyi deitirmek istediiniz tm hcrelerde setCell( ) metodunu ararakta baarabilirsiniz, hareketli bir Tile kullanm size tm etkilenmi hcreleri deitiren tek bir ar yapmanza izin verir. Hareketli bir Tile kullanmak iin, aadaki metodu kullanarak hareketli bir Tile oluturabilirsiniz: public int createAnimatedTile(int staticTileIndex);
Bu metoda, hareketli Tile olarak kullanlmak zere balang Tile olarak dzenli bir Tile indeksini geirirsiniz. Metod, zel bir hareketli Tile indeksi geri dndrr. (Burda by my yok, yalnzca negatif bir say.) Hareketli bir Tile bir hcreye atamak iin createAnimatedTile( ) metodundan dnen deeri setCell( ) metoduna geirirsiniz. Bir hareketli Tilen ieriini deitirmek istediiniz zaman aadaki metodu kullann: public void setAnimatedTile(int animatedTileIndex, int staticTileIndex);
Bu metot, salanan Tile indeksini hareketli Tilea atar. Hareketli Tile zellii salanan tm hcrelerde artk bu verilen Tile grntlenecektir. Bir hareketli Tile ile birletirilmi geerli Tile geri almaya ihtiya duyarsanz yalnzca hareketli Tile indeks numarasn get getAnimatedTile( ) metoduna geirirsiniz. Spritelarn Kullanm :
Bir TiledLayer, geni bir alan doldurmak iin Tilelardan oluan bir paleti kullanrken bir Sprite, tek bir Tile boyutu gibi ayn olan bir layer hareketlendirmek iin Tilelarn bir paletini kullanr. Spritelar genellikle oyunlardaki balca ana karakterleri, ba rol oyuncularn temsil eder. Sprite deyimi iinde framelerin(animasyon kareleri) yerine Tile olarak arlmtr. Bir TiledLayer gibi bir Sprite, eit llerde framelere blnm image kaynandan oluturulmutur: public Sprite(Image image, int frameWidth, int frameHeight);
Ayrca zel bir durum da vardr Eer image sadece bir tek frameden oluuyorsa hareketli olmayacaktr: public Sprite(Image image);
lgin bir ekilde bir Sprite ayr frame imagelerinden oluturulamaz; frameler tek bir image kayna iine paketlenmi olmaldr(Paketleme sktrma iin de iyidir). Eer Sprite oluturulduktan sonra deitirmek istiyorsak setImage( ) metodu kullanlr:
public void setImage(Image img, int frameWidth, int frameHeight);
Sprite iine dahil edilmi framelerin toplam says getRawFrameCount( ) metodunun geri dnnden elde edilir. Dier Layerlar gibi Spriteler de paint( ) metodunun arlmas ile izimi ilenir(render). Genellikle bir Sprite, izimi ilendiinde otomatikman Sprite izimini de ileyecek bir LayerManagera ait olacaktr. Spritelarn Hareketlendirilmesi :
Sprite animasyonunun tamam birbirini srayla izleyen frameler hakkndadr. Bir Sprite oluturulduu zaman, kaynak imagete bulunan her framein dahil edildii varsaylan bir frame srasna sahiptir. rnein aada grnen Dr. Quatsch ismini verdiimiz kurgusal karakterin bulunduu kaynak imagee dikkat edelim:
Image boyutu 192x48 pikseldir. Eer 48x48 piksel boyutunda oluturulmu olsayd, 4 framee bulunurdu. Varsaylan frame sras {0, 1, 2, 3}. NOT:/ frame indeksleri 0dan balayarak numaralandrlrken Tile indeksleri(TiledLayer snfnda) 1den balayarak numaralandrlr. Yukardaki ilk 3 framede Dr. Quatsch koarken gstermekte, 4. framede hareketsiz durduu grlmektedir. Aadaki metot geerli frame srasn deitirir. public void setFrameSequence(int[] sequence);
rnein aadaki kod yeni bir Spritei nasl oluturabileceinizi ve sadece koma framelerini dahil etmek iin frame srasna nasl yerletirebileceinizi gsterir: int[] runningSequence = { 0, 1, 2 }; Image quatschImage = Image.createImage("/quatsch.png"); Sprite quatsch = new Sprite(quatschImage, 48, 48); quatsch.setFrameSequence(runningSequence);
Sprite, frame sras boyunca gezinti iin eitli metotlar salar. Animasyon otomatikman balatlmaz; uygulama sradaki bir sonraki framee hareket etme zaman geldii zaman bunu Spritee bildirmelidir. Genellikle bu muhtemelen animasyon threadinin bir paras olan ayr bir thread iinde baarlmaktadr. Sra iindeki ileri ve geri hareket etmek iin nextFrame( ) ve prevFrame( ) metotlar kullanlr. Bu metotlar, sonraki deerin etrafna sarmalandndan, srann sonunda hangi frame srasnn olmasn umuyorsanz onu getirirler(!). rnein {0, 1, 2} den oluan frame sras kullanlrken, eer Spritein geerli framei 2 ise ve nextFrame( ) metodunu arrsanz, geerli frame 0a ayarlanacaktr. Aadaki metot ile dorudan belirli bir framee srayabilirsiniz: public void setFrame(int sequenceIndex); NOT:/ Bu metot bir indeks srasn kabul eder. Eer Spriten frame sras {2, 3, 1, 9} ise ve sonra setFrame(1) arlrsa bunun sonucunda Spritein geerli framei 3 olarak ayarlanacaktr.
Spriten geerli frameini ayarladnzda grsel olarak hibir ey olmaz. Deiiklikler Spritein paint( ) metodu kullanlarak izimi ilendii sonraki seferde grlebilir olacaktr. GameCanvas kullanyorsanz bu genellikle animasyon dngsnn sonunda olacaktr. Geerli olan framein indeks srasn bulmak iin getFrame( ) metodu arlr. Sakn kartrmayn: Metod bir frame indeksi geri dndrmez, ama geerli olan(o an kullanlan) frame srasndaki geerli olan indeks. lgin bir ekilde, bir getFrameSequence( ) metodu bulunmadndan geerli framein srasn saklamadysanz, geerli frame indeksini bulmann yolu yoktur. Bununla beraber geerli frame sras iindeki elementlerin saysn getFrameSequenceLength( ) metodunu kullanarak geri alabilirsiniz. Spritelarn Dndrlmesi :
Daha nce grdmz Dr. Quatsch isimli framelerin sadece sol tarafa bakyor olduuna dikkat etmisinizdir. Peki ya sa tarafa komasn istersek ne olur? Sprite snfnda dnm/dndrme iin destek salandndan, mevcut framelerin basit dnmlerinden ek frameler retilmesi amacyla APIyi kullanabilirsiniz. Bu yaklam saklanm imagelerin toplam saysn azaltr, etkin kullanmla kaynak kullanmnn(disk yzeyi, hafza, vs.) azaltmn salar. Aadaki metot bir Spritea bir dnm/dndrme uygular: public void setTransform(int transform);
transform argman, Sprite snfnda tanmlanm aadaki sabit deerlerden herhangi biri olabilir (Bu sabitleri daha nce Gelimi Image(Resim) leme(Render-resmetme) bal altndaki konuda ilemi ve Sprite snfnda tanml olduklarn belirtmitik. Bunlar tekrar belirtelim): TRANS_NONE TRANS_ROT90 TRANS_ROT180 TRANS_ROT270 TRANS_MIRROR TRANS_MIRROR_ROT90 TRANS_MIRROR_ROT180 TRANS_MIRROR_ROT270 ROT dnmleri, kaynak imagei 90, 180 veya 270 derecelerde dndrr. MIRROR_ROT dnmleri, ilk nce imagein dey ekseni etrafnda ayna grnts gibi tersini yanstr, sonra, eer verilen a varsa ayna grnts alnm blgeyi aya gre dndrr. Dr. Quatsch frameinin yzn soldan saa evirebilmek iin bir TRANS_MIRROR dnm sabitini uygulamalsnz. Dnmler hakkndaki hnerli blm sadece (reference pixel) referans piksel noktasdr. Btn Spritelar, Spriten kendi koordinat sistemi iinde tanmlanm, varsaylan olarak (0,0) koordinat, Spriten sol st kesine yerletirilmi bir referans noktasna sahiptir. Sprite dndrld zaman, referans noktas da ayrca dndrlm olur. Bir dndrme uyguland zaman, Spriten pozisyonu deitirildiinde referans noktas da dndrld halde geerli yerleimi deimez. rnein basit bir TRANS_MIRROR dnm uygulandnda Spriten pozisyonunun nasl deitiini (ama referans noktasnn deimediini) aadaki frameler gsterir:
TRANS_MIRROR
rnein Spriten orijinal pozisyonunun (100,100) olduunu(Konteynr koordinat sistemi, genel sistem iinde) ve referans noktasnn da (0,0) olduunu (Sprite koordinat sistemi iinde) farzedelim. Bir TRANS_MIRROR dnm uygulandktan sonra Spriten pozisyonu ayarlanm olduundan dreferans pikseli de dndrlm, ama orijinal referans pikselin bulunduu ayn yerleim kooordinatndadr. nk frame genilii 48 piksel olduundan, Spriten pozisyonu (kendi sol st kesi) (100,100) den, (52,100) koordinatna deimitir. Spriten dndrlmemi koordinat sistemindeki referans noktasnn konumunu ayarlamak iin aadaki metodu kullanrz: public void defineReferencePixel(int x, int y);
Dr. Quatschn durumuna uygulayalm, Sprite hareketinin olmad bir ayna dnmn uygulamak istediimiz iin referans pikselini (48x48) boyutundaki frameimizin tam ortasna yerletiririz: quatsch.defineReferencePixel(24, 24);
Spriten referans pikselinin geerli konumunu kendisinin dahil olduu koordinat sisteminde bulabilmek iin getRefPixelX( ) ve getRefPixelY( ) metodlar kullanlr. Sakn kartrmayn: defineReferencePixel( ) metodu Spritein orjin noktalarna balantl(relative) olarak koordinatlar kabul ederken getRefPixelX( ) ve getRefPixelY( ) metodlar Sprite taycsna(konteynr ?) balantl(relative) olarak deerler geri dndrr. Ayrca kendi referans noktasnn stnde Sprite temelinin pozisyonunu ayarlamak da mmkndr. Layerdan tretilmi olan setPosition( ) metodu kullanm ile Spritein sol st kesinin pozisyonunu ayarlayabileceinizi zaten biliyordunuz, ama aadaki metot Spritein referans noktasnn geerli pozisyonunu ayarlar: public void setRefPointPosition(int x, int y); En bata, geerli dnme aldrmadan referans noktasn belirli bir pozisyona yerletirmeye izin verdiinden bu daha uygun grnebilir. arpmalarn(Collision) daresi :
Sprite snf oyunlarla beraber ortaya kan kritik bir soruyu cevaplamak iin metotlar salar Mermi uzaygemisini vurdumu? , Dr. Quatsch kap nnde duruyormu ? Game API, arpma tespiti iin 2 teknii destekler: 1. Gerekleme iki ayr Sprite temsil eden dikdrtgenleri karlatrabilir. Dikdrtgenler kesiirse bir arpma meydana gelmitir. Bu arpmalar test iin hzl bir yoldur ama dikdrtgen olmayan ekiller iin hatal sonular retilebilir. 2. Gerekleme iki ayr Spritein her pikselini karlatrabilir. Eer Sprite iindeki bir opak(saydam) piksel dier bir Sprite iindeki bir opak pikselle st ste akyorsa bir arpma meydana gelmitir. Bu teknik daha ok hesaplamalar gerektiri ama daha doru sonular retir. Bir Spritein arpma tespiti iin kullanlacak bir arpma dikdrtgeni bulunur. Spritein kendi koordinat sisteminde, referans noktalar gibi tanmlanmtr. lk bata varsaylan arpma dikdrtgeni, (0,0) ve Sprite ile ayn genilik ve ykseklik deerlerine konumlandrlmtr(Spriten kendi tanmland boyutta). arpma dikdrtggenini aadaki metodu kullanarak deitirebilirsiniz:
public void defineCollisionRectangle(int x, int y, int width, int height);
arpma dikdrtgeni iki amaca hizmet eder: Piksel seviyesinde arpma tespiti kullanlmamsa, arpma dikdrtgenleri arpmalara karar vermede kullanlr. Piksel seviyesinde arpma tespiti kullanlmsa, o zaman yalnzca arpma dikdrtgeni iindeki pikseller denetlenmi olur. Sprite, dier Spriteler, TiledLayerlar ve Imageler ile arpmalarn tespit edebilir: public final boolean collidesWith(Sprite s, boolean pixelLevel); public final boolean collidesWith(TiledLayer t, boolean pixelLevel); public final boolean collidesWith(Image image, int x, int y, boolean pixelLevel);
Aadaki tabloda gsterildii gibi her bir metodun ierdii anlamlar incelikle farkldr: Hedef Kesiim Dikdrtgeni Piksel Seviyesi arpma dikdrtgeni iindeki pikseller Sprite arpma dikdrtgenleri karlatrlr karlatrlr Spritein arpma dikdrtgeni iindeki Spriten arpma dikdrtgeni ve TiledLayer pikseller ile TiledLayer iindeki pikseller TiledLayern Tilelar karlatrlr karlatrlr Spritein arpma dikdrtgeni iindeki Spriten arpma dikdrtgeni ve Image pikseller ile Image iindeki pikseller Imagein snrlar karlatrlr karlatrlr Spritelerin Kopyalanmas :
Sprite snfnn bir kopya yaplandrcs vardr: public Sprite(Sprite s);
Bu dndnzden ok daha gldr. Orjinalinin tm nitelikleri ile yeni bir Sprite oluturur: Source image frames (Kaynak image frameleri) Frame sras(sequence) Geerli(current) frame Geerli(current) dnm/dndrme(transformation) Referans piksel noktas arpma(Collision) dikdrtgeni zel Efektler :
zel efekt metotlarnn yalnzca Game Apde bulunmas ile snrlandrlmam, Display snfnda da ok yakn ilikili iki metot bulunmaktadr: public boolean flashBacklight(int duration); public boolean vibrate(int duration);
Her iki metot da milisaniye(millisecond) cinsinden duration(devam sresi) kabul ederek, cihazn arka nn ne kadar sre ak kalm olaca veya ne kadar sre titreecei belirlenir. Her iki metot da cihazn bu zellikleri destekleyip desteklememesine gre true veya false deerleri geri dndrr. Ufak Bir Uygulama ile Hepsini Bir Arada Grelim :
QuatschCanvas ile Game APIde grdmz bir ok zellii bir arada grebiliriz:
GameCanvas iindeki animasyon dngsnn kullanm GameCanvas kullanlarak tu durumlar iin polling(tu durumlarn yakalama oklu katmanlarn durumunu muhafaza iin bir LayerManager kullanm Bir Sprite ve TiledLayerlar oluturma Deien frame sras ve dnmlerin bulunduu bir hareketli Sprite TiledLayer iinde bir hareketli Tile kullanm
Uygulama ekranda aadaki gibi grnr:
QuatschCanvas iin: ...... ...... ...... ......
Find millions of documents on Course Hero - Study Guides, Lecture Notes, Reference Materials, Practice Exams and more.
Course Hero has millions of course specific materials providing students with the best way to expand
their education.
Below is a small sample set of documents:
Miami University - ENT - 252
ME 322 - Professor Molian's Lecture Notes on10/5/10 11:45 PMME 322 - Professor Molian's Lecture Notes onCOMPUTER NUMERICAL CONTROL1 Introduction 2 Elements of CNC 3 Types of Control Systems 4 Precision in CNC Machining 5 Principles of CNC 6 CNC Progra
LSU - KIN - 3513
TheMeasurementof ClicktoeditMastersubtitlestyle MotorPerformance10/6/10Whystudythemeasurementof Motorperformance?Themeasurementofperformanceis essentialfor: Performanceassessment/evaluation Motorcontrolandlearningresearch Trackingprogress(deteriorati
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz $ (Chapters 12, 13) Facilitator: Randolph A. StanleyStudent Name: LIEN BACH Grade:_ Instructions: Please answer all questions. Each question worth 1point for a total of 25poin
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz 2 (Chapters 15-16) Facilitator: Randolph A. StanleyStudent Name: Lien Bach 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. A B C D B
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz 3 (Chapters 7,8) Facilitator: Randolph A. StanleyStudent Name: LIEN BACH Grade:_ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. C D B D C D C C B C D D
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz $ (Chapters 12, 13) Facilitator: Randolph A. StanleyStudent Name: LIEN BACH Grade:_ Instructions: Please answer all questions. Each question worth 1point for a total of 25poin
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz 1 (Chapters 1, 5, 6) Facilitator: Randolph A. StanleyStudent Name:_ Grade:_ Instructions: Please answer all questions. Each question worth 1point for a total of 25points. You
Phoenix - ACC - ACC561
AuntConniesCookies1AUNT CONNIE'S COOKIES Lien Bach University of Phoenix Accounting-ACC/561AuntConniesCookies2Connie Rocha started her businessAunt Connies Cookiesin 1986 after making cookies for a fundraiser event and receiving a great deal of posit
Phoenix - ACC - ACC561
Lemon Crme Unit 1000 900 800 Unit CM 0.94 0.94 0.94 Profit 670 576 482Chocorones Revenue Variable costs Fixed costs Total cost Operating profitsLabor-intensive operations 2250 1200 150 1350 900Equipment intensive operations 2250 750 600 1350 900Real M
Phoenix - ACC - ACC561
Guillermo Furniture Store Flexible Budget Items Flexible Budget fourmula Units Mid-grade High_end Revenue Mid-grade High_end Total Revenue Variable Costs: Direct Material Cost per unitMid-Grade High-EndFlexible Budgets Far various Levels Option 1 2700 4
Phoenix - ACC - ACC561
1Running Head: GUILLERMO FURNITURE STORE SCENARIOGuillermo Furniture Store Scenario Lien Bach University of Phoenix Accounting-ACC/5612GUILLERMO FURNITURE STORE SCENARIOGuillermo Navallez has built a furniture company providing the variety of tables
Phoenix - ACC - ACC561
Productionunit Price/Unit Sales Variablecost DirectMaterial DirectLabor Benefits Totalvariablecost Contributionmargin Contributionmarginratio Fixedcost Salaried Utiliities Insurance Propertytax Depreciaton Supplies TotalfixedcostMidgrade2800 509 1425200
Phoenix - ACC - ACC561
Week 1 In- Class Exercises1. Strangle Company manufactures ties. When 28,000 items are produced, the costs per unit are: Direct materials Direct manufacturing labor Variable manufacturing overhead Fixed manufacturing overhead Variable selling Fixed selli
Phoenix - ACC - ACC561
Week 2 Class Exercises 1.Below are the transactions for Newman Company: 1. The owners invested $10,000 cash in Newman Company. 2. Newman Company acquired equipment that cost $8,000. 25% of the balance was paid in cash with the balance as a note. 3. Newma
Phoenix - ACC - ACC561
Week 3 Class Exercises1. Frances Company produces only product A. The following information is available: Selling price per unit Variable costs per unit Total fixed costs Required: a. Compute break-even point in units. b. Compute break-even volume in dol
Phoenix - ACC - ACC561
Week 4 Class Exercise 1. The Drew Company has the following information: Month March April May June July Budgeted Sales $150,000 153,000 151,000 254,500 252,500In addition, the gross profit rate is 40% and the desired ending inventory level is 20% of nex
Phoenix - ACC - ACC561
Week 5 Class Exercises 1. Robert Companys power plant provides electricity for its two producing departments, A and B. The budget for the power plant shows the following: Budgeted fixed costs Budgeted variable costs per kilowatt hour Additional data are a
Phoenix - ACC - ACC561
Week 6 Class Exercise 1. The following information is available for Wildwood Consulting Company and its two offices: Euclid North Royalton Office Office Net sales $250,000 $400,000 Fixed costs: Controllable by division manager 78,000 48,000 Controllable b
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz 1 (Chapters 1, 5, 6) Facilitator: Randolph A. StanleyStudent Name:_ Grade:_ Instructions: Please answer all questions. Each question worth 1point for a total of 25points. You
Phoenix - ACC - ACC561
University of Phoenix, Northern Virginia Campus ACC 561 Accounting Course Quiz 2 (Chapters 15-16) Facilitator: Randolph A. StanleyStudent Name:_ Grade:_ Instructions: Please answer all questions. Each question worth 1point for a total of 25points. You mu
Phoenix - ACC - ACC561
Quiz 3 (Chapters 7-8) 1. _ budgeting is when budgets are formulated with the active participation of all affected employees a. b. c. d. 2. Financial Team Participative SharedBudgets are generally more effective if they are _. a. b. c. d. created with the
Phoenix - ACC - ACC561
Quiz 4 (Chapter 12-13) 1. Cost allocation base refers to the _. a. b. c. d. 2. cost driver total costs to be allocated total allocated costs cost objectives_ is not a type of cost allocation. a. b. c. d. Allocation of costs to the appropriate organizatio
Phoenix - ACC - ACC561
Setup Information Brian Lindquist Peso? (1=Yes) 0 0.08 1.00 10.814 Mexican Pesos = 1.000 US Dollars Income Information-Current Standards Current Production Mid-Grade High-End Direct Materials ($)/Unit Mid-Grade High-End Direct Labor ($/HR)/Unit Labor Time
Phoenix - ACC - ACC561
ACC/561 AccountingScenario: The Guillermo Furniture StoreWhile many people recognize Sonora, Mexico as a beautiful vacation spot, it is also a large furniture manufacturing location in North America. Guillermo Navallez has made furniture for years near
Phoenix - ACC - ACC561
CHAPTER10COST ANALYSIS FOR MANAGEMENT DECISION MAKINGReview Summary1. Absorption costing or full costing assigns direct materials and direct labor costs and a share of both fixed and variable factory overhead costs to units of production. In variable co
Phoenix - ACC - ACC561
Flex Budget 1Flex Budget Team B ACC/561 University of Phoenix May 11, 2008Flex Budget 2Flex Budget Analysis Guillermo Furniture production grew into a thriving enterprise that is now being threatened by foreign competition. Advanced production technolo
Phoenix - ACC - ACC561
Setup Information Brian Lindquist Peso? (1=Yes) 0 0.08 1.00 10.814 Mexican Pesos = 1.000 US Dollars Income Information-Current Standards Current Production Mid-Grade High-End Direct Materials ($)/Unit Mid-Grade High-End Direct Labor ($/HR)/Unit Labor Time
Phoenix - ACC - ACC561
ACC/561 AccountingScenario: The Guillermo Furniture StoreWhile many people recognize Sonora, Mexico as a beautiful vacation spot, it is also a large furniture manufacturing location in North America. Guillermo Navallez has made furniture for years near
Phoenix - ACC - ACC561
ACC/561 AccountingWeek One Content Outline: Decision MakingOBJECTIVE: Explain the role of budgets and performance reports in the management decisionmaking process. Resource: Ch. 1 of Introduction to Management Accounting ContentManagerial Accounting, t
Phoenix - ACC - ACC561
Management by Exception (pp . 1 1 -14)Importance of Ethics (pp . 8-10)Ch. 1 : Managerial Accounting the , Business Organization a nd , Professional Ethics (in Horngren, Sundem & Stratton )Evaluate the role of ethics in accounting decision making .Ch.
Phoenix - ACC - ACC561
ACC/561Week One Important Note to Students Greetings, class: This is a challenging course. Because this is a graduate course, you'll be required to work with unknowns, research new concepts, and apply theory to incomplete situations. Just like in the wor
Phoenix - ACC - ACC561
ACC/561 Student Road MapWeek OneStudent Road Map STUDENT ROAD MAP We designed this course to help you develop analytical skills as a manager and apply the tools necessary to make business decisions. Some objectives are linked to short tutorials that conn
Phoenix - ACC - ACC561
Week 1 In- Class Exercises1. Strangle Company manufactures ties. When 28,000 items are produced, the costs per unit are: Direct materials Direct manufacturing labor Variable manufacturing overhead Fixed manufacturing overhead Variable selling Fixed selli
Phoenix - ACC - ACC561
ACC/561Kymberly Polser, CPA I am a Phoenix . . .2007 Prentice Hall Business Publishing, Introduction to Management Accounting 14/e, Horngren/Sundem/Stratton1-1 2008PrenticeHallBusinessPublishing,IntroductiontoManagementAccounting14/e,Horngren/Sundem/St
Phoenix - ACC - ACC561
IntroductiontoManagementAccounting Chapter5RelevantInformationfor DecisionMakingwithaFocus onPricingDecisions08PrenticeHallBusinessPublishing,IntroductiontoManagementAccounting14/e,Horngren/Sundem/Stratton/Schatzberg/Burgstahler5 - 1 08PrenticeHallBusin
Phoenix - ACC - ACC561
IntroductiontoManagementAccounting Chapter6RelevantInformationfor DecisionMakingwithaFocus onOperationalDecisions08PrenticeHallBusinessPublishing,IntroductiontoManagementAccounting14/e,Horngren/Sundem/Stratton/Schatzberg/Burgstahler6- 1 08PrenticeHallBu
Phoenix - ACC - ACC561
ACC/561 AccountingWeek Two Content Outline: Financial StatementsOBJECTIVE: Apply the concepts, techniques, and conventions of basic financial accounting. Resource: Ch. 15 of Introduction to Management Accounting ContentBasic Accounting: Concepts, Techn
Phoenix - ACC - ACC561
Ch. 15: Basic Accounting: C oncepts, Techniques, and Conventions (in Horngren , Sundem & Stratton)Three Measurement Conventions (pp. 702705) Ch. 15: Basic Accounting: Concepts, Techniques, and Conventions (in Horngren, Sundem & Stratton)Apply the concep
Phoenix - ACC - ACC561
Review IASB Web site: http:/www.iasb.org/Home.htm Review FASB Web site: http:/www.fasb.org/Assessment
Phoenix - ACC - ACC561
Identifying resources , Activities, Costs, a nd Cost Drivers (pp. 4 648)Variable and Fixed C ost Behavior (pp. 48 -53)Management Influence on Cost Behavior (pp. 9 7-99)Cost Volume Profit Analysis (pp. 5 3-64) Ch. 2: Introduction to Cost Behavior and Co
Phoenix - ACC - ACC561
ACC/561 AccountingWeek Four Content Outline: BudgetsOBJECTIVE: Explain the major components, advantages, and disadvantages of a master budget. Resource: Ch. 7 of Introduction to Management Accounting ContentIntroduction to Budgets and Preparing the Mas
Phoenix - ACC - ACC561
Types of Budgets (pp. 304-305) Potential Problems in Implementing Budgets (pp. 299-304) Ch. 7 : Introduction to Budgets and Preparing the Master Budget (in H orngren, Sundem & Stratton)Ch. 7: Introduction to Budgets and Preparing the Master Budget(in H o
Phoenix - ACC - ACC561
ACC/561 AccountingWeek Five Content Outline: Cost AllocationOBJECTIVE: Explain the methods of cost allocation. Resource: Ch. 12 of Introduction to Management Accounting ContentCost Allocation (in Horngren, Sundem, Stratton, Burgstahler, & Schatzberg)o
Phoenix - ACC - ACC561
Accounting for Factory Overhead (pp . 590 - 591 )Ch. 12: C ost Allocation ( in Ch. 1 3: Accounting forH orngren , Sundem & Stratton )Overhead Costs ( in H orngren , Sundem & Stratton )Explain the methods of c ost allocation.Analyze how factory overhe
Phoenix - ACC - ACC561
ACC/561 AccountingWeek Six Content Outline: Performance ManagementOBJECTIVE: Evaluate how managers use control systems to achieve organizational goals. Resource: Ch. 9 of Introduction to Management Accounting ContentManagement Control Systems and Respo
Phoenix - ACC - ACC561
Management Control Systems and Organizational Goals (pp. 386-388) Measures of Profitability (pp. 433435) Ch. 9: Management Control Systems and Responsibility Accounting (in Horngren, Sundem & Stratton)Ch. 10: Management Control in D ecentralized Organiza
Phoenix - ACC - ACC561
PrologueManagerial Accounting and the Business EnvironmentStudy SuggestionsaThe prologue describes important aspects of the contemporary business environment. While there are no written assignments, you should be familiar with the major ideas as backg
Phoenix - ACC - ACC561
AccordingtoBnet.com,Assetutilizationmeasuresacompanysabilitytomakebestuseofits resourcesandbyinference,thequalityofitsmanagement.Assetutilizationisalsocalled ReturnonAssets.Basedonthisratios,themanagementofacompanycanmeasurehowmuch moneytheygetreturnforev
Phoenix - ACC - ACC561
SERVICEDEPARTMENT X Y ZSQUAREFEET DIRECTDEPARTMENTCOSTS OCCUPIED 300000 225000 480000 10050006000 4000 3000 13000PRODUCTIONDEPARTMENT P1 P2750000 600000 13500008000 7000 15000DIRECTLABORFLOURS 13000 7000 6000 2600017000 15000 32000
Phoenix - ACC - ACC561
CHAPTER 8Budgeting for Planning and ControlLEARNING OBJECTIVESAfter studying this chapter, you should be able to: 1. Define budgeting and discuss its role in planning, controlling, and decision making. 2. Prepare the operating budget, identify its majo
Phoenix - ACC - ACC561
Guillermo Furniture Store Flex Budget University of Phoenix Introduction Cost relationship behaviors Areas of business decisions that are of great importance to discuss are how the cost behaviors at Guillermo can affect the decision making prerogatives an
Phoenix - ACC - ACC561
1._ refers to accounting information developed for managers within an organization.a. Internal auditing b. Managerial accounting c. Financial accounting d. Tax accounting 2. a. b. c. d. 3. Ethical accountants are important to society because _. they pay
Phoenix - ACC - ACC561
Month June July August September OctoberBudgeted Sales Cost of Good Sold Ending Inventory Level 68000 44200 18000 72000 46800 18500 74000 48100 19000 76000 49400 19500 78000 50700Beginning Inventory Purchase Budget 18000 18500 19000 47300 48600 49900Ap
Phoenix - ACC - ACC561
LIEN BACH Problem Set 3 1. The following information is available for Animal Company and its two divisions, Reptiles and Mammals: Company as a whole Net sales Fixed costs: Controllable by division managers Controllable by others Variable costs: Cost of me
Phoenix - ACC - ACC561
Net Sales Variable Costs Cost of merchandise managers Operating Expenses Total variable costs Contribution margin Less: fixed costs controllable by division managers Contribution Controllable by managers Less: fixed costs controllable by others Contributi
Phoenix - ACC - ACC561
LIENBACH ProblemSet11. TexasCompany AdditionalCost:2,000*(15+45+25)=170,000 AdditionalRevenue:2,000*120=240,000 Profit:240,000170,000=70,000 Conclusion:Iftheorderwereaccepted,theoperatingincomeofTexasCompany wouldincrease70,000.2. GeorgiaCompany Sales:1
Phoenix - ACC - ACC561
Course Syllabus ACC/561 Please print a copy of this syllabus for handy reference.University of PhoenixWhenever there is a question about what assignments are due, please remember this syllabus is considered the ruling document. Please note that the inst
Phoenix - ACC - ACC561
Team A (Christ, Kat, Lien, Mike, Sophia) Team exercise set 1 1. Wildwood Corporation: a) Contribution margin unit =17.55 Unit sales price-unit variable costs=68.50-50.95=17.55b) Contribution margin ration=25% Contribution margin ration=contribution margi
Phoenix - ACC - ACC561
The break-even point for a product is the point where total revenue received equals the total costs associated with the sale of the product (TR=TC). [1]A break-even point is t ypically calculated in order for businesses to determine if it would be profita
Phoenix - ACC - ACC561
In what ways do the elements of the four financial statements (The four main financial statements being: balance sheet, the income statement, the statement of cash flows, and the statement of changes in owners equity.) interact with one another? How might
Phoenix - ACC - ACC561
Write a 1050-word paper discussing how differences in the industries and different measurement conventions (IASB and FASB) affect presentations. If one of the companies uses the cash basis of accounting, how would that differ from the accrual basis? If yo