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

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

by oncerun 2020. 3. 25.
반응형
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; 

//모든 오목들이 사용하는값. 
//색을 지정하는 불린값이다. 
private static boolean isBlackTurn;  

static { // 전역변수를 초기화하는 역할 
isBlackTurn = false;  //false이면 Black 턴 , ture이면 White; 
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(); 
} 

} 
//draw는  그래픽객체를 이용해서 그림을그린다. 
public void draw(Graphics g) { 
//이미지만 변하므로 이미지변수값만 변환시켜준다. 
Image img = imgBlack; 

if (color == BLACK) { 
g.drawImage(img, locationX - 19, locationY - 19, OmokCanvas.getInstance()); 
} else if (color == WHITE) { 
img = imgWhite; 
g.drawImage(img, locationX - 19, locationY - 19, OmokCanvas.getInstance()); 

} 

} 

public Omok(int x, int y) { 


isBlackTurn = !isBlackTurn; 
//isBlack은 전역 변수이므로 모든 객체가 참조한다. 객체가 생성될때마다 값을 참조하기때문에 
//값은 유지되서 가져오게된다. 
if(isBlackTurn) 
color = BLACK; 
else if(!isBlackTurn) 
color = WHITE; 

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

} 

모든 오목 객체들이 공유하는 값을 하나를 가지고  그 값으로 color의 변숫값을 변경시켜서 흰돌과 검은 돌이 순차적으로 나오게 하겠다.
private static boolean isBlackTurn; 

boolean형 변수를 전역변수로 생성하고

생성자에서 기본값으로 false를 넣고  첫 번째 순서를 검은 돌로 한다.

 

if(isBlackTurn) 
color = BLACK; 
else if(!isBlackTurn) 
color = WHITE;

 

오목 객체가 마우스 클릭에 의해 생성되면 

생성자에 있는 isBlackTurn =! isBlackTurn; 에 의해

ture값으로 변하며 전역 변수 isBlackTurn값은 true가 된다.

그 이후 if문에 의해 color가 black으로 바뀌게 되며

draw함수에 의해 검은 돌이 그려지게 된다.

 

다음 클릭으로 오목 객체를 만들게 되면 전역 변숫값인 true값을 가져오게 되고

isBlackTurn =! isBlackTurn에 의해 false로 바뀌게 된다

 

위 코드 if문에 의해 else if문이 실행되며 color값이 white로 변하게 된다.

그 뒤 draw함수에서 white이미지를 그려서 출력하게 된다.

 

-----문제점-----

각 네모칸마다 간격은 40이고 처음 칸 간격 값은 20이다.

만약 점과 점 사이의 좌표를 마우스로 클릭했을 때 어디에 위치해야 하는지에 대한 문제점인데

클릭한 위치 값을 40으로 나누고 20을 더해주면 첫 번째 칸에 위치하게 되는데

그 값을 반올림을 시켜줘서 왼쪽에 둘지 오른쪽에 둘지 정해준다. 그리 고난 뒤 다시 40을 곱해주면 반올림된 점에서 원래 그위 치로 가게 돼서 이미지가 출력된다.

public void mouseClicked(MouseEvent e) {
				int x = e.getX();
				int y = e.getY(); 
				System.out.println(x );
				//정확한 점이 마우스클릭이 되지않았을때 반올림해서한다.
				//입력받은 x좌표값을 한칸이 40픽셀이므로 먼저나눈뒤 반올림을해준다 
				//그뒤 40을 곱해줘서 다시좌표로 보내준뒤 빈공간값인20을 더해준다.
				x= (int)(Math.floor(x/40)*(40))+20;
				y= (int)(Math.floor(y/40)*(40))+20;
				// 오목객체를 생성해서 배열에 담은뒤 가르키는 인덱스에추가
				omoks[omokIndex++] = new Omok(x, y);
				repaint();
			}
		});

 

-------------문제점

만약에 더 많은 오목 알이 생성되게 된다면 update가 지우고 그리고 를 반복하기 때문에

깜빡임 현상이 심해진다. 그것을 해결하기 위해 더블 버퍼링을 사용하고

update메서드에서 부모의 update를 실행하지 않고 즉시 paint함수를 호출하도록 해서

깜빡임을 없앤다.

public void update(Graphics g) {
		this.paint(g);
	}
				
		


	// 캔버스의 paint를 오버라이드해서 이미지를 그려주겠다.
	//paint는 캔버스에 이미지를 그려준다.
	public void paint(Graphics g) {
		Image buf;
		Graphics bufG;
		//동일한크기의 비트맵이미지를만들고
		buf  = createImage(760,760);
		//buf는 그래픽객체를 가지고있는데 getGraphics()를 통해 그래픽스객체를 반환해서 bufG에 저장한다.
		//그 그래픽스 객체를 가지고 버퍼이미지에 그린뒤 전부그린 버퍼이미지를 한번에 캔버스에 그려준다.
		bufG = buf.getGraphics();
		//bufg를 통해 비트맵에 전부그린다.
		bufG.drawImage(img, 0, 0, this);
		// 판을그리고 오목을그린다.
		for (int i = 0; i < omokIndex; i++)
			omoks[i].draw(bufG);
		//전부그려진 buf이미지를 한번에 그리도록한다.
		g.drawImage(buf, 0, 0, this);
	}

 

반응형

댓글