본문 바로가기
개발/android

[엔진없이 게임만들자] 자유자재로 오브젝트 이동시키기

by 매몰 2014. 4. 14.

유니티나 코코스 엔진 없이 게임을 만드는 첫번째 시간!


물체 이동시키기~ 즉, 오브젝트 타켓팅 기법~



오브젝트 이동시키기



참고로 혼자서 독학하여 터득한 내용이니 기존의 기법과 다소 차이가 있을 수 있다ㅎㅎ

하지만 이론만 늘어놓는 내용이 아닌 내가 직접 만들어 출시한 앱에 사용되는 기법이다


일단 오브젝트를 이동시키 위해서는 방향 및 속도를 정하는 타켓팅 단계와

타켓팅 정보에 따라서 오브젝트를 이동시키는 액션 단계.. 두단계가 필요하다.

(타켓팅, 액션 구조는 내가 나름 만든 용어ㅎㅎ 또한 이구조는 이동뿐만 아니라 크기변화, 투명도변화 등에서도 같은 구조를 가진다)


먼저 타켓팅은 오브젝트를 이동시키는 명령어라 할 수 있다. 즉, 이동을 시작하는 시점에 넣으면 된다.

그리고 액션은 좌표이동을 지속적으로 해야 하기 때문에 게임루프에 넣어 반복실행하면 되고

오브젝트 이미지는 Bitmap이나 Drawable일테니 좌표 mX, mY를 알맞게 적용하여 출력하면 된다.



class Object {

public int mX, mY;

public int mTargetX, mTargetY;

public float mNormalX, mNormalY;

public float mTempX, mTempY;

public float mSpeed;

 

//타켓팅(sx,sy:출발좌표, ex,ey:도착좌표, speed:속도)

public void targeting(float sx, float sy, float ex, float ey, float speed) {

  //출발지와 도착지의 거리계산

float x = ex - sx;

float y = ey - sy;

double distance = Math.sqrt(x*x + y*y);

  //방향 단위백터 계산

if(distance == 0) {

mNormalX = x;

mNormalY = y;

}

else {

mNormalX = (float)(x / distance);

mNormalY = (float)(y / distance);

}

  //출발지 설정(mTempX,mTempY는 float형으로 화면좌표가 int형인 안드로이드에서 이동경로를 더 정확하게 하기 위해 사용한다. 실제로 int형으로 계산하면 원하는 경로로 안가는 경우가 있다. 또한 mX,mY는 int형으로 오브젝트 이미지를 찍어주는 출력용 좌표라 할수 있다)

mTempX = mX = (int)sx;

mTempY = mY = (int)sy;

  //목적지 설정

mTargetX = (int)ex;

mTargetY = (int)ey;

  //속도 설정

mSpeed = speed;

}


//액션(반환값이 true이면 계속 이동, false이면 멈춤)

public boolean move() {

boolean result = true;

//속도에 맞게 좌표이동

mX = (int)(mTempX += (mNormalX * mSpeed));

mY = (int)(mTempY += (mNormalY * mSpeed));

//목적지에 도달했는지 검사

boolean stopx = false, stopy = false;

if(mNormalX > 0) {

if(mTempX >= mTargetX)

stopx = true;

}

else {

if(mTempX <= mTargetX)

stopx = true;

}

if(mNormalY > 0) {

if(mTempY >= mTargetY)

stopy = true;

}

else {

if(mTempY <= mTargetY)

stopy = true;

}

//목적지에 도달했으면 멈춤

if(stopx && stopy) {

mX = mTargetX;

mY = mTargetY;

result = false;

}


return result;

}        

}




아주 간단하지 않은가ㅎㅎ 이 구조를 처음 짯을때만 해도 이리도 짜보고 저리도 짜보고 하면서 엄청 고생했던것 같은데 막상 이렇게 적어보니 허무할정도로 간단ㅎㅎ


물론 실제 게임에서는 이보다 더 복잡한 내용을 가진다. 왜냐하면 오브젝트는 가속도 또는 곡선이동도 할것이고 이동뿐만 아니라 동시에 크기,투명도등의 변화도 할것이기 때문이다.

하지만 단순 이동만 시킨다면 이것만으로 충분하다.




 

 



수제 앱 장인: 고영진


1인 개발자 

  

     실패만 하고 있어도 꿈을 포기하지 않는 남자 

     제가 직접 경험하고 습득한 지식을 위주로 올릴게요

 





사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기