운영체제/입출력 시스템 : Windows API

[게임 프로그래머 입문 올인원] Windows API 입문 : 오브젝트 설계 #1, #2(90, 91강)

순정법사 2024.04.06

A. 오브젝트 설계  #1

1. 오브젝트 틀 설계

a. Object 생성하기

Scene처럼 관리할 Object를 생성해줌

 

Object는 가장 최상위 객체 

 

Object 폴더에 Object 클래스 생성


📁 03.Object > 📄 ObjectType.h

 

Object 타입이 될 애들을 enum으로 만들어주고

 

나머지 기본정보들 작성해주기

 

Stat은 따로 struct를 관리하는 Types.h에 작성

 

b. 자식 클래스 작성하기 : Player

위에서 오브젝트 타입으로 정의해준 애들을 만들기

 

Game폴더 생성 후 플레이어, 몬스터, 미사일(투사체) 클래스 생성

 

📁 03.Object >  📁 Game > 📄 Player

 

Object를 상속받는 Player부터 작성하고

 

원래 기본 정보는 데이터 시트를 통해 제공받지만 여기선 그냥 하드코딩!

 

사실 움직여야 하는건 Player니까 DevScene에서 사용하던 이동 키를

 

Player 코드에 넣어주고 스페이스바를 누르면 미사일을 날아가는 코드를 작성할 예정

 

여긴 일단 이렇게만 작성해주기

 

c. 자식 클래스 작성하기 : Missile

위에서 작성한 Player 코드처럼 동일하게 missile 코드도 작성해주고 (monster도 동일)

 

Missile.h 코드 틀 작성

 

📁 03.Object >  📁 Game > 📄 Missile.cpp

 

기본 정보를 세팅해주고

 

미사일 충돌과정과 렌더링 부분을 작성해준다

 

d. 자식 클래스 작성하기 : Monster

Monster.h 코드 틀 먼저 작성하고

 

📁 03.Object >  📁 Game > 📄 Monster.cpp

 

기초 부분을 작성해준다

 

 

2. 기능 구현하기

a. GameScene 으로 교체하기

이제부터  devScene에서 테스트하던걸 gameScene으로 옮겨서 테스트함

 

플레이어를 들고있도록 플레이어 변수를 생성해주고

 

cpp파일에선 Player, Monster include 해주고

 

플레이어를 조작할 수 있도록 설정해주기

 

Game.cpp에서 GameScene으로 교체 후 실행하기

 

그럼 예전에 구현했던 것과 동일하지만, 이젠 Player로써 움직이는것임

 

테스트용도로 사용, 실제론 플레이어가 한명이 아니기 때문에 이렇게 관리하지 않는다

 

b. 오브젝트 매니저 만들기 

스페이스바를 누르면 미사일을 스폰해줘야 함

 

  1. 미사일을 어디서 스폰해야 할까
  2. 어디서 관리해야 할까 - 씬에서 오브젝트를 관리? 오브젝트 매니저로 관리?

 

위 두 가지 문제를 해결해야 함 (정석이 없음) 

 

먼저 두 번째 문제에서 유니티, 언리얼에서는 씬에서 오브젝트를 관리하는 방식을 사용 

 

이런느낌, 일반 싱글게임에서 많이 사용하는 방식

 

하지만 경우에 따라서는 온라인게임에서는 오브젝트 매니저로 오브젝트를 관리할 수 있음 

➡ 이번 강의에서는 오브젝트 매니저를 생성해서 관리하는 방식으로 제작

 

오브젝트 매니저 생성해주고

 

중간에 생성한 오브젝트 템플릿은 메모리 생성, 해제를 한공간에 하려고 생성, Object 전방선언 해주기

 

오브젝트를 관리하는 코드를 쭉 작성해주기, 메모리 정리는 필수!!

 

💙 참조값으로 넘기는 이유
ObjectManager.h 파일을 보면 이렇게 외부로 목록을 뱉어주는걸 참조값으로 넘기고 있음

이유는 복사비용을 아끼기 위해 원본을 가지고 내보내고 있음 

근데 이렇게 GameScene.cpp 에서 사용되는 Update()함수에서 위에서 가져온 참조값을 순회한다면 위험함

 

순회하다 말고 오브젝트가 생기거나 삭제되면 갑자기 이렇게 중간에 코드가 되어서 에러가 남!

따라서 두가지 방법으로 해결할 수 있음

1) 생성 예약을 해서 예약 순으로 일감을 처리 
2) 객체를 복사해서 복사된 부분만 순회하기

따라서 참조값이 아닌 복사객체로 사용해야 에러가 나지 않는다!

 

c. GameScene에 ObjectManager 등장시키기

ObjectManager 추가해주고

 

ObjectManager을 이용해 플레이어를 등장시키기 / 오브젝트 업데이트 & 렌더링 코드 작성하기

 

d. 미사일 코드 작성하기

1) 미사일 생성하기

 

📁 03.Object > 📁 Game > 📄 Player.cpp

  

Update함수 내부 / 한 공간에서 생성된 오브젝트(미사일)를 발사할 수 있게 됨!!

 

여기까지의 진행과정!! 잘된다 ><

 

2) 미사일 소멸하기

 

생성(발사)까지는 잘 되는데, 그렇다면 소멸은 어떻게 해야할까?

 

단순히 이렇게 ObjectManager에서 Remove를 때려도 괜찮을까?

 

위와같이 나를 다른사람에게 요청해 자폭을 하게 만든다면 

꼭 끝나자마자 리턴을 해야함!!

➡ 날아가고 사용하면 안되는 객체의 멤버변수들 때문에 꼭 바로 리턴해주기

 

3) 몬스터 생성하기

 

위에서 만들어준 간단한 몬스터 코드를 생성해서 미사일을 맞춰봄

 

이렇게 게임 시작시 몬스터 5개를 만들어주고

 

화면엔 이렇게 등장

 

4) 미사일 적중시키기

 

미사일이 몬스터에 적중해 충돌처리를 해줘야 함

 

복사 방식으로 변형을 일으켜주고 맞으면 삭제하는 코드를 작성해주기

 

큰 틀은 완성

여기서 게임수학을 붙여 미사일이 나아가는 방식,

몬스터도 인공지능으로 움직이면 우리가 시중에서 하는 게임과 동일!!

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com