Anda di halaman 1dari 17

1.

Tujuan
● Setelah mempelajari modul ini peserta diharapkan dapat:
● Mengetahui jenis-jenis format image
● Mengetahui cara meload file image
● Memuat gambar strip atau gambar bernomor

2. Latar Belakang
Inti dari game 2 dimensi sebenarnya terletak pada image, dimana image yang telah
dibuat ataupun diedit dari program seperti adobe photoshop, corel draw dll, kemudian
diurutkan menjadi satu bentuk. Sebagai contoh sebuah pesawat yang untuh sampai pada
pesawat yang hancur atau meledak dikumpulkan menjadi satu kesatuan dan akan dipanggil
saat dibutuhkan (apabila terkena bom maka gambar pesawat yang ditampilkan meledak)
ilustrasinya seperti itu dan masih banyak lagi yang lain sesuai dengan game yang anda buat.

3. Percobaan
Percobaan 1: Membuat interface ImageSequenceListener

package jeni6;

public interface ImageSequenceListener


{
void sequenceEnded(String imageName);
}

Distributed by Meruvian Education


Percobaan 2 : Membuat class ImageManager

package jeni6;

import java.awt.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;
import javax.imageio.*;

public class ImageManager


{
private final static String IMAGE_DIR = "images/";

private HashMap imagesMap;


private String path;
private GraphicsConfiguration gc;

public ImageManager()
{ initManager(); }

public ImageManager(String imPath)


{
initManager();
path=imPath;
}

private void initManager()


{
imagesMap = new HashMap();

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
path=IMAGE_DIR;
}

// --------- load a single image -------------------------------

public boolean loadSingleImage(String fnm)


{
String name = getPrefix(fnm);

if (imagesMap.containsKey(name)) {
System.out.println( "Error: " + name + "sudah digunakan");
return false;
}

Distributed by Meruvian Education


BufferedImage bi = loadImage(fnm);
if (bi != null) {
ArrayList imsList = new ArrayList();
imsList.add(bi);
imagesMap.put(name, imsList);
System.out.println(" disimpan " + name + "/" + fnm);
return true;
}
else
return false;
}

// --------- load numbered images -------------------------------

public int loadNumImages(String fnm, int number)


{
String prefix = getPrefix(fnm);
String postfix = getPosfix(fnm);

String imFnm;
BufferedImage bi;
ArrayList imsList = new ArrayList();
int loadCount = 0;

if (imagesMap.containsKey(prefix)) {
System.out.println( "Error: " + prefix + "sudah digunakan");
return 0;
}

if (number <= 0) {
System.out.println("Error: Number <= 0: " + number);
imFnm = prefix + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);
System.out.println(" disimpan " + prefix + "/" + imFnm);
}
}
else { // load prefix + <i> + postfix, where i = 0 to <number-1>
System.out.print(" Menambahkan " + prefix + "/" +
prefix + "*" + postfix + "... ");
for(int i=0; i < number; i++) {
imFnm = prefix + i + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);

Distributed by Meruvian Education


public boolean loadSingleImage(String fnm)
{
String name = getPrefix(fnm);

if (imagesMap.containsKey(name)) {
System.out.println( "Error: " + name + "sudah digunakan");
return false;
}

BufferedImage bi = loadImage(fnm);
if (bi != null) {
ArrayList imsList = new ArrayList();
imsList.add(bi);
imagesMap.put(name, imsList);
System.out.println(" disimpan " + name + "/" + fnm);
return true;
}
else
return false;
}

// --------- load numbered images -------------------------------

public int loadNumImages(String fnm, int number)


{
String prefix = getPrefix(fnm);
String postfix = getPosfix(fnm);

String imFnm;
BufferedImage bi;
ArrayList imsList = new ArrayList();
int loadCount = 0;

if (imagesMap.containsKey(prefix)) {
System.out.println( "Error: " + prefix + "sudah digunakan");
return 0;
}

if (number <= 0) {
System.out.println("Error: Number <= 0: " + number);
imFnm = prefix + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);
System.out.println(" disimpan " + prefix + "/" + imFnm);
}
}
else { // load prefix + <i> + postfix, where i = 0 to <number-1>

Distributed by Meruvian Education


System.out.print(" Menambahkan " + prefix + "/" +
prefix + "*" + postfix + "... ");
for(int i=0; i < number; i++) {
imFnm = prefix + i + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);
System.out.print(" menambahkan " + name + "/" + fnm + "... ");
for (int i=0; i < strip.length; i++) {
loadCount++;
imsList.add(strip[i]);
System.out.print(i + " ");
}
System.out.println();

if (loadCount == 0)
System.out.println("Tidak ada image dengan prefix " + name);
else
imagesMap.put(name, imsList);

return loadCount;
} // end of loadStripImages()

private BufferedImage[] loadStripImageArray(String fnm, int column,int row)


{
if (column <= 0) {
System.out.println("column <= 0; returning null");
return null;
}

BufferedImage stripIm;
if ((stripIm = loadImage(fnm)) == null) {
System.out.println("Return null");
return null;
}

int imWidth = (int) stripIm.getWidth() / column;


int imHeight =(int) stripIm.getHeight()/row;

int transparency = stripIm.getColorModel().getTransparency();

BufferedImage[] strip = new BufferedImage[column*row];


Graphics2D stripGC;

for (int i=0;i<row;i++)


{
for(int j=i*column;j<(i+1)*column;j++)
{

Distributed by Meruvian Education


int fx=(j%column)*imWidth;
int fy=i*imHeight;

strip[j] = gc.createCompatibleImage(imWidth, imHeight, transparency);

stripGC = strip[j].createGraphics();
stripGC.setComposite(AlphaComposite.Src);

stripGC.drawImage(stripIm,0,0, imWidth,imHeight,
fx,fy, fx+imWidth,fy+imHeight,null);
stripGC.dispose();
}
}
return strip;
} // end of loadStripImageArray()

// ------------------ access methods -------------------

public BufferedImage getImage(String name)


{
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
System.out.println("Tidak ada image dengan nama " + name);
return null;
}

return (BufferedImage) imsList.get(0);


} // end of getImage() with name input;

public BufferedImage getImage(String name, int posn)


{
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
System.out.println("Tidak ada image dengan nama " + name);
return null;
}

int size = imsList.size();


if (posn < 0) {
return (BufferedImage) imsList.get(0); // return first image
}
else if (posn >= size) {
int newPosn = posn % size; // modulo
return (BufferedImage) imsList.get(newPosn);
}
return (BufferedImage) imsList.get(posn);
} // end of getImage() with posn input;

Distributed by Meruvian Education


public ArrayList getImages(String name)
{
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
System.out.println("Tidak ada image dengan nama " + name);
return null;
}

return imsList;
}

public boolean isLoaded(String name)


{
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null)
return false;
return true;
}

public int numImages(String name)


{
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
System.out.println("Tidak ada image dengan nama " + name);
return 0;
}
return imsList.size();
}

//

public void setPath(String path){


this.path=path;
}

// ------------------- Image Input ------------------

private BufferedImage loadImage(String fnm)


{
try {
BufferedImage im;
if(path.equals(IMAGE_DIR))
im = ImageIO.read( getClass().getResource(path + fnm) );
else
im = ImageIO.read( new File(path+"/" + fnm) );

int transparency = im.getColorModel().getTransparency();


BufferedImage copy = gc.createCompatibleImage(
im.getWidth(), im.getHeight(),

Distributed by Meruvian Education


transparency );
// membuat graphics context
Graphics2D g2d = copy.createGraphics();
// g2d.setComposite(AlphaComposite.Src);

g2d.drawImage(im,0,0,null);
g2d.dispose();
return copy;
}
catch(IOException e) {
System.out.println("Gagal memuat " +
path + "/" + fnm + ":\n" + e);
return null;
}
}
}

Percobaan 3 : Membuat class ImageAnimator

import java.awt.image.*;

public class ImageAnimator


{
private String imName;
private boolean isRepeating, ticksIgnored;
private ImageManager imsMgr;

private int animPeriod;


// waktu yang dibutuhkan untuk satu animasi (dalam milidetik)
private long animTotalTime;

private int showPeriod;


// Waktu untuk menampilkan animasi saat ini (dalam milidetik)
private double seqDuration;
// total waktu yang dibutuhkan untuk keseluruhan animasi

private int numImages; // jumlah keseluruhan gambar


private int imPosition; // Posisi gambar terkini

private ImageSequenceListener listener = null;

public ImageAnimator(String nm, int ap, double d,boolean isr, ImageManager il)
{
imName = nm;

Distributed by Meruvian Education


animPeriod = ap;
seqDuration = d;
isRepeating = isr;
imsMgr = il;

animTotalTime = 0L;

if (seqDuration < 0.5) {


System.out.println("Warning: durasi minimal 0.5 sec.");
seqDuration = 0.5;
}

if (!imsMgr.isLoaded(imName)) {
System.out.println(imName + " Tidak diketahui oleh imageManager");
numImages = 0;
imPosition = -1;
ticksIgnored = true;
}
else {
numImages = imsMgr.numImages(imName);
imPosition = 0;
ticksIgnored = false;
showPeriod = (int) (1000 * seqDuration / numImages);
}
}

public void updateTick()


/* diasumsikan method ini di panggil sesuai dengan periode animasi (dalam ms) */
{
if (!ticksIgnored) {
// update total waktu animasi, modulo waktu animasi dengan durasi sequence
animTotalTime = (animTotalTime + animPeriod) % (long)(1000 * seqDuration);

// menghitung image terkini


imPosition = (int) (animTotalTime / showPeriod); // dalam jarak 0 sampai
jumlah gambar-1

if ((imPosition == numImages-1) && (!isRepeating)) { // sequence selesai


ticksIgnored = true; // update tick diabaikan
if (listener != null)
listener.sequenceEnded(imName); // mengirimkan pesan ke listener
}
}
}

Distributed by Meruvian Education


public BufferedImage getCurrentImage()
{ if (numImages != 0)
return imsMgr.getImage(imName, imPosition);
else
return null;
}

public int getCurrentPosition()


{ return imPosition; }

public void addImageSequenceListener(ImageSequenceListener l)


{ listener = l; }

public void stop()


/* update tick diabaikan */
{ ticksIgnored = true; }

public boolean isStopped()


{ return ticksIgnored; }

public boolean atSequenceEnd()


// check apakah sequence selesai
{ return ((imPosition == numImages-1) && (!isRepeating)); }

public void stopAt(int pos){


imPosition=pos;
ticksIgnored = true;

public void restartAt(int imPosn)


/* memulai menampilkan gambar sesuai dengan posisi yang diberikan */
{
if (numImages != 0) {
if ((imPosn < 0) || (imPosn > numImages-1)) {
System.out.println("Posisi restart salah, Mulai dari 0");
imPosn = 0;
}

imPosition = imPosn;

Distributed by Meruvian Education


animTotalTime = (long) imPosition * showPeriod;
ticksIgnored = false;
}
}

public void resume()


{
if (numImages != 0)
ticksIgnored = false;
}
}

Percobaan 4 : Membuat class ImageTest1

package jeni6;
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class ImageTest1 extends JFrame{

Image Background,JeniOpaque,JeniTransparant,JeniTranscluent,JeniAATranscluent;
BufferedImage im;
public ImageTest1(){
super("ImageTest");
this.setSize(420,500);

try{
im = ImageIO.read(getClass().getResource("images/Background.png"));
Background =
ImageIO.read(getClass().getResource("images/Background.png"));
JeniOpaque=
ImageIO.read(getClass().getResource("images/JeniOpaque.png"));
JeniTransparant=
ImageIO.read(getClass().getResource("images/JeniTransparant.png"));
JeniTranscluent=
ImageIO.read(getClass().getResource("images/JeniTranscluent.png"));
JeniAATranscluent=
ImageIO.read(getClass().getResource("images/JeniAATranscluent.png"));

}catch(IOException e){

Distributed by Meruvian Education


System.out.println(e.toString());
}

this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

public void paint(Graphics g){


Graphics2D g2d;
g2d= (Graphics2D) g;
g.drawImage(im,0,0,500,500,this);
// g.drawImage(Background,0,0,500,500,this);
g.drawImage(JeniOpaque,10,50,200,200,this);
g.drawImage(JeniTransparant,210,50,200,200,this);
g.drawImage(JeniTranscluent,10,250,200,200,this);
g.drawImage(JeniAATranscluent,210,250,200,200,this);
}
public static void main(String [] ags){
new ImageTest1();
}
}

Percobaan 5 : Membuat class ImagesTest2

package jeni6;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.*;
import java.io.*;
import java.text.DecimalFormat;

public class ImagesTest2 extends JPanel implements ImageSequenceListener,Runnable


{
private static final int PERIOD = 50; // 0.05 secs

private static final int PWIDTH = 600; // size of this panel


private static final int PHEIGHT = 400;

private ImageManager imsLoader; // the image loader

private ImageAnimator mihPlayer,catsPlayer, kaboomPlayer,jeballPlayer,numbersPlayer;

Distributed by Meruvian Education


Thread t;

public ImagesTest2()
{
setBackground(Color.white);
setPreferredSize( new Dimension(PWIDTH, PHEIGHT) );

imsLoader = new ImageManager();


imsLoader.setPath("Jeni6/images");

try{
imsLoader.loadNumImages("25_04_.gif",15);
imsLoader.loadNumImages("numbers.gif",6);
imsLoader.loadStripImages("boom.png", 5,1);
imsLoader.loadStripImages("ball.png", 8,4);
imsLoader.loadStripImages("cats.gif",6,1);
}catch (Exception e){System.out.println(e.toString());}

initImages();

t=new Thread(this);

private void initImages()


{
mihPlayer =
new ImageAnimator("25_04_",PERIOD, 1.5, true, imsLoader);
numbersPlayer =
new ImageAnimator("numbers", PERIOD, 6, false, imsLoader);
numbersPlayer.addImageSequenceListener(this);
catsPlayer =
new ImageAnimator("cats", PERIOD, 0.5, true, imsLoader);
kaboomPlayer =
new ImageAnimator("boom", PERIOD, 1, true, imsLoader);
jeballPlayer =
new ImageAnimator("ball", PERIOD, 1, true, imsLoader);

public void sequenceEnded(String imageName)


{ System.out.println( imageName + " sequence has ended");
}

private void imagesUpdate()


{

Distributed by Meruvian Education


mihPlayer.updateTick();
numbersPlayer.updateTick();

catsPlayer.updateTick();
kaboomPlayer.updateTick();
jeballPlayer.updateTick();

public void paintComponent(Graphics g)


{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;

// clear the background


g2d.setColor(Color.blue);
g2d.fillRect(0, 0, PWIDTH, PHEIGHT);

drawImage(g2d, mihPlayer.getCurrentImage(), 10, 10);


drawImage(g2d, numbersPlayer.getCurrentImage(), 200, 10);

// --------------- strip images ----------------------

drawImage(g2d, catsPlayer.getCurrentImage(), 10, 235);


drawImage(g2d, kaboomPlayer.getCurrentImage(), 400, 10);
drawImage(g2d, jeballPlayer.getCurrentImage(), 350, 270);
}

private void drawImage(Graphics2D g2d, BufferedImage im, int x, int y)


{
g2d.drawImage(im, x, y, this);
}

public static void main(String args[])


{
ImagesTest2 ttPanel = new ImagesTest2();

ttPanel.start();

JFrame app = new JFrame("Image Manager Test");


app.getContentPane().add(ttPanel, BorderLayout.CENTER);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Distributed by Meruvian Education


app.pack();
app.setResizable(false);
app.setVisible(true);
}

public void start(){


t.start();
}

public void run() {


while (Thread.currentThread()==t){
try{
Thread.sleep(50);
}
catch(Exception e){}

imagesUpdate();
repaint();
}
}

Distributed by Meruvian Education


Kunci Jawaban :
Percobaan 4

Distributed by Meruvian Education


Percobaan 5

Distributed by Meruvian Education

Anda mungkin juga menyukai