앱을 제작할때에는 버튼 클래스가 기본적으로 제공된다..
하지만 SurfaceView 기반의 게임을 만들때는 그렇지 않기 때문에 손수 만들어야 한다..
빠른 이해를 위해 모든 군더더기는 다 빼고 이미지로만 이루어진 버튼 클래스를 만들어 보겠다..
클래스
public class GraphicButton {
public static final int IMAGE_UP = 0;
public static final int IMAGE_DOWN = 1;
private Bitmap[] mImage;
private Rect mRect;
public
int
mImageNum;
public GraphicButton(Rect rect) {
mRect = rect;
mImage = new Bitmap[2];
mImageNum = IMAGE_UP;
}
public void setImages(Bitmap upimage, Bitmap downimage) {
//이미지를 눌린 상태 및 아닌 상태 두가지로 저장한다
mImage[IMAGE_UP] = upimage;
mImage[IMAGE_DOWN] = downimage;
}
public boolean touch(int tx, int ty) {
//이미지 좌표와 터치 좌표를 비교한다
Rect rect = mRect;
if((rect.left < tx && rect.right > tx) && (rect.top < ty && rect.bottom > ty))
return true;
return false;
}
public void setPress(boolean press) {
//버튼의 이미지를 변경하여 눌린 상태 및 아닌 상태를 표시한다
mImageNum = press ? IMAGE_DOWN : IMAGE_UP;
}
public void draw(Canvas canvas) {
//이미지 번호대로 이미지를 출력한다
int imagenum = mImageNum;
if(mImage[imagenum] != null)
canvas.drawBitmap(mImage[imagenum], null, mRect, null);
}
}
사용법
private GraphicButton mButton;
private GameThread mThread;
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
//버튼을 원하는 위치에 생성
mButton = new GraphicButton(new Rect(100, 100, 300, 200));
//버튼 이미지 설정
Bitmap upimage = BitmapFactory.decodeResource(context.getResources(), R.drawable.upbutton);
Bitmap downimage = BitmapFactory.decodeResource(context.getResources(), R.drawable.downbutton);
mButton.setImages(upimage, downimage);
mThread = new GameThread(holder);
}
class GameThread extends Thread {
private SurfaceHolder mSurfaceholder;
public GameThread(SurfaceHolder surfaceHolder) {
mSurfaceholder = surfaceHolder;
}
@Override
public void run() {
SurfaceHolder surfaceHolder = mSurfaceholder;
Canvas c = null;
while(true) {
//게임 로직
//...
try{
c = surfaceHolder.lockCanvas(null);
synchronized(surfaceHolder) {
if(c != null)
doDraw(c);
}
sleep(mDelay);
}catch(InterruptedException e) {
e.printStackTrace();
}
finally {
if(c != null)
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
private boolean doDraw(Canvas canvas) {
//배경 및 오브젝트 출력
//...
//버튼 출력
mButton.draw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int touchx = (int)event.getX();
int touchy = (int)event.getY();
switch(event.getAction()) {
case MotionEvent.ACTION_CANCEL:
mButton.setPress(false); //버튼 상태 초기화
break;
case MotionEvent.ACTION_UP:
mButton.setPress(false); //버튼 상태 초기화
if(mButton.touch(touchx, touchy)) {
//버튼 클릭 행동
//...
}
break;
case MotionEvent.ACTION_MOVE:
//버튼 상태 변경
mButton.setPress(mButton.touch(touchx, touchy));
break;
case MotionEvent.ACTION_DOWN:
//버튼 상태 변경
mButton.setPress(mButton.touch(touchx, touchy));
}
}
게임에서는 버튼이 움직이는 등의 애니메이션이 많이 들어 간다.
그러기 위해서는 클래스를 확장하여 좀 더 알맞게 고쳐야 할 것이다.
도움이 되셨다면~ 정성으로 빚은 저희 앱! 많은 이용 바래요:)
https://meorimal.com/index.html?tab=spaceship
https://meorimal.com/subway.html
'개발 > android' 카테고리의 다른 글
버튼 누름 효과를 만드는 2가지 방법 (2) | 2015.04.19 |
---|---|
오로지 기울기 센서로만 가로세로 모드 체크하기 (0) | 2015.02.23 |
게임에 꼭 필요한 난수, 간단하게 확률대로 발생시키기 (0) | 2014.09.14 |
점의 선대칭 이동 공식을 코드로 짜보자 (0) | 2014.08.15 |
[안드로이드] 간단하고 편리한 난수 발생 함수 만들기 (0) | 2014.06.22 |