2023년 11월 9일 목요일

C# - TextRpg 2

   
시작마을 맵, 대충 만들었다.

플레이어를 구분하기 쉽게 색을 입혔고 방향키로 움직일 수 있다.

방향키 입력은 이런식으로 받아서 처리하였다.


키입력은 ReadKey 함수를 사용하여 처리하며 쓰레드로 따로 빼서 돌렸다.
눌린 버튼은 전역함수인 bool 형 변수를 true로 초기화하고
다른 함수에서 이를 처리하여 다시 false로 바꾼다. 










방향키를 입력했을때, 플레이어 위치를 이동시키고
플레이어가 이동하려는 방향에 공백문자 "  "가 아닌 다른 문자가 있는지
확인함으로써 물체가 있는지 없는지 if문으로 처리하여 벽을 뚫고 이동하지
못하게 만든다.




다음은 UI로 메인 화면과 여러 UI화면을 왔다갔다 해야 하므로
현재 랜더링을 해야 하는 화면을 구분하기 쉽게 enum으로 선언하여 정리하였다.







Switch 문으로 Ui버퍼에 원하는 문자열을 char배열로 변환하여 배치한다.


결과


하지만 이때 문제가 생기는데, 보통 영어나 숫자같은 문자열은
한자리당 1바이트씩 차지하는데 특수문자와 한글은 2바이트다. 
(UTF8 기준으로는 3바이트)
그래서 자리 칸 무시하고 그냥 출력하면 이렇게 된다.

1바이트는 한칸 차지하고 3바이트는 두칸 차지하기 때문에 
이런식으로 길이 차이가 생긴다.



여기서 1바이트 문자 개수 만큼 맨 뒤에다 " "공백을 넣게되면 정상적으로 자리가 맞춰진다.



다음은 인벤토리이다.


일단은 구조체로 만든 무기, 방어구의 상세 정보를 배열로 만들어서
출력할 때 내용물 중에서 이름 정보가 null 아니면 출력하게 하였다.
(구조체 자체가 null인지 확인할 수 없음)


이런식으로 저장되있는 장비들을 불러와 출력하면 된다.
(장착 여부에 따라 앞에 [E] 를 추가하는 코드는 구현 해놨지만
아직 장착하는 부분을 안했다.)




댓글 없음:

댓글 쓰기

c++ thread.h

 c++에서 쓰레드 돌릴려면 thread.h 헤더를 쓰면 되는데 이 친구는 쓰레드가 아직 실행 중인지, 아니면 강제 종료하거나 하는 함수가 없어서 조금 아쉬운 애다. std::thread 는 로컬 변수로 선언하든 new 동적 할당을 하든 start 함...