package com.example.remembergame2;
import java.util.ArrayList;
import java.util.Random;
import android.R.color;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
public class RememberGame extends Activity {
GameView gv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gv = new GameView(this);
setContentView(gv);
}
// 도형 하나에 정보
class Shape
{
final static int RECT = 0;
final static int CIRCLE = 1;
final static int TRIANGLE = 2;
int what;
int color;
Rect rt;
}
// 게임 뷰 : 실질적인 메인이다.
class GameView extends View
{
// 그리기 모드, 빈화면 또는 도형 출력
final static int BLANK = 0;
final static int PLAY = 1;
// 게임 진행 속도
final static int DELAY = 1500;
// 현재 그리기 모드
int status;
// 생성된 도형의 목록
ArrayList<Shape> arShape = new ArrayList<Shape>();
Random Rnd = new Random();
Activity mParent;
public GameView(Context context)
{
super(context);
mParent = (Activity)context;
// 빈 화면으로 시작하고 잠시 후에 게임 시작
status = BLANK;
mHandler.sendEmptyMessageDelayed(0, DELAY);
}
public void onDraw(Canvas canvas)
{
// 검정색 배경으로 지운다. 빈 화면이면 지우기만 하고 리턴
canvas.drawColor(Color.BLACK);
if(status == BLANK)
{
return;
}
// 도형 목록을 순회하면서 도형 정보대로 출력한다.
int idx;
for(idx = 0; idx < arShape.size(); idx++)
{
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
Pnt.setColor(arShape.get(idx).color);
Rect rt = arShape.get(idx).rt;
switch(arShape.get(idx).what)
{
case Shape.RECT:
canvas.drawRect(rt, Pnt);
break;
case Shape.CIRCLE:
canvas.drawCircle(rt.left + rt.width() / 2 , rt.top + rt.height() / 2 , rt.width() / 2 , Pnt);
break;
case Shape.TRIANGLE:
Path path = new Path();
path.moveTo(rt.left + rt.width() / 2 , rt.top);
path.lineTo(rt.left, rt.bottom);
path.lineTo(rt.right, rt.bottom);
canvas.drawPath(path, Pnt);
break;
}
}
}
public boolean onTouchEvent(MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
int sel;
sel = findShapeIdx((int)event.getX(), (int)event.getY());
// 빈 바닥을 찍었으면 무시한다.
if(sel == -1)
{
return true;
}
// 마지막 추가된 도형을 제데로 찍었으면 다음 단계로 진행
// 빈 화면 잠시 보여준 후 새 도형 추가
if(sel == arShape.size() - 1)
{
status = BLANK;
invalidate();
mHandler.sendEmptyMessageDelayed(0, DELAY);
// 엉뚱한 도형을 찍었으면 질문 후 게임 종료 또는 재시작
}
else
{
new AlertDialog.Builder(getBaseContext())
.setMessage("재미있지! 또 할래?")
.setTitle("게임 끝")
.setPositiveButton("함더", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int whichButton) {
// TODO Auto-generated method stub
arShape.clear();
status = BLANK;
invalidate();
mHandler.sendEmptyMessageDelayed(0, DELAY);
}
})
.setNegativeButton("안해", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// TODO Auto-generated method stub
mParent.finish();
}
})
.show();
}
return true;
}
return false;
}
// 새로운 도형을 목록에 추가한다
void AddNewShape()
{
Shape shape = new Shape();
int idx;
boolean bFindIntersect;
Rect rt = new Rect();
// 기존 도형과 겹치지 않는 새 위치를 찾는다
for(;;)
{
// 크기는 32, 48, 64 중 하나 선택
int Size = 32 + 16 * Rnd.nextInt(3);
// 위치는 난수로 선택
rt.left = Rnd.nextInt(getWidth());
rt.top = Rnd.nextInt(getHeight());
rt.right = rt.left + Size;
rt.bottom = rt.top + Size;
// 화면을 벗어나면 안된다
if(rt.right > getWidth() || rt.bottom > getHeight())
{
continue;
}
// 기존 도형 순회하며 겹치는지 조사한다
bFindIntersect = false;
for(idx = 0; idx < arShape.size(); idx++)
{
if(rt.intersect(arShape.get(idx).rt) == true)
{
bFindIntersect = true;
}
}
// 겹치지 않을 때 확정한다. 겹치면 계속 새 위치 선정한다.
if(bFindIntersect == false)
{
break;
}
}
// 새 도형 정보 작성, 모양, 색상 등을 난수 선택한다
shape.what = Rnd.nextInt(3);
switch(Rnd.nextInt(5))
{
case 0:
shape.color = Color.WHITE;
break;
case 1:
shape.color = Color.RED;
break;
case 2:
shape.color = Color.GREEN;
break;
case 3:
shape.color = Color.BLUE;
break;
case 4:
shape.color = Color.YELLOW;
break;
}
shape.rt = rt;
arShape.add(shape);
}
// x, y 위치의 도형 번호를 찾는다. 도형이 없는 위치면 -1 리턴
int findShapeIdx(int x, int y)
{
int idx;
for(idx = 0; idx < arShape.size(); idx++)
{
if(arShape.get(idx).rt.contains(x, y))
{
return idx;
}
}
return -1;
}
// 새 도형을 추가하고 화면을 다시 그린다. 딜레이를 주기 위해 핸들러를 사용했다.
Handler mHandler = new Handler()
{
public void handleMesasge(Message msg)
{
AddNewShape();
status = PLAY;
invalidate();
String title;
title = "MemoryPower - " + arShape.size() + " 단계 ";
mParent.setTitle(title);
}
};
}
}
---
기억력 게임인데
실행은 되는데
도형이 안생깁니다.. ㅠㅠ 도와주세요...
에러없이 컴파일되니까 문제를 못찾겟네요 ㅠㅠ
처음에 블랙화면이여다가 1.5초후에 도형을 그려주는거네요.. 1.5초이후에도 도형이 않그러진다면
도형이 추가가되었는지 확인 .. 그런다음 invalidate로 인하여 onDraw호출이 되었는지 여부를 알아보세요