WinAPI 17 Object (1)

CJB_ny·2022년 9월 2일
0

WinAPI

목록 보기
17/79
post-thumbnail

상속과 다형성

유니티 프젝에서 진행하는 것처럼 부모에는 구현만 해놓고 자식이 알아서 뭐 하게 해야함.

그런데 지금은 winAPI이기 떄문에 각 물체가 update를 호출하는 방식이여야한다.

그래서 update 함수를 가상함수로 만들어야 하는 것 까지 ㅇㅋ.

부모 클래스 '객체화' X

또한 나는 CObject는 부모 인데 이것을 '객체화'할 수 없게 만들고 싶다.

그러면 추상 클래스로 만들면 된다.

추상 클래스로 어떻게 만드나? => 함수하나를 '순수 가상 함수'로 만들면 된다.

갤러그

'시간 동기화' 안되어있고 플레이어 오브젝트 움직이는데 '고정값'을 넣어놔서

화면에 적들(오브젝트)가 없어지면 없어질 수록 render랑 update 할 것들이 줄어서

컴퓨터가 할일이 줄어드니까 -> fps가 올라간다. 프레임이 올라간다.

그래서 적들을 죽이면 죽일 수록 게임 속도가 빨라졌다.

중심점

몬스터 오브젝트가 좌우로 왔다리 갔다리 할껀데 조금 오차가 생겨서 계속 밑으로 가거나 하면 안되니까 '중심점'이 필요하다.

프레임 넘어갈 경우

몬스터에게는 이런 멤버 변수들이 있고 갤러그 처럼 좌우로 이동하게 할 것이다.

그래서 중심점을 기준으로 _loopDistance만큼 반복해서 움직이게 할 것인데

오른쪽으로 이동할 거리를 100이라 지정을 해놓았는데

이번프레임에

딱 이동해서 저쯤 가 있을 수도 있다. 그리고 나서 100 초과 했으니까

부호를 반대로 바꾼다. 그러면 몬스터가 되돌아갈 거리가 100을 넘게된다.

문제점 ❗❗❗

이런거 반복하면 짜투리가 남게되서 오차가 생긴다.

만약

이럴경우 100을 넘어서서 방향전환이 이루어져야할 경우

그렇다면 다음 이동하는 부분은

이렇게 음수가 곱해져서 x축이 빠질 것이다.

근데 충분히 회복할 만큼 못 빠졌다.

저 흰색점까지 와버렸다고 하면은 => 어느 이유에선가 갑자기 DT가 확 줄어서

그러면 여전히 부호를 바꾸었는데도 범위를 벗어 나게 되어서 다시 양수를 곱해서 오른쪽으로 갈려고 할 것이다.

근데 다시 조건 체크하니까 범위를 벗어나 있어서 부호를 음수로 바꾸고 왼쪽으로 갈 것이다.

이게 반복되다보면 물체가 '덜덜 떨리는 현상'이 발생할 것이다.

상황을 면밀해 분석해서 '추론'해야한다.

해결 방법 ❗

사실 '시간'은 천천히 흐른다.

근데 이게 뭐 각진것 마냥 DT단위로 짤려서

이 DT시간동안 니가 해야할 일. 이렇게 나뉘는? 식이다.

그래서 사실 저 동그라친 DT시간동안 '원래 도달해야하는 거리 양'을 '초과'한 것이라면

'실제 현실 시간'으로 보면은 초과한 거리를 다시 되돌아와야하는 상황인 것이다.

그래서 거리를 초과 했다면 초과한 만큼 해당 동그라미 DT시간 동안 초과한 거리를 빼주어야한다. 어디에서? => 현재 진행되는 DT시간동안 시간동기화를 맞춰서...

위에 설명한게 이해가 안 간다?

=> 해당 DT라는 시간 동안 초과한 거리가 있다면 해당 DT시간 동안 거리를 다시 보완해주는 작업이 들어가야한다는 것이다.

c가 centerAnchor이고 거리거 100전일때는 difDis가 음수가 나와서 if 문에 안걸리고

110정도의 위치에 왔다고 가정을 하자. 이럴경우 _difDis의 값이 10이 나온다.

이 값을 curPos += 에다가 더해주는데 얼마만큼 더해주냐하면은

_difDis * _dir한 만큼 더해준다.

_difDis는 10이고 _dir은 -1인 상태이니까 -10만큼을 curPos에 더해준다...

그러면 curPos._x의 값이 -10만큼 빠지게 됨. 그러면 딱 _x는 100에 걸리게 되고

해당 좌표를 SetPos로 다시 설정한다.

	Vector2 curPos = GetPos();
	
	// 진행 방향으로 초당 _speed 만큼 이동
	curPos._x += _speed * _dir * DeltaTime_F;

	// 배회 거리 기준량을 넘어섰는지 확인

	float difDis = abs(_centerAnchor._x - curPos._x) - _loopDistance;

	if (0.f < difDis)
	{
		_dir *= -1;
		curPos._x += difDis * _dir;
	}

	SetPos(curPos);

operator =

먼저

해상도를 구하기 위해 이렇게 해주는데 연산자가 구현이 안되어있다.

그래서 Vector2 struct에서 연산자를 구현해준다.

Vector2 vec = CCor::Get()->GetResolusion();

나는지금 값만 operator = 를 통해서 복사받고 싶은데 지금 뭔가 이상하지 않나?

이게 지금 Vector2라는 구조체의 객체를 생성하자마자 = 로 받고있으니까

복사 생성자가 호출되는 형태이다.

변수 선언과 동시에 대입중이다. => 복사 생성자.

우리는 복사 생성자가 아니라 그냥 operator = 를 호출하고싶은 것이다.

아니면 그냥 복사 생성자 구현하든가

(구현해주자...)

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

0개의 댓글