perpet

2.퀘스트

스터디/C++,CLI,C#2009. 9. 14. 20:11

 

그렇다면 이것으로 간단한 퀘스트를 짜보고 간단한 핵심 코드 리뷰를 해보자

Demo2

일반적으로 기획자가 상상하는 단순한 퀘스트를 상상해보자.

1.유저가 npc 를 클릭한다.

2.유저에게 A 를 만나달라고 대화박스를 보인다

3.승낙을 하면 아이템을 준다.

4.A를 클릭하면 고맙다고 한다.

아주일반적인 퀘스트 내용이다.

 

이것을 정말 저런순서대로 코딩을 할수없을까?

 

밑에 코드를 보자

 

quest1 버튼을 누르면 밑에 코드가 돌아간다.

 

우선 퀘스트 코드를 보자

 [소스1]


  1.         public IEnumerator GetEnumerator()
            {

    // 이미 퀘스트를 받았나?

                if (_Owner._QuestInfo.Contains(1))
                {

  2.        

            yield return new NCondition.WaitMessage("여기서 뭐하나", 2);

                    yield break;
                }

  3.            // 부탁을 한다.

                NCondition.WaitMessage msg = new NCondition.WaitMessage("반갑군. 내부탁을 들어줄수있나?", 0);

                yield return msg;

  4.            
  5.             if (msg.Ret() == "OK")
                {

                // ok 이면 퀘스트를 준다

                    _Owner._QuestInfo.Add(1);

                    yield return new NCondition.WaitMessage("고맙군 어서 친구를 찾아주게 ", 2);
                }
                else
                {

  6.                //

        yield return new NCondition.WaitMessage("실망일세 꺼지라우", 2);

                    yield break;
                }

  7.             // A를 클릭하면

                yield return new NCondition.WaitClickEvent(1);

  8.          
  9.             // 보상을 해주던지 다른이벤트를 하던지 하여간 여기서 끝냄

                yield return new NCondition.WaitMessage("반갑군 자네가 그친구인가? 너무늦었네... ", 5);


                yield break;
            }

     

     


 

한마디로 yield 로 표현된 코드는 우리가 일일히 스테이트관리를 해야하는작업을 코드가 알아서 만들어준다고 보면된다.

우리는 귀찮은 스테이트 관리와 데이타 관리를 컴파일러에게 넘겨주고 우리가 필요한 컨텐츠 코드작성만 하면되는것이다.

 [소스2]

  1.  
            public void Update()
            {
  2.             // 등록된 enumerable 오브젝트를 가지고 있다.
                // for 문중 ProcessList 에 있는 아이템을 지울수있는 구조를 위에 뒤에서 앞으로 for 문을 돈다.(성능은 좋지않다)
               
                for (int index = ProcessList.Count - 1; index >= 0; index--)
                {
                    JobInfo pProcess = ProcessList[index];
  3.                 // 현재 스크립트용 함수에서 yield return new icondition 류가 있는지 본다.
                    if (pProcess.m_Condition != null)
                    {
                        // yield return new icondition 이 있으면 완료가 될때까지 스킵한다.
                        if (pProcess.m_Condition.IsComplete() == false)
                        {// 선행작업이 완료되지 않았다.
                            continue;
                        }
                    }
  4.                 // yield 나 yield return 이 올때까지 프로세스가 진행된다.
                    if (pProcess.m_ProcessEnum.MoveNext() == true)
                    {
                        // 유저가 요정한 yield return new icondition 을 저장한다.
  5.                     pProcess.m_Condition = (ICondition)pProcess.m_ProcessEnum.Current;
                        continue;
                    }
                    else
                    {
                        // enumerable 문을 다 완료하였다면 지운다.
                        ProcessList.Remove(pProcess);
                    }
                }
  6.         }

위[소스2] 코드는 [소스1] 의 코드를 어떻게 제어할수있는지 보여주는 코드이다.

이샘풀소스에 위코드 두가지를 이해한다면 핵심적인 내용은  다이해한거라 볼수있다.


다음에는 이 yield 프로그래밍을 가지고 분산프로그램을 쉡게 구현할수있는 방법을 소개해 보겠다.

이 글은 스프링노트에서 작성되었습니다.