NAT(Null Animation Technique) 을 이용한 캐릭터 애니메이션 #2

이번 버전2는 이전의 버전1과는 다르게 Null Image(1x1 크기의 투명 이미지)를 이용하고 있습니다.
그리하여 Null Animation 처리 이외에 일반 Rotate, Scale, Move 를 동시에 처리가능하게 할 수 있습니다.


이것을 응용하면 Null Image 개수를 늘려서, 좀더 다양한 이벤트도 처리가 가능합니다.
예를 들면 캐릭터 주변에 발생되는 이펙트 효과라든가 말이지요.

저작자 표시
신고


NAT(Null Animation Technique) 을 이용한 캐릭터 애니메이션 #1


게임오븐은 콜백 기반으로 인터페이스가 구성되어 있습니다.

그리고, 게임오븐에서 일정 시간이 경과한 이후에 변화를 처리하기 위해서는
다음과 같이 몇가지 방법이 있습니다.


1. Client:OnTimer() 에서 타이머 이벤트 발생 주기마다 변화

2. Scene:Update() 에서 매 프레임 랜더링할 때마다 시간적 변화를 체크

3. AnimationFinished 이벤트 핸들러를 이용한 콜백 이벤트 처리


위의 각 방법에는 나름대로 장단점이 있습니다.

1번의 경우에는 보통적인 방법으로 시간 변화를 감지할 수 있으나,
timerid 관리가 어렵습니다.

아울러, 캐릭터 애니메이션과 연관지어서 구성하려면 timerid 나 시간을
정교하게 관리해야 하는 번거로움이 있습니다.


2번의 경우에는 매 호출시기 마다 경과 시간을 체크해서
현재의 상황을 갱신해야 합니다.

아울러 매 프레임마다 호출되므로,
복잡한 코드가 Update() 내부에서 동작하게 될 경우 전체 프레임이 떨어집니다.

이것은 게임 성능상 치명적이고 보기 좋지 않습니다.


3번의 경우는 AnimationFinished 콜백 이벤트 함수를 응용해서
특정 시간동안 애니메이션을 처리한 이후에 호출되는 콜백 함수를 이용하는 것입니다.

특정 시간동안 아무것도 처리하지 않는 Null Animation 을 끼워넣어서
주기적으로 콜백 함수가 호출되도록 하는 것입니다.

각 이미지 단위로 콜백 함수를 호출되도록 관리할 수 있으므로, 매우 유용하게
쓰일 수 있습니다.

애니메이션 종류에는 몇가지 있지만, 그중에서 KeyShow 애니메이션이
아무것도 처리하지 않는 Null Animation 에 적합합니다.

그러나, 복합적으로 이미지에 애니메이션을 처리하고자 할 때는
Null Animation 의 완료된 시점과 일반 Rotate, Scale, Move 등의 애니메이션의
완료된 시점이 혼동될 수 있습니다.


이 예제는 3번의 AnimationFinished 이벤트 핸들러를 이용해서
구현한 캐릭터 애니메이션을 보여주고 있습니다.

저는 이 방법을 NAT(Null Animation Technique)라고 이름을 지어봤습니다.
네트워크 용어와 혼동될 수도 있지만, 그래도 짧게 읽고 싶습니다. (^^)

추후에 일반 Rotate, Scale, Move 와 Null Animation 을 병행해서 처리 가능하도록
개선의 여지는 남아 있습니다. (이 부분은 다음 버전에서 해결됩니다.)


저작자 표시
신고


게임오븐상에서 A* 알고리즘을 이용해서 길찾기를 구현한 예제입니다.

마우스 왼쪽 클릭으로 파란색 점을 찍으면 시작점이고,
두번째 왼쪽 클릭으로 빨간색 점을 찍으면 도착점입니다.

두점을 찍으면 길찾기를 수행하고, 찾은 길은 연두색 점으로 찍힙니다.

마우스 오른쪽 클릭으로 이동 불가능한 블럭 셀을 지정하거나,
블럭 셀을 지울 수 있습니다.

블럭은 흰색의 사각형입니다.


참고:

http://en.wikipedia.org/wiki/A*_search_algorithm
http://blog.naver.com/migurazi/70068117902
http://lua-users.org/lists/lua-l/2007-07/msg00482.html
http://symlink.tistory.com/42

저작자 표시
신고

Serializable 클래스를 재활용하는 방법에 대한 예제입니다.

원래 PlayerGameData 의 userdata 멤버가 Serializable 타입으로 구성되어 있습니다.

이 예제는 userdata 멤버를, 자신이 직접 만든 MyCard 라는 클래스로 교체하여
서버 및 클라이언트에서 MyCard 클래스를 재활용하는 방법을 보여줍니다.

이는 단순히 MyCard 클래스를 재활용하는 것이 아닌,
(1) 서버에 데이터를 저장하고
(2) 서버와 클라이언트 사이에서 데이터를 주고 받을 수 있도록 하였고
이 작업을 아주 단순하게 몇 줄의 코드만으로 해결 가능하도록 했습니다.


이 예제의 동작 과정은 다음과 같습니다.

1. 클라이언트가 서버에 접속한다.
2. 서버에서 접속한 클라이언트의 PlayGameData(MyCard 데이터 포함) 를 로딩한다.
3. 로딩된 MyCard 데이터를 클라이언트에 보낸다.
4. 서버에서 수신된 MyCard 데이터를 화면에 보여준다.
5. <카드섞기> 버튼을 클릭하여 자신의 MyCard 데이터를 임의로 바꾼다.
6. 클라이언트가 접속을 끊으면, 현재의 MyCard 데이터를 저장한다.


이 예제를 작성하는 시점에서 Serializable 은
자신의 멤버 데이터 변수들을 문자열로 자동으로 변환해주는 막강한 기능을 제공합니다.

그러나, 자동으로 변환된 이 문자열은 크기가 큽니다.
게임오븐에서 제한하는 저장소 데이터 크기(4kb)와 네트워크 트래픽(200kb)을 고려한다면
Serializable 클래스는 신중히 사용해야 할 것입니다.

따라서, 기획하고자 하는 게임의 데이터 크기가 크지 않은 경우에.
간단히 게임을 만들고자 할 때는 활용 범위가 클 것이라 믿습니다.


다른곳: http://cms.hangame.com/post2/812/1916355

저작자 표시
신고

티스토리 툴바