İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır

MIDP 2.0 Game(Oyun) Paketi

MIDP 2.0 sadece oyun geliştiriciler için geliştirilmiş bir paket içermekte: javax.microedition.lcdui.game

Bu pakette 5 class var.

GameCanvas

GameCanvas Canvas class'înı extends etmiştir. abstract class olmasından dolayı nesnesi yaratılamaz. Extends edilmek zorundadır.

getGraphics ile Graphics nesnesi alınarak çizim yapılır. Ancak çizim hafızadaki bir Graphics nesnesine çizilir. Tüm çizim işlemleri tamamlandığında flushGraphics() method'u çağrılarak tüm ekran tek seferde çizilir.

getKeyStates() ile tuşun durumunu verir. Alınan değer aşağıdaki yöntemler hangi tuş olduğu anlaşılır.

      if((getKeyStates()&LEFT_PRESSED)!=0){
		//sola basıldı
      }else if((getKeyStates()&RIGHT_PRESSED)!=0){
		//sağa basıldı
      }else if((getKeyStates()&UP_PRESSED)!=0){
		//yukarı tuşuna basıldı
      }else if((getKeyStates()&DOWN_PRESSED)!=0){
		//aşağı tuşuna basıldı
      }

Eğer getKeyStates() ile LEFT_PRESSED 1 değilse sunuç 0 olur. Bu şekilde sol tuşuna basılmadığı anlaşılır.

Aşağıdaki örnekte bir resim gösteriyoruz. Bu resim sol,sağ,yukarı ve aşağı yön tüşları ile hareket ettirilmektedir. GameCanvas'ı extend eden bir MoveCanvas class'ı yaratılmıştır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 import javax.microedition.lcdui.game.*;
  4 import java.util.*;
  5 public class GameCanvasTest extends MIDlet{
  6   MoveCanvas canvas;
  7   public GameCanvasTest(){
  8     try{
  9       Image image = Image.createImage("/test.png");
 10       canvas=new MoveCanvas(image);
 11     }catch(Exception e){
 12       e.printStackTrace();
 13     }
 14   }
 15   protected void startApp(){
 16       Display.getDisplay(this).setCurrent(canvas);
 17   }
 18   protected void pauseApp(){}
 19   protected void destroyApp(boolean boolean0){}
 20   class MoveCanvas extends GameCanvas{
 21     Image image;
 22     int x,y;
 23     public MoveCanvas(Image image){
 24       super(true);
 25       this.image=image;
 26       TimerTask task=new TimerTask(){
 27         public void run(){
 28           refresh();
 29         }
 30       };
 31       Timer timer=new Timer();
 32       timer.schedule(task,new Date(),100);
 33     }
 34     public void refresh(){
 35       if((getKeyStates()&LEFT_PRESSED)!=0){
 36         x--;
 37       }else if((getKeyStates()&RIGHT_PRESSED)!=0){
 38         x++;
 39       }else if((getKeyStates()&UP_PRESSED)!=0){
 40         y--;
 41       }else if((getKeyStates()&DOWN_PRESSED)!=0){
 42         y++;
 43       }
 44       Graphics g=getGraphics();
 45       clear(g);
 46       g.drawImage(image,x,y,Graphics.LEFT|Graphics.TOP);
 47       flushGraphics();
 48     }
 49     private void clear(Graphics g){
 50       g.setColor(255,255,255);
 51       g.fillRect(0,0,getWidth(),getHeight());
 52     }
 53   }
 54 }

Midlet bir image'ı resource'dan yükler ve MoveCanvas'a verir. startApp'da görüldüğü gibi canvas ekranda gösterilir. MoveCanvas bir timer bulundurur. Bu timer her 100 ms'de ekranı yeniden çizer.

Çizerken hangi tuşa basılmış olduğunu öğrenir ve ona göre resmin orjinini değiştirir.

Graphics g=getGraphics();
clear(g);
g.drawImage(image,x,y,Graphics.LEFT|Graphics.TOP);
flushGraphics();

Resmin orjini değiştirildikten sonra ekrana çizilmesi gerekir. Bunun için canvas'ın Graphis nesnesi alınır. Ekran temizlenir. (clear method'u ile). Image graphics'e çizilir. flushGraphics() ise tüm çizlenlerin ekranda gözükmesini sağlar.

Sprite Class'ı

Sprite class'ı Layer class'ını extend etmiştir. Verilen bir resmin ekranda layer şeklinde gözükmesini sağlar. Verilen resim birden fazla dikdörtgensel olarak bölünüp arkaya arkaya gösterilmesi sağlanabilir. Sprite ile animasyon yapmak son derece kolaydır. Yine Sprite class'ı ile bir resmi belli açılarda ve ve belli bir noktaya göre döndürülebilir.

Layer'den extend edip yeni bir layer yaratamassınız. Layer'in public bir kurucusu yoktur. protected bir kurucusu vardır ve sadece aynı paketteki class'lar Layer'i extends edebilirler.

Aşağıdaki örnekte bir Spite nesnesi yaratıyoruz. Bu nesneyeye verdiğimiz resim 100-20'lik bir resim. Bu resmi 5 parçaya bölüyoruz ve her çizimde bir parçasını çiziyoruz. Bu şekilde bir animasyon elde etmiş oluyoruz.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 import javax.microedition.lcdui.game.*;
  4 import java.util.*;
  5 public class AnimationTest extends MIDlet{
  6   AnimationCanvas canvas;
  7   public AnimationTest() {
  8     try{
  9       Image image = Image.createImage("/all.png");
 10       canvas=new AnimationCanvas(image);
 11     }catch(Exception e){
 12       e.printStackTrace();
 13     }
 14   }
 15   protected void startApp(){
 16     Display.getDisplay(this).setCurrent(canvas);
 17   }
 18   protected void pauseApp(){
 19   }
 20   protected void destroyApp(boolean boolean0){
 21   }
 22   class AnimationCanvas extends GameCanvas{
 23     Sprite sprite;
 24     public AnimationCanvas(Image image) {
 25       super(true);
 26       sprite = new Sprite(image,20,20);
 27       sprite.setPosition(10,10);
 28       TimerTask task = new TimerTask() {
 29         public void run(){
 30           refresh();
 31         }
 32       };
 33       Timer timer = new Timer();
 34       timer.schedule(task, new Date(), 500);
 35     }
 36     public void refresh(){
 37       Graphics g = getGraphics();
 38       clear(g);
 39       sprite.paint(g);
 40       flushGraphics();
 41       sprite.nextFrame();
 42     }
 43     private void clear(Graphics g) {
 44       g.setColor(255, 255, 255);
 45       g.fillRect(0, 0, getWidth(), getHeight());
 46     }
 47   }
 48 }

sprite = new Sprite(image,20,20);

satır ile bir Sprite nesnesi yaratıyoruz ve bir frame(pencere)'nin boyutlarının 20-20 olduğunu söylüyoruz.

sprite.setPosition(10,10);

ile10,10 noktasında gözükmesini sağlıyoruz. Bir timer yaratıp ekranın sürekli güncellenmesi sağlıyoruz. refresh() method'u bu işi yapmaktadır.

sprite.paint(g); ile sprite nesnesi ekrana çizilir. Çizildikten sonra

sprite.nextFrame();

diyerek diğer frame'e geçilir. Tekrar sprite çizildiğinde ekranda yeni frame çizilecektir.

TiledLayer Class'ı

TiledLayer bir dikdörtgen alanı ızgara şeklinde hücrelere böler. Bu hücrelere istenilen resim koyulabilir. TiledLayer tek bir resmin birbirine eşit dikdörtgen şeklinde bölebilir. Bu dikdörtgenlere numara ile erişip resimleri hücrelere yerleştirebilirsiniz. Örneğin 100x20 lik bir resmi 5 parçaya bölerseniz 20x20 frame'ler elde edersiniz. İşte bu parçalar TiledLayer ile istenildiği kadar kullanılabilir. Aşağıdaki örnekte 100x20'lik bir resmimiz var. 20x20'lik 5 resim kullanacağız. Önce 8 satır ve 8 sütun genişliğinde bir ızgara yaratıyoruz. Bu dikdörtgenin her kenarını faklı bir resimle dolduruyoruz. En ortaya 5. resmi koyuyoruz.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 import javax.microedition.lcdui.game.*;
  4 import java.util.*;
  5 public class TiledLayerTest extends MIDlet{
  6   RoomCanvas canvas;
  7   public TiledLayerTest() {
  8     try{
  9       Image image = Image.createImage("/all.png");
 10       canvas=new RoomCanvas(image);
 11     }catch(Exception e){
 12       e.printStackTrace();
 13     }
 14   }
 15   protected void startApp(){
 16     Display.getDisplay(this).setCurrent(canvas);
 17   }
 18   protected void pauseApp(){
 19   }
 20   protected void destroyApp(boolean boolean0){
 21   }
 22   class RoomCanvas extends GameCanvas{
 23     Sprite sprite;
 24     public RoomCanvas(Image image) {
 25       super(true);
 26       TiledLayer room=new TiledLayer(8,8,image,20,20);
 27       room.setPosition(0,0);
 28       room.fillCells(0,0,8,1,1);
 29       room.fillCells(0,0,1,8,2);
 30       room.fillCells(7,0,1,8,3);
 31       room.fillCells(0,7,8,1,4);
 32       room.setCell(3,3,5);
 33       Graphics g = getGraphics();
 34       clear(g);
 35       room.paint(g);
 36       flushGraphics();
 37     }
 38     private void clear(Graphics g) {
 39       g.setColor(255, 255, 255);
 40       g.fillRect(0, 0, getWidth(), getHeight());
 41     }
 42   }
 43 }

TiledLayer room=new TiledLayer(8,8,image,20,20);

ile yeni bir TiledLayer yaratıyoruz. 8 satır ve 8 sütundan oluşacak. Her hücrenin genişiliği 20x20 olacak. Bu değer ile aynı zamanda resim 20x20 lik frame'lere ayrılır. Verilen resim 100x20 olduğu için 5 resim elde edilir.

room.fillCells(0,0,8,1,1);
room.fillCells(0,0,1,8,2);
room.fillCells(7,0,1,8,3);
room.fillCells(0,7,8,1,4);
room.setCell(3,3,5);

ile resimler TiledLayer'in hücrelerine konulur. setCell tek bir hücreye bir resim koymak için kullanılır. Örnekte 3.satır ve 3.sütuna 5. resmi koyuyoruz. fillCells ise verilen satır ve sütundan başlayarak verilen satır ve sütun sayısı kadar aynı resmi doldurmak için kullanılır. Örneğin ilk işlemde 0. sütun ve 0. satırdan 8 sütun ve 1 satır kadar 1. resim koyulur. Bu ilk dikdörtgenin üst kenarıdır. Diğer kenarlarda bu şekilde eklenir.

LayerManager Class'ı

Birden fazla layer nesnesini yönetmek için kullanılır. Örneğin eklenen layerleri index'ine göre sırayla ekrana çizer. index'i büyük olan küçük olanın her zaman önünde çizilir. LayerManager telefonun ekranından büyük olan layer'leri görüntüleme özelliğine de sahiptir. Bunun için setViewWindow() method'u kullanılır. Bu method ile ekranda gözüken kısm bir layer'in belirli bir dikdörtgeni olabilir. Bu özellik birden fazla layeri olan oyunlar için kullanılabilir. Örneğin tüm oyun ortamı ekrana sığmaz. Oyun içinde kullanıcı sağa doğru hareket ettirildiğinde ekran sola kaydırılır. Böylece kullanıcı ortamda dolaşıyormuş görüntüsü elde edilebilir.

Aşağıda örnekte 1000 hücrelik bir TiledLayer yaratıyoruz. Bu yolu temsil ediyor. Bir Sprite nesnesi ekliyoruz. Bu sprite sol ve sağ tuşlarına basılarak hareket ettiriliyor. Hareket edildiği zaman yol tam tersine hareket ettirilmekte. Bu da sprite'nın yürüdüğü gibi bir görüntüye sebep olmaktadır.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.midlet.*;
  2 import javax.microedition.lcdui.*;
  3 import javax.microedition.lcdui.game.*;
  4 import javax.microedition.lcdui.Graphics;
  5 import java.util.*;
  6 public class LayerManagerTest extends MIDlet{
  7   GamePanelTest test;
  8   public LayerManagerTest(){
  9     try{
 10       Image image = Image.createImage("/test.png");
 11       Image imageRoad = Image.createImage("/road.png");
 12       Sprite hero=new Sprite(image);
 13       TiledLayer road=new TiledLayer(1000,1,imageRoad,10,9);
 14       road.fillCells(0,0,999,1,1);
 15       test=new GamePanelTest(hero,road);
 16     }catch(Exception e){
 17       e.printStackTrace();
 18     }
 19   }
 20   protected void startApp(){
 21     Display.getDisplay(this).setCurrent(test);
 22   }
 23   protected void pauseApp(){}
 24   protected void destroyApp(boolean boolean0){}
 25   class GamePanelTest extends GameCanvas{
 26     Sprite hero;
 27     TiledLayer road;
 28     LayerManager manager;
 29     public GamePanelTest(Sprite hero,TiledLayer road){
 30       super(true);
 31       this.hero=hero;
 32       this.road=road;
 33       manager=new LayerManager();
 34       manager.append(road);
 35       manager.append(hero);
 36       hero.setPosition(50,50);
 37       manager.setViewWindow(0,0,getWidth(),getHeight());
 38       TimerTask task=new TimerTask(){
 39         public void run(){
 40           refresh();
 41         }
 42       };
 43       Timer timer=new Timer();
 44       timer.schedule(task,new Date(),100);
 45     }
 46     int level=1;
 47     public void refresh(){
 48       if((getKeyStates()&LEFT_PRESSED)!=0){
 49         hero.move(-1,0);
 50       }else if((getKeyStates()&RIGHT_PRESSED)!=0){
 51         hero.move(1,0);
 52       }
 53       Graphics g=getGraphics();
 54       clear(g);
 55       manager.setViewWindow(hero.getX()-50,0,getWidth(),getHeight());
 56       manager.paint(g,0,0);
 57       flushGraphics();
 58     }
 59     private void clear(Graphics g){
 60       g.setColor(255,255,255);
 61       g.fillRect(0,0,getWidth(),getHeight());
 62       g.setColor(0,0,0);
 63     }
 64   }
 65 }

Sprite hero=new Sprite(image);

ile br sprite nesnesi yaratıp onu 50,50 noktasına koyuyoruz.

TiledLayer road=new TiledLayer(1000,1,imageRoad,10,9);
road.fillCells(0,0,999,1,1);

ile 1000 hücrelik bir yol yaratıyoruz. Kahraman bu yol buyunca yürüyecek.

manager=new LayerManager();
manager.append(road);
manager.append(hero);

ile LayerManager yaratıp kahramanı ve yolu ekliyoruz. Bir timer ile sürekli ekran güncellenmektedir.

if((getKeyStates()&LEFT_PRESSED)!=0){
	hero.move(-1,0);
}else if((getKeyStates()&RIGHT_PRESSED)!=0){
	hero.move(1,0);
}

ile kahraman sağa ve sola hareket ettrilmektedir. Kahraman her haraket etttiğinde x değişmektedir. Bu yüzden gözüken kısım hahramanın tam tersi yönünde kaydırılmalıdır.

manager.setViewWindow(hero.getX()-50,0,getWidth(),getHeight());

ile bu işlem yapılır. Kahramanın x'i ne olursa olsun kahraman ortada gözükecektir.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonraki YokSon
Geriİleri
Yazdır