posted by REDFORCE 2017. 8. 30. 15:33

Sephy Engine과 Sephy Engine 을 기반으로 한 전략게임을 제작한 문서 정리가 끝났습니다.


아직 미흡하고 부족한 부분이 많은 엔진이고 버그 투성이인 게임이지만


어떻게 마무리를 짓고 이렇게 끝낼 수 있게 되었네요.


함께 개발에 참여해주셨던 성윤님과 최윤님 그리고 고생많이 하신 학성님께 감사드립니다.


Sephy Engine Development Document.pdf




posted by REDFORCE 2017. 8. 30. 15:33



Sephy Engine으로 제작한 게임의 Battle 소개 영상입니다.


목표로 했던 모든 콘텐츠를 완전히 다 구현하진 못하고 마무리 하게 되었으나

여기까지 그래서 만들어왔다는 점이 돌아보면 많이 한거 같기도 하고...별로 한게 없는거 같기도하고...


버그 투성이에 부족한 기능이 많은 게임이지만 어찌어찌 여기까지 왔네요 :)

posted by REDFORCE 2017. 8. 30. 15:30


Sephy Engine으로 제작한 게임의 Simple 전투 수행 영상입니다.


별다른 설명은 필요없을 것 같아 내용은 적지 않겠습니다.

posted by REDFORCE 2017. 8. 30. 15:28


Sephy Engine으로 제작한 맵 툴(MapTool) 입니다.


Engine에서 제공해주는 UI 프레임워크를 사용하여 제작하였습니다.

제작하고있는 게임에 맞춰서 제작한 맵툴 이기 때문에 다소 특이한 기능들이 몇가지 첨부 되어 있습니다.


기본적으로 Isometric 을 기반으로한 타일 방식을 사용하고 있으며,

일반 타일, 오브젝트, 이벤트 오브젝트로 분류하여 오브젝트들을 설치할 수 있습니다.


맵툴은 추후에 어떤 데이터가 생길 것인가 하는 문제 때문에 설계기간이 길어져서 프로그래밍 작업 기간은 짧으나 실제 제작기간은 상당히 오래걸렸습니다.

posted by REDFORCE 2017. 8. 30. 15:09


Sephy Engine (자체 엔진)으로 제작한 게임에서 사용했던 Unit Testing Tool 입니다.



게임에서 사용하고자 하는 함선의 데이터를 불러와서 모의전투가 수행가능하며

밸런스 조절을 목적으로 유닛들의 성능들을 바꿔가며 실시간 테스팅이 가능하도록 만들었습니다.


중간 중간 유닛을 새로 생성하거나 삭제가 가능한구조로 되어있으며,

아군 vs 적군 유닛으로 구분하여 모의 전투 수행이 가능합니다.


자체엔진에서 이것저것 UI까지 정리해서 만드는데 3일정도 걸렸던 것 같네요.

posted by REDFORCE 2017. 5. 18. 22:14

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics

 + Image - SpriteData

 + Layer  

 + Input (현재 글)

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------


이번글에서 설명 할 내용은 Input Class 입니다.


Input 클래스는 엔진에서의 모든 키입력 처리에 대한 것을 담당하는 클래스입니다.


일반적인 키보드 입력, 마우스 입력 부터 XBox Pad의 입력에 대한 처리를 담당합니다.




먼저 헤더에서의 주요 내용들을 살펴보도록 하겠습니다.


헤더에서 다룰 내용 목록은 다음과 같습니다.


1. 키 입력을 위한 주요 변수들

2. Input 클래스의 주요 함수 목록 


본 글에서는 자세한 게임패드 입력처리에 대한 설명은 하지 않습니다.

게임패드 입력처리에 대한 자세한 내용은 다음에 기회가 되면 다루도록 하겠습니다.

(#include <XInput>제목으로 별도의 포스팅을 통해 다룰 예정입니다.)




1. 먼저 Input.h 의 상단에 위치한 내용들을 보도록 하겠습니다.



 (1) namespace inputNS를 보시면 사용 될 모든 키들에 대한 값들을 위해 KEYS_ARRAY_LEN이 있습니다. 사용 할 키들의 사이즈 크기라 보시면 됩니다. (즉, 256 개의 키를 지원)

 (2) 다음 키다운 이나 눌러졌다를 판단할 용도의 KEYS_DOWN / KEYS_PRESSED 플래그

 (3) 마우스에 대한 플래그 값 MOUSE와 텍스트 입력에 대한 플래그 값 TEXT_IN 플래그

 (4) 모든 키들을 Clear시킬 용도로 각 플래그 값들을 합친 KEYS_MOUSE_TEXT 플래그


그리고 그 아래에는 게임 패드를 사용하는 것들에 대한 키 플래그값들이 나열되어 있습니다.

게임패드에 대한 입력을 처리할 목적으로 선언되어 있으나 패드를 지원하는 게임을 만들 게 아니라면 딱히 사용할 일은 없습니다.


게임 패드에 대한 선언은 본 글에서는 생략하고 추후 XInput에 대한 것을 다룰 때 다시 설명하도록 하겠습니다.



다음, Input 클래스에서 키 입력 처리를 위해 사용 되어지는 주요 변수들 입니다.


(private: 접근한정자 안에 선언 된 주요 변수들을 먼저 코드로 올렸습니다. 실제 전체 코드는 public: 영역도 포함하여 최 하단에 업로드 되어있습니다.)



 (1) keysDown[KEYS_ARRAY_LEN] / keysPressed[KEYS_ARRAY_LEN] (키 입력 여부를 판단할 목적의 bool 변수)

 (2) bool mouseWheelRoll / Rollup/ RollDown (마우스 휠을 굴렸을 때의 이벤트 판단목적)

 (3) std::string textIn (텍스트 입력값들을 저장할 목적)

 (4) char charIn (텍스트 입력 시 한 글자 값들을 저장)

 (5) bool newLine (줄바꿈 여부를 판단할 목적)

 (6) int mouseX / Y (현재 마우스 커서의 x,y 위치)

 (7) int mouseRawX / Y (현재 마우스커서의 고감도 x, y 위치)

 (8) RAWINPUTDEVICE Rid[1] (고감도 마우스 지원 여부 판단 목적의 변수)

 (9) bool mouseCaptured (마우스 위치 캡쳐 목적의 플래그 값)

 (10) bool mouseL/M/RButton (마우스 좌/우/중앙 키 입력 플래그 값)

 (11) bool mouseX1/X2Button (마우스 특수버튼 1,2 키 플래그 값)

 (12) ControllerState controllers[MAX_CONTROLLERS] (게임 패드 이용 시 사용하는 플래그 값)


들로 주요 변수들이 이루어져 있습니다.


일반적인 게임 키처리에 대한 변수들과 동일한 구조 형태라 아마 이름만봐도 아 저변수가 무슨용도구나 하고 이해하시는데는 불편함이 없을거라 생각합니다.



그럼 마지막으로 각 키입력에 대한 함수들의 구조를 보겠습니다.


2. 주요 함수 목록



지금 위에 언급된 함수 외에도 게임패드관련 함수가 상당히 많이 있습니다만, 분량이 너무 길어지는 관계로 위 코드에는 올리지 않았습니다. 최하단 전체 코드에는 게임패드 관련 함수도 같이 들어있습니다.


헤더에서 함수가 뭐 이렇게 많아!? 하고 겁먹으실 필요는 없습니다.

어짜피 엔진을 쓰면서 사용하게 될 함수는 8~90% isKeyDown / wasKeyPressed 밖에 없으니까요. 게임패드 관련 함수를 뺏음에도 상당히 부담이 가신다면 아래와 같이 간단히 이런 게 있다 라고만 보시면 될 것 같습니다.


 (1) 생성자 / 소멸자

 (2) KeyDown / Up / In (키입력에 대한 판단 함수)

 (3) isKeyDown (키가 눌러졌냐~? 라고 물어보는 함수)

 (4) wasKeyPressed (최근 프레임 1~2사이에 키가 눌려졌냐~? 라고 물어보는 함수)

 (5) anyKeyPressed (아무키나 눌러졌었냐~? 라고 물어보는 함수)

 (6) clearKeyPressed (눌려진적이 있는 키를 다시 false로 초기화 하는 함수)

 (7) mouseWheel In / Up / Down (마우스 휠이 굴려졌을때 위로굴렸냐 아래로 굴렸냐 체크하는 함수)

 (8) clear / clearAll / clearTextIn 각각 키 입력에 대한 Clear 함수

 (9) getTextIn / getCharIn (문장 / 한 글자 입력 시 내용 받아오는 함수)

 (10) set/ get Mouse L/M/R/X Button (마우스 키 입력 또는 받아오는 함수)

 (11) getMouseX / Y , getMouseRawX /Y (마우스 좌표 받아오는 함수)


키 입력에 대한 처리를 하는 함수들은 위와 같이  11가지가 있습니다.

결과적으로는 모두 다 사용하는 함수들이기 때문에 대충 어떤목적에 사용한다 라는 것만 알고 넘어간 뒤 엔진을 사용하면서 쓰다보면 자연스레 본인이 쓰고 있는 모습을 볼 수 있습니다.


자세한 각 함수들에 구현 내용은 .cpp로 이어서 적도록 하겠습니다.



아래는 전체 헤더파일 내용입니다.



'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #3_LayerManager Class .cpp  (0) 2017.04.21
June_Engine #3_LayerManager Class .h  (0) 2017.04.21
June_Engine #3_Layer Class  (0) 2017.04.21
June_Engine #3_Image Class .cpp (2)  (0) 2017.04.20
June_Engine #3_Image Class .cpp (1)  (0) 2017.04.19
posted by REDFORCE 2017. 4. 21. 20:39

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics

 + Image - SpriteData

 + Layer  (현재 글)

 + Input

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------


LayerManager Class .cpp 내용을 살펴보도록 하겠습니다.



1. 간단히 생성자와 소멸자 그리고 initialize 함수를 보도록 하겠습니다.



생성자 부분에서는 현재 LayerState 값이 LAYER_NONE 값으로 초기화 됩니다.

소멸자는 release 함수 호출뿐이군요.


initialize 함수에서는 미리 네임스페이스로 만들어두었던 기본 LAYER들 값들에 맞춰서

addLayer 함수를 호출하여 레이어를 등록하도록 되어있습니다.


반복문으로 처리하면 안되~? 라는 생각도 해봤습니다만


= _=아마 당시에 만들면서 귀찮아 그냥 몇개 안되니까 하드코딩으로 만들자

라고 생각했던 것 같네요.


enum Class 타입의 값을 반복문으로 알아서 처리되게끔 고치실 수 있다면 initialize 코드를 개선해보시는것도 좋을 것 같습니다.



release 함수에서는 각각 Layer들이 new 로 할당되어 등록되었기 때문에


해지해주는 과정이 이루어지고 있습니다.

(SAFE_DELETE 매크로를 이용하여 해지합니다. SAFE_DELETE 매크로는 graphics 글에서 언급했습니다.)



initialize 함수의 addLayer 과정을 통해 다음 그림과 같이 Layer가 layerVec에 쌓이게 됩니다.


레이어 순서는 번호 순서대로 위에서 아래로 렌더링 순서가 정해집니다.

enum class 형태의 값 순서대로 읽어 가기 때문인데요. 


여기서 중요한 점은 AddLayer 함수를 호출하면 레이어가 enum Class 값 형식에 맞춰서 정렬됩니다.


만약 같은 Layer 타입이라면 딱히 같은 타입들사이에서는 정렬 될 필요가 없다 느꼈기 때문에


다른 타입들간의 순서만 정렬시켜줍니다.



그럼 이제 AddLayer 함수를 살펴보겠습니다.


2. addLayer


addPlayer 함수는 initialize() 에서 Layer를 등록하면서 호출 되었덩 함수입니다.


코드를 먼저 보겠습니다.



// 레이어 등록이 성공적으로 끝났다면 true값으로 바뀝니다.

Line 3 : bool success = false;   


// 만약 레이어 타입이 네임스페이스LayerManagerNS::none 과 같다면 false를 리턴합니다.

Line 6 : if (layerkey.compare (LayerManagerNS::none) == 0) 


Line 10 ~ 15 : 현재 레이어 리스트에 등록된 같은 레이어가 있는지 확인하여 있다면 false를 리턴합니다.


Line 17 : 여기까지 왔는데 아무이상없었으면 Layer를 등록합니다. 


Line 18 : success 값을 true 로 변경합니다.


Line 20 : 레이어 정렬 함수를 호출합니다.



아마 위에 적어둔 설명을 보시면 아마 AddLayer 함수 내용자체는 별로 어려운 것이 없을 것 입니다.


★주의 할 점은 현재 layerList 라고 하는 MAP 형태의 컨테이너에만 

Layer를 담았다는 것을 꼭 확인하시기 바랍니다.



3. deleteLayer


DeleteLayer() 함수는 AddLayer 함수와 반대로 등록 된 레이어를 삭제하는 함수입니다.



간단히 layerList 에 등록 된 레이어 중에 파라미터로 받은 레이어 이름과 비교하여

등로 된 레이어가 있다면 layerList에서 해당 항목의 레이어를 erase 시킨 후

sortLayer() 함수를 호출하여 줍니다.



4. sortLayer


네 번째로, addLayer과 deleteLayer에서 호출한 sortLayer 함수를 살펴보겠습니다.


sortLayer는 함수명 그대로 레이어들을 정렬시키는 함수입니다.




위에서 주의할 점으로 layerList 라고 하는 Map 타입의 컨테이너에 Layer를 담았었다는 것을 보셨을 겁니다.


그 이유는 바로 layerList (Map 컨테이너)에서 정렬을 수행 한 후

진짜 컨테이너인 layerVec (Vector 타입의 컨테이너) 에 정렬 시킨 후 담아두기 위함입니다.


sortLayer( ) 함수 자체는 간단하게 3줄로 되어있습니다.


1. std::vector<std::pair<std::string, Layer*>> 형태의 벡터 컨테이너를 먼저 만듭니다.

그리고 생성과 동시에 layerList에 담겨있는 Layer들을 그대로 begin 부터 end까지 넣어줍니다.


2. 미리 헤더에 생성해둔 Sort 템플릿을 이용하여 정렬시킵니다.


3. layerVec 의 값을 위에서 정렬 시킨 컨테이너로 넣어줍니다.



그리고 SortLayer에서 중요한 점은 아래의 템플릿을 이해를 하셔야 합니다.




방법은 간단히 좌우 값을 비교하여 작은 값 순서대로 정렬을 시킵니다.


아마 정렬하는 로직은 간단해서 이해하시기 어려움이 없을 것이오나, 템플릿을 사용하는 점에대해서는 스스로 템플릿이 뭔지 알고보셔야 아마 이해하시는데 문제가 없을거라 보입니다.



'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #2_Input .h  (0) 2017.05.18
June_Engine #3_LayerManager Class .h  (0) 2017.04.21
June_Engine #3_Layer Class  (0) 2017.04.21
June_Engine #3_Image Class .cpp (2)  (0) 2017.04.20
June_Engine #3_Image Class .cpp (1)  (0) 2017.04.19
posted by REDFORCE 2017. 4. 21. 07:18

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics

 + Image - SpriteData

 + Layer  (현재 글)

 + Input

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------



이어서 LayerManager Class에 대해서 설명하도록 하겠습니다.



Layer Class를 보셨다면 헤더 파일 내용 중에

enum class 타입으로 선언되어있는 Layer 리스트를 보셨을 겁니다.


위 그림은 해당 리스트 내용을 그대로 순서대로 나열한 것 입니다.



다시 뒤로 돌아가서 코드 보기 귀찮으신 분들을 위해 enum Class만 다시 올려드립니다.



보는 바와 같이 LAYER_NONE 부터 LAYER_LAST 까지.


 (1) LAYER_NONE : 초기화용 레이어 타입

 (2) LAYER_FIRST : 첫 번째 레이어

 (3) LAYER_BACKGROUND : 배경 레이어

 (4) LAYER_DEFAULT : 일반 레이어

 (5) LAYER_UI : UI 용 레이어

 (6) LAYER_LAST : 마지막 레이어


순으로 총 6가지의 레이어 타입이 있습니다.


만약 무엇보다 우선순위를 높여서 출력하고 싶으신 것이 있다면 첫 번째 레이어로 이미지 클래스에서 타입을 결정시키면 되고.


일반적인 이미지 출력(캐릭터, 아이템, 애니메이션 등)은 LAYER_DEFAULT 를 이용하시면 됩니다.

그 외에 레이어들은 다른 레이어와 똑같이 직관적이므로 설명은 생략하겠습니다.


만약 어떤 설정을 안한다면 모든 이미지들은 LAYER_DEFAULT 값으로 들어갑니다.



그럼 Layer에 대한 복습이 다시 됐으리라 생각하고, 

LayerManager를 바로 살펴보도록 하겠습니다.


Layer Manager 헤더 내용입니다.



1. LayerManagerNS


먼저 namespace 를 살펴보시면 const std::string 타입으로 미리 구성 된 LAYER의 이름들이 들어가있습니다.



2. 변수들


그리고 private: 에 선언되어있는 변수를 확인해주시기 바랍니다.


 (1) std::map<std::string, layer*> layerList;  (레이어 정렬 전 MAP 컨테이너)

 (2) std::vector<std::pair<std::string, layer*>> layerVec; (레이어 정렬 된 VECTOR 컨테이너)

 (3) enLayerList curLayerState; (현재 렌더링 해야할 레이어)


이렇게 3가지의 변수가 있습니다.



3. 함수들


다음  public: 에 여러가지 함수들이 있습니다만...

역시나 getter/setter함수들이 주로 있을 뿐, 현재 눈여겨 봐야 될 함수는 SortLayer( ) 밖에 없습니다.



4. 정렬용 템플릿


네 번째로 확인할 점은 레이어들을 정렬 시키기 위해 만들어 둔 템플릿 입니다.

std::less를 이용하여 받아온 매개변수를 left / right 비교를 통해 true/false를 뱉어줍니다.




헤더에서 일단 살펴볼 내용들은 위에 언급한 정도이고,

자세한 설명은 .cpp에서 이어가도록 하겠습니다.

'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #2_Input .h  (0) 2017.05.18
June_Engine #3_LayerManager Class .cpp  (0) 2017.04.21
June_Engine #3_Layer Class  (0) 2017.04.21
June_Engine #3_Image Class .cpp (2)  (0) 2017.04.20
June_Engine #3_Image Class .cpp (1)  (0) 2017.04.19
posted by REDFORCE 2017. 4. 21. 04:00

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics

 + Image - SpriteData

 + Layer  (현재 글)

 + Input

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------


이번 글에서는 Layer Class에 대해 다루도록 하겠습니다.


Layer Class는 Image Class 내부에 들어가서 사용 되는 클래스 입니다.

즉, 어떤 이미지 또는 애니메이션을 돌릴 때 사용되어지는 모듈 입니다.



Q. 그럼 Layer Class가 대체 무엇인가?

A. 포토샵의 레이어와 비슷하다 생각하시면 될 것 같습니다.


흔히 레이어라 하면 겹겹이 쌓여서 출력되어지는 그런 계층 구조의 기능을 상상하실 수 있을 것 입니다.


그러나 보시고 계신 현재 Layer Class 는 Scene의 Render에서 

해당 Layer 단계의 출력 여부(true / false) 를 체크하여 Rendering 해줍니다.


Layer Class 자체는 Layer가 활성화 됐냐 안됐냐 여부만 갖고 있습니다.


그리고 활성화 여부에 맞춰,

씬의 Render 에서는 활성화 된 Layer만 Rendering을 해주게 됩니다.


Layer Class의 헤더 부터 살펴볼까요.



헤더에서 보면 


Class Layer

{

private:

enLayerList layer = enLayerList::LAYER_DEFAULT;

bool bRenderSwitch = TRUE;

}


로 되어있습니다.


첫 번째 enum class 형 layer는 현재 Layer클래스가 어떤 레이어 타입인지를 나타내고,

두 번째 bRenderSwitch 값은 레이어의 활성화 여부를 나타냅니다.


기본적으로 두 값은 Default와 true 값으로 초기화되어 들어갑니다.

클래스가 만들어 진 시점에서 일단 한번 바로 활성화하기 위해서 그렇습니다.


만약 레이어만 만들고 쓰고 싶지 않다면


클래스 생성 후 바로 set함수를 이용하여 비활성화 시키면 됩니다.


.cpp 파일의 내용 또한 별게 없습니다.


다만 주의할 점은 생성자가 enum class 형 enLayerList layerstate값을 받게 되어있습니다.



여기까지 봐서는 무슨 말인지 잘 이해가 안가실 수 있으나


간단히 예제 상황을 들면,


액션 게임을 할 때 캐릭터가 필살기를 쓰면 배경이 검은색으로 바뀌면서 배경이나 UI가 사라지고 캐릭터에 카메라 포커스가 맞춰지는 경우를 보신 적이 있을 것 입니다.


위 경우와 같이 어떤 레이어 계층의 렌더링 자체를 껏다 켰다 하실 때 사용 할 수 있습니다.


별로 이런거 쓸일이 없다. 그러면 딱히 Layer Class를 활용하지 않아도 상관없습니다.



레이어 클래스 자체는 여기까지만 설명드리면 어느정도 목적과 그 이용 사례를 스스로 생각하실 수 있으리라 예상 됩니다.


그럼 다음 글 LayerManager Class 를 이어서 설명하도록 하겠습니다.

posted by REDFORCE 2017. 4. 20. 05:44

#1. Engine System

 + WinMain - EngineSystem

 + EngineCore

 + EngineError

 + MainNode


#2. FrameWork

 + Grahpics

 + Image - SpriteData  (현재 글)

 + Layer

 + Input

 + Game

 + Manager

 + Game Interface

 + Utility


#3. Testing Module

 + 2D Image Test

 + 2D Animation Test

 + Game UI Test


-----------------------------------------------------------------------


Image Class .cpp (1) 번 글에 이어서 (2)번 글 입니다.


이번 글은 주목할 내용이 Update 함수 뿐이라서 짧습니다.



1. Update


Update 라는 함수 이름으로 알 수 있듯이, 이 함수는 게임이 진행 되는


매 프레임마다 호출되는 함수입니다.


왜 Update 라는 함수가 필요한가? 에 대해서 의문이신 분은 Image class가 궁극적으로

무엇을 하기 위한 클래스 였는지 한번 상기해볼 필요가 있습니다.


이유인즉, Image Class는 spriteData와 같이 단순한 이미지 출력 용이 아닌,

애니메이션을 돌리기 위한 용도이기 때문입니다.


따라서 매 프레임 어떤 애니메이션 동작이 나올지 계속 갱신해줘야 하기 때문에 Update 함수를 갖고 있습니다.


다음 코드가 update 함수 전체 입니다.



update 내용을 보면,


8 Line : if (endFrame - startFrame > 0) 


만약 끝 프레임에서 시작프레임을 뺐는데 값이 0 보다 크다는 말은

프레임이 1개 이상이라는 뜻이니 애니메이션을 업데이트 해야 한다라고 인식합니다.


10 Line : animTimer += frameTime;


위 뜻은 animation을 돌릴 때 설정해둔 딜레이와 계산해서 

딜레이 보다 작다면 애니메이션을 업데이트 하지 않고 크다면 애니메이션을 업데이트 시킵니다.

즉, 딜레이가 길다는 뜻은 애니메이션 동작을 펼치는데 오래걸린다는 뜻 입니다.


예를 들어서 느릿느릿 움직이게 하고 싶은 애니메이션은 딜레이를 길게 주면됩니다.


13 Line : animTimer -= frameDelay;


조건문 결과 true 값으로 안으로 들어왔다면, 타이머에서 딜레이 값 만큼 빼줍니다.

안그러면은 타이머가 계속 올라가기만 해서 딜레이 보다 무조건 크다 라고 판단하고 조건문을 계속 들어오니까요.


14 Line : currentFrame++;


업데이트를 하게 되었으니, 현재 프레임을 상승시켜줍니다.


15 Line : if (currentFrame < startFrame || currentFrame > endFrame)


위 뜻은 현재 프레임이 시작프레임 보다 작거나 현재 프레임이 끝 프레임보다 크다면

아래의 내용을 수행해라 라는 뜻 입니다.


17 ~ 23 Line : if(loop == true){ } else { }


만약 반복 애니메이션 이라면~? 아래 내용을 수행 / 아니면 현재 프레임을 끝 프레임으로 설정하고 애니메이션이 끝났다 라고 알림 (animComplete = true;)


25 Line : setRect( ) 


다음 출력 해야 할 애니메이션의 spriteData.rect 를 셋업.



여기까지가 Image Class의 Update 내용이었습니다.


혹시나 보시고 응? 잘 이해안가시거나 오류가 있다면 알려주시면

바로 해결하도록 노력하겠습니다.