public class CardGameView extends View {
Bitmap m_bgImage;
Bitmap m_Card_Back, m_Card_Red, m_Card_Green, m_Card_Blue, m_TOUCH, m_end;
SoundPool m_SoundPool;
MediaPlayer m_Sound_BG;
MediaPlayer m_effect1;
MediaPlayer m_effect2;
int m_Sound_ef1;
int m_Sound_ef2;
Handler mhandler;
Handler chandler;
int value = 0;
Card m_Shuffle [][];
public static final int STATE_READY = 0;
public static final int STATE_GAME = 1;
public static final int STATE_END = 2;
private int m_state = STATE_READY; //초기화는 STATE READY부터
private Card m_selected1 = null; //카드 짝맞출때 변수
private Card m_selected2 = null;
public CardGameView(Context context) {
super(context);
setFocusable(true);
// TODO Auto-generated constructor stub
m_bgImage = BitmapFactory.decodeResource(getResources(), R.drawable.background); //백그라운드 이미지 설정.
m_Card_Back = BitmapFactory.decodeResource(getResources(), R.drawable.backside);
m_Card_Red = BitmapFactory.decodeResource(getResources(), R.drawable.front_red);
m_Card_Green = BitmapFactory.decodeResource(getResources(), R.drawable.front_green);
m_Card_Blue = BitmapFactory.decodeResource(getResources(), R.drawable.front_blue);
m_TOUCH = BitmapFactory.decodeResource(getResources(), R.drawable.touch);
m_SoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
m_Sound_BG = MediaPlayer.create(context, R.raw.background);
m_effect1 = MediaPlayer.create(context, R.raw.effect1);
m_effect2 = MediaPlayer.create(context, R.raw.effect2);
m_Sound_ef1 = m_SoundPool.load(context, R.raw.effect1, 1);
m_Sound_ef2 = m_SoundPool.load(context, R.raw.effect2, 1);
m_Sound_BG.start();
m_Shuffle = new Card[3][2];
SetCardShuffle();
CardGameThread _thread = new CardGameThread(this); //이상태에서는 실행안됨.
_thread.start();
mhandler = new Handler();
chandler = new Handler();
chandler.sendEmptyMessage(0);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
//super.onDraw(canvas);
canvas.drawBitmap(m_bgImage, 0, 0, null);
for(int y=0; y<2; y++){
for(int x=0; x<3; x++){
if(m_Shuffle[x][y].m_state == Card.CARD_MATCHED|| m_Shuffle[x][y].m_state == Card.CARD_PLAYEROPEN || m_Shuffle[x][y].m_state == Card.CARD_SHOW ) {
if(m_Shuffle[x][y].m_color == Card.IMG_RED)
canvas.drawBitmap(m_Card_Red, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
else if(m_Shuffle[x][y].m_color == Card.IMG_BLUE)
canvas.drawBitmap(m_Card_Blue, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
else if(m_Shuffle[x][y].m_color == Card.IMG_GREEN)
canvas.drawBitmap(m_Card_Green, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
}
else {// m_Shuffle[x][y].m_state == Card.CARD_CLOSE || m_Shuffle[x][y].m_state == Card.CARD_BEGIN
canvas.drawBitmap(m_Card_Back, 20+x*70, 150+y*110, null);// 해당하는 카드를 보여준다.
}
}
}
if(m_Shuffle[0][0].m_state ==Card.CARD_BEGIN){ //첫번째 터치 들어올때만 보여지게 한다.
//state를 바꾸거나 card의 상태를 살펴본다.
canvas.drawBitmap(m_TOUCH, 20, 150, null);
}
if(m_Shuffle[0][0].m_state == STATE_END){
canvas.drawBitmap(m_end, 20, 150, null);
}
}
//start게임이 무엇인지 정의
public void startGame() {
m_Shuffle[0][0].m_state = Card.CARD_CLOSE; //현재 상태를 모두 card close로 변경.
m_Shuffle[0][1].m_state = Card.CARD_CLOSE;
m_Shuffle[1][0].m_state = Card.CARD_CLOSE;
m_Shuffle[1][1].m_state = Card.CARD_CLOSE;
m_Shuffle[2][0].m_state = Card.CARD_CLOSE;
m_Shuffle[2][1].m_state = Card.CARD_CLOSE;
invalidate();
}
public void showCard() {
m_Shuffle[0][0].m_state = Card.CARD_SHOW; //현재 상태를 모두 card SHOW로 변경.
m_Shuffle[0][1].m_state = Card.CARD_SHOW;
m_Shuffle[1][0].m_state = Card.CARD_SHOW;
m_Shuffle[1][1].m_state = Card.CARD_SHOW;
m_Shuffle[2][0].m_state = Card.CARD_SHOW;
m_Shuffle[2][1].m_state = Card.CARD_SHOW;
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(m_state == STATE_READY){
showCard();
mhandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try{
Thread.sleep(5000);
}catch (InterruptedException e){};
startGame();
}
});
//startGame(); //다른곳에서 호출을 해 주어야 한다.타이머쪽에서 실행할 수 있도록.
m_state = STATE_GAME; //카드를 시작한후에는 STATE_GAME으로 바꿔줌 터치만으로도 동작을함. 위치지정 필요 없음.
} //STATE_READY이면 STARTGAME이다.
//카드 show에서 카드 close로 바꿔야 한다.
else if(m_state == STATE_GAME){
int px = (int)event.getX(); //터치위치지정
int py = (int)event.getY(); //터치위치지정
for(int y=0 ; y<2 ; y++){
for(int x=0 ; x<3 ; x++){
Rect box_card = new Rect(20+x*70, 150+y*110, 20+x*70+80, 150+y*110+115);
if(box_card.contains(px,py))
if(m_Shuffle[x][y].m_state != Card.CARD_MATCHED){
if(m_selected1 != null){
m_selected2 = m_Shuffle[x][y];
m_selected2.m_state = Card.CARD_PLAYEROPEN;
}
else if(m_selected1 == null){
m_selected1 = m_Shuffle[x][y];
m_selected1.m_state = Card.CARD_PLAYEROPEN;
}
}
}
}
chandler = new Handler(){
public void handleMessage(Message msg){
value++;
chandler.sendEmptyMessageDelayed(0, 1000);
}
};
}
else if(m_state == STATE_END){
}
invalidate();
return super.onTouchEvent(event);
}
이 소스에서 handler를 이용하여 타이머를 생성하고 ondraw를 통하여 화면에 게임을 시작되고 짝을 다 맞출때까지 시간을 나타나게 하고 싶습니다. 그리고 짝 맞추다가 틀린 갯수도 나타나게 하고 싶은데 어떻게 해야 할까요?? 몇시간을 붙잡고 있는데 해결이 안되네요... 도와주세요ㅠㅠ