티스토리 뷰

======================================================

안녕하세요 Doridori 입니다. 


이번강의는 방치형 게임에서 숫자 표현 하는 것을 구현 해 보도록 하겠습니다.


사실 이건 처음에 강의를 만들 생각으로 시작 한 것은 아니고 WPF로 방치형 게임을 한번 만들어 볼까 하고 시작한 것인데 구현을 하다 보니 이것저것 들어가는것이 많아서 (Daty Type Double에 관한 내용이라던지 Enum에 대한 내용이라던지 Thread Timer라던지 String.Format 라던지 등등) 재미삼아 구현 해 보시면 많은 도움이 될것 같아서 강의를 만들게 되었습니다. 


UI 그리는것이 WPF가 편해서 (요즘 주 업무를 WPF로 진행 하다보니 . . . (Winform 강의는 WPF가 보급화 되지는 않아서 Winform으로 진행 하고 있습니다만 언어는 C#이고 다른점이 몇게 없다 보니 로직 부분을 참고 하셔서 사용하시면 될것 같습니다.)

======================================================


Soruce 전체) DisplayNumber.zip


소스는 전체 올립니다. 


중간에 enum 정의 해 놓은 부분은 소스를 받아서 쓰시는 것이 편할것이라고 생각 합니다. 



구현)



프로그램 진행 중인 화면이고 상단 부분이 실제 double Data 값을 표현 한부분이고 하단 부분이 앞에 4자리 까지만 표현을 하고 이후 단위부터는 알파벳으로 구현 해 놓았습니다. 


이런 변태적인(?) 단위를 사용하게 된 이유가 숫자 표현 자체가 어이 없을 정도로 커지기 때문에 화면에 표시하려면 너무 커져서 생긴 이유가 아닐까 합니다. 

(저만큼을 찍었지만 반도 안찍은겁니다. double DataType 자체가 표현 할 수 있는 승수가 308자리 까지 가능 합니다.


※ Doridori의 Winform 강의 2강 Data Type를 참고 해주시면 어마어마하게 감사 드리겠습니다. ㅜㅠ 

 (http://cwkcw.tistory.com/64?category=1001431)


프로그램은 시작 하게 될 경우 타이머를 동작 시켜서 10m/s 간격으로 숫자를 1.2배 씩 증가 시키도록 만들었습니다. 


소스 Code 및 내용)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
        bool _bStart = false;
        DispatcherTimer _Timer = null;
        double _dNumber = 1;
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// 시작 Button 을 Click 했을 때 숫자를 증가 시키는 Timer를 작동/정지 시킴
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            if (!_bStart)
            {
                _Timer = new DispatcherTimer();
 
                TimeSpan tsTime = new TimeSpan();
                tsTime = new TimeSpan(000010);
 
                _Timer.Interval = tsTime;
                _Timer.Tick += _Timer_Tick;
                _Timer.Start();
 
                btnStart.Content = "Running";
                _bStart = true;
            }
            else
            {
                _Timer.Stop();
                _Timer = null;
 
                btnStart.Content = "Start";
                _bStart = false;
            }
        }
 
        /// <summary>
        /// Timer 동작 Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _Timer_Tick(object sender, EventArgs e)
        {
            _dNumber = _dNumber * 1.2;
 
            if (double.IsInfinity(_dNumber))
            {
                return;
            }
 
            lblNumber.Content = string.Format("{0:n0}", _dNumber);
            lblNumberString.Content = fDoubleToStringNumber(_dNumber);
        }
 
        /// <summary>
        /// double 형태로 되어 있는 숫자를 방치형 게임 용 숫자로 변경(숫자 4자리 + 알파벳의 조합으로 표현)
        /// </summary>
        /// <param name="dNumber"></param>
        /// <returns></returns>
        private string fDoubleToStringNumber(double dNumber)
        {
            string sResult = string.Empty;
            string sNumber = string.Empty;
            string sDigit = string.Empty;
 
            string[] sNumberList = (dNumber.ToString()).Split('+');
 
            double dKeepNumber = 0;
 
            if (sNumberList.Length < 2)
            {
                double dRMV_Decimal = Math.Truncate(dNumber);
 
                if (dRMV_Decimal.ToString().Length <4)
                {
                    dKeepNumber = dRMV_Decimal;
                }
                else
                {
                    dKeepNumber = double.Parse(dRMV_Decimal.ToString().Substring(04));
                }
                sNumber = string.Format("{0:n0}", dKeepNumber);
 
                if (Enum.IsDefined(typeof(enumNumber), dRMV_Decimal.ToString().Length))
                {
                    sDigit = ((enumNumber)dRMV_Decimal.ToString().Length).ToString().Replace("num_""");
                }
            }
            else
            {
                dKeepNumber = double.Parse(sNumberList[0].ToString().Replace("E""")) * 1000;
                sNumber = string.Format("{0:n0}", dKeepNumber);
                sDigit = ((enumNumber)int.Parse(sNumberList[1]) + 1).ToString().Replace("num_""");
            }
 
            sResult = String.Format("{0}{1}", sNumber, sDigit);
 
            return sResult;
 
        }
cs



의)

강의는 1강, 2강 나눠서 진행 했습니다.


기존에 저장 안하고 진행 했다가 날려먹은 경험도 있고 중간에 enum만든다고 시간이 많이 걸려서 나누었습니다. 전체 강의는 30분 정도 됩니다.


(두번째 강의를 만들 때 마가 꼈는지 동영상 캡쳐 프로그램이 꺼지고 PC가 꺼지고... 매우 험난하게 만들었습니다만 재미있게 봐주셨으면 좋겠습니다.  *^^*)


1강)




2강)




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함