목록2026/02 (12)
발전하는 춘배
책 정보『나를 소모하지 않는 현명한 태도에 관하여』마티아스 뇔케 저이미옥 역퍼스트펭귄 (2025)멋있는 사람나는 멋있는 사람이 되고 싶었다. 구체적인 특징을 말로 설명하진 못하겠지만 그냥 딱 봤을 때, '오 멋지다' 싶은 느낌이 드는 그런 사람. 이 책은 그런 사람이 되기 위한 여러 방법 중 한 가지 길을 제시해 주었다.돌이켜보면 여태 나는 물질적 의미에서의 성공과 그로부터 나오는 '멋'을 바라왔던 것 같다. 어쩌면 내가 그리는 '멋진 사람'의 명확한 상이 없어서 막연히 가장 단순하고 간편한 사회적 성공 - 돈 - 을 목표로 삼았던 걸지도. 이 책을 읽고서 돈 많은 사람보다 멋진 사람이 어떤 사람인가에 관한 하나의 이미지를 얻게 되었고, 한 단어로 말하면 젠틀맨, 한 문장으로 정의하자면 '자신이 어떤 사..
지금 Game.run은 이렇다.void Game::run() { isRunning = true; world->populateMap("map1", 50, 50); player= world->getPlayer(); camera->follow(player->getX(), player->getY(), world->getCurrentMap()->getWidth(), world->getCurrentMap()->getHeight()); while (isRunning) { render(); handleInput(); if (world->isPlayerDead()) { std::cout follow(player->getX(), player->getY(), world->getCurrent..
이어서 실제 아이템 데이터들을 만들어보자.귀찮아서 gpt한테 만들어달라 했다.[ { "name": "Small Potion", "type": "consumable", "description": "Heals +20 health to the player", "effects": [ { "type": "heal", "value": 20 } ] }, { "name": "Large Potion", "type": "consumable", "description": "Heals +50 health to the player", "effects": [ { "type": "heal", "value": 50 } ] }, { "name": "..
카메라까지 구현하고 나니 뭘 해야 할지 순간 막막해졌다.생각해보니 지금은 게임 플레이가 불가능하다. 맵과 몬스터는 나오는데 아이템이 없으니 체력 회복도 불가능해서 몬스터들을 다 잡을 수가 없다. 1. 구상대충 아이템 클래스랑 인벤토리 클래스를 만들고 이렇게 해본다.- 플레이어는 인벤토리를 가지고 있다.- 인벤토리는 (0개 이상의) 아이템들을 가지고 있다.- 인벤토리는 해당 아이템을 몇 개 가지고 있는지 수량 정보도 가지고 있다.- 인벤토리는 아이템을 추가, 제거(버리기), 사용하는 기능을 가지고 있다.- 아이템은 데이터다. 공통 정보로는 이름, 종류, 설명이 있다. 종류로는 무기, 의상, 소비아이템 정도가 있다.-- 무기 아이템은 착용 시 공격력을 올려주므로 "공격력" 스탯이 있다. "착용하기"와 "착용..
저번에 여러 방들을 템플릿화해서 맵에 랜덤으로 가져다 쓰는 식으로 해보고 싶다고 했었는데 일단 미루기로 했다.당장 해보고 싶은게 생겼다. 카메라 느낌이다.넓은 맵을 한번에 다 출력하니 뭔가 그 게임 느낌이 안 난다. 플레이어 주변으로 필요한 부분만 조금 확대(는 안 되겠지만) 집중시켜 출력하면 좋을 것 같다. 1. 아키텍처 구상어떻게 해야 할까?여태까지의 깨달음을 바탕으로 생각해본다.1. 알고 있는 것."카메라가 알고 있는 것은?" - 출력해야할 맵의 범위 2. 생명 주기"월드가 리셋되면 카메라가 없어진다"와, "게임이 없어지면 카메라가 없어진다"둘 중 후자가 맞는 것 같다는 느낌이 든다. 즉, Camera는 World가 가지는 요소라기보다는 Game이 가지는 게 맞다. 여기까지 고려했을 때 일단 Cam..
이제는 로그라이크 느낌이 나도록 제대로 된 맵을 만들어보려고 한다.맵을 만드는 데에는 여러 방법이 있겠지만 잘 알려진 알고리즘인 BSP를 이용하여 만들어보고자 한다.BSP 알고리즘: https://nowitzki.tistory.com/9구현: https://nowitzki.tistory.com/10이 두 글을 잘 참고했다. 1. BSP 알고리즘BSP는 Binary Space Partitioning의 약자이다.즉, 전체 공간을 두 부분으로 재귀적으로 나누는 알고리즘이다.공간을 두 부분으로 나누며 트리 형태로 저장한다. 시작할 때의 전체 공간은 0번 노드이며, 그를 분할해 나온 두 공간은 0번 노드의 자식인 1, 2번 노드가 된다.n번 재귀적으로 반복하여 트리를 만든다.리프 공간들에 대해 각 공간을 초과하지..
1. 공격이동이 가능해졌으므로 이제 전투를 해보자.플레이어가 이동한 곳에 적이 있다면, 서로 맞딜하여 피를 깎아본다.이를 위해 tryMoveEntity 로직에 공격 로직을 추가해준다.때려보고 잡았으면 그 자리로 이동하고, 못 잡았으면 원래 자리에서 한대 맞는다. int newX = entity->getX() + x; int newY = entity->getY() + y; if (currentMap->getTile(newX, newY).props.walkable) { entity->move(x, y); Entity *target = getEntityAt(newX, newY); if (target != nullptr && target->getState() != EntityState::D..
1. 플레이어 이동 함수 호출에 대한 고민플레이어 이동을 구현해보자.큰 틀은 이렇다.1) 플레이어는 자신을 이동시키는 API를 갖고있다. 입력은 변화시킬 x와 y이며 자기 자신의 좌표를 그만큼 업데이트한다. 2) 생각해보면 플레이어뿐 아니라 다른 적(Entity)들도 이동은 가능하므로 이 API는 Entity라는 클래스에 넣는다. 일단 플레이어와 적 말고 다른 엔티티는 구현하지 않을 것이므로 따로 MovingEntity같은 클래스는 만들지 않는다.3) 이 API는 Game이라는 클래스에서 호출할 것이다. 이렇게 만들면 지금은 콘솔 input기반으로 moving API가 호출되겠지만, 나중에 UI 등 다른 input으로 변경할 때 호출되도록 변경하기 용이할 것이다. 여기서 이런 고민이 생겼다. map의 범..
책 정보『동물농장』조지 오웰 저도정일 역민음사 (2025)기록1기억의 조작은 어려운 일이 아니다. (1984와 유사한 느낌을 받았다)동물들은 그 말을 그대로 믿었다. 사실대로 말하면, 존스라든가 존스라는 이름이 의미하는 모든 것들은 이미 동물들의 기억에서 거의 대부분 잊히고 없었다. 그들은 지금의 삶이 고단하고 힘들다는 것, 자주 춥고 배고프다는 것, 잠자는 시간을 빼면 하루 종일 일해야 한다는 것을 알고 있었다. 그러나 지난날 존스 시절에는 사정이 훨씬 더 나빴던 것임에 틀림없다고 동물들은 생각했다. 그들은 즐거이 그렇게 믿었다. (108p) 2우매한 대중은 생각 자체를 하지 않거나, 무언가 잘못되었다 생각하지만 마땅히 표현할 방법을 찾지 못하거나, 주변에서 '큰 목소리'로 들리는 선전에 입을 다물거나..
앞서 정의한 Map과 World의 책임 정의를 염두해 두고 Map 구현을 끝내보자.Map:타일 정보 보관 (벽, 땅, 나무)특정 좌표가 막혔는지특정 좌표에 엔티티가 있는지화면 출력World:맵 생성맵 초기화 (벽, 땅 채우기)플레이어 배치몬스터 배치맵 전환1. 맵을 Tile 형태로 저장지금 맵은 int형 이중벡터 형식인데 이는 직관적이지 않다.map을 std::vector> tiles; 형태로 구현하려고 한다. Tile은 아직은 딱히 class로 만들 이유를 못 느껴서 struct로 만든다.struct Tile { TileType type; TileProperty props;};struct TileProperty { char symbol; bool walkable;};타일의 속성으로..
