공부/SFML

게임 오브젝트, 스프라이트 게임 오브젝트, 텍스트 게임 오브젝트, 디파인즈, 유틸즈, 씬, 게임 씬, 반복적인 include 처리

월러비 2025. 6. 27. 18:45

짧은 설명

  • 벡터를 bool형으로 백터 선언 (이게 좋아 보임)
    • true false 로 구별
  • 벡터를 int 형으로 백터 선언
    • 1과 0으로 구별
  • 변경된 애만 따로 모아서 바꾸는게 좋을거같다.
  • 키 고정 및 해당 키가 눌림, 눌리고 있음, 땜 상태를 확인할 수 있게 작성하는것도 좋다.

작업 순서

  • 프레임 워크
    • 인풋 매니저
    • 리소스 매니저씬 매니저
        • 게임 오브젝트 : 상속받아서 늘리는 형태로 작성

게임 오브젝트

  • 리소스 세팅, 초기화, 드로우 반복
    • 게임 오브젝트에 그리기에 필요한 기능을 넣진 않을 것이다.
    • 하지만, 그리지는 않더라도 위치, 회전, 크기는 넣어놓을 것이다.
  • 초기화 함수, 드로우 함수 → 가상 함수
virtual void Init() = 0; //생성할때 초기화
virtual void Release() = 0; //삭제할 때 함수
virtual void Reset() = 0; //사용할때 초기화

virtual void Update(float dt) = 0;
virtual void Draw(sf::RenderWindow& window) = 0;
  • 게임오브젝트 컨테이너 생성
    • 순회하면서 드로우 함수를 호출하면 그리지게끔 작성
  • 단독으로 사용하지 않고 씬에 컨테이너를 만들어 넣을 것이다.

게임 오브젝트 상속

  • 스프라이트 게임 오브젝트이다.
    • 동기화 시켜서 사용한다.
  • 이미지로 그리기만 하는 클래스는 이 클래스를 사용하는 것이다.
  • 드로우 함수 : 렌더 윈도우 받아서 사용한다.
  • 텍스쳐 할당 : Init, reset에서 할당한다.
  • 오리진 : 오리진 프리셋 9개를 생성해서 상황에 맞춰 사용할 것이다.
    • 전역함수처럼 사용할 수 있도록 해야한다. - 클래스 생성 및 스테틱 함수
  • 초기화 - 리셋 - 업데이트 - 드로우 - 릴리즈 순서다.
SpriteGameObject spriteGo("graphics/player.png");
spriteGo.Init(); //생성할때 초기화
spriteGo.Reset(); //사용할때 초기화

while (window.isOpen())
{
~
		// Update
		InputMgr::Update(0.f);
		spriteGo.Update(0.f);
		
		//Draw
~
		spriteGo.Draw(window);
		
}

    spriteGo.Release(); //게임오브젝트 삭제
    return 0;
}

디파인즈

  • 오리진 프리셋처럼 디파인하는것을 모아놓는 헤더파일

유틸즈

  • 오리진 프리셋같은 유틸리티를 모아놓은 클래스

씬 매니저

  • 씬들을 관리
  • 컨테이너 - 씬 추가
  • 씬 개별적으로 추가 제거
  • 메인에서는 씬 메니저를 생성
    • 열 씬을 추가하고 호출

  • 게임 오브젝트들을 관리하는 클래스
  • 타이틀 씬
    • 타이틀에 띄우는 게임오브젝트 - 이미지
  • 게임 씬
  • 특정 씬을 전환하고 싶은 경우? : 씬 ID를 열거형으로 만들어 사용한다.
  • 씬을 시작할 때 Enter 함수를 호출해서 사용하고, 씬이 끝날때 Exit 함수를 호출해서 사용한다.
  • 씬은 한번에 하나만 열려야한다. → Enter 호출
    • 씬 종료 - Exit 호출 및 초기화
  • 게임 오브젝트 리스트 : 씬에 넣을 게임 오브젝트를 add 하고 remove를 한다.
    • 씬에 함수를 추가해서 작성한다.
  • 직접 게임 오브젝트 리스트에 추가하고 삭제시킬것이다.
    • 나중에는 이렇게 하면 안되서 바꿔야한다.
    • 순회하다가 추가 및 제거를 하면 딜레이가 발생하기 때문이다.
      • 한프레임에 한번 진행하고 다음 프레임이 올때까지 대기했다가 다시 해야한다.

getLocalBound 함수

  • 스프라이트가 그려질 영역 정보를 받게 된다.
    • rect 형으로 받아진다.
    • 너비, 높이 값을 받을 수 있다.

반복적인 include 처리

  • 프로젝트 - 설정 - C/C++ - 미리 컴파일된 헤더 : 사용
  • stdafx hpp cpp 생성 - cpp에 stdafx.h include 하기 - stdafx.cpp 속성 - C/C++ - 미리 컴파일된 헤더 : 만들기
    • cpp의 파일이 먼저 컴파일 되고 헤더가 추가되는 것이다.
  • hpp에 자주쓰는 헤더들 추가
    • iostream
    • vctor
    • list
    • unordered_map
    • algorithm
    • SFML 헤더
  • 미리 컴파일 된 헤더를 사용하면 ? : 캐싱된 헤더를 우선적으로 컴파일되기 때문에 반복적인 헤더 추가를 안해도 된다.
  • 이 작업을 해주면 앞으로 모든 클래스에 stdafx 헤더파일이 include 되어있는다.
  • 자주 변경 안되는 헤더를 넣는것이 좋다.

폴더에 파일 정리

  • 폴더 생성 후 파일을 넣으면 헤더의 경로가 깨지게 된다.
    • 이유 : 폴더를 기준으로 상대경로기 때문
  • 프로젝트 속성 - C/C++ - 일반 - 추가 포함 디렉터리 - SFML include 폴더에 .\ 추가 - .\Framework 추가 - $(ProjectDir) 추가
    • 이유 : .\가 현재 폴더를 가리키게 되어 현재 폴더를 사용하라는 의미이기 때문이다.

순수 가상 함수 자동 구현

  • 상속받은 클래스에 ctrl + ‘.’ : 순수 가상함수가 자동으로 cpp(구현 파일)에 생성된다.