목록OOP (10)
발전하는 춘배
지금 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..
앞서 정의한 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;};타일의 속성으로..
1. Map의 고유성과 World 도입만들다 보니 또 뭔가 부딪혀서 생각이 복잡해졌다.한 게임에서 Map이 고유하다면 static으로 만들면 될 거 같은데..이러면 맵을 이동했다가 다시 돌아오고 이런 건 어떡하지어 근데 맵을 이동한다는 거 자체가 맵이 고유하지 않다는 말인디아니 그럼 main에서 map1 map2 이런식으로 여러 맵을 다 만들어야 되나?근데 뭔가 이건 좀 안예쁜거같은디그래서 GPT형님한테 또 물어봤다 어떡해야할까요 형님 결론부터 말하면👉 Map은 instance로 두되, “전역 싱글 Map”이 아니라 World / Game이 관리하게 하는 구조가 제일 깔끔해. 아하 그렇구나하긴 어떤 시점에 플레이어가 존재하는 맵은 하나이지만, 넓게 봤을 때 '던전 1층', '던전 2층', '보스방', ..
0. 시작GPT한테 웹 기반 IDE로 개발하려 하니깐 웹IDE 추천해달라 부탁했다.replit.com을 추천해줘서 오 하고 있었는데 얘가 무슨플젝하면 좋을지도 추천해준다.5개 추천받았는데 **(강력 추천)**까지 받아서 재밌겠다 싶어 선택해봤다. **(중요)**한 목표 정의일단 딱 이정도만 해보자. 일단 젤 만만해 보이는 게 Map이라 Map.cpp랑 Map.h 먼저 만들기로 함 1. 클래스 헤더 파일 분리예전에 분명히 알고 했었는데 또 시간 한참 지났다고 cpp랑 h 분리하는 걸 까먹어버림https://velog.io/@sean2337/C-%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%8C%8C%EC%9D%BC-%EB%B6%84%EB%A6%AC%ED%97%A4%EB%8D%94%ED%8C%8C..
개요객체 지향 프로그래밍(OOP: Object-Oriented Programing)은 컴퓨터 프로그램을 메시지를 주고받고 데이터를 처리할 수 있는 여러 개의 독립된 단위, 즉 "객체"들의 집합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임이다.객체 지향 프로그래밍을 적용하면 확장 및 보수가 용이한 대규모 소프트웨어를 개발하기에 유리하며, 또한 인간의 사고 방식과 유사하기 때문에 보다 직관적인 코드 분석이 가능하게 된다.이러한 객체 지향 프로그래밍의 장점은 추상화, 상속, 다형성, 캡슐화의 4가지 특성에 의해 극대화 된다. 각각의 특성이 무엇인지 알아보도록 하자.추상화 Abstration자료의 추상화란 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다. 다시 말하면 객체..
