본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 23일차 -39

by oncerun 2020. 3. 25.
반응형

게임 프로젝트 들어가기전에 간단한 Omokgame틀을 잡아보면서 복습.

package omokgame;

import java.awt.Frame;

public class Program {

	public static void main(String[] args) {
		//OmokFrame의 확장된 기능을 사용하지않기위해서.
		//캡슐화를 위해 Frame형식으로 만들었다. 
		Frame frame = new OmokFrame();
		
	}

}

1. 구조를 잡는데 Frame에 직접적으로 이미지를 출력하는것이 아니라 캔버스를 덮어서 사용하겠다.

2. Frame 을 참조형식으로 OmokFrame클래스의 인스턴스를 생성하는 이유는 Frame의 기능만을 사용하고,

OmokFrame의 추가적인 부분을 의도치않게 사용하여 오류의 발생을 한정시키는 캡슐화를 구현

 

 

package omokgame;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class OmokFrame extends Frame {
//OmokCanvas의 확장된 기능을 사용하겠다.
//캔버스를 부품으로써 사용하기위해 프레임에서
	private OmokCanvas canvas;

	public OmokFrame() {// 객체를 생성할때는 생성자에서 하는게 더좋을것같다
		
		canvas = new OmokCanvas();
		add(canvas);// Frame에 canvas를 붙인다.
		
		pack(); // 먼저 캔버스의 크기를 가져와서 Frame의크기를 맞춰준다. 호출되기전 작성
		setVisible(true);// 기본값이 false이므로 보여지않는다. 될때 paint가 호출된다.
		//setSize(760, 760); // 창의 너비와 높이를 지정해주고
		setLocationRelativeTo(null); // 화면 중앙에 출력 시켜준다.
		//프레임창에대한 이벤트를 하기위해 리스너를 준비한뒤
		//익명클래스인 windowAdapter()를 생성해
		//WindowListener 인터페이스를 구현하고있는 클래스가 WindowAdapter이기때문에 필요한 메소드만 우리가 오버라이드할 수 있다.
		
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}
}

1. OmokFrame은 Frame을 상속받아 Frame으로 사용될것이다.

2. 캔버스의 크기에따라 Frame의 크기를 정하기위해 pack();메소드를 사용한다.

3. Frame의 종료를 해주기위해 이벤트함수를 정의해주는데 인터페이스를 사용하게되면

 불필요한 메소드까지 생성해야하므로  인터페이스의 메소드를 이미 정의한 Adapter를 사용해서 원하는 메소드만을 구현한다

package omokgame;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class OmokCanvas extends Canvas {
	public static OmokCanvas canvas;
	private Image img;// ? 이미지파일을 담기위한 변수가 필요하다.

	private Omok[] omoks;
	// 오목을 추가할 위치를 기억하기위한 변수 OmokIndex를 추가하고 초기화
	private int omokIndex;
	// 오목 캔버스에 배열을 추가하는이유는 캔버스에서 Omokclass의 값을 지정해 동시에 관리하기위함이다

	public static OmokCanvas getInstance() {
		return canvas;
	}

	// 생성자
	public OmokCanvas() {
		canvas = this;
		omoks = new Omok[100];
		omokIndex = 0;

		// 생성자를 사용하면 객체생성동시에 작성한 로직이 실행된다.
		// 이미지를 인스턴스할때마다 만들면 여러가지면에서 좋지않고 static으로 만들면 딱한번만한다.
		// 캔버스를 여러개만들지않으므로 딱한번만 만드니까 생성자에서 만든다.
		// 이미지를 가져오는 시점이 다르다 static으로 설정시 다른 메모리에 올리기때문에 가져오는 속도면에서 차이가난다.
		// 생성자에 이미지를 가져오면 생성됬을때 가져오기때문이다.

		try {
			img = ImageIO.read(new File("./images/omokboard.png"));// 현재위치를 기반으로 이미지를 가져온다.
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 이미지크기와 넓이를 가져와서 캔버스의 사이즈를 정해준다.
		this.setSize(img.getWidth(this), img.getHeight(this));

		// 이또한 마우스어뎁터가 인터페이스의 메소드를 구현해놨기때문에
		// 필요한 메소드만을 오버라이드 할 수 있다.
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				int x = e.getX();
				int y = e.getY();
				// 오목객체를 생성해서 배열에 담은뒤 가르키는 인덱스에추가
				omoks[omokIndex++] = new Omok(x, y,omokIndex);
				repaint();
			}
		});

			
	}//생성자
	
				
		

//
	// 캔버스의 paint를 오버라이드해서 이미지를 그려주겠다.
	public void paint(Graphics g) {
		g.drawImage(img, 0, 0, this);
		// 판을그리고 오목을그린다.
		for (int i = 0; i < omokIndex; i++)
			omoks[i].draw(g);
	}
}

1.OmokCanvas에서 오목을 관리해줄것이다.

2.오목을 관리하기위해 오목클래스를 만들고 배열을 만들어준다.

3.배열을에 객체를 생성할때 오목 클래스에서  각 흰돌 검은돌에대한 속성값을 정의를해주고

4.한번에 OmokCanvas에서 오목을 그려준다.

 

 

 

package omokgame;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

//두개의 돌을 다 커버할 클래스.
//돌을 개체로써 흰돌과 검은돌을  속성을 가지는 Omok클래스를 한다.
public class Omok {
	// 정수형이기때문에 구체적인 변수명은 안됨.
	private int color; // 돌을 식별하기위한 값 , 기본값
	// static생성자안에서 일관되게 초기화하는것이 바람직함
	private static final int WHITE;
	private static final int BLACK;
	// 오목의 객체가 여러번 생성되기때문에 한번의 생성으로 사용하기위함
	private static Image imgBlack;
	private static Image imgWhite;
	private int locationX;
	private int locationY;
	static { // 전역변수를 초기화하는 역할
		BLACK = 2;
		WHITE = 1;

		try {
			imgBlack = ImageIO.read(new File("./images/blackstone.png"));
			imgWhite = ImageIO.read(new File("./images/whitestone.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void draw(Graphics g) {
		if (color == BLACK) {
			g.drawImage(imgBlack, locationX - 19, locationY - 19, OmokCanvas.getInstance());
		} else if (color == WHITE)
			g.drawImage(imgWhite, locationX - 19, locationY - 19, OmokCanvas.getInstance());
	}

	public Omok(int x, int y, int omokIndex) {
		locationX = x;
		locationY = y;
		if (omokIndex % 2 == 1)
			color = BLACK;
		else
			color = WHITE;
		// 인스턴스 변수는 생성자에 초기화해주는것을 통일하는것이 바람직하다.
	}

}
반응형

댓글