티스토리 뷰

C#/C# 강좌 Winform

Doridori C# 강의) 18.Timer (Clicker Game 1)

꼬꼬마도리도리 2018. 9. 22. 14:52

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

안녕하세요 Doridori 입니다. 


이번강의는 원래는 지난 강의했던 자료를 기준으로 암호화, 복호화에 대한 이야기를 해보려고 했는데 


자료 내용도 맞지 않고 만들었던걸 계속 우려 내는것도 아닌것 같아서 뭘 할까 고민하다가 Clicker Game을 한번 준비해 보았습니다.


게임류의 경우 기본적으로 Loop가 돌아서 상태를 확인 해야 하기 때문에 Timer나 Thread가 필수로 발생 하게 됩니다. 


그래서 Clicker Game을 2강에 걸쳐서 만들어볼 예정이고 Timer를 먼저 진행 하고 다음 시간에 암호화, 복호화에 대해 진행 하도록 하겠습니다. 

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


Timer


Source UI) Study_18_Timer (Clicker Game 1)(UI).zip

Soruce 전체) Study_18_Timer (Clicker Game 1).zip

교재) 18강 Timer (Clicker Game 1).pdf



지난 강의에서 XML에 대해서 진행 하였고 지난 강의에서는 XML을 Config File을 저장 했다가 불러오는데 사용 하였는데 이번에는 Clicker Game를 만들고 진행 상황 및 정보들을 저장 했다가 불러오는 부분에 사용해 보도록 하려고 합니다. 


기본적으로 게임 Data의 경우 수정 할 경우 게임의 Level Modeling에 이상을 주게되어 있어서 각종 치트를 방지하는 기능을 사용하게 됩니다. 


이런 거창한 보안기능을 넣을 것은 아니지만 기본적으로 메모장정도에서 외부 정보를 읽지 못하도록 암호화 시키고 복호화 시키는 기능을 다!음!강!의!에서 구현 하도록 할텐데 그 이전에 구현할 바탕이 있어야 하기에 Clicker 게임을 만들어 보도록 하겠습니다. ^^;;


Clicker류 게임의 경우 요즘은 방치형 게임이라고 많이 나오는데 클릭하고 구경하고 있으면 시간이 지남에 따라 자동으로 돈이 쌓이고 그 돈으로 레벨업을 하고를 반복하는 방식의 게임 입니다. 


결국 시간에 따라 내가 정해놓은 수치가 지속적으로 증가해야 합니다. 

이 애기는 시간에 맞춰서 Event가 주기적으로 발생 한다는 점입니다. 


이 Event를 주기적으로 발생 시키는 Timer에 대해서 이야기해 보도록 하겠습니다. 


※ 비슷한 목적의 Button의 경우 묶어서 사용하면 프로그램 소스도 줄일 수 있고 프로그램 수정 시에도 기존 Button들과 같은 구조로 만들기 편하기 때문에 Event를 묶어서 보내는 경우가 많아서 Button을 묶어서 Event를 발생 시켰는데 강의에서 확인 해 보시면 되움이 될것 같습니다.

Timer의 경우 검색을 하면 많이 나오는데 대부분 위의 4가지 Timer에 대해 나오게 됩니다. 

지금은 Winform에 대한 강의를 진행 중이므로 4번째 Timer는 신경쓰지 않으셔도 됩니다. (WPF에서 사용)

가장 기본인 System.Windows.Forms.Timer에 대해서 진행 할 예정입니다. 

(다른 Timer의 경우 밑에 적어 놓았는데 invoke 대리자를 사용해야 함으로 추후에 진행 하도록 하겠습니다.)

가장 큰 차이점은 중간에 두개의 경우 Multi Thread를 사용 하고 가장 위에 있는 System.Windows.Forms.Timer의 경우 Form Thread를 사용하기 때문에 Single Thread를 사용 합니다. 

그렇기 때문에 Timer 내부에서 프로그램 Logic이 진행 중일  경우 프로그램이 멈춰있는 현상이 발생 합니다. 


UI)



이미지도 없고 간단한 숫자만 있지만 클리커류의 기본이 되는 숫자 증가 및 레벨업의 기능을 구현 하였습니다. 


강의)

중간에 Timer Tick 관련 잘못된 내용이 있어서 뒷쪽에 정정 하였습니다.  m(_._)m


Source)

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
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
 
 
namespace _18_Simple_Clicker
{
    public partial class Form1 : Form
    {
        private double iTick = 0;  // 한 Tick 당 더할 값
        private double iTotal = 0;  // 전체 값
 
        private int i1Add = 1;  // 1 * LEVEL 값
        private int i1Level = 1;
 
        private int i3Add = 3;  // 3 * LEVEL 값
        private int i3Level = 1;
 
        private int i50Add = 0;   // 50 * LEVEL 값
        private int i50Level = 0;
 
 
        /// <summary>
        /// 진입점
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// Form이 Loading 될때 발생 하는 Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            System.Windows.Forms.Timer oTimer = new System.Windows.Forms.Timer();
            oTimer.Enabled = true;
            oTimer.Interval = 100;
            oTimer.Tick += OTimer_Tick;
            oTimer.Start();
        }
 
 
        // 타이머에서 호출 할 Event (Interval 간격 기준)
        private void OTimer_Tick(object sender, EventArgs e)
        {
            iTick = i1Add + i3Add + i50Add;
            iTotal = iTotal + iTick;
 
            lblTickPoint.Text = string.Format("{0} (1:{1}), (3:{2}), (50:{3})", iTick.ToString(), i1Level.ToString(), i3Level.ToString(), i50Level.ToString());
            lblTotal.Text = iTotal.ToString();
        }
 
 
        /// <summary>
        /// Button을 Click 했을 경우 발생 하는 Event (Form Designer에서 Button 종류를 묶어서 하나의 Event로 받음)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {
            Button obtn = sender as Button;  // 받아온 Sender를 Button 형으로 변환 시킴
 
            // UI 작성 시 지정한 Name을 기준으로 Event가 발생 한 Button을 찾아서 프로그램 동작 수행
            switch (obtn.Name)
            {
                case "btn1Add":
                    if (iTotal > 100)
                    {
                        iTotal = iTotal - 100;
 
                        i1Level++;
                        i1Add = 1 * i1Level;
                    }
                    break;
                case "btn3Add":
                    if (iTotal > 300)
                    {
                        iTotal = iTotal - 300;
 
                        i3Level++;
                        i3Add = 3 * i3Level;
                    }
                    break;
                case "btn50Add":
                    if (iTotal > 5000)
                    {
                        iTotal = iTotal - 5000;
 
                        i50Level++;
                        i50Add = 50 * i50Level;
                    }
                    break;
                default:
                    break;
            }
        }
        
    }
}
 
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함