퇴근5분전


 새로 만든 서버와 클라이언트 모델이다.

스샷만 넣는다..

중요한 컨셉은. 데이타 전송은 표준데이타를 사용하고 실제 사용하는 데이타를 분리해냈다.

서버와 클라이언트간 기본 통신메세지는 표준으로 정의 하고.

실제 응용프로그램에서 사용되는 데이타 모델을 패킷에서 분리해냈다.

이는 응용프로그램에서 사용되는 데이타 모델을 필요에 의해 바꿀수 있다.

위에 사용되는 데이타는 기본데이타(CommPack) + 응용데이타(ChattMsg)를 더해서 패킷을 만들어

Tcp/Ip 통신으로 보낸다.

전에 만들어두었던 모델에 전부터 하려던걸 추가했다.



               ChattMsg msg = new ChattMsg ();
                msg.ChattMessage = this.textBox2.Text;
                CommPack pack = new CommPack ();
                pack.CommandCode = CommPack.__DATATRANS;
                pack.FromID = client.ID;
                pack.ToID = client.ID;
                pack.Set_TransData(msg);   // 데이타를 표준 패킷에 싣는다!
                client.Send(pack);
                this.textBox2.Clear();

                --> 데이타를 보내는 것임.



한글은 어려웡... 실어나른다. 싣다. 암튼... 아래 사전을 찾아보았다.
싣다? 
http://krdic.daum.net/dickr/contents.do?offset=A024243500&query1=A024243500#A024243500











쉽다면 쉽고.. 어렵다면 어려운 패턴이었음.  아직도 가끔은 헷갈리는데...

예제로 본것들중 기억에 남는것은 기자가 각 방송국을 들락 날락 거린다는 예제였던것 같다.

콤보짓 없이 비지터를 살짝쿵.. 비스므리 해보려 했더니... 좀..골때린게 나왔다. 의미상 별거 없어보이긴 하는데..
어쨌거나 저쨌거나..


방문자(Visitor)는 자기가 방문하게될 요소(Ac)에 자기를 등록하도록 Acceptor(방문자 v); 가 요구되고 이를 인터페이스로 구현된다. 
 
이 인터페이스를 통해 방문자의 .Visit( 요소 )를 호출하면서 구조(자료리스트)를 순회 하게 된다. 

단순하게 생각하자!! 

방문자는   방문하게될 대상에 자기가 들어갈 곳을(Acceptor) 요구하고 이를 통해 자기가 들어가서

방문(Visit())을 하게 되며  대상요소에 대한 처리는 Visit() 내에서 처리한다!!..

소스를 보자.. 말로는 역시 풀어내는것은 아직 표현부족으로 한계....

추가:  방문자의 문제 처리를 바꾸고자 한다면

간단히 짝수 출력라인 주석을 하면 홀수만 보이게된다... 일이 구분된다는 것이지.


  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Ac a1 = new Ac("a1");  // <== 각 요소들...
            Ac a2 = new Ac("a2");
            Ac a3 = new Ac("a3");
            Ac a4 = new Ac("a4");
            Ac a5 = new Ac("a5");
            Ac a6 = new Ac("a6");
            Ac a7 = new Ac("a7");
            Ac a8 = new Ac("a8");
            Ac a9 = new Ac("a9");
            Ac a10 = new Ac("a10");

            a1._ac = a10; <-- 하위 요소들 추가!!
            a10._ac = a4;
            a5._ac = a7;

            List<Ac> ls = new List<Ac>();  // <-- 비지터가 방문하게될 리스트...
            ls.Add(a1);
            ls.Add(a2);
            ls.Add(a3);
            ls.Add(a5);
            ls.Add(a6);
            ls.Add(a8);
            ls.Add(a9);
          
            Visitor v = new Visitor();
            foreach( Ac item in ls )
            v.Visit(item);  // <--- 각각 방문하게 된다.

            this.textBox1.Text = v.ToString();  // <-- 방문결과...


        }
    }


    public interface IVisitor
    {
        void Visit(Ac ac);
    }

    public interface IAcc
    {
        void Acceptor( IVisitor   v);
    }

 

    public class Ac : IAcc  // <-- 방문하게 될 대상 객체이다.
    {
        static int InstanceCount = 0;
        static void Count() { InstanceCount++; }

        int _i = 0;

        public Ac _ac = null; 
        // <-- 하위 요소가 존재시... 방문자가 순회 하게 될.. 요소로 판정하기 위해... ( 콤포짓 패턴... )

        public int I
        {
            get { return _i; }
        }

        string _name = "";
        public Ac(string __name)
        {
            Count();
            _i = InstanceCount;
            _name = __name;
        }

        #region IAcc 멤버
        public void Acceptor(IVisitor v)
        {
            v.Visit(this); // 비지터에 AC자신에 대한 처리를 맡긴다.
        }
        #endregion

        public override string ToString()
        {
            return _name;
        }
    }


    public class Visitor : IVisitor  //<-- 방문자...
    {
        StringBuilder sb = new StringBuilder();

        public void Clear()
        {
            sb.Remove(0, sb.Length);
        }

        #region IVisitor 멤버

        public void Visit(Ac ac)  //<-- 방문될 요소를 받는다.
        {
            if( ac.I % 2  == 0 )
            {
                 sb.AppendLine(" "+ac.ToString()+"(짝수)");
                 if (ac._ac == null) sb.AppendLine();
            }
            else
            {
                sb.AppendLine(" " + ac.ToString() + "(홀수)");
                if (ac._ac == null) sb.AppendLine();
            }
           
            if (ac._ac != null)
            {
                ac._ac.Acceptor(this); 
               //<-- 하위 요소가 존재시 방문등록을 한다.
                  이로써 방문자는 다시 하위 요소에 자기가 등록되면서 visit가 재귀형태로 호출된다.

            }
        }

        #endregion

        public override string ToString()
        {
            return sb.ToString();
        }
    }



 움... 이 패턴을 첨 접할때 Tree라는 개념을 알고 본터라.. 가장 처음 접했던 어려운 패턴이었다.

단순해보이면서도 왠지... 거북했던 패턴으로 기억나는데...

 가장 최근에 적용하고 사용한 방법중에 XmlHelper를 만들때

각 Element를 메모리에 올리기 위한 자료구조를 만들때 사용했었다.

Element를 받고 하위 Element를 동일한 타입으로 설정하고 추가 추가...

재귀를 통해 읽어들이고 각각 요구사항에 맞춰 파싱도 하고 출력도 하고... 


   단위객체 
  {
        단위객체[]  하위List;
        Print()
        {
             "<자기자신>" 
               foreach( 단위객체 obj in 하위List )
                    obj.Print()
             "</자기자신>"
        }
  }

대략...이랬다...

사용방법은 꾀 많다.
 
트리구조를 가지고 있는 자료구조에 적용하기 쉽기때문에...랄까?







 

'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글

Commad? 응용...  (0) 2012.01.19
비지터 패턴...  (0) 2010.05.06
객체를 공부하면서... 커플링? 느슨한결합도?  (0) 2010.05.04
체인 패턴...  (0) 2010.05.04
커맨드패턴  (0) 2010.05.03


 요즘 공부를 하면서 객체간에 커플링과 느슨한결합도에 대한 다시한번더 생각하게 된다.

내가 주도하는 프로젝트에서야 내가 만든 프레임웍등을 이용할때나 위... 커플링과 느슨한결합도에 신경을 쓸까..?

프리형태의 입장인 지금은 저딴건 개나 줘버렷!!

지금껏 하루 하루 시간 쪼개서 공부해온 것들은 모두.. 내가 주도하거나 내가 주축이 되면.. 가능한것들 뿐이다.

SW공학.. 자체가 비전공자인 내가 공부해봤자라는 의미가 될수 있는듯 하다.

물론 알아두면 좋고 알아야 하는것이기도 하고... 물론 몰라도 돈버는데는 영향이 없어보인다. 


 객체와 객체를 연결지으면서 서로간에 간섭이 얼마나 일어나느냐를 커플링 척도로 보는데 이는 프리로 일하면서

관심밖에 사항이 된다. 결합도 역시.. 그렇다.

느슨하게 해주는 주체가 무엇이 될까?  인터페이스? 추상화된 기반객체?

음... 그렇다면... 내가 주가 되었을때의 이 개념들을 어떻게 써먹을지도 고민해봐야 하는데...

얼마전 완성된 프레임웍은 내부적으론 유지보수에 대한 대비를 많이 했지만.. 실제 사용에 있어서의 결합도는 거의 무시한채 작업이 되었는데... 이건 어떻게 한다?

객체가 객체를 사용하는데 있어서 직접적이 호출이 아닌 중간에 하나를 거쳐서 호출하게끔하여 실제 호출되는 객체의 변화에 조금 덜 반응할수 있도록 맞춰주는것이 결합도를 낮춰주는 방법이라고 난 생각한다.

개발자와 개발자간에 직접적인 업무교류가 아닌 중간에 PL을 거쳐 협업을 하는것 처럼...  이랄까? 비유가 좀 아닌가?

아무튼.. 사용자는 실제 호출되는 객체에 대해 모르는 편이 좋다고 본다. 곧 블랙박스가 된다.
알아야 하는것은 인터페이스.. 정도? 기반클래스에서 제공되는 메서드와 프로퍼티?랄까?

현재의 프로젝트는 인터페이스 기반에 호출이 아닌 해당 객체를 직접 호출하는 형태이다.

또한 객체를 생성하는데 있어서.. 해당 객체를 직접 생성하고 있는데 이를 분리하는것이 곧 생성패턴들을 이용 하는것인데

그런것도 없어보이고... 


느슨함과 커플링에 대한 생각은 좀더 찾아보고 고려해보아야 할 것이다.



'# 5) 디자인패턴(for .NET )' 카테고리의 다른 글

비지터 패턴...  (0) 2010.05.06
콤포지트 패턴...  (0) 2010.05.06
체인 패턴...  (0) 2010.05.04
커맨드패턴  (0) 2010.05.03
디자인 패턴 설명이 정말 쉬운곳...  (0) 2010.03.16


 뭐 볼꺼 있나... 요약하자...


문제 -- 해결책 따로 따로 매칭시켜서 처리 해보자..

어떤 문제들을 해결할수 있는 방법 1,2,3,... N 개가 존재할시 이 해결법들을 하나로 묶어 관리 하며

제시되는 문제들을 받았을때 이 문제를 해결할수 있는놈이 처리하자!! 라는 취지임.

없으면 말고.. 라는? ㅋㅋ

문제1 : 문제,  문제 2 : 문제, 문제3 : 문제, 문제4 : 문제, 문제n : 문제...

해결법1 : 해결 . 해결법2 : 해결 , 해결법3 : 해결 , 해결법4 : 해결 ... 해결법n : 해결 .

해결 { 해결 Next; setNext( 해결 );  풀이( 문제 );  내꺼( 문제 );  }

이렇게 따로 따로 분리하여 각 해결법과 문제를 볼수 있게 된다.

해결법1.setNext(해결법2).setNext( 해결법3 )... <-- 체인 처럼. 각각 연결을 시켜둔다.

해결법1.풀이( 문제1 );  
해결법1.풀이( 문제2 ); ...

풀이 내부에서는 자기가 풀수 있는 문제인지 체크하고 풀거나 또는 다음으로 넘겨준다.

이런 순서라는거쥐... 문제는 이것도 지식이되고 만다는거...

어따 써머거? 음... 어따 써먹을지 찾아보자. 전에 뭔가 하다가 써먹으려다 실패했었다.


명령 자체를 객체로 만든다 라는 개념인데 잘 보면 어렵진 않고...

다만 이걸 어따 써먹느냐..가 관건인듯 하다.

늘 그렇듯이 쌓아올린 지식은 지혜로 바꾸어내야만 한다. 써먹을수 있는 지식을 많이 가지는 것이 곧 내가 지향하는 목표가 아닌가..

 프로그래밍에 대한 전반적인 지식들은 인터넷, 서적등으로 얼마든지 취할수 있으나 이것을 써먹지 못하면... 알아서 뭐하겠는가? 

  간단히 커맨드패턴을 요약하자면..
 
1. 명령{ 수행() }

2. 수행객체{  수행할일(); }

1 + 2 . 명령처리객체 : 명령
{
    수행객체 ;
   
    수행() { 수행객체.수행()}
}

3. 요청처리객체
{
   명령;
   수행(){  명령.수행() }
}
 
보통의 객체와 객체사이의 메세지 전달구조에서는 객체와 객체간에 메세지를 공통으로 사용하기 위해서 Interface를 사용하는데 단일 메서드 일때는 그냥 호출해도 되지만  한번에 호출될 메세지가 많을때 이를 캡슐화 할때 이용할수 있다.

 예제로 본 문서에는 전사, 법사, 힐러 같은경우를 예로 들고 있다
Attack() 공격시  전사가 취하는 행동, 법사가 취하는 행동, 힐러가 취하는 행동이 각각 다르지만. Attack()이란 명령으로 통합관리 할수 있고 이를 커맨드패턴을 이용하는 기법에 대해 설명하고 있다.

1.
명령 { Attack() }

2.
전사{ 준비자세(); 칼을 든다(); 후려친다(); 준비자세(); }
법사{ 준비자세(); 책을 편다(); 스킬시전한다(); 준비자세();}
...

1 + 2.
 전사명령처리 : 명령 { 
  전사;
  Attack()
{
전사.준비자세(); 
전사.칼을든다();
전사.후려친다();
전사.준비자세();
}
}

3. 캐릭터명령
{
     명령 : 
     SetCmd( 명령 );
     Attack(){ 명령.Attack();  }
}

전사 워리어 = new 전사();
명령 cmd = new 전사명령처리( 워리어 );
캐릭터명령  cCmd = new 캐릭터명령( );
cCmd.SetCmd( cmd );
cCmd.Attack();  


뭐 이런식이라는데... 

명령을 객체화 하여 실제행동에 사용되는 객체와  명령을 요청한 객체간 관계를 느슨하게 만들어주는... 역할을 한다.

느슨하게!! 라는것에 대한 생각을 해볼필요가 있어보인다.


 자가용을 몰다가 한순간 아찔했던 순간이 토요일은 두번이나 겪었다. 

 이천에 도착해서 고속도로를 빠져나오자 마자. 2차선에서 직진중인데 뜬금없이 1톤 포토가 들어오면서 깜빡이.. 썅...
내차를 못본건가?? 차가 길을 잘못들어서서 3차선에서 1차선으로 좌회전하기위해 급하게 끼어들어왔나분데... 쫌만 브레이크 늦게 밟았음 들이 받을뻔했었다...

 또한번은 어머니 모시고 올라와서 이모가 일하시는 가게로 가던중... 가끔 다니던 길이지만 다니던 학교앞이라
U턴을 하기위해 차선을 타고 가는데... 순간 U턴차선이 사라졌음을 보고.. 어랏.. 하는사이에 앞 신호도 바뀌고 나는
멍하니 교차로 안으로 진입해버린것... 혼자 벙쪄서... 정말 순간 아무 생각도 안나던 상황...
 다행히 사고없이 교차로를 통과 하였다. 정말 한순간 머리속이 하얗게 바뀌었다..

 난 정말 차 운전을 하면 안되는 그런 류의 사람인지도 모른다.  머리속에 생각이 너무 많아서 가끔.. 혼란스러울때가 있는데...   그럴때면 멍해진다. 운전하기 정말 싫다.

내가 운전하는 것에 대한 거부를 표시해도 가족들은 그저 무시한다. 어쩔수 없이 짊어질수밖에... 

 신호위반으로 찍혀서 날아와도... 뭐 그닥... 아깝지 않다. 다행히 천만 .. 다행히.. 살아 왔기 때문에... 그깟 벌금... 내주마! 

 
 온라인 게임을 하면서... 이런 글을 게시판에서 보는건 처음이었다.
늘 상대캐릭 까대기 바쁘고 적길드 욕하는 거라든가... 이러네 저러네... 하는글들만 봐왔는데..

 상당히 공감이 가는 글이다.
온라인 게임을 많이 해왔지만... 대부분의 운영회사들은 이익을 목적으로 게임을 개발하고 서비스 하겠지만
완성도에 기대를 가지는회사는 몇안될것이다. 한게임과 씨알에서 서비스하는 세븐소울즈...

 개인적으론 그저 그런겜이다. 할거없으니 잠깐씩 하는 게임인데... 나름 게임에 애착을 가진사람이 있구나...
드래곤볼 온라인도 세븐소울즈도 ... 동급수준이다.

  요새나온 겜들이 뭐 죄다 부분 유료화를 하며 캐쉬를 팔아먹기 바쁜데... 아래글처럼 좀 겜좀 안정화 하고 
뭔가 팔아묵든가 했음 좋겠다. 조만간 접을겜이지만 나름 생각이 있는 글같아서 복사해왔다.


게시한분께 양해를 못구해서 그냥 가져왔으나.. 혹 문제가 되면 지우겠다.
제  목   캐쉬템이나 아니냐를 떠나서 이글이나 읽고 애기하세요!!   작성자     아득광  
작성일   2010-04-30 09:38:24   조회수     2  

안녕하세요, 부탁드린 세븐소울즈를 살리자는 내용이 담긴 한탄서를 복사해주신 소수 몇몇 유저분들께 깊은 감사의 말씀을 드립니다.

 

아까 쓴글이라, 이것저것 너무 흥분해서 쓰느라 정신이 없었기에 다시한번 재정리해서 써볼까 합니다.

 

어떤분은 좀더 짧고 간략하게 적어달라고 하신것도 있고 해서, 세븐소울즈의 현재 상황과 미래 그리고 이 상태가 지속될경우의 세븐소울즈는 어떻게 될까..하는부분에 대해 얘기해보자 합니다.

 

현재 세븐소울즈는 오픈 베타 (정식 상용화를 앞두고, 본격적인 '현지테스트' 즉 오픈 서버에서 많은 유저들을 테스트 상대로 하여 서비스 중인 게임입니다.

 

먼저 이 부분에서 아셔야 할것이 있습니다. 보통 어지간히 거만하거나 자뻑하는 , 정말 리니지3정도의 레벨이 아닌이상, 오픈베타 시기부터 영리적인 목적이 있는 혹은 단기적인 '수익성'을 내려고 하는 패키지 / 캐시아이템 판매는 거의 없습니다. 보통 넥슨, 대한민국 초딩들을 주 대상으로 하는 회사의 경우 예외인데, 넥슨의 경우 워낙에 돈밝히는게 노골적인 회사고 대부분 초딩들이 그 술수에 넘어가기때문에, 유명합니다.

 

한게임, 저는 한게임계열의 게임은 많이 해보지 못해봐서 한게임의 실질적 '운영'이 어떻게 되는지 모릅니다

 

각 게임별 부서가 있겠고, 그 부서들의 실적을 담당하고, 매출이 낮을경우 그것을 조절하기 위한 압박이 들어오고 그런 식으로 대충 돌아가지 않겠는가싶습니다.

 

하지만, 그건 이미 게임이 '자리'를 잡았을때 적용되는 경우입니다.

 

그 어느 누구도 '테스트'중인 게임을 '테스터'들을 상대로 이익을 내려는 말도 안되는 행태는 부리지 않습니다.

 

보통 외국에 수출되는 게임의 경우 , 정확하게 예를 들어드리면 브라질의 *ASDA STORY라는 케이스를 들어보면, 그들은 남미권에 3D MMORPG가 많이 발달하지 않았다는것을 명목하에, 게임성도 낮은 저 게임을 들여오자 마자 엄청난 버그와 미완료된 번역에도 불구하고 '캐시템을 상용화'시키기 시작하는 경우가 있습니다.

 

(*Mgame계열사게임인데, 한국에서는 당연히 저급한 게임성으로 망했고, 남미에 수출되어 브라질에 이제막 들어왔습니다. 역시 OBT중이죠)

 

다시 정리해서 말씀드리면, 실질적으로 온라인 게임의 경쟁이 쌔고, 명함 내놓으라 하는 게임들이 넘쳐나는 이 한국내에서는 이런 유저를 골려먹는, 즉 80년대 사상인 "먹으려면 돈내고 먹고, 안먹을려면 먹지마. 난 손해볼거 없어"라는 식의 마인드를 가진 현재 이 시추에이션은 정말 세븐소울즈의 멋진 미래를 위해 뛰는 유저들의 뒷골을 치는 행위가 아닐수 없습니다.

 

오히려 세븐소울즈 팀은 '스킬초기화', '테스터 전용 아바타' 등을 선물로 줘야 할 판입니다. 현재 세븐소울즈를 테스트 하고 버그를 신고하고, 게임성을 맞춰나가는 사람들은 유저입니다. 개발팀은 보고가 들어오면 그걸 체크할 뿐이죠, 직접적으로 게임 자체를 키우는 것은 바로 우리 유저들이란 말입니다.

 

오히려 우리가 선물을 받아야 할 이 상황에, (수많은 정기정검, 알려지지 않았지만 너무 많은 버그, 케릭터들의 애매모모한 밸런스), 오히려 세븐소울즈 팀은 우리들을 상대로 돈을 벌려고 하고있습니다.

 

정말 어이가 없는거죠.

 

제 개인적인 추측으로는 세븐소울즈의 게임 개발팀, 즉 영리적 목적보다는 세븐소울즈 클라이언트, 게임내 밸런스등에 관여하는 사람들은 이런 마인드로 일하는게 쉽지 않습니다.

 

다시 말씀드리면, '윗상사', 대가리 큰 사람들이 적당히

 

"이번엔 어떤겜이 돈좀 긁어 주려나,,. 난 어차피 게임 안할 뿐이고, 게임이 잘나가든 말든 그건 내 알바아니고, 나에겐 오직 '실적'이 중요해. 그러니까 OBT든 CBT든 나발이든 당장 실적을 올려다오 세븐소울즈"

 

정도의 생각을 가지고 압박을 한것 같습니다.

 

도저히 기존의 공지사항/이벤트 문들을 읽어보면 세븐소울즈 운영팀이 유저들을 이렇게 농락하는 스타일은 아니거든요. 최대한 유저들을 위해서, 유저들의 편의를 위해서, 고개 숙여 사죄하고, 새벽 밤잠 설치며 최대 인력으로 작업에 몰두하고 하면서 세븐소울즈 테스터들을 위해 일하고 있는 그들입니다.

 

지금 이 순간 저에게 문뜩 드는 생각은 자본주의와 순수 게임 개발자들간의 내부 압력이라는거죠

 

.......글이 너무 길어지는것 같아 정리드리겠습니다.

 

첫째, 현재 세븐소울즈는 OBT, 테스트 기간중이고, 테스터들을 상대로 '보답'을 하기는 커녕 오히려 우리의 '불편함'을 이용해서 돈을 벌려고 하고 있습니다. 그 원인이 윗대가리든, 세븐소울즈 운영팀이든 중요하지 않습니다

 

 둘째, 잦은 정기정검으로 게임의 정상적인 플레이가 쉽지 않은 이 상황, 그리고 수많은 '주말플레이어'들이 있는 이 분위기에서 주말을 앞두고 갑작스럽게 '전체 캐릭터 하향패치' 그리고 '캐시템 업데이트'를 한것은, 꾸준히 이 게임을 즐기는 평일유저를 개 무시하는 행태며, 아무 분위기 파악 못하고 들어올 주말 플레이어들을 상대로 캐시를 팔아보겠다는 수작입니다.

 

세븐소울즈는 메이플스토리가 아닙니다. 우리는 계좌이체를 할떄, 돈지불을 할때 효율성을 생각하고, 이것이 나에게 도움이 되는가, 나는 왜 이 돈을 내야 하는가를 생각합니다

 

아무생각없이 게임에 돈 넣고 날려버리는 초딩들과는 차원이 다릅니다.

 

"성인"을 위한 게임이라고 해놓고 "초딩"을 위한 캐시템을 팔려고 하고있습니다.

 

애초에 세븐소울즈가 잭팟, 슬롯등의 한탕주의 컨셉을 이용해 유저들을 끌여들였다면

 

당신들의 캐시템들 역시 '한탕주의'가 되어야 하는건가요?

 

하지만 한가지 기억하세요

 

우리가 게임내에서 잭팟을 돌리고, 그것이 실패하더라도, 사냥을 계속해서 다시 시도하면 되지만

 

당신들이 우리에게 확률게임을 하고, 한탕의 단기이익 실현을 위한 운영을 계속해서 시도한다면

 

유저들은 떠날것입니다.

 

가만히 있지 않을것입니다. 왜냐구요, 21세기이고, 세상엔 정말 할만한 게임 많습니다.

 

전 세븐소울즈를 좋아합니다. 처음 접속했을때 발밑에서 라이트가 쭉쭉 나가는거부터 시작해서

 

우광비에서 표던까지 육성하면서 정말 오랜만에 '아 할만한 게임이다'라는 느낌을 가졌습니다.

 

단지 수 많은 오토때문에 이 게임의 매력이 감춰질 뿐이지만, 오토에 대해서 짜증을 낼뿐 세븐소울즈에 대해서 짜증낸 사람은 거의 없지 않았나 싶습니다.

 

부디 유저들의 말을 기울여 주시기 바랍니다

 

성인을 위한 게임이고, 성인을 대하는 운영진이니, 초딩스런 말투가 아닌 정중한 안건스타일로 이렇게

 

글을 적어봅니다.

 

저 하나가 게임을 바꿀순 없을것입니다.

 

모든 유저가 동참해주셨으면 좋겠습니다.

 

부디 이 글을 복사해주셔서, 진정으로 세븐소울즈를 개발시키려는 순수한 사람들이 살아나고

 

한탕 이익을 봐보려는 윗상사들은 부디 흥분을 가라앉히고 제 2의 아이온 / 제2의 리니지 혁명을 만들기 위해

 

2보 전진을 위한 1보 후퇴를 하시길 바랍니다.

 

세븐소울즈, 한게임, 네이버., 게임성과 자잘한 버그만 보장된다면, 게임홍보, PR 마케팅, 팬사이트 , 유저의 입을 타고 오르는 소문들을 통해 이 게임은 성공할것입니다.

 

유저들을 만만히 보지마세요

 

수정이 시급합니다. 유저를 우롱하는 '캐시판매'등의 공지사항은 OBT기간동안 다시는 올라오지 않았으면 좋겠습니다

 

그리고 테스트 기간에 '스킬 초기화'를 유료로 판매한다는것은.....진짜..간이 큰겁니다.

대단하네요 세븐소울즈...어디서 그런 용기가 나왔는지.. 도대체 얼마나 많은 사람들이 당신들의 캐시템에 매력을 느낄지.. 잘 회의해보세요..


Unable to copy file "D:\Daebang\WPF_Login\Wpf.TabControl.dll" to "bin\Debug\Wpf.TabControl.dll". 'bin\Debug\Wpf.TabControl.dll' 경로에 대한 액세스가 거부되었습니다.

소스를 소스세이프에 바인딩 하면서 참조 경로 설정값을 특정 디렉토리로 변경해주었다.
이유는 기존에 따로 소스관리를 해주던 소스를 소스세이프로 통합관리 한다기에 옮겨주다보니 경로를 바꿔주어야 했었다.


바인딩하면서 경로를 바꿔주고 빌드를 하던중!! 한프로젝트에서 위와 같은 에러가 발생...


왜인지도 모르고 3시간을 다시 빌드를 하며 참조 dll을 다시 연결해주고.. 미친짓을 몇번이나 했으나...

아놔... 그닥 이유도 모른채 다시 빌드가 되었다. ㅡㅡ;;

추측 :  해당 프로젝트에 관련 된 프로젝트가 2개 있는데  그 두 프로젝트의 참조경로를 바꾸면서 '새로고침'을 안해서?
참조된 dll의 로컬경로 복사가 실행중에 다른 프로젝트의 관련 dll이 복사되면서 두 파일간 쫑이 난듯 한데...

정확한 이유를 잘 모르겠는뒝??? 음... 테스트를 한번 해볼까낭.

참조경로를 기존 경로로 하나 바꾸고 빌드를 해보자!!

ㅡ.,ㅡ 에러가 안뜬다!! 뭐쥐??



썅!! 이유도 모른채.. 해결되면 어쩌라는겨~~



훈스 게시판에 힘들게 타이머를 구현하시는 분이 계셔서 퇴근하고 잠깐 머리도 식힐겸... 1시간가량 작성해보았다.



Clock개념을 이용해서  true 가 들어올때마다 계수를 하여 0, 0 , 0 이 될때까지... 카운트를 한다.

카운트 완료시 백그라운드는 색이 바뀐다.

신호 제어를 통해 전체 클럭을 주고 안주고 한다.

머 그닥 달건 없고... 소스에 주석!!을 통해 추상화 부터 구현까지 어떤 과정을 거쳤는지 간단히 써놓았다.

  /*
        타이머를 우선 추상화 합니다.
     *
     *    Reset ();
     *    Setting( 시간)
     *   Start(); -> Pause();
     *   Stop();
     *
     *  기본적인 타이머 동작을 우선 살펴보면.
     * 
     *  지정된 시간을 역카운트 해서 00: 00: 00이 되면 자동 멈추고 알람발생
     *  지정된 시간을 역카운트 중 Pause상태가 되면 Reset() Or Start() or Stop() 가능
     *
     *  조금더... 생각해서 실제로 디지탈적으로 구현하기 위해 클럭 개념을 이용합니다.
     *
     *  Tick당 계수되는걸로 구현합니다.  우선 간단히 추상화가 되었고
     * 
     * 이에 맞춰 이 타이머에 필요한 부품들을 생각해봅니다.
     *
     *  1.  기본적인 디스플레이 ( 라벨 또는 TextBox ) : 입력가능하여야 하므로 Textbox로... 선정.
     *  2 . 타이머별로 이름붙이는건 옵션으로 해서 라벨하나더.
     *  3.  클럭을 받아들일 인터페이스
     *  4.  이 인터페이스에 부탁될 이벤트... or 내부 메서드
     *  5.  타이머가 구동중인지 알아볼 상태플래그.
     * 
     *  대충 요약 완료!
     */

주석에 맞춰 코딩을 시작해서 1시간가량에 끝났다.

쩝!!