[기타]'틱'에 관해 질문!!
member photo Jero 7 2,499 0 2004-06-21 09:46:32
0
7Comments
member photo
Raven 2004.06.21(월) 오전 11:07:56
저도 아직 구현은 안해봐서 잘 모르겠는데요,

공지 같은 경우는 말씀하신대로, 특정 시간이 되면 특정 함수를 호출하는 방식으로 하시면 됩니다.

Mordor 같은 경우는 update 라는 함수가 있어서, 메인 루프에서 계속 호출을 합니다.
update 함수가 다시 계속 호출하는 함수로 update_active라는 함수가 있는데, 사용자가 현재 있는 방의 활성화된 몹들의 행동을 갱신해주는 함수입니다.

바로 이 부분에서, 현재 전투중이거나, 몹이 만약 선공몹이라면, 공격 여부를 결정해서 계속 공격을 하게 만들죠.

그리고 '틱'이 반드시 하나만 존재하는건 아닙니다. 사용자가 볼 수 있는 일반적인 '틱'이 존재하는 반면, 백그라운드에서 조용히 몹 리젠이라던가, 존 갱신 등을 하는 '틱'도 존재합니다.
물론 용도에 따라 틱의 간격은 다르죠.


그리고 월드 문제는 '방' 자체가 자신과 이어져있는 다른 방의 정보를 가지고 있습니다.
(엄밀히 말하자면 자신과 이어진 방의 방번호를 가지고 있다가(파일 상태죠), 머드를 가동할 때에 모든 방들이 로딩(이 때 메모리로 올라갑니다)된 후에, 번호에 따라서 방끼리 '포인터(C)'로 연결된 방식이죠.)

물론 이렇게되면 머드 실행중에 외부에서 방 파일을 변경한 후에 그 방을 머드로 가져오려면,
머드 상에서 별도의 명령어를 입력하여(물론 만들어줘야겠죠. 갱신된 파일이 있는지 검사하고 갱신되었으면 메모리로 가져오는 명령어를요.) 새로 메모리로 올려줘야겠죠.
이렇게 직접 명령어를 입력하지 않고 자동으로 갱신된걸 체크하려면 메인 루프에서 모든 방 파일을 체크하면서 돌아가야 하는데, 이렇게되면 방이 많아질 경우 많은 파일을 검사해야하기 때문에 부하도 걸리고, 체크하는 동안에는 머드에 '렉'이 생길 수도 있을거라 생각됩니다.
member photo
Raven 2004.06.21(월) 오전 11:14:09
아, 그리고 '지도'에 대한 정보는 일반적으로 머드가 가지고있지 않습니다.
애초에 '지도'란 것은 사용자 편의를 위해 만든것이죠.
실제 지도 구성은 '방'들 간에 연결 정보를 토대로 만들어집니다.
'방'을 여러개 만들어놓고 그 주변을 좀 넓게 본다 치면 그게 지도가 되는거죠. ^^;
member photo
Jero 2004.06.24(목) 오전 08:41:15
답변 감사합니다.
만약에 메모리에 맵을 상주시키지 않고 기본적으로 스타트룸만 상주했다가 다른곳으로 이동할때 이동하고자 하는 방을 체크해서 보여주는 방식도 '렉'을 초래할까요?
기존에 있던 '심플월드제네레이터'를 완전히 다른 방식으로 변경할려니 이거 거의 처음부터 뜯어 고여야 할것 같군요 .....
member photo
Jero 2004.06.24(목) 오전 08:45:35
일단 제가 생각해봤던 경우는요..
로긴후에 스타트룸만 보여줍니다.
거기에 이동을하는 명령어(동,서,남,북등)가 입력되면 현제 위치에서 출구를 찾고,입력된 커맨드와 출구가 일치 한다면 현제 방의 리스트에서 자신을 지우고 새로운 방을 프린팅한 후 그 방에 자신을 넣는 방법입니다.
방정보는 000,001,002란 식으로 방마다 파일을 만들어주고,
그 파일안에는..
=방이름=
방설명~
동,서,남,북
001,002,003,004
식으로 되어 있어서 스타트룸의 정보를 readline으로 각각의 변수에 집어 넣고,
이동을 한다면 출구를 찾고,출구에 해당하는 방번호를 리턴시켜서,
그 방번호의 파일을 읽어서 다시 방이름,방설명,출구를 프린팅하는방식이죠.
member photo
Jero 2004.06.24(목) 오전 08:49:00
저장할때는 캐릭터 변수중에 room이란 것을 만들어두고 거기에 방번호를 저장해서,
로긴시에 저장된 방번호에 맞는 방을 프린팅 해주는겁니다.
그런데 위의 방식으로 할때 서버 부팅시 전체 방을 메모리에 상주시키지 않아도 될것 같은데요...
제말 맞나요?
아니면 위의 방식대로 해도 메모리에 상주시킬수 있나요?
확실히 기본기가 부족하니까 별 방법이 떠오르질 않는군요 ㅜㅠ
기본적으로 존의 정보를 서버 부팅시 읽어와서 방을 거기에 따라 나열하고 만들어준다면 서버부팅시 방을 메모리에 상주시키기 쉬울듯한데요...
위 방법으로는 어떤식으로 해야 방의 메모리 상주가 가능할까요 ㅋ.....

일단은 위의 방법이 며칠동안 고민한중 가장 그럴듯 해 보였답니다.. ㅜㅠ
member photo
Jero 2004.06.24(목) 오전 08:55:31
참, 그리구요 '틱'문제는 어느정도 해결 된거 같습니다.
처음 시작할때 일정 함수를 불러들이면,
그 함수는 time.sleep함수를 써서 일정간격으로 카운트를 하나씩 늘려줍니다.
그럼 메인루프상에서 그 카운트를 체크하다가 일정 숫자가 됐을때 이벤트를 발생하는겁니다.
현제 날씨,시간,자동저장부분을 해결했구요
몹의 리젠경우는 몹이 죽었을때 틱함수를 호출해서 카운트를 늘리다가 일정 숫자가 되면 다시 리젠하면 될듯하구요,아이템도 아이템을 집었을때 방의 인벤토리에서 아이템이 빠져나가는 순간 틱함수를 호출하면 될듯 싶어요.
틱함수도 다른 모듈에서 쓰레드를 사용하니 다른 명령어 부분은 time.sleep의 영향을 안받는것 같구요
(물론 기존의 소스에 시간을 보정해 주는함수가 들어 있어서 가능하겠지만요 ^^;하지만 이부분은 아직 이해가 잘 안되더군요 ㅋ)
혼님과 레이븐님이 힌트를 안주셨다면 아직도 ''에서 헤메고 있을지도 ^^;
감사합니다.
member photo
Raven 2004.06.24(목) 오전 10:04:57
아, 제가 아무래도 말씀을 잘못 드린거 같군요. ^^;

Python에서는 메모리 개념을 신경쓰실 필요가 없는데 Mordor를 예로 들어 설명하다보니... ^^;;

방식은 그게 맞습니다. 머드 부팅시에 방 정보를 모두 읽어들이는겁니다.

방 사이에 이동하는 것도 그게 맞습니다. ^^

일단 이동 명령어를 입력 받고 해당 출구가 있으면 해당 출구와 연결된 방 정보를 얻어와서,

캐릭터가 기존에 가지고 있던 방 정보를 지우고 새로운 방 정보를 넣어주면 되는거죠. ^^

아, 틱은 time.sleep을 쓰는 방법 말고도, 현재 시스템 시간을 얻어와서 마지막으로 '틱'한 시간과의 차를 비교해서 만들어주는 방법도 있습니다. ^^
(이렇게 하면 하나의 thread로도 여러 가지의 '틱' 이벤트(리젠, 날씨, 시간 등)를 함께 처리할 수 있다는 장점이 있죠. ^^;)
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 943개 / 검색된 게시물: 943개
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
내용
쪽지가 도착하였습니다.
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--