İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır
Onder Teker
on_der_tek_er@yahoo.com

Game Applet Örneği

Bu applet, az bir kod'la yazılmış olmasına ve basitliğine rağmen, bir oyunda olması gereken temel özellikleri barındırmaktadır. "Start" düğmesine basınca başlayan oyunda klavye tuşları dinlenmekte ve ok tuşlarına göre bir person image'ı hareket ettirilmektedir. Person image'ı cake image'ına gelince cake image'ı kaybolmaktadır. Bu durumda cake 'yenmiş' olur.

Oyuna Başlama

Applet'te 'Start' düğmesi dinleniyor. ActionListener'a ait actionPerformed methodunun içine düğmeye basıldığında yapılacaklar yazılıyor.

	public void actionPerformed(ActionEvent e){
		gameStarted=true;
		repaint();
		startButton.transferFocus();
		requestFocus();
	}

Burada işlem sadece gameStarted property'sini true yapmak ve yeniden paint etmek.

Focus (Odak), kullanıcının klavyesini dinleyen componente olmalı. İl olarak button'da olan focus, düğmeden applete transfer ediliyor. Buradaki startButton.transferFocus() ifadesi düğmenin focus'u iade etmesi için, requestFocus() da appletin focusu alması için. Aksi taktirde KeyEvent'ler düğmeye gider. Halbuki biz appletin key eventlerini dinliyoruz.

Her repaint sonucunda paint çağrılıyor ve yeni durum için (gameStarted==true için) tekrar paint yapılıyor.

	if(gameStarted){
		paintPerson(g);
		if(!cakeEaten){
			paintCake(g);
		}
	}

Başlangıçta gameStarted=false olduğu için Image'lar düğmeye basılmadan önce çizilmiyor. Sonradan gameStarted=true yapılıp yeninde çizim yapıldığında bu kez çiziliyor. Görüldüğü gibi appletlerde çalışma şekli, durumu değiştirip tekrar çizmek suretiyle gerçekleştiriliyor.

Image'ların Çizilmesi

Image ve AudioClip nesneleri applet'in init() method'unda yükleniyor :

	personImage=getImage(getCodeBase(),"person.gif");
	cakeImage=getImage(getCodeBase(),"cake.gif");
	eatingAudio=getAudioClip(getCodeBase(),"eating.au");	  

Applet'in paint method'unda Person ve Cake'i paint eden methodlar çağrılıyor.

	paintPerson(g);
	if(!cakeEaten){
		paintCake(g);
	}

Cake'i çizem method cakeEaten property'sinin false olması durumunda çalışıyor (!false=true). Bu property true olduğunda !true = false olacağında paintCake methodu hiç çağrılmaz. Bir image'ın belli bir duruma göre çizilip çizilmemesi animasyon etkisi yaratılmış olur.

Klavyeyi Dinleme

KeyListener'ı implement etmek için yazmak zorudna olduğumuz method'lardan keyPressed içerisinde basılan key'e göre bir işlem yapılıyor.

	if(gameStarted){
		int code=e.getKeyCode();
		if(code == KeyEvent.VK_RIGHT){
			movePerson(1,0);
		}else if (code == KeyEvent.VK_LEFT){
			movePerson(-1,0);
		}else if (code == KeyEvent.VK_DOWN){
			movePerson(0,1);
		}else if (code == KeyEvent.VK_UP){
			movePerson(0,-1);
		}
	}

Elbette öncelikle gameStarted property'sinin true olması gerekiyor. KeyEvent'ten key code' alınıyor ve ok tuşlarından hangisi olduğuna bakılıyor. Key code'larını herkesin bilmesi zor olduğu için KeyEvent class'ında VK_RIGHT,VK_LEFT,VK_UP, VK_DOWN gibi sabitler karşılaştırma için kullanılıyor. Key code'u bunlardan biriyse movePerson methodu çağrılıyor.

Hareket Etme

Applet'teki movePerson methodu hareket etmeyi sağlayan işlemleri yapıyor.

	private void movePerson(int dx,int dy){
		personPoint.translate(dx,dy);
		boolean canEat=canEatCake();
		if(canEat){
			eatCake();
		}
		repaint();
	}

Aslında hareket için

	personPoint.translate(dx,dy);
	repaint();

yazmak yeterli. Point'in yerini değiştirip sonra tekrar çizmekten ibaret işlem .

Cake'i 'Yeme'

Appletteki movePerson metodunda cake'in yenilip yenmediği kontrol edilmesi gerekir. canEeatCake mehtod'u person'un şu anda cake'i yiyebilecek yakınlıkta olup olmadığını test ediyor.

	private boolean canEatCake(){
		int dx=Math.abs(personPoint.x-cakePoint.x);
		int dy=Math.abs(personPoint.y-cakePoint.y);
		return dx<20 && dy<20;
	}

eatCake'le yapılan cake'i 'yemek'. Elbette işlem sadece cakeEaten property'sini true yapmaktan ibaret. Ses çalarak ve ses kartı olmayanlar için de 'beep' yaparak sadece kullanıcının dikkati çekiliyor.

Deployment

Applet

	<applet code="com.godoro.samples.applet.GameApplet.class"
	  width="400" height="400"
	>
	</applet>

şeklinde bir HTML sayfasına gömüldü. Bu örneğe göre HTML class'larla aynı yerde olmalıdır. Ancak GameApplet.html, GameApplet.class'ının olduğu yerde değil, class'ların kök dizininde olması lazım. Aynı şekilde kullanılan resource'lar (Image veya AudioClip) aynı yerde olmalı. Dizin yapısı :

	com
		godoro
			samples
				applets
					GameApplet.class
	GameApplet.html
	person.gif
	cake.gif
	eating.au

şeklinde olmalı. Aşağıdaki zip herhangi bir kalsöre açılırsa yukarıdaki yapı elde edilir.

Bütün dosyalar GameApplet.zip'te

Kod

Applet Java kodu :

Göster Gizle Kopar Satır Gizle Satır Göster
  1 package com.godoro.samples.applet;
  2 import java.applet.*;
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 public class GameApplet
  6     extends Applet
  7     implements ActionListener, KeyListener
  8 {
  9   private boolean gameStarted=false;
 10   private Button startButton=new Button("Start");
 11   private Image personImage=null;
 12   private Point personPoint=new Point(100,300);
 13   private Image cakeImage=null;
 14   private Point cakePoint=new Point(200,200);
 15   private boolean cakeEaten=false;
 16   private AudioClip eatingAudio=null;
 17   public void init(){
 18     addKeyListener(this);
 19     startButton.addActionListener(this);
 20     add(startButton);
 21     personImage=getImage(getCodeBase(),"person.gif");
 22     cakeImage=getImage(getCodeBase(),"cake.gif");
 23     eatingAudio=getAudioClip(getCodeBase(),"eating.au");
 24   }
 25   public void paint(Graphics g){
 26     g.drawString("Cake Eater Game",25,25);
 27     if(gameStarted){
 28       paintPerson(g);
 29       if(!cakeEaten){
 30         paintCake(g);
 31       }
 32     }
 33   }
 34   private void paintPerson(Graphics g){
 35     g.drawImage(personImage,personPoint.x,personPoint.y,this);
 36   }
 37   private void paintCake(Graphics g){
 38     g.drawImage(cakeImage,cakePoint.x,cakePoint.y,this);
 39   }
 40   private void movePerson(int dx,int dy){
 41     personPoint.translate(dx,dy);
 42     boolean canEat=canEatCake();
 43     if(canEat){
 44       eatCake();
 45     }
 46     repaint();
 47   }
 48   private boolean canEatCake(){
 49     int dx=Math.abs(personPoint.x-cakePoint.x);
 50     int dy=Math.abs(personPoint.y-cakePoint.y);
 51     return dx<20 && dy<20;
 52   }
 53   private void eatCake(){
 54     eatingAudio.play();
 55     Toolkit.getDefaultToolkit().beep();
 56     cakeEaten=true;
 57   }
 58   public void actionPerformed(ActionEvent e){
 59     gameStarted=true;
 60     repaint();
 61     startButton.transferFocus();
 62     requestFocus();
 63   }
 64   public void keyTyped(KeyEvent e){
 65   }
 66   public void keyPressed(KeyEvent e){
 67     System.out.println("gameStarted : "+gameStarted);
 68     if(gameStarted){
 69       int code=e.getKeyCode();
 70       System.out.println("code : "+code);
 71       if(code == KeyEvent.VK_RIGHT){
 72         movePerson(1,0);
 73       }else if (code == KeyEvent.VK_LEFT){
 74         movePerson(-1,0);
 75       }else if (code == KeyEvent.VK_DOWN){
 76         movePerson(0,1);
 77       }else if (code == KeyEvent.VK_UP){
 78         movePerson(0,-1);
 79       }
 80     }
 81   }
 82   public void keyReleased(KeyEvent e){
 83   }
 84 }

Oyun

Oyunu Oynamak İçin : Game Applet.html'i tıklayın.

Dosya Listesi

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