package AnimalShooting.com;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable.Callback;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
public class AnimalShootingView extends SurfaceView implements Callback,
android.view.SurfaceHolder.Callback {
// 변수 선언
public static boolean RUN = true;
public static boolean PUSE = false;
public boolean mMode = true; // 게임 멈춤 값
int x, y, Hero_X, Hero_Y, DS_W, DS_H, Hero_W, Hero_H, Hero_S, Tcuch_X,
Tcuch_Y, Back_H;// 변수 선언
int Counter = 0; // 이미지 변경 조건 값
Bitmap Hero_image[] = new Bitmap[3];// 캐릭터 이미지 (히어로)
Bitmap Background; // 배경이미지 선언
GameThread mThread;
boolean GameRun = true; // 스레드 종료 스위치 값
SurfaceHolder mHolder;
public AnimalShootingView(Context context) { // 변수값 설정
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
mThread = new GameThread(context, holder);
} // public AnimalShootingView END
public void surfaceCreated(SurfaceHolder arg0) { // Surface 가 생성될 때 호출
mThread.start();
} // surfaceCreated END
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // Surface
// 가
// 바뀔때
// 호출
} // surfaceChanged END
public void surfaceDestroyed(SurfaceHolder arg0) { // Surface 가 삭제될 때 호출
// TODO Auto-generated method stub
while (GameRun) {
try {
System.exit(0);
mThread.join();
GameRun = false;
} catch (InterruptedException e) {
//
}
}
} // surfaceDestroyed END
// ---------------------------------------------------------------------------------
// Thread 업무
// ---------------------------------------------------------------------------------
class GameThread extends Thread {
public GameThread(Context context, SurfaceHolder holder) {
mHolder = holder;
Background = BitmapFactory.decodeResource(context.getResources(),
R.drawable.map01);
Display DSP = ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
DS_W = DSP.getWidth(); // view 가로 화면 길이
DS_H = DSP.getHeight(); // View 세로 화면 길이
Hero_image[0] = BitmapFactory.decodeResource(getResources(),
R.drawable.dog01);
Hero_image[1] = BitmapFactory.decodeResource(getResources(),
R.drawable.dog02);
Hero_W = Hero_image[0].getWidth() / 2;// 캐릭터(히어로) 가로 중심 값
Hero_H = Hero_image[0].getHeight() / 2;// 캐릭터(히어로) 세로 중심 값
Hero_S = 10; // 캐릭터(히어로) 이동속도
Hero_X = DS_W / 2; // 캐릭터 x 좌표
Hero_Y = ((DS_H / 3) + (DS_H / 2)) - Hero_H; // 캐릭터 y 좌표
Tcuch_X = Hero_X;
Tcuch_Y = Hero_Y;
Back_H = -1000;
Background = Bitmap
.createScaledBitmap(Background, DS_W, (Back_H- DS_H), true); // 배경화면
// 해상도에
// 맞게 변경
}
public void run() { // 스레드 실행 부분
while (GameRun) {
Canvas canvas = null;
try {
synchronized (mHolder) {
canvas = mHolder.lockCanvas();
ScrollImage(); // Viewport 이동
canvas.drawBitmap(Background, 0, (Back_H + DS_H), null);
Counter++;
int n = Counter % 20 / 10; // 캐릭터(히어로)애니 메이션 변화 기준
if (Hero_X < DS_W && Hero_X < Tcuch_X
&& Hero_X != Tcuch_X) {
Hero_X += Hero_S;
}
if (Hero_X > 10 && Hero_X > Tcuch_X
&& Hero_X != Tcuch_X) {
Hero_X -= Hero_S;
}
if (Hero_Y < DS_H && Hero_Y < Tcuch_Y
&& Hero_Y != Tcuch_Y) {
Hero_Y += Hero_S;
}
if (Hero_Y > 10 && Hero_Y > Tcuch_Y
&& Hero_Y != Tcuch_Y) {
Hero_Y -= Hero_S;
}
x = Hero_X - Hero_W;
y = Hero_Y - Hero_H;
canvas.drawBitmap(Hero_image[n], x, y, null);
}
} finally {
mHolder.unlockCanvasAndPost(canvas);
}
} // while END
} // run END
} // GameThread END
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mMode == false) {
return false;
}
// 터치 한 곳의 X,Y의 값을 구한다.
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Tcuch_X = (int) event.getX();
Tcuch_Y = (int) event.getY();
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
Tcuch_X = (int) event.getX();
Tcuch_Y = (int) event.getY();
} else if (event.getAction() == MotionEvent.ACTION_UP) {
Tcuch_X = (int) event.getX();
Tcuch_Y = (int) event.getY();
}
return true;
}// onTouchEvent End
public void ScrollImage() {// 배경 Scroll
// TODO Auto-generated method stub
if (mMode == false) {
return;
}
// 맵의 이미지를 움직인다.
Back_H += 5;
}
} // class AnimalShootingView END
여기에 보면 surfaceView를 이용해서 맵의 뒤 배경을 움직이는데 정상으로 움직이닥
맵이 일그러져 보이더니 캐릭터와 잔상이 막 생기네요 ㅜㅜ 어떻게 해야 될까요 도와주세요
맵 이미지 크기는 320*1000 입니다