WinAPI 38 Animation (3)

CJB_ny·2022년 9월 17일
0

WinAPI

목록 보기
37/79
post-thumbnail

오늘 배운거 👍👍👍

  • CPP 최적화 &&, ||


    CPP의 최적화에 따라서 24번째 if 문의 && 조건을 보면은 먼저 오는 조건식이 true인지 false인지만 바로 판별하고 뒤에 조건을 볼지 말지 정한다. true일 경우에만 뒤에 조건을 검사를 하고 false일 경우에는 뒤에 조건 뭔지도 보지도않는다.

    매프레임마다 호출 할 것인데 최적화를 잘 한 모습이다.

    이러한 이유로 코드를 앞쪽에 배치를 할지 뒤에 배치를 할지 갈린다.
    ( || 의 경우에도 마찬가지에다 A || B 일경우 A가 참일 경우 뒤에 B는 검사도 하지 않는다)


Player Animation 띄우는 작업을 해보도록 하자.

이제 Player는 Texture* 라는 멤버 포인터 변수랑 TransParentBlt 필요가 없다.

render할 부분은 실제 플레이어가 들고있는 animator가 화면에 나올 것이다.

Animation render

_vecanimFrame의 벡터의 [ ] 현재 프레임의 sliceSize / 2한 것이

pos.x, y될 것이다.

그리고 가로세로 크기는 _vecanimFrame의 가로 세로 길이이다.

이까지해서 이제 이미지 복붙 준비는 했는데 '원본'은 누구냐 이거다.

원본은 Animation의 멤버 포인터 변수인 texture이다.

이 texture내에서 짜를 위치의 좌상단과 가로세로 크기이다.

그리고 우리가 지금 이것을 float로 계산하고있는데 정수값을 인자로 요구하기 때문에 캐스팅 해주면된다.

우리는 강제로 _vecFrame에다가 _curFrame을 넣어주고있는데 == 강제로 프레임을 정해가지고..

시간 누적

근데 이게아니라 이제 시간이 지남에따라서 프레임이 증가해야한다.

이렇게 누적할 것인데 _accTime의 뜻이 뭐냐? => '실제 흘러간 시간'이다.

update에서 이렇게 시간누적을 해주어야 하는데

_vecAnimFrame의 현재프레임(curFrame)의 지속시간(_duration)이 크다면은


부호가 '>' 가 되어야하지 않나? ㅇㅇ 맞다.


근데 이러다가 '끝'에 도달했을 수도있다. 끝??

0~9프레임까지있는데 9프레임에 도달했다는 것은 어떻게 알 수 있을까?

프레임이 9번까지니까

이렇게 0~9번프레임을 계속 돌 수 있도록 해주도록 하자.

CreateAnimation호출할 때 duration값 조절에 따라 애니매이션 조금 부드럽거나 끊겨보이거나 바뀐다.

이렇게 동작하는 이유

지금 sprite가

존나 이런상태라서 CreateAnimation함수를 통해 거의 완벽하게 잘라서 사용할 수 있었다.

1) sprite이미지 니가 편집으로 사용하거나

2) 코드로 적절하게 조절이 되도록 설정해주어야한다.

진행방향

Player가 어떤 애니매이션을 틀어달라고 Animator한테 요청을 한다.

Animator는 Player가 요청한 애니매이션을 현재 애니매이션을 지정을 하고 update호출할 것이다.

그리고 finish알림이거나,

이렇게 repeated를 요청할 수 있다.

그래서 현재 프레임을 끝났다는 의미로 -1로 두고

true로 놔둘 것이다.

이런식으로 줄 것이다.

반복재생 여부를 PlayAnim함수에 인자값으로 넣어주고 => 코드를 보고 분석을 하도록 하자.

이렇게했을때 아름답게 동작하는거 같은데

아직도 문제가 있다.

문제

여기 _accTime이 over한 만큼 '잔량'이 남을 것이다.

다음 애니매이션이 정상적으로 동작해야하는데 오버한만큼 잔량이 남아버려서

이부분에서 _curFrame이 약간 증가해버려지는 상황을 말하는 것이다.

그래서 현재 _accTime은 '넘어선 양' 만큼 빼주어야한다.

근데 이렇게 해주면 끝이냐? => 또 아니다.

렉 걸린경우

만약 프로그램이 렉걸렸다고 가정을 하자.

그러면 DeltaTime이 엄청 크게 뜰 것이다.

dt가 일정하닥 버버벅 렉 걸리면서 1초의 시간이 흘럿다고 가정을 하자.

이렇게.

그러면 나는 프레임을 여러번 건넏뛰어서 3번째 시간인

시간동기화를 정확하게 했다면 3번째 프레임의 저정도 시간이 진행된 상황쯤이 나와야한다.

다음시간

파일 입출력 배울 것이다.

프로그램상에서 편집을 할 수 있으면 좋게 만들도록 하겠다.

개선할 부분은

Animator 얕은 복사가 일어나는데 해당 부분 수정해야한다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글