WinAPI 73 Animation (5)

CJB_ny·2022년 10월 14일
0

WinAPI

목록 보기
76/79
post-thumbnail

오늘 배운거 👍👍👍

  • 데이터 직렬화 ❗

  • 문자열 입출력 ❗❗❗

    wstring객체는 vector처럼 동적할당한다.

    문자열은 객체안에 문자열을 넣지 않고 wchar_t타입을 넣는다.

  • 벡터 Load시 반복문 대신 resize

    vector의 동적할당 작업을 최소화


오늘 애니매이션 관련 작업을 할 것이다.

먼저 저장부터 구현을 할 것이다.

Player클래스에서 이런식으로 다 애니를 불러오는 작업을 코드로써 했는데

이렇게 작업해놓은 데이터를 파일로 저장을 해놓으면 나중에 게임 킬때 로딩만 하면 될 것이다.

이런식으로 확장자 명은 내마음대로 하고 이런식으로 저자을 해준다.

이렇게하고나면 저장됨. 그러면 이제

나중에

이런식으로 파일로부터 로딩을 한게

CreatAnimation과 결과가 동일하게 나온다.

로딩방식으로 애니매이션 불러 올때 장점

이런식으로 애니매이션 오프셋설정이나 이런거 하려면은 직접 와서 코드 수정해야한다.

그런데 파일을 저장해 놓는 방식으로 간다면은

애니매이션의 조절 같은 것들을 파일을 그냥 수정을 하면은

코드변경이나 프로그램 재빌드 없이 파일만 수정을 하기때문에 장점이 생긴다.

구현

먼저 파일들 다 create해보고 -> SaveAnim되는지보고

Load도 되는지 먼저 확인해보도록 하자.

Save에서 하나의 애니매이션이 제대로 동작할 수 있게

데이터를 남겨놓을 려면은 불러올때도 똑같이 데이터를 남겨 놓아야한다.

근데 저장해야할 데이터가 문자열이다.

먼저 PathManager로 contents폴더까지 경로를 잡아 낸다음에

이렇게 최종경로 들고와서 반드시 쓰기모드 wb로 해준다음에

또 반드시 fclose로 닫아 주어야한다.

문자열 저장

a의 주소를 알려주고 크기 알려주고 갯수 알려준다.

이렇게하면은 0이라는 데이터가 저장이 된다.

이렇게하면 이게 맞나?

ㄴㄴ. 딱봐도 아니기는 함.

wstring ❗❗❗❗❗

std::string을 참조를 해서 wstring의 기능을 쓰고있다.

이게 뭐 할때 기능을 지원하는 것인가?

문자열 관련해서이다.

wstring str = L"asdasdasdasdasd";

이렇게 문자열이 있으면 str이라는 녀석안에 asdasdasd이게 저장이 되어있나?

ㄴㄴ roData영역에 있는것이고 str이 그 주소에있는 데이터를 복사 받은 것이다.

이런식으로 다되는데 사이즈를 미리 어떻게 알고 저장을 하나?

뒤에다가도 이어 붙일 수 있는데 이것들 어디에 저장이 되는 것이고?

당연하게도 str이라는 객체 안에 문자열을 넣지는 않고

w_char 타입을 넣는다.

vector랑 똑같다.

str객체를 저장하면 안에 있는 데이터가 저장될거라고 하는게

벡터에 1만개의 데이터를 넣어놓고 벡터를 저장을 하면은 1만개가 저장될꺼라고 하는 말이다.

(당연히 1만개 저장 안된다. 벡터는 동적할당해서 resize크기를 늘리는 방식이기 때문에)

벡터도 그렇고 객체의 멤버로 포인터변수를 들고있고 실제로는 힙메모리를 관리하도록 설계가 되어있기 때문에

그래야 가변적으로 대응이 가능하다. wstring도

결론

wstring객체를 저장을해도 파일에 저장이 전혀 되지 않는다.

어 근데 저는 되던데요?

문자열 길이가 5~6글자 미만이면은 가능하다.

미리 5~6개 정도의 사이즈 벡터처럼 확보해놓고 초과하려고하면은

힙메모리에 동적할당 해서 공간 늘려서 받는다.

그래서 무조건 힙메모리에 있는 녀석을 사용하는 방식으로 가야한다.

좀더 정확하게는 wstring객체한테 니가 힙메모리 관리를 하고있는 곳의 '주소'를 달라고해서

그 주소에 있는 데이터를 저장시켜야한다.

데이터 직렬화 ❗❗❗

지금 이런식으로 filePtr로 주소도 알았고 len도 알았다.

문자 하나하나가 사실은 아스키 코드 그냥 숫자이다.

그 숫자 데이터를 똑같이 저장을 해야 나중에 불러올때 똑같이 불러올 수 있다.

이게 지금 '데이터 직렬화'작업이다.

  • 데이터 직렬화

    데이터를 저장하고싶은데 그 안에 포인터가 있다.
    그 포인터의 주소에 접근했을 때의 데이터를 저장하고싶은거지
    포인터 변수를 저장하고싶은게 아니다.

    그래서 해당 포인터 변수가 들고있는 주소에 접근해서 필요한 데이터만 일렬로 나열을 시켜서 데이터를 정한다는게 직렬화 작업이다.

되게 중요한 개념이다.

서버 통신을 한다거나 할 경우 나의 100번지 주소를 준다고해서 서버에서도 100번지 주소에 같은 데이터가 들어있을리가 없다.

그래서 필요한 데이터들만 뽑아와서 일렬로 나열 => 즉, 직렬화를 해서 보낸다.

데이터 읽는 부분

null문자까지 넣어서 null문자 까지 읽는 방식으로도 갈 수 있는데 => 좀 불분명하다.

그래서 저장할 문자열 앞에 정수값을 넣어줘서 몇번 문자를 읽게할지 인지를 할 수 있게 할 수 있다.

이렇게해주면은 이제 _animationName에 들어있는 문자열을 크기와 함께 저장했다고 볼 수 있다.

여기까지가 아까 저장한 문자열을 거꾸로 읽는 부분이다.

fread, fwrite 특징

이거 둘다 파일 포인터가 앞으로 전진을 한다.

쓰거나 읽을때 도 그 뒤어어서 쓰거나 읽는다.

문자열 저장함수

이제 이렇게 만들었으니까

문자열 저장할 일이 생기면 이거 사용하면 된다.

프레임 저장

텍스쳐 일단 보류.

프레임 저장을 해야하는데 문자열 사이즈 먼저 저장한것처럼

프레임 갯수를 먼저 저장을 한다.

이렇게 한방에 저장을 하나

반복문으로 이렇게 저장을 하나 똑같다.

이게 가능한게 vector는 연속적인 메모리 구조이기 때문이다.

Load할 때 장점

반복문 돌면서 하나하나 넣는 것도 방법이지만 프레임이 클수록 벡터가 자체적으로 계속 동적할 당해서 재배치 하는 작업이 들어가니까

먼저 resize로 공간을 한방에 확보를 해놓는게 좀더 좋다.

Texture 저장

이녀석 포인터 이다.

이 주소를 곧이 곧대로 저장을 하면 안된다.

이 텍스쳐 포인터가 어떤 녀석이였는지에 대해 저장을 해야 나중에 Load할 때, 복구가 가능하다.

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글