[안드로이드 게임 만들기] 스프라이트 애니메이션
안드로이드 게임 만들기 SpriteAnimation |
게임에서 가장 중요한것 중 하나가 애니매이션 일텐데요. 여기서는 안드로이드의 애니매이션중에서 2D 스프아이트 애니메이션을 구현하는 방법을 알아보겠습니다. 여러 방법이 있지만 비트맵 하나를 리소스에 추가해서 정보를 코드에 직접 작정하는 방식으로 구현해 보겠습니다.
다음과 같이 연속적인 이미지를 이용해서 구현해 볼텐데요. 포토샵에 소질이 없어서 좀 허접 하더라도 이해해주세요^^;
■ 이런 이미지가 있으면 전체를 한번에 그려주는 것이 아니라 프레임 하나씩 연속적으로 네개를 그려주면서 마치 움직이는 듯한 느낌을 주는 것입니다. 직접 해보면서 어떻게 작동하는지 알아보도록 할게요.
■먼저 FrameWork패키지에 SpriteAnimation클래스를 만들고 지난 포스팅에서 했던 GraphicObject클래스를 상속 받겠습니다.
■ 이렇게 상속을 받았기 때문에 기본적으로 Bitmap 멤버 변수가 있습니다. 이제 몇가지 멤버를 추가하겠습니다. 우선 현재 프레임에서 그려줄 범위 정보를 담을 Rect형 멤버 변수를 추가하고, 애니매이션의 초당 프레임(FPS : Frame Per Second) 정보를 담을 맴버 변수도 추가하겠습니다. 또한 시트의 개수를 담을 m_iFrames를 추가하겠습니다.
■ 다음으로 추가할 변수는 현재의 프레임을 담을 변수 입니다. 이 변수는 시간이 지남에 따라 값이 증가하고, 그에 따라 그려지는 이미지도 바뀌게 됩니다. 그리고 프레임의 높이와 넓이를 담아줄 변수도 추가 하겠습니다.
■ 이제 클래스의 생성자에서 변수들의 값을 초기화 하겠습니다. 그리고 인스턴스에 스프라이트 애니메이션 정보를 대입하는 InitSprigeData()메서드를 작성하겠습니다.
■ 데이터들을 초기화 하는 메서드까지 작성을 해봤는데요. 매개변수로 받은 값을 변수에 그대로 대입을 했습니다. m_fps만 밀리초 계산을 위해서 약간의 수식이 들어갔네요. 이제 이 클래스를 게임뷰 클래스에서 인스턴스를 생성하고 초기화 하는 코드를 작성하겠습니다. 먼저 GameView클래스에서 이 클래스를 멤버로 선언을 하고 생성자에서 인스턴스화 합니다.
■ 다음으로 SpriteAnimation클래스의 InitSpriteDate()메서드를 호출해서 이미지 파일에 대한 애니매이션 정보를 입력해줘야 합니다. 그리고 GameView클래스의 onDraw메서드에서 m_spr의 Draw메서드를 호출하게 합니다.
■ 이제 컴파일 하고 실행을 해보겠습니다.
실행을 해보면 이미지를 그냥 그렸을때와 똑같은 화면이 나타나는데요. 이것은 스프라이트 애니메이션 클래스의 Draw메서드를 재정의 하지 않아서 그렇습니다.
■ Draw메서드를 재정의 하겠습니다.
■ 실행해 보면 메서드에서 정한 범위만큼의 한프레임만 나타납니다.
■ 다음으로 업데이트 메서드를 만들어서 시간이 지남에 따라 그려야 하는 프레임을 바꾸는 부분을 작성하겠습니다. 시간의 흐름에 따라 그려주는 스프라이트 프레임에 변화를 주기 위해서 업데이트 메서드의 매개변수를 게임상의 시간으로 받습니다.
■ 업데이트 메서드도 게임프레임 워크인 GameView클래스의 Update에서 불러와야 합니다. 그리고 현재의 시간 정보를 담을 long 형 변수를 추가하고 System.currentTimeMills메서드를 호출해서 현재 시간을 밀리초 단위로 구합니다.
■ 마지막으로 SpriteAnimation 클래스 업데이트 메서드에서 그림을 그릴 때 들어가는 매개변수 값인 m_Rect 변수의 값을 새로 그려줄 프레임 값으로 교체하는 코드를 추가합니다.
■ 실행을 해보면 애니매이션이 정상적으로 작동하는걸 확인 할 수 있습니다.
손으로 잘라서 만든 이미지라 들쑥날쑥 하지만 제대로 작동하는건 확인이 되네요.