게임 개발 44

7/23 - 포탈, 링 ID 0~5 스프라이트

생각보다 그림 그리는게 재밌다. 정확히는 그리는거 자체가 재밌는건 아니고, 그린 스프라이트를 게임에 적용시켜보면 확실히 완성도가 쭉쭉 높아지는게 보여서 좋다! 그래서 욕심내서 포탈 애니메이션도 함 넣어봤는데 빙글빙글 돌아가는게 나름 괜찮다. 참고로 파란 포탈은 빈 방, 빨간 포탈은 전투방, 노란 포탈은 미스터리/상점 방, 검은 포탈은 보스방이다. 또한 위의 짤에서 노란 포탈을 눌렀을 때 그냥 빈 방인 이유는 아직 미스터리/상점 두 타입의 방들은 구현하지 않아서이다. 방학 시즌에 일요일마다 학회 팀원들과 랩실에서 PS 팀연습을 하고 있어서 매주 서울에 올라가는 중이다. 최근에 재밌어보여서 라는 책을 샀는데 내일은 이거 들고 가서 버스에서 읽어야겠다. 멀미날것 같으면 얼른 접어야겠지만. 암튼 다음주도 계속해..

7/21 - 필드(바닥) 스프라이트

Aseprite라는 프로그램으로 그린 게임 배경이다. 실제로 게임에 배치한 배경은 외곽 부분은 보이지 않게 했다. 전투/특별방들 모두 위를 배경으로 하며, 해당 배경 위에 각종 몬스터/링/아이템이 배치되면서 장면이 완성된다. 하단부의 공간은 전투중에는 전투에서 덱이 위치하는 곳이며, 그 외의 경우에는 버튼들(보유 링/유물 보기, 설정, 메뉴)과 미니맵이 위치할 예정이다. 내일 할일은 몬스터 경로 스프라이트를 만드는 것이다. Path Creator로 경로를 조정하는 것 또한 포함한다. -몬스터 경로 0~5번 제작

7/20 - 보스 몬스터(타입 14~16번) 능력 구현

오늘은 보스 몬스터(타입 14~16번)를 구현했다. 즉, 모든 몬스터의 스킬을 구현한 아주 기쁜날이다!!!!! 1) 타입 14번은 공간분열자이다. 10초마다 모든 일반 적들의 자리를 서로 바꾼다. 쿨타임 10초가 될 때마다 모든 몬스터들이 다른 랜덤한 몬스터 하나를 골라서 movedDistance값을 스왑하도록 했다. 2) 타입 15번은 처형인이다. 10초마다 링 한 개를 파괴한다. 쿨타임 10초가 될 때마다 랜덤한 링을 골라서 DeckManager의 RemoveRingFromBattle()로 해당 링을 제거해주면 된다. 3) 타입 16번은 타락한 왕이다. 능력이 좀 복잡하다... 일단 10초마다 다음의 효과 중 하나를 발동한다. 1. 링 하나를 파괴한다. 2. 링 하나의 제련 단계를 낮춘다. 3. 전체..

7/19 - 보스 몬스터(타입 10~13번) 능력 구현

오늘은 보스 몬스터(타입 10~13번)를 구현했다. 1) 타입 10번은 인형술사이다. 10초마다 자신의 바로 앞에 인형을 소환하며 인형이 살아있는 한 HP가 0 이하로 떨어지지 않는다. 이를 위해서 타입 17번의 몬스터를 만들었다. 10초마다 17번 몬스터 하나를 오브젝트 풀에서 불러와서 인형술사보다 살짝 앞쪽에 (movedDistance값 + 1) 놓고, 항상 타입 17번 몬스터가 하나라도 살아있는지 확인해서 immuneDamage를 킨다. 2) 타입 11번은 분신술사이다. 10초마다 현재 HP의 2/3을 가지고 둘로 갈라진다. 현재 HP의 2/3으로 바꾸고, 다른 타입 11번 몬스터 하나를 오브젝트 풀에서 불러와서 나와 같은 스탯으로 생성해주면 된다. 3) 타입 12번은 봉인술사이다. 10초마다 전체..

7/15 - 엘리트 몬스터(타입 3~9번) 능력 구현

오늘은 엘리트 몬스터(타입 3~9번)를 구현했다. 1) 타입 3번은 광전사이다. HP가 줄어들 수록 이동 속도가 빨라지고 최대 2배까지 빨라진다. 즉, 기본 이동속도를 의미하는 baseSPD를 해당 사항에 맞게 값을 바꿔주면 되는데, baseSPD = baseMonster.baseSPD * (1.0f + (maxHP - curHP) / maxHP)로 하면 된다. 이러면 baseMonster.baseSPD값이 1.0배에서 2.0배로 점차 빨라진다. 2) 타입 4번은 전령이다. 5초마다 2초동안 이동속도가 2배로 증가한다. 몬스터들이 이런 특수스킬을 쓰는 것을 대비해서 skillUseTime과 skillCoolTime 함수를 두었다. 전자는 스킬을 사용한 시간이고, 후자는 말그대로 쿨타임이다. 전령의 경우,..

7/14 - 층 생성, 방 이동, 맵

오늘은 어제 구현한 내용을 C#으로 바꿔서 실제로 게임에서 층을 생성하고, 방끼리 이동을 구현했으며, 하단에 미니맵까지 만들었다. 1) 앞으로 FloorManager는 층을 관리할 것이다. 방 생성을 담당하는 Floor 클래스는 Generate(층번호) 메소드를 실행하면 층 정보를 생성한다. FloorManager는 CreateAndMoveToFloor(층번호) 함수에서 해당 메소드를 불러서 층을 생성하고 유저를 시작 방에 보낸다. 2) MoveToRoom(int x, int y) 함수를 구현했는데, 얘는 (x, y)위치의 방으로 유저를 이동시킨다. 정확히는, 유저는 그대로 있고 화면에 나타나는 포탈, 몬스터 공격로 모양등을 바꾸는 것 뿐이다. 예를들면, 위 움짤에서는 빨간색 포탈이 하단에 뜨는데, Fl..

7/13 - 랜덤 층 생성 알고리즘

오늘은 층 생성 알고리즘을 짰다. 이 과정에서 기획면에서 미스터리 방의 이벤트&골드/에메랄드/링 입수처&유물 입수처를 약간 수정했다. 1) 층 생성 알고리즘은 이전에 말한대로 아이작의 번제 방식에서 맵을 생성하는 방식을 적용했다. 우선 아이작의 번제에서 맵을 만드는 방법은 아래 글에서 자세히 설명하고 있다. Dungeon Generation in Binding of Isaac The Binding of Isaac, and its remake, Binding Of Isaac: Rebirth are one of my favourite games of all time. It’s a roguelite twin stick shooter, much like Enter the Gungeon. The dungeons ..

7/12 - 링 ID 17, 30, 31번, 몬스터 웨이브, 전투 보상, 게임 오버

한동안 개발을 많이 못해서 벌로 오늘은 좀 많이 구현했다(근데 난 억울해.. 토요일에는 밭 갔다오고 일요일에 SUAPC 연습하러 서울 갔다오고, 어제는 동생 데리고 안과에 하루종일 있었으므로! 3일동안 이동한 거리 400키로는 그냥 넘을거같다. 뭐, 그래도 그동안 이동할 때랑 대기할 때 잠은 푹 잤다). 먼저, 링 ID 17(탐욕), 30(식물), 31(네크로)번을 구현하면서 드디어 0~32번 링을 모두 구현했다. 경축!. 짤에서 앞의 세 개 링이 각각 17, 30, 31번이다. 더불어 오늘은 몬스터 웨이브를 조정하고, 전투 보상을 얻는 것을 구현했으며, 게임 오버 방식을 변경했다. 1) 17번 링은 배치 시 공격력만큼 게임 종료 후 골드 획득량이 늘어난다. 이는 전투가 완전히 종료되었을 때 Battle..

7/8 - 링 ID 28, 29, 32번

오늘은 링 ID 28(추적), 29(즉사), 32(동면)번을 구현했다. 위 짤에서 앞에서부터 순서대로 각각 28, 29, 32번 링이다. 마지막 분홍색은 28번 링의 효과를 보여주기 위해 넣은 18(결계)번 링이다. 1) 28번은 가장 적이 뭉쳐있는 곳을 공격하여 범위 내에 있는 모든 적에게 피해를 입힌다. 그리고 타겟 스탯이 증가해도 실제로 공격하는 수가 증가하는 것이 아니라 최종 피해량이 50%씩 증가한다. 구현에서 가장 복잡했던 부분은 가장 적이 모여있는 곳을 찾는 것이었다. 이는 모든 몬스터-몬스터 간 Vector2.Distance()로 구한 거리가 추적 링의 타격 시 반경인 chaseRadius값보다 작은 것들이 가장 많은 몬스터를 선정하여 해당 적에게 Bullet을 발사하도록 했다. 그후 공격..