시소당
import java.awt.MediaTracker;
import java.awt.Image;
import java.applet.Applet;
import java.net.URL;
public class ImageLoader implements Runnable {
private static ImageLoader m_this;
private Hashtable m_images;
private MediaTracker m_tracker;
private int m_nTotal;
private int m_nLoaded;
private Thread m_thread;
private ImageLoader () {
m_images = new Hashtable ();
}
// Get instance
public static ImageLoader getInstance () {
if (m_this == null) {
m_this = new ImageLoader ();
}
return m_this;
}
// Load images
public void load (Applet applet, URL url, String dir, String [] name) {
m_tracker = new MediaTracker (applet);
m_nTotal = name.length;
m_nLoaded = 0;
Image img = null;
for (int i = 0; i < m_nTotal; i ++) {
img = applet.getImage (url, dir + "/" + name [i]);
m_tracker.addImage (img, i);
m_images.put (name [i], img);
}
m_thread = new Thread (this);
m_thread.start ();
}
// Get Image
public Image getImage (String name) {
return (Image) m_images.get (name);
}
// Get loading rate
public int getLoadRate () {
return (int) (100 * m_nLoaded / m_nTotal);
}
// run ()
public void run () {
for (int i = 0; i < m_nTotal; i ++) {
try {
m_tracker.waitForID (i);
} catch (InterruptedException e) {
} // End of try-catch
while ((m_tracker.statusID (i, true) & MediaTracker.COMPLETE) == 0) {}
m_nLoaded ++;
try {
Thread.sleep (50);
} catch (InterruptedException e) {
} // End of try-catch
} // End of for (i)
} // End of run ()
} // End of ImageLoader class
MediaTracker class 는 각종 미디어(AudioClip, Image)의 상태를 추적하고 감시하는 기능을 가진 유틸리티 클래스입니다.
MediaTracker객체 생성시 미디어가 출력될 컴퍼넌트 객체를 인수로 넘겨 주어야 추적 대상이 되구요, 말 그대로. 미디어를 추적하는 것으로서 이미지 로딩의 상태를 추적할 수 있는 방법들을 제공합니다.
이 클래스를 사용하면 필요한 이미지들을 쉽게 다운로드 받을수 있고, 이미지들이 모두 로딩되는 시점을 알수 있습니다.
그러니가.서버에서 이미지를 다운 받아서 그려지게 될때. 이 클래스를 사용하게 되면 다운로드가 되기전에 그려지는(이미지의 일부분만 그려지는..) 문제점이 해결되는 것입니다.
게임에서 사용되는 모든 이미지들을 다운로드하고 로딩한후에 사용할 수가 있습니다.^^
-----------------------------------------------------------------------------------------------------
MediaTracker 를 사용하는 경우는 대부분 애플릿에서 사용을 하구요,
애플릿은 클라이언트의 브라우저에서 실행되죠.
그런데 지도애플릿이 있어서 아주 큰 이미지를 읽어들어야 한다면
Mediatracker 를 사용해야 합니다.
사용 안하면 어떻게 되는가?
애플릿은 서버로부터 이미지가 제대로 로딩됐는지 확인도 안하고
그냥 자기 할일을 계속 해버립니다.
이미지가 없어서 못받은 건지, 아니면 받다가 삑사리가 나서 깨진건지,
그것도 아니면 너무 커서 시간이 더 필요한 건지....
이딴거 생각하지도 않고 애플릿이 실행되어 버리니까
이미지가 안나오는 경우가 발생합니다.
이미지가 작으면 다행스럽게도 보일 수가 있는데(시간이 적게 걸리니까) 1 메가만 넘어도 아마 백발백중 실패하게 됩니다.
for (int i = 0; i < m_nTotal; i ++) {
try {
m_tracker.waitForID (i);
} catch (InterruptedException e) {} // End of try-catch
while ((m_tracker.statusID (i, true) & MediaTracker.COMPLETE) == 0) {}
m_nLoaded ++;
try {
Thread.sleep (50);
} catch (InterruptedException e) {} // End of try-catch
} // End of for (i)
여기서 m_tracker.waitForID (i); 이부분이 i 번째 이미지를 기다리는 겁니다.
그리고 while 문에서 잘 로딩되었는지를 확인해서 이상이 없으면
로딩된 숫자를 하나 증가시키는 거죠...
선사에서 이 클래스를 개발 할때는 이미지 뿐만 아니라 사운드나 기타 다른 파일까지도 통합하겠다고 했는데 아직까지도 이미지만 가능한 것 같아요...