목록전체 글 (96)
강께르의 개발일지
1. 오늘 해야할 일 - 공중에 떠 있는 플랫폼과의 충돌 구현 - PlayerBullet 클래스 구현 - 일자식 탄환 발사 구현 - 화살표 위를 눌러 플레이어 위 사격 구현 - 화살표 아래를 눌러 숙이기/숙여서 사격 구현 - 임시 Boss_Platform 클래스 구현 - 테스트용 보스 RECT 구현 - 보스 RECT를 이용해 일자식 탄환 충돌 구현 - 플레이어 피격 충돌 구현 - 피격 시 알파블렌드 적용 - 패링 - 스프라이트 적용 - 점프 - 대시 - 일자식 탄환 - 발사 - 위쪽 에임 상태 - 위쪽 사격 - 숙이기 - 숙이기 사격 2. 결산 - 오늘은 많이 하지 못 했다. 시간을 많이 쏟으며 집중하지 못했을 뿐더러, 직관적으로 눈에 보이는 스프라이트 출력에 코드를 작업하는 시간을 보냈다. 그래도 스프..
1. 오늘 해야할 일 - 프레임워크 정리 - 플레이어까지 상속해줄 상위 클래스 구성 - 플레이어 클래스 구성 - 플레이어 RECT 화면상 출력 - 키보드 입력에 따른 플레이어 횡이동과 점프 - 플레이어 대시 기능 - 플레이어 대시에 따른 횡이동, 점프의 중첩 기능 수행 막기 - 플레이어의 유휴 상태, 좌우 이동 상태 애니메이션 2. 이렇게 하면 좋지 않을까? - 어제 파일 입출력으로 텍스트 파일로 값을 파일로 입력하고 그 파일을 출력해 값을 다시 저장하는 방법을 배웠다. - 이것으로 반복적으로 저장할 요소들을 텍스트 파일화해서 불러오면 개발 능률이 오르지 않을까? 3. 오늘 한 내용 - 클래스 다이어그램을 기반한 클래스를 구성했다. CObject를 중심으로 CCharacter 클래스와 CMap 클래스를 ..
1. 프로젝트로 만들려고 하는 것 - 이번에 일주일이라는 시간을 갖고 게임을 모작하여 게임 프로그래밍 실력을 증진하는 기회를 얻었다. - 이에 부응하기 위해 그동안 배운 것을 응용하거나 심화하는 방향을 갖고 게임을 선정하고 개발하려고 한다. - 그런 방향성에 부합하다고 여긴 게임이 컵헤드이다. 2. 오늘 해야할 일 - 현재 14시 00분이다. 학원에서 퇴근하기까지 앞으로 3시간 40분이 내게 주어졌는데 이 시간을 최대한 능률적으로 활용하려고 한다. - 게임에 대한 요구 사항은 전 날에 작성했다. 그래서 오늘 해야할 일을 명확히 하고 1일차부터 본격적으로 게임을 쌓아가는 과정을 밟기 위해 오늘은 재료를 준비하는 느낌으로 시간을 써야겠다. - 스프라이트 정리하기 - vector로 탄환 관리, 객체끼리의 충돌..
1. 어떤 상황이었는가? - WinApi를 이용해 플래피버드를 만들던 중이었다. - 이 게임을 만들기 위해 나는 세 개의 클래스를 사용하고 있었다. - 어떤 물체를 나타낼 오브젝트를 아울러 이야기할 클래스로 CObject와 이것을 부모 클래스로 상속받는 플레이어 클래스인 CPlayer와 발판과 방해물 클래스인 CLand가 있다. - 이를 메인에 인클루드하여 프로그래밍하고 있었다. 메인에서 플레이어와 발판은 CPlayer와 CLand를 각각 포인터 변수로 하나씩 만들어 동적할당을 하였다. - 그리고 여러 개수를 등장시켜야 할 이 게임에서 방해물을 여러 개 만들어야 하는데, 그것을 위해 배열과 같은 자료구조가 필요했다. - 그래서 나는 연습 삼을 겸 배열말고 vector 템플릿 클래스를 사용해보기로 했다. ..
1. 버퍼란 무엇인가? - 한 곳에서 다른 곳으로 데이터를 이동할 때, 임시적으로 그 데이터를 저장하기 위해 사용되는 물리적인 메모리 저장소의 영역이라고 한다. - 이에 대한 설명으로는 출체에서 다음과 같이 얘기한다. - 예를 들어 A와 B라는 소프트웨어 혹은 하드웨어가 있다고 하자. - A는 어떤 작업에 대한 결과물로 특정 데이터를 내놓을 것이다. B는 특정 데이터를 입력받아서 작업을 한다고 가정하자. - 여기서 '데이터를 내놓는다'의 의미는 특정 메모리 영역에 데이터를 기록한다는 의미이다. 특정 메모리 영역의 입장에서는 데이터를 저장한다고 해석이 될 것 같다. - 그리고 '데이터를 입력 받는다'는 의미는 특정 메모리 영역의 데이터를 읽는다는 것을 의미한다. 특정 메모리 영역의 입장에서는 데이터를 넘겨..
1. C의 형 변환 int num = 10; std::cout 자식 클래스의 참조/포인터 자식 클래스의 참조/포인터 -> 부모 클래스의 참조/포인터 - static_cast는 dynamic_cast보다 덜 엄격한 기준으로 형 변환을 지원한다. 그렇기에 만약 부모 클래스 객체를 가리키고 있는 부모 클래스의 포인터 변수를 형 변환을 해 자식 클래스 포인터로 바꾸었다면? - 이를 에러라고 잡지는 않겠지만, 원하는 결과가 나오지 않을 수 있다. 이에 대한 책임은 설계한 프로그래머가 져야하는 것이다. - 이런 경우의 에러를 검출하고 조치하고 싶다면 아래의 형 변환 연산자를 사용해야 할 것이다. 3. dynamic_cast dynamic_cast (expr) - dynamic_cast는 상속 관계에서의 안전한 형 ..
1. 일반적인 프로그램과 게임 프로그램의 차이 - 프로그램은 사용자가 발생시키는 메시지를 이용해 그에 맞는 일을 처리하며 동작한다. - 예를 들어, 키보드와 마우스와 같은 입력이 메시지로 전달되어 그 이벤트에 맞게 프로그래밍된 동작을 수행할 것이다. - 만약 일반적인 프로그램이라면 위와 같은 메시지를 받을 때까지 대기할 것이다. 아무런 동작하지 않고 오로지 메시지가 새로 올 때까지 무한정 대기하는 상태가 될 것이다. - 하지만 게임은 일반적인 프로그램과 달리 취급해야 한다. - 일반적인 프로그램은 메시지가 올 때까지 그 어느 동작도 수행하지 않는다. 게임도 그와 똑같다면, 메시지가 올 때까지, 그 어떤 애니메이션을 동작하지 않고 게임이 멈춰있는 것처럼 보일 것이다. - 그에 따라서 일반적인 프로그램과 다..
1. 디자인 패턴이란? - 소프트웨어를 설계할 때, 공통적으로 개발자라면 만나게 되는 문제에 대한 공통적인 해법이나 자주 쓰이는 설계 방법을 이르는 말이다. - 이를 패턴화하여 재사용하기 좋게 해놓았으며, 효율적인 코드를 만들기 위한 방법론을 제시하기 때문에 개발의 효율성을 좋게 하는 효과가 있다. - 하지만 이를 패턴을 맹신하여 남용하는 부분은 지양해야 한다. 굳이 이러한 적용점이 필요 없는 부분이라면 적용하지 않을 것이 좋다고 한다. - 상황에 따라 자주 쓰이는 설계 방법을 정리한 방법론이기에 모든 상황의 해결책은 아니다. 무작정 가져다 쓰기보다 왜 효율적인 방식이고 패턴들로부터 노하우를 습득하는 것이 중요하다고 한다. - 그리고 상대방과의 의사소통에 도움을 줄 것이다. 예를 들어 문제 해결 제안을 ..
1. 타이머란? - 프로그램은 실행 중에 사용자로부터 입력을 받게 되면 그 입력에 따른 메시지를 처리하고 그것을 화면에 보여주는 과정을 거친다. - 만약 사용자로부터 키보드나 마우스와 같은 입력이 없을 경우엔 프로그램은 사용자의 동작을 통해 발생하는 메시지가 없어 화면이 멈추는 현상이 일어날 것이다. - 이 경우를 위해 다른 동작에 의한 메시지가 없어도 메시지를 발생하는 것이 필요할텐데, 그것이 타이머 메시지이다. - 타이머 메시지는 일정한 시간 간격을 두고 계속 발생하는 메시지를 말한다. - 주기적으로 같은 동작을 반복해야 하거나 여러번 나누어 해야 할 일을 할 때, 이 메세지를 이용한다. 2. SetTimer - SetTimer는 타이머 생성 함수이다. 이를 통해 원하는 동작을 일정한 간격의 시간마다..
1. 이것은 무엇인가? - 큐는 선입선출의 특징을 가지고 있다. 그 특징을 구현하는데 문제점인 인덱스 변경으로 인한 배열 사용 범위가 애매해지는 것이 있다. 이를 보완하는 순환 큐를 이해해보고자 구현해보았다. 2. 순환 큐의 구조 - 순환 큐를 도식화하면 이렇게 생겼다. - 큐는 선입선출의 특징을 가지고 있어 데이터를 하나 꺼낸다고 한다면, 가장 앞에 있는 인덱스를 비울 수 없기에 그 다음 데이터를 가진 인덱스로 바꿀 것이다. - 이 때 모든 인덱스를 하나씩 땡겨서 그 빈자리를 채우는 것이 아니라 가리키는 인덱스를 옮기는 것이어서 공간에 대한 애매함이 있다. - 이를 보완하는 것이 순환 큐인 것이다. 마치 마지막 인덱스의 다음 인덱스는 다시 처음 인덱스인 것으로 논리적으로 구현한 것이다. - front는..