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웨이브 정돈 있어야 디펜스 빌드업 하는 느낌이 들겠죠?이렇게 큰 데이터를 코드 내에 저장할 수는 없으니 txt파일에 저장해둔 뒤에 가져오는게 낫습니다. 저의 능지로 '랜덤임과 동시에 합리적인 웨이브 시스템'따윈 구현 불가하기에 간단하게 한줄마다 웨이브의 정보를 간단하게적이 나오는 수, 적이 나오는 간격으로 간단하게 구성하겠습니다. 이런식으로 적이 ..
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 | 다섯번째 프로젝트 # 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 이펙트를 맡겨두었습니다. 이제 저는 다른 일을 하고 있..
Default Defense | 다섯번째 프로젝트 # 1 : Scene 구조, 싱글톤
·
개발/Default Defense
개요글을 시작하기 전에 간단하게 할말을 적고 시작하곤 했는데 지금은 별로 적을게 없습니다.바로 가죠/   구조 구상 게임의 전체적인 구조는 간단하...진 않지만 Unity처럼 Scene을 나누는 구조를 사용하는 것이 좋다고 생각 했습니다.블로그에 정리하진 않았지만 저번 2시간에 객체지향 프로그래밍, 싱글톤, 추상 클래스, 상속을 배웠습니다.2시간만에 급하게 배운거라 뇌에 전부다 담진 못했지만 그래도 어떻게든 따라가면서 적어놓은 소스코드를 사용해서 적어봅시다. 일단 저희가 만드는 게임은 게임 로직을 처리하는 Update와 처리가 끝난 후 모든걸 그려주는 Render로 모든게 가능해야 합니다.그렇기 때문에 각 Scene은 각자의 Update와 Render를 가지고 있어야 하고 이 Scene들을 가지고 있는 ..