package com.Project2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 전체 화면 모드
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 사용자 View 모드
setContentView(new MyView(this));
}
//----------------------------------
// MyView
//----------------------------------
class MyView extends View {
int width, height; // View의 폭과 높이
int x, y; // 캐릭터의 현재 좌표
int sx, sy; // 캐릭터가 이동할 방향과 거리
int rw, rh; // 캐릭터의 중심점
Bitmap rabbit;
//----------------------------------
// 생성자(Constructor)
//----------------------------------
public MyView(Context context) {
super(context);
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
width = display.getWidth(); // View의 가로 폭
height = display.getHeight(); // View의 세로 높이
rabbit = BitmapFactory.decodeResource(context.getResources(), R.drawable.rabbit_1);
rw = rabbit.getWidth() / 2; // 캐릭터의 중심점
rh = rabbit.getHeight() / 2;
x = 100; // 캐릭터의 초기 좌표
y = 100;
sx = 3; // 캐릭터가 1회에 이동할 거리
sy = 3;
mHandler.sendEmptyMessageDelayed(0, 10); // Handler 호출
}
//----------------------------------
// onDraw
//----------------------------------
public void onDraw(Canvas canvas) {
x += sx; // 수평으로 이동
y += sy; // 수직으로 이동
Log.i("sx",sx+"");
Log.i("sy",sy+"");
/* 벽을 통과할 경우의 처리
if (x < -rw) x = width + rw;
if (x > width + rw) x = - rw;
if (y < -rh) y = height + rh;
if (y > height + rh) y = - rh;
*/
// 벽과 반사할 경우의 처리
if (x < rw) { // 왼쪽 벽과 충동
x = rw;
sx = -sx;
}
if (x > width - rw) { // 오른쪽 벽과 충돌
x = width - rw;
sx = -sx;
}
if (y < rh) { // 천정과 충돌
y = rh;
sy = -sy;
}
if (y > height - rh) { // 바닥과 충돌
y = height - rh;
sy = -sy;
}
canvas.drawBitmap(rabbit, x - rw, y - rh, null);
}
//------------------------------------
// Timer Handler
//------------------------------------
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
invalidate(); // View를 다시 그림
mHandler.sendEmptyMessageDelayed(0, 100);
}
}; // Handler
} // MyView
} // Activiry
소스는 이렇게 진행되고 있습니다.
여기서 로그를 찍어보고 테스트 해봤는데 왼쪽에서 오른쪽으로 이동시 sx값이 3씩 증가합니다. 오른쪽 벽 충돌했을때 값을 다시 셋팅해서 -3으로 x값이 감소됩니다. 그리고 오른쪽 충돌했을때 다시 3씩 증가를 하는데.. 소스를 보면 초기 셋팅값이 sx =3이고, 오른쪽 벽 충돌시 sx = -sx라서 -3인것 알겠습니다. 여기서 중요한것이 if문에서만 -3으로 되야되는데 계속 -3으로 값이 나오더라고요..
이런이유를 아무리 생각해봐도 답이 안나와서요 ㅠㅠ 답변 부탁드립니다.
무슨 말이신지 ㅡ_ㅡ;
-> 일루 가니까 이동량이 3이었죠?
그럼 가다가 오른쪽 벽에 바운스 되니까 <- 일로 가야죠?
그러니까 sx와 sy를 이동량으로 봐야 하는겁니다.
바운스 시킨거죠.
튕기면서 계속 움직이게 하려는 겁니다.