반응형
게임 프로젝트 들어가기전에 간단한 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;
// 인스턴스 변수는 생성자에 초기화해주는것을 통일하는것이 바람직하다.
}
}
반응형
'웹 프로그래밍 기초 > 자바기반의 웹&앱 응용SW 개발자' 카테고리의 다른 글
자바기반의 웹&앱 응용 SW개발자 양성과정 24일차 -41 (0) | 2020.03.26 |
---|---|
자바기반의 웹&앱 응용 SW개발자 양성과정 23일차 -40 (0) | 2020.03.25 |
자바기반의 웹&앱 응용 SW개발자 양성과정 22일차 -38 (0) | 2020.03.24 |
자바기반의 웹&앱 응용 SW개발자 양성과정 21일차 -37 (0) | 2020.03.24 |
자바기반의 웹&앱 응용 SW개발자 양성과정 20일차 -36 (0) | 2020.03.24 |
댓글