스토리지

머드게임 개발 1. 창 띄우기 본문

개발일지

머드게임 개발 1. 창 띄우기

ljw4104 2021. 3. 27. 18:22

Console로 만들면 분위기는 있을꺼같지만 제약이 많기 때문에 WPF를 사용하였다.

Winform 에서 고민하긴했지만 winform은 지원안하는게 너무많고 지원 또한 끊겼기에 사용하지 않았다.

  • Tick Count는 10초에 한 번 울린다.
  • 아직까지 기능은 없고 텍스트박스에 텍스트를 치면 그냥 위에 출력된다.

콘솔창 분위기나게 바뀌었다.

  • XAML 코드
XAML은 선언적 태그 언어입니다.
 
XAML은 .NET Core 프로그래밍 모델에 적용되어 .NET Core 앱의 UI를 쉽게 만들 수 있게 해줍니다.
 
선언적 XAML 태그에 시각적 UI 요소를 만든 다음, 코드 숨김 파일을 사용하여 UI 정의를 런타임 논리와 분리할 수 있습니다. 이 정의는 partial 클래스 정의를 통해 태그에 연결됩니다.
 
XAML은 어셈블리에 정의된 특정 지원 형식 집합으로 개체의 인스턴스화를 직접 나타냅니다.
 
이는 지원 형식 시스템에 직접 연결되지 않고 해석되는 언어인 대부분의 다른 태그 언어와의 차이점입니다.
 
XAML은 개별 대상이 잠재적으로 서로 다른 도구를 사용하여 앱의 UI와 논리를 작업할 수 있는 워크플로를 가능하게 합니다.
https://docs.microsoft.com/ko-kr/dotnet/desktop/wpf/fundamentals/xaml?view=netdesktop-5.0
<Window x:Class="MUDGame.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MUDGame"
        mc:Ignorable="d"
        Title="머드게임 샘플" Height="600" Width="800"
        x:Name="mainWindow" >

    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="10*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="9*"/>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Border Grid.ColumnSpan="2" BorderThickness="1" Background="Black" BorderBrush="Black">
            <ScrollViewer VerticalScrollBarVisibility="Visible" CanContentScroll="True">
                <TextBlock x:Name="dialogBox" Margin="10" Width="Auto" TextWrapping="Wrap" Background="Black" Foreground="White" />
            </ScrollViewer>
        </Border>
        <TextBox Margin="0 15 0 0" Grid.Row="1" Grid.Column="0" x:Name="orderBox" FontSize="14" 
                 GotFocus="FocusTextBox" Foreground="Gray" KeyDown="KeydownOrderBox" VerticalContentAlignment="Center">
            여기에 행동을 입력하고 엔터를 치세요.
        </TextBox>
        <Button Margin="10 15 0 0" Grid.Row="1" Grid.Column="1" x:Name="enterBtn" Click="ClickEnterButton" FontSize="14">
            Enter
        </Button>
    </Grid>
</Window>

 

  • C# 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Windows.Threading;

namespace MUDGame
{
    /// <summary>
    /// 메인 UI를 관리하는 클래스
    /// Dialog는 매개변수로 받아서 출력만 함.
    /// </summary>
    public partial class MainWindow : Window
    {
        public Thread tickThread;
        public MainWindow()
        {
            InitializeComponent();
            InitializeWindow();

            this.Closed += (s, e) => System.Diagnostics.Process.GetCurrentProcess().Kill();
        }

        private void InitializeWindow()
        {
            tickThread = new Thread(new ThreadStart(Tick));
            tickThread.Start();
        }

        public void FocusTextBox(object sender, RoutedEventArgs e)
        {
            orderBox.Text = "";
            orderBox.Foreground = Brushes.Black;
        }

        //버튼을 눌렀을 때
        private void ClickEnterButton(object sender, RoutedEventArgs e)
        {
            UpdateDialog();
        }

        //엔터를 눌렀을 때를 감지
        private void KeydownOrderBox(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Return)
            {
                UpdateDialog();
            }
        }

        private void UpdateDialog()
        {
            if(orderBox.Text != string.Empty)
            {
                dialogBox.Text += string.Format("{0}\n", orderBox.Text);
                orderBox.Text = "";
            }
        }

        private void Tick()
        {
            string tick = "[SYSTEM] < ================================ TICK CNTP ================================ >\n";
            while (true)
            {
                Thread.Sleep(10000);
                //이 스레드가 먼저 자원에 접근함
                Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
                {
                    dialogBox.Text += tick;
                }));
            }
        }
    }
}

다음에 해야할 것

  • 게임 기획 (무슨 게임인지? 진행방식이나 그런것).
  • GameManager 클래스 생성 후 맵 만들기.
Comments