C++ 콘솔에서 Bad Apple!! 출력하기 | Default Defense # 9
·
개발/Default Defense
개요제가 콘솔창으로 게임을 만들면서 꼭 해보고 싶었던게 있습니다.바로 Bad Apple!! 출력해보기! 입니다. 유튜브에 'Bad Apple!! but' 키워드로 검색을 하면 아주 많은 미친 프로그래머들이 Bad Apple!! 뮤비를 기상천외한 방법을 사용해서 출력하는 영상을 많이 접할 수 있습니다.  그래서? 저도 해보기로 했죠.     아이디어 정리Bad Apple!!은 그 뮤비를 봤을때 전부 흑백이죠?그러니 뭔가 영상의 한 프레임을 읽어온 다음 그 해상도를 강제로 콘솔창에 맞춰 줄이고 한 픽셀씩 읽어와서 0과 1을 구분해 낼 수 있어보였죠. 그래서 그러한 방법을 시도하기 위해 C++ 콘솔에서 영상을 읽어오는 법을 찾아봤는데... 대충 찾아봤는데도 얼마나 길고 복잡하고 하드한 코딩을 요하는지 알게 되..
Default Defense | 다섯번째 프로젝트 # 8 : Wave, InGameState
·
개발/Default Defense
개요그동안 바쁜 상황에도 개발일지를 시간 잘 짬내서 적고 있었다고 생각했는데 다시 생각해보니 진짜 바쁘면 개발일지를 적지도 못해요.그래서 이미 개발이 다 끝난 프로젝트 개발일지를 적는 우스운일을 하고 있는거겠죠.사실 이때쯤 오면 회고록에 가깝긴 합니다. 그리고 블로그 카테고리를 조금 세분화 했습니다.큰 카테고리를 세분화 한건 아니구요 개발 카테고리 내의 카테고리를 세분화 했습니다.각각의 프로젝트마다 소개글을 하나씩은 쓸텐데 솔직히 카테고리를 각 프로젝트 단위로 나누는게 맞다고 생각했습니다. 그 외는... 아마 폐기한 프로젝트들의 개발일지가 비공개로 들어가 있을겁니다.     Wave아이디어 정리디펜스 게임, 그것도 타워 디펜스다보니까 적들이 몰려오는 웨이브라는 개념이 필요하겠죠.최소한 50웨이브 정돈 있..
Default Defense | 다섯번째 프로젝트 # 7 : 구조 수정
·
개발/Default Defense
개요이미 수정한 구조를 구버전으로 적는 것 만큼 괴로운 일이 없습니다.제가 지금 그러고 있거든요.솔직히 의미 없는 짓 같아서 그냥 쓰겠습니다.    뭘?개요에서 말은 그렇게 했지만 실제로 아군 공격을 끝내고 Entity 구조를 수정했습니다. 그래서 뭘 수정하냐?지금 Enemy와 Ally를 봤을때 공통적으로 무조건 update에서 돌아가야 하는 함수가 있죠.일정 간격을 두어 실행해야 하는 tryMove와 tryAttack이 있죠.이것들을 Entity 클래스에서 update함수를 만들어 묶어주고둘 다 타이머를 사용하기 때문에 타이머 또한 Entity에서 묶어주면 좋겠죠. 그러기 위해선 모든 Entity를 담는 EntityVector가 따로 있으면 좋겠죠.지금의 EntityManager는 Entity를 따로 ..
Default Defense | 다섯번째 프로젝트 # 6 : Ally Attack
·
개발/Default Defense
개요개발 일지를 적기에 앞서 저번 글을 적은 이유는 블로그 유입에 대한 고민이아닌 말 그대로 블로그를 쓰는 방향성에 대한 것이였습니다.그래도 값진 피드백을 들을 수 있었으니 괜찮은 경험이였죠. 글을 적다가 한번 날아가기도 했고 지금 개발 상황은 상당히 진행된 상탠데 어디부터 적어야 할지 조금 막막합니다.그러니 대충 적는것 처럼 보여도 이해 부탁드립니다.    아이디어 정리전 글에서 적었듯이 Ally는 각각의 공격 사거리를 가집니다. 보통 이 사거리는 공격자를 기준으로 사거리만큼의 반지름을 가진 원을 그려 그 안에 있는 적을 공격하는 식으로 작동합니다.  근데 여긴 OverlapCircle을 제공해주는 유니티가 아닌 콘솔창입니다.픽셀이랑 유사한 칸 구조를 갖고 있는것과는 별개로 원을 어떻게 그리는지 조차 ..
Default Defense | 다섯번째 프로젝트 # 5 : Enemy Movement
·
개발/Default Defense
개요친구가 옆에서 다섯번째 띄어쓰기가 다섯 번째 아니냐고 하던데 사실 저도 알고 있습니다. (진짜임)근데 블로그 첫글에서부터 띄어쓰기를 안해서 그냥 쭉 띄어쓰기 없이 가는겁니다.절대 몰랐던거 아니에요. 진짜로요.   Enemy 움직임일단 적을 움직여 주기 위해 Enemy 클래스에 변수랑 함수를 조금 추가해주겠습니다.class Enemy : public Entity{public: Enemy(); virtual ~Enemy();protected: int _hp; int _rewardGold; int _moveTime; int _lastMoveTime = 0; Vector2 _facingDir = Vector2(1,0); clock_t _moveTimer;public: void tryMove(); void m..
Default Defense | 다섯번째 프로젝트 # 4 : Entity
·
개발/Default Defense
개요저번 글 적고 바로 적는 개발일지입니다.제가 어제 하루종일 적은 코드니 아직 머릿속에 생생합니다.     Vector2Entity를 적기 전에 일단 각각의 위치들을 훨씬 원활하게 관리하기 위해 Vector2 구조체를 적겠습니다.//Vector2.hstruct Vector2{ Vector2() : x{ 0 }, y{ 0 } {}; Vector2(int x, int y) : x{ x }, y{ y } {}; int x; int y; Vector2 operator+(const Vector2& other); void operator+=(const Vector2& other); Vector2 operator-(const Vector2& other); void operator-=(const Vector2& ot..
Default Defense | 다섯번째 프로젝트 # 3 : 맵
·
개발/Default Defense
개요확실히 구조 짜는게 재밌긴 하네요.처음부터 하나하나 만들어 간다는게 만족감도 크고 재밌어요.    맵 파일 읽기일단 맵을 렌더링할 InGameScene을 하나 추가해줍니다.//InGameScene.hclass InGameScene : public Scene{public: InGameScene(); ~InGameScene();public: void init() override; void update() override; void render() override;}; 그리고 맵을 가져와야 하는데 코드에서 수동으로 한줄 한줄 넣어주는건 조금 그러니까 짧게나마 배웠던 파일 입출력을 활용하겠습니다. 맵은 한번만 가져오면 충분하니 init함수 내에서 읽어오겠습니다. 제 팀원이 보내준 맵 텍스트 파일을 소스코드 ..
Default Defense | 다섯번째 프로젝트 # 2 : Transition
·
개발/Default Defense
개요제가 의욕이 안났던 이유는 그냥 엔진 갠프가 하기 싫어서였을지도 모르겠습니다.겜프는 좀 재밌네요.     개발 시작 전에...게임 프로그래밍 과목에서 진행하는 프로젝트는 팀 프로젝트라고 말씀 드렸었죠?제가 팀장인 만큼 메인이 되어서 개발을 진행해야 합니다. 그러다보니 일단 같이하는 친구에게 다른 일을 시켜놓고 저는 구조를 짰습니다.그 과정이 저번 글입니다. 구조는 생각보다 빨리 완성 됐으니 친구에게 이러한 구조가 됐으니 Scene을 상속 받아서 너가 원하는 Scene을 만들고 init, update, render 함수를 구현해서... 뭐 이러쿵저러쿵.구조는 이해하기 편하고 직관적이게 짰으니 문제는 없었습니다. 일단 Title과 Transition 이펙트를 맡겨두었습니다. 이제 저는 다른 일을 하고 있..