package twogo1p;
import javax.microedition.lcdui.*;
import java.io.InputStream;
import com.skt.m.Graphics2D;
import gostop.*;
import common.*;
/**
* 맞고의 게임 화면을 그려준다.
*/
class GameView extends GostopView
{
// 폰트 사이즈 상수.
private final int SMALLFONT_WIDTH = 4;
private final int SMALLFONT_HEIGHT = 6;
protected int totalWidth = 128, totalHeight = 150; //전체 게임 크기
private short cardWindowHeight = 0;
private Image imgExitBtn, imgStartBtn; // 종료 버튼, 시작 버튼.
// 플레이어와 컴퓨터의 아바타 얼굴 이미지.
private Image imgPlayer, imgComputer;
private Image imgFloorBg; // 바닥 중앙의 무늬 이미지.
private Image imgBgPattern; // 배경 타일 패턴 이미지.
private Image imgAqViewTable; // 획득 카드 화면의 사용자정보 출력 테이블.
private Image imgAqViewOkBtn; // 획득 카드 화면의 확인 버튼.
private Image imgAqViewIconID;// 획득 카드 화면의 ID 아이콘.
private Image imgAqViewIconMoney; // 획득 카드 화면의 Money 아이콘.
private Image imgSmallFont; // 작은 숫자 폰트 이미지.
byte curTurn = User.NULL; // 현재 턴.
byte curViewState = State.GAME_WAIT; // 현재 보여지는 화면의 상태.
CyResMan resMan;
Room room;
Graphics2D g2d;
Midlet midlet;
Rect rectFloor;
byte whoseAcquireCards = User.NULL;
/**
* Constructor.
* @param midlet
*/
public GameView(Midlet midlet)
{
this.midlet = midlet;
width = (short)getWidth();
height = (short)(getHeight()+16);
resMan = new CyResMan();
room = new Room();
makeImage();
System.out.println(width + ", " + height);
}
/**
* 합친 이미지 파일에서 각각의 이미지를 추출한다.
*/
private void makeImage()
{
// 합친 이미지 파일을 로드후,
resMan.setImageData("/image/MixImage_1.dat");
// Mix 파일에서 각각의 이미지를 추출한다.
resMan.addImage("0", 0, 654); // 남자 아바타 얼굴.
resMan.addImage("1", 654, 684); // 여자 아바타 얼굴.
resMan.addImage("2", 1338, 924); // 바닥의 타일 패턴.
resMan.addImage("3", 2262, 7448); // 게임판 중앙의 장식 무늬.
resMan.addImage("4", 9710, 204); // 폰트 #1.
resMan.addImage("5", 9914, 304); // 폰트 #2.
resMan.addImage("6", 10218, 21144); // 카드 스프라이트 (대).
resMan.addImage("7", 31362, 5304); // 카드 스프라이트 (소).
// 아바타 로드.
imgPlayer = resMan.getImage("0");
imgComputer = resMan.getImage("1");
// 바닥 타일 및 배경 로드.
imgBgPattern = resMan.getImage("2");
imgFloorBg = resMan.getImage("3");
// 폰트 로드.
imgSmallFont = resMan.getImage("5");
initPos(); // 위치 초기화.
}
/**
* 각 개체의 위치 설정.
*/
private void initPos()
{
rectFloor = new Rect(0,37,128,58);
cardWindowHeight = (short)((totalHeight-imgFloorBg.getHeight())/2);
}
/**
* 이미지 로드.
* @param path
* @return
*/
public synchronized Image loadImage(String path)
{
// 동시에 2개의 thread가 읽는 경우가 있음
Image img = null;
try
{
byte[] byteImage;
InputStream is = null;
is = getClass().getResourceAsStream(path);
byteImage = new byte[is.available()];
is.read(byteImage);
is.close();
img = Image.createImage(byteImage, 0, byteImage.length);
byteImage = null;
} catch(Exception e) {}
return img;
}
/**
* 게임판의 배경을 화면에 그려준다.
* @param g
*/
private void drawFloor(Graphics g)
{
g.setColor(204,153,255);
g.fillRect(0,0,totalWidth,totalHeight);
int clipx=0, clipy=0;
int clipw=0, cliph=0;
/*
* 기본 클리핑 영역을 저장한다.
*/
clipx = g.getClipX();
clipy = g.getClipY();
clipw = g.getClipWidth();
cliph = g.getClipHeight();
g.setClip(0,0,totalWidth,totalHeight);
/*
* 타일 패턴을 화면에 깔아준다.
*/
for(int x=0;x<totalWidth;x+=imgBgPattern.getWidth())
{
for(int y=0;y<totalHeight;y+=imgBgPattern.getHeight())
{
g.drawImage(imgBgPattern, x, y, Graphics.LEFT|Graphics.TOP);
}
}
if(curTurn == User.COMPUTER)
{
// 타일 배경을 그려준다.
g.drawImage(imgFloorBg, width/2, rectFloor.top+6, Graphics.HCENTER|Graphics.TOP);
}
else /* if(curTurn == PLAYER) */
{
// 타일 배경을 그려준다.
g.drawImage(imgFloorBg, width/2, rectFloor.top, Graphics.HCENTER|Graphics.TOP);
}
/*
* 저장해 둔 기본 클리핑 영역을 복원한다.
*/
g.setClip(clipx, clipy, clipw, cliph);
}
/**
* 게임 대기화면을 그려준다.
* @param g
*/
private void drawWaitingGame(Graphics g)
{
/*
* Start 버튼이 로드되지 않았다면, 스타트버튼 이미지 로드.
*/
if(imgStartBtn == null)
{
imgStartBtn = loadImage("/image/startbtn.lbm");
} // Start 버튼을 그려준다.
g.drawImage(imgStartBtn, width, height, Graphics.RIGHT|Graphics.BOTTOM);
/*
* Exit 버튼이 로드되지 않았다면, Exit 버튼 이미지 로드.
*/
if(imgExitBtn == null)
{
imgExitBtn = loadImage("/image/exitbtn.lbm");
} // Exit 버튼을 그려준다.
g.drawImage(imgExitBtn, 0, height,Graphics.LEFT|Graphics.BOTTOM);
// 각 플레이어의 정보 출력.
g.setColor(182,219,255);
/*
* 컴퓨터의 정보 출력.
*/
// 아바타 얼굴 표시.
g.drawImage(imgComputer, 28, 38, Graphics.TOP|Graphics.RIGHT);
// 돈 표시.
g.drawString("Computer", 30,38,Graphics.TOP|Graphics.LEFT);
g.drawString(room.getComMoney()+" 원", totalWidth-10,49,Graphics.TOP|Graphics.RIGHT);
/*
* 플레이어의 정보 출력.
*/
// 아바타 얼굴 표시.
g.drawImage(imgPlayer, 28, 68, Graphics.TOP|Graphics.RIGHT);
// 돈 표시.
g.drawString("Player", 30,68,Graphics.TOP|Graphics.LEFT);
g.drawString(room.getPlayerMoney()+" 원", totalWidth-10, 81,Graphics.TOP|Graphics.RIGHT);
}
/**
* 카드를 나눠주는 중의 화면을 그려준다.
* @param g
*/
private void drawDistributeCards(Graphics g)
{
}
/**
* 게임 진행중의 화면을 그려준다.
* @param g
*/
private void drawRunningGame(Graphics g)
{
}
/**
* 획득 카드 확인 화면을 그려준다.
* @param g
*/
private void drawAcquireCards(Graphics g)
{
imgAqViewTable = loadImage("/image/aqviewp.lbm");
imgAqViewOkBtn = loadImage("/image/aqviewok.lbm");
imgAqViewIconID = loadImage("/image/iconid.lbm");
imgAqViewIconMoney = loadImage("/image/iconmoney.lbm");
// 화면 Clear 후,
g.setColor(0,0,153);
g.fillRect(0, 0, width, height);
/*
* ID/Money 테이블 출력.
*/
// ID/Money Border의 Fill 출력.
g.setColor(255,200,255);
g.fillRect(width-75,0,70,26);
// 아이디 아이콘과 아이디 표시.
g.setColor(0);
g.drawImage(imgAqViewIconID, width-74, 3, Graphics.LEFT|Graphics.TOP);
if(whoseAcquireCards == User.PLAYER)
g.drawString("PLAYER", width-5, 1, Graphics.RIGHT|Graphics.TOP);
else /* if(whoseAcquireCards == User.COMPUTER) */
g.drawString("COMPUTER", width-5, 1, Graphics.RIGHT|Graphics.TOP);
// 돈 아이콘과 돈 표시.
g.drawImage(imgAqViewIconMoney, width-74,15, Graphics.LEFT|Graphics.TOP);
drawSmallNum(g,width-5, 16+1, room.getPlayerMoney(), Graphics.RIGHT);
// ID/Money Border의 Outline 출력.
g.setColor(0,146,170);
g.drawRect(width-75,0,70,26);
/*
* User Info 테이블 출력.
*/
g.drawImage(imgAqViewTable, 83, 47+10, Graphics.LEFT|Graphics.TOP);
drawSmallNum(g,(short)(113), (short)(60), room.getPoint((int)whoseAcquireCards), (short)Graphics.RIGHT);
drawSmallNum(g,(short)(113), (short)(70), room.getCntGo((int)whoseAcquireCards), (short)Graphics.RIGHT);
drawSmallNum(g,(short)(113), (short)(80), room.getCntShake((int)whoseAcquireCards), (short)Graphics.RIGHT);
drawSmallNum(g,(short)(113), (short)(90), room.getCntPuck((int)whoseAcquireCards), (short)Graphics.RIGHT);
/*
* 확인 버튼 출력.
*/
g.drawImage(imgAqViewOkBtn, width, height, Graphics.RIGHT|Graphics.BOTTOM);
}
/**
* 결과 화면을 그려준다.
* @param g
*/
private void drawResult(Graphics g)
{
}
/**
* 화면에 작은 숫자를 표시한다.
* @param g
* @param x 숫자의 x.
* @param y 숫자의 y.
* @param num 수.
* @param anchor 왼쪽/오른쪽 정렬 선택.
*/
private void drawSmallNum(Graphics g, int x, int y, long num, int anchor)
{
int cnt;
int posx = x;
int posy = y;
String strNum = String.valueOf(num); // 숫자를 문자열로 변경해 준다.
int len = strNum.length(); // 문자열의 길이를 구한다.
// 오른쪽 정렬일때,
if(anchor==Graphics.RIGHT)
{
/*
* 정확히 시작점부터 시작하기 위해,
* 시작점에서 폰트의 폭을 빼준다.
*/
posx -= SMALLFONT_WIDTH;
}
// 숫자를 한자 한자 출력해 준다.
if(anchor == Graphics.RIGHT)
{
// 오른쪽에서 왼쪽으로...
for(cnt=len-1; cnt>=0; cnt--)
{
drawSmallFont(g, posx, posy, (strNum.charAt(cnt)-'0'));
posx -= SMALLFONT_WIDTH;
}
}
else if(anchor == Graphics.LEFT)
{
// 왼쪽에서 오른쪽으로...
for(cnt=0; cnt<len; cnt++)
{
drawSmallFont(g, posx, posy, (strNum.charAt(cnt)-'0'));
posx += SMALLFONT_WIDTH;
}
}
} // end private void drawSmallNum().
private void drawSmallFont(Graphics g, int x, int y, int num)
{
g2d.drawImage(x, y, imgSmallFont, num*SMALLFONT_WIDTH, 0,
SMALLFONT_WIDTH, SMALLFONT_HEIGHT, Graphics2D.DRAW_COPY);
}
/**
* 화면에 게임 화면을 그려준다.
*/
public void paint(Graphics g)
{
if(g2d == null)
g2d = Graphics2D.getGraphics2D(g);
g.setColor(0);
g.fillRect(0,0,width,height);
drawFloor(g); // 게임판의 배경을 화면에 그려준다.
System.out.println("현재 게임 상태 : " + curViewState);
switch(curViewState)
{
case State.GAME_WAIT: // 게임 대기 중일때,
drawWaitingGame(g);
break;
case State.GAME_DISTRIBUTECARDS: // 카드를 나눠주는 중일때,
drawDistributeCards(g);
break;
case State.GAME_RUNNING: // 게임 진행 중일때,
drawRunningGame(g);
break;
case State.GAME_ACQUIRECARDS: // 얻은 카드 확인 중일때,
drawAcquireCards(g);
break;
case State.GAME_RESULT: // 게임 결과 출력 중일때,
drawResult(g);
break;
}
}
/**
* 메인 메뉴로 돌아감.
*/
private void enterMainMenu()
{
//room.gameOver();
//initGame();
midlet.enterMainMenu();
}
} |