Ground 제작

CJB_ny·2022년 10월 26일
0

JumpKing

목록 보기
6/8
post-thumbnail

Ground 제작 - 1

AddObject 하는 부분에서 중복으로 데이터를 넣는 부분도 수정을 하고

이제 ground와 충돌하거나 애니매이션만 어느정도 손을 보면은 된다.

그중에서도 일단 ground를 어떻게 만들것인지가 중요하다.

방법

  1. 마우스로 다 그려서 파일로 저장해서 Animation처럼 불러온다.

  2. 코드로 비트맵 파일을 보면서 해당 위치 에다가 Ground를 배치한다.

중간에 문제 발생 ❗

씬 이동을 UP, DOWN으로 하고나서 종료를 하면은

Scene의 소멸자 부분에서 double free 현상 발생한다.

이부분 해결해야한다.

원인 찾음

밥먹다가 원인 찾음

_object를 지금 SceneManager에서 관리를 하는줄 알았는데 Scene마다 가지고 있다!!!!

이거 수정해야한다.

또한 dynamic array에서는 벡터를 가장많이 쓰는데 이부준 딱 objects에다가 reserve해주어야 한다.


Ground 제작 - 2

현재 각각의 StageScene마다 이런 오브젝트들을 가지고있는 vector를 각각 가지고있는게 맞는 것일까..??

SceneManager에 list<Object*> _objects[GROUP_END] => list배열을 만드는 것은 어떻까?

Scene이 변경될 때마다 삽입 삭제가 빈번하게 일어날 것이기 때문에.

고민되는 부분

근데 StageScene_1 -> _2로 갈 때 맵 collider의 중복이 되는 부분을 걸러내서 list의 삽입 삭제가 vector보다 유용하다는 점을 활용해도 되지만... 이까지하면 어렵기도하고 복잡하고 시간이 많이 걸릴거같다.

그래서 어차피 다음씬을 로드할 때는 Collider든 뭐든 player를 제외하고 싹다 delete하고 새로 벡터에 채워넣는 작업을 할 것이기 때문에

그냥 list말고 vector를 사용해서 SceneManager에서 모든 objects들을 관리를 해주도록 하자.

일단 Scene에 있던 _objects를 SceneManager로 옮겨와 관련된 모든 함수 다 바꾸어 주었다.

=> 잘 동작함.

일단 씬이 변경될 때마다 SceneManager에 접근을 하여 Ground를 지우고 다시 stage_2에 진입할 때 Enter부분에서 추가를 해주는 방향으로 되었다.

수정할 부분

지금

각각의 StageScene들을 이런 static 을 붙여 전역 변수로 stage의 단계를 구분할 수 있게 하고

SceneManager에서도 이런 전역 변수를 사용해서 접근할 수 있게 했는데

iterator를 전역화 해서 각각의 씬에 맞게 ++iter 이런식으로 해주어도 가능하지 않을까? 라는 생각에서

SceneManager를 수정을 하도록 하겠다 Scene과 함께

현재 SceneManager에서 힙 영역에 들어갈 녀석들을 생성중이다.

인자를 받는 생성자에 i를 넣어주고있는데 저부분은 수정하면 안된다.

나중에 각각의 Scene이 background를 가져올 때 필요한 부분이기 때문이다.

그리고 StageScene들은 생성자부분에서 stageNumber를 배정받고 SceneName도 설정받는다.

일단 SceneManager에 이런 함수를 만들어주고

StageScene에다가 이런식으로 테스트용으로 구현을 해주도록 하자.

주석부분이 이전에 사용하던 부분인데 훨씬더 간결하고 직관적? 인거같다.

잘동작한다.

마지막 스테이지에서 UP키 아무리 눌러도 안올라가고 _0에서 DOWN키 아무리 눌러도 아무 문제 없음.

Ground 만들기 순서도?

현재 각각의 씬마다 Ground에 해당하는 Collider를 만들어야한다.

  1. 일단 각각의 StageScene을 킨다음에 DockMenu를 통해 메뉴바 하나 추가

  2. 메뉴바에서 삼각형 상하좌우 선택 가능, 사각형 + 직사각형 선택가능 한 메뉴 만들기

  1. 아이콘 클릭하고 클릭->드래그시 클릭한 지점부터 드래그 하고나서 AWAY한 지점 좌표까지를 Collider Scale로 잡는다.

  2. Ctrl + s 하면 Animation처럼 텍스트 파일로 저장할 수 있도록 기능 구현하기.

1 . 메뉴바 추가 구현

일단 이까지 완료

2. 모달 방식 구현

모달방식으로 UI를 구현을 할 것이다.

먼저,

리소스 뷰로 진입

도구상자를 열어 CheckBox두개를 만들어준다.

그리고 저장하고

Resource.h 파일을 확인을 하면은 이렇게 ID값이 떠있다.

애내들은 다 윈도우 객체이다.

아이디값은 아까 리소스뷰에서 Diaolog선택후 F4를 누르면

이런식으로 확인이 가능하다.

이후 사각형 체크후 확인 버튼을 눌렀을 경우에 값을 가져와야하는데

https://kworks.tistory.com/29

https://stackoverflow.com/questions/24065214/how-to-make-checkbox-in-win32

구글링을 하기는 했는데 막 자세히 읽어본것은 아니고 함수이름 대충 보고 이것저것 넣어 보니까

240줄의 IsDlgButtonChecked함수를 통해서 true/false 둘중 하나의 값을 얻어올 수 있었다.

사각형 선택후 확인 누르면 true이고 그냥 체크 안하고 확인 누르면 false값 return 해준다.

그러면 이제 이 값을 StageScene에다가 넘겨준다음에 뭔가를 해주면된다.


Ground 제작 - 3

2. 값 전달 받은 부분 처리하기

https://velog.io/@starkshn/Ground-%EC%A0%9C%EC%9E%91-2

현재 이부분에 이어서 진행을 해야한다.

이렇게 모달방식으로 Check Box값을 받아와서

StageScene의 Update부분에서 확인을 해야한다.

일단 코드를 좀더 직관적으로 보기 위해서

이런식으로 enum class들 정의 해주고

이렇게 확인을 받도록 해주자.


Ground 제작 - 4

(22/10/31)

Define에 해당 구조체 선언후

StageScene에 멤버 변수로 추가.

StartScene의 Update내부에서 이런식으로 확인을 해준다.

생각해야할 부분

TAP하는 순간 startPos가 정해지고 AWAY인 순간 endPos가 정해지는데

클릭하는 순간의 좌표부터 드래그하면서 마우스를 땟을 때, 그위치가 endPos가 되어 Collider가 그려지는 과정을 가시적으로 확인을 하고싶다.

그럴려면 KEY_HOLD일때 Collider의 크기가 동적으로 늘어났다 줄어들었다 해야할 것이다.

이후 Collider가 만들어지면은 이것을 파일로 저장을 할 것이다.

구현

일단 코드 이따위로 테스트용으로 만들어 준다.

현재 GROUND메뉴창 선택시 영상에는 녹화가 안되는데

이렇게 선택후 탭한 지점부터 클릭을 땟을때 지점까지 잘 그려지기는 한다.

추가해야할 부분

  • 드래그하면서 동적으로 점점 커지거나 줄어드는 부분아 실시간으로 보이는 부분

  • 생성해낸 Ground오브젝트에 Collider 추가

  • 그린 부분을 특정키 입력시 Animation파일처럼 저장할 수 있는 기능

  • 저장한 Ground 정보 파일을 각 StageScene Enter부분에서 불러와 추가하는 작업.

Ground 제작 - 5

22/11/01

현재

LBTN TAP, HOLD, AWAY를 나누어서 Ground의 크기를 조절 하는데 까지는 성공하였다.

근데 문제는 내가 최초로 클릭한 좌표에서 생성이 안되는 문제와

드래그 했을 때, 크기는 변하지만

생성된 좌표에서부터 상하좌우로 scale이 커지는 중이다.

또한 Collider추가가 안되고있다.

구현해야할 부분

내가 클릭한 좌표에서부터 사람들이 일반적으로 사용하는 UI의 사용감에 맞추어

클릭한 부분부터 5시방향으로 드래그를 하면은

Ground의 scale이 양의 x축방향과 음의 y축 방향으로 커져야한다.

또한 11시 방향으로 드래그 항경우에는 반대로 커져야 한다.

문제점

프레임의 다형성의 문제?가 여기서 발생하는거 같은데

기존의 Collider 나 Object의 Render부분은 현재 _pos를 기준으로

_scale / 2.f 만큼을 render하였고

모든 오브젝트들의 중심 좌표가 scale의 정중앙이다.

Ground의 경우에는 중심좌표를 LT으로 변경하고 5시 방향으로 드래그 하였을 때

Scale을 조절할 때 +x, -y방향으로만 Ground의 크기가 커져야한다.


Ground 제작 - 6

22/11/02

클릭한 지점의 마우스 좌표를 설정을 한뒤 현재 씬의 오브젝트들을 다 긁어와서

해당 오브젝트의 범위 안에 있는지 마우스 좌표와 비교를 하여

targetGround로 잡아준다.

HOLD, AWAY일 경우는 그냥 위치만 옮겨주면 된다.

이제 이부분 파일로만 저장을 하고 불러오기만 하면 끝이다.

SaveGround

현재 StageScene에서 저장할 수 있도록 만들어 두었는데

StageScene에서 저장하는게 과연 최선인지 의문이 든다...

Ground 제작 - 7

22/11/03

SaveGroundInfo

이제 Ctrl 누르면 저장하고 StageScene에 Enter시 GroundInfo를 Load할 수 있도록 만들 것이다.

일단 Save하는 부분부터 어제에 이어서 조금 다듬으면 나중에 Load할 경우를 위해서 GroundCount를 추가를 해주었다.

나중에 Load할 때 현재 StageScene에 Ground가 몇개가 있는지 파악을 하기 위해서 추가를 해주었다.

Enter할 때 Ground를 Ground갯수만큼 추가를 해주어야 하니까..

그리고 414 줄에 'wb'모드로 쓰고는 있는데 %d %d \n에 들어가는데 이부분 잠시 넘어간다음에 설명을 하도록 하겠다.

LoadGroundInfo

이부분이 LoadGroundInfo의 핵심 부분인데

파일은 이렇게 잘 저장이 된다.

그런데

[Ground Pos](Vector2)
10 450

여기 450뒤에 '\n' 이 안보이지만 들어가있는거 같더라.. 그래서 계속 읽히지가 않았었는데

한번더

454줄에서 이렇게 한번더 읽어오면 잘 된다.

이제 벡터에 다 넣었으니 Enter할 때 vector에서 꺼내와서 AddObject를 해주면된다.

문제점

for문 안에서 읽는 부분에서 계속 안 읽혀져서 _vecGroundInfo에 데이터가 안채워 져서

생성자에서 LoadGroundInfo를 못하고있었는데

이게 '\n'문자 때문에 그렇다.

그래서 458줄에서 이렇게 i 1이상일 경우 '\n'을 읽을 수 있도록 해주면 된다.

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

0개의 댓글