понедельник, 23 января 2017 г.

C# + SDL.NET. Шаблон приложения

Думаю, каждый из нас хотел когда-то или даже хочет сейчас написать интересную игру. Благо, эпоха многомиллионных игровых суперблокбастеров и огромных творческих команд постепенно проходит, уступая место разработчикам-индивидуалам и небольшим студиям на три-четыре сотрудника. Да и от фотореалистичного 3D многие уже устали. Теперь у многих в почете теплые ламповые игры со Смыслом, а не с Картинкой.
Предлагаю стать на один шаг ближе к мечте: создать первое шаблонное приложение с помощью библиотеки SDL.NET, враппера известной библиотеки sdl.
В первую очередь, нам необходимо скачать саму библиотеку. Сделать это можно со страницы проекта на SourceForge: https://sourceforge.net/projects/cs-sdl/files/SDL.NET/6.1.0/sdldotnet-6.1.0.zip/download. Как несложно понять, я использую версию 6.1.0.
Далее, мы создаем пустой проект:





Создадим в проекте статический класс Game, являющийся каркасом для функционала игры. На данном этапе нам необходимы два свойства, описывающие горизонтальное и вертикальное разрешения экрана, и приватное поле, которое будет содержать экземпляр Surface - основную "поверхность", на которой мы будем впоследствии рисовать все остальные элементы.

    public static class Game
    {
        #region PRIVATE
        
        private static Int32 screenWidth = 800;
        private static Int32 screenHeight = 600;
        private static Surface screen;

        #endregion
        
        #region PUBLIC
        
        /// <summary>
        /// Горизонтальное разрешение экрана
        /// </summary>
        public static Int32 ScreenWidth {
            get {
                return screenWidth;
            }
            set {
                screenWidth = value;
            }
        }
        
        /// <summary>
        /// Вертикальное разрешение экрана
        /// </summary>
        public static Int32 ScreenHeight {
            get {
                return screenHeight;
            }
            set {
                screenHeight = value;
            }
        }        
        
        #endregion
    }

Создадим метод Run(), запускающий игру:

        public static void Run(){
            Video.WindowIcon();
            Video.WindowCaption = "SDL.NET. Simple Application";
            screen = Video.SetVideoMode(ScreenWidth, ScreenHeight);
        }

Ну вот, теперь приложение получает заголовок, и устанавливаются его размеры. Но... оно все еще не запускается. Причиной тому - необходимость подключить обработчики к некоторым событиям:

        public static void Run(){
            Video.WindowIcon();
            Video.WindowCaption = "SDL.NET. Simple Application";
            screen = Video.SetVideoMode(ScreenWidth, ScreenHeight);
            
            Events.KeyboardDown += new EventHandler<KeyboardEventArgs>(KeyDown);
            Events.Tick+=new EventHandler<TickEventArgs>(Tick);
            Events.Quit += new EventHandler<QuitEventArgs>(Quit);
            
            Events.Run();
        }

        private static void KeyDown(object sender, KeyboardEventArgs e){
            if (e.Key == Key.Escape || e.Key == Key.Q)
            {
                Events.QuitApplication();
            }
        }
        
        private static void Tick(object sender, TickEventArgs args){
            screen.Fill(Color.AliceBlue);
            screen.Update();
        }
        
        private static void Quit(object sender, QuitEventArgs e)
        {
            Events.QuitApplication();
        }

Событие KeyboardDown срабатывает при нажатии кнопок клавиатуры, и мы используем это, организовав выход их приложения по нажатию на Escape и Q.
Событие Tick срабатывает каждый раз при смене кадра. Именно в обработчике этого события мы и будем отрисовывать все элементы игры.
Ну а событие Quit срабатывает тогда, когда пользователь любым способом пытается закрыть игру. В данном обработчике мы можем, в частности, спросить у пользователя - правда стоит выйти, или он нажал не на ту кнопку, или вставить код создания игрового сохранения.
Команда Events.Run() запускает главную петлю приложения.
Для успешного старта осталось только создать класс Program, а в нем - статический метод Main:

    public class Program
    {
        [STAThread]
        static void Main(string[] args){
            Game.Run();
        }
    }

Иии... Работает!


Комментариев нет:

Отправить комментарий