Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2007 / 46 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Самостоятельная работа 1:

Компьютерная 2D-графика в Microsoft XNA Game Studio 3.0

Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >

Формирование установочного диска

Хорошим тоном установки программы являются следующие критерии:

  • Запуск программы установки происходит один раз
  • Программа установки имеет имя Setup.exe или Install.exe, и ее легко найти среди файлов установки
  • Если программа распространяется на CD, то вставка диска в привод приводит к автоматическому запуску установки
  • Весь процесс установки можно пройти, нажимая Enter. Это означает, что каждый шаг должен предполагать вариант по умолчанию.
  • Информация, показанная при установке, необходима и достаточна. Не полагайтесь на то, что пользователь будет читать README -файл. Сначала он запустит Setup.exe и обратится к документации лишь в случае, когда столкнется с серьезными проблемами при установке.
  • Одна программа установки работает на всех поддерживаемых приложением версиях операционной системы
  • Все вспомогательные пакеты установки устанавливать либо в полностью скрытом от пользователя режиме, либо только с окном хода выполнения

Библиотеки .NET Framework 3.0 и XNA Framework 3.0, которые мы использовали при разработке нашего приложения, являются новым продуктом и не у всех потенциальных пользователей они развернуты на компьютере. Поэтому их нужно поставлять на установочном диске вместе с нашей распространяемой программой. Нашей программе понадобятся библиотеки, упакованные в пакеты, которые можно найти по адресу http://www.microsoft.com/downloads/en/A2ZPage.aspx. Для облегчения выполнения работы они прилагаются и находятся в каталоге Setup.

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

  • dotnetfx30.exe - библиотека .NET Framework 3.0 среды исполнения
  • xnafx30_redist.msi - библиотека XNA Framework 3.0 для игровых компонентов, включая DirectX 9.0c runtime
  • Lab58_Install.exe - пользовательска программа, подлежащая распространению

Чтобы не заморачивать голову неквалифицированному пользователю, библиотечные пакеты будем запускать на его компьютере со следующими опциями:

  • dotnetfx30.exe /norestart - показывать ход выполнения и не перезапускать компьютер
  • xnafx30_redist.msi /passive /norestart - показывать только ход выполнения и не перезапускать компьютер

При успешной установке этих пакетов в реестр добавляются определенные разделы. Чтобы проверить, установлены ли они на компьютере пользователя, нужно проверить в системном реестре

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup значение ключа InstallSuccess==1 (или в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5 значение ключа Install==1 )
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XNA\Framework\v3.0 значение ключа Installed==1

Программу, установщик пакетов, будем запускать из файла сценариев WSH (Windows Scripting Host) с расширением .wsf (Windows Scripting File), написанного на JScript. В этом файле мы будем проверять в системном реестре метки установки вспомогательных системных библиотек .NET Framework 3.0 и XNA Framework 3.0 и принимать решение об отказе от их установки. Если библиотеки не обнаружены, то их нужно будет установить, ну и в любом случае - не забыть установить нашу прикладную программу.

  • Командой меню Project/Add New Item создайте новый файл сценариев Windows Script Host с именем Install.wsf

Операционная система Windows распознает это зарегистрированное расширение и автоматически запускает сервер WScript.exe (или CScript.exe для запуска из командной строки), размещенный в каталоге %WINDIR%\System32.

  • Заполните пакетный файл Install.wsf следующим кодом JScript
<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://schemas.microsoft.com/WindowsScriptHost">
<job>
    <script language="JScript">        
        // Возвращает true, если ключ существует в системном реестре
        function KeyExists(obj, key)
        {
            // Проверяет наличие раздела
            try
            {
                var key2 = obj.RegRead(key);
            }
            catch(e)
            {
                if(e != 0) // Нет раздела
                    return false;
            }
            return true;
        }
    </script>
       
    <!-- Переменные сценария -->
    <script language="JScript">
        var strSubDir = "Setup\\";                  
        var strCommand = "";
        var bWaitOnReturn = true;// Ждать завершения процесса
        var intWindowStyle = 10; // То же состояние, что и у запустившей программы
        var key;
        var title = "Установка системных библиотек";
        var message;
        var vbYesNo = 4;
        var vbInformation = 64;
        var vbYes = 6;
        var WshShell=WScript.CreateObject("WScript.Shell");
   </script>
    
    <!-- Устанавливаем DotNet -->
    <script language="JScript">
        var keyDotNet35 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft" +
                          "\\NET Framework Setup\\NDP\\v3.5\\Install";
        var keyDotNet30 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft" +
                          "\\NET Framework Setup\\NDP\\v3.0\\Setup\\InstallSuccess";
        
        // Читаем ключи версий сверху вниз
        key = 0;
        if(KeyExists(WshShell, keyDotNet35))    
        {
            key = WshShell.RegRead(keyDotNet35);
        }
        else if(KeyExists(WshShell, keyDotNet30))
        {
            key = WshShell.RegRead(keyDotNet30);
        }
        // Запускаем инсталлятор DotNet из подкаталога Installs
        if(key != 1)
        {
            message = "            Требуется установка\n" + 
                      "    библиотеки .NET Framework 3.0\n" + 
                      "Без нее программа работать не будет!\n" + 
                      "                    Установить?";
            var result = WshShell.Popup(message, 0, title, vbYesNo + vbInformation);
            strCommand = strSubDir + "dotnetfx30.exe /norestart";
            if(result == vbYes)
            {
                WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); 
                WScript.Echo("Библиотека .NET Framework 3.0 устанавлена!");
            }
        }
    </script>
    
    <!-- Устанавливаем XNA -->
    <script language="JScript">
        var keyXNA30 = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\XNA\\Framework\\v3.0\\Installed";
        
        // Читаем ключ 
        key = 0;
        if(KeyExists(WshShell, keyXNA30))    
        {
            key = WshShell.RegRead(keyXNA30);
        }
    
        // Запускаем инсталлятор XNA в скрытом режиме с показом хода выполнения
        if(key != 1)
        {
            message = "            Требуется установка\n" + 
                      "    библиотеки XNA Framework 3.0\n" + 
                      "Без нее программа работать не будет!\n" + 
                      "                    Установить?";
            var result = WshShell.Popup(message, 0, title, vbYesNo + vbInformation);
            strCommand = strSubDir + "xnafx30_redist.msi /passive /norestart";
            intWindowStyle = 1; // Показывает окно
            if(result == vbYes)
            {
                WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); 
                WScript.Echo("Библиотека XNA Framework 3.0 устанавлена!");
            }
        }
    </script>
    
    <!-- Устанавливаем наше приложение -->
    <script language="JScript">
        // Запускаем инсталлятор приложения
        strCommand = strSubDir + "Lab58_Install.exe";
        intWindowStyle = 1; // Показывает окно
        bWaitOnReturn = false; // Не ждать, а закончить сценарий
        WshShell.Run(strCommand, intWindowStyle, bWaitOnReturn); 
    </script>
    
    <!-- Этот код должен стоять последним -->
    <script language="JScript">
        // Освобождаем объект
        WScript.DisconnectObject(WshShell);
    </script>
</job>
</package>
  • В Проводнике решений вызовите контекстное меню для файла Install.wsf и командой Exclude From Project отсоедините его от основного проекта игры

Теперь осталось включить вызов этого файла в autorun.inf, который нужно разместить в корневом каталоге установочного диска вместе с файлом Install.wsf.

[autorun]
OPEN="WScript.exe Install.wsf"
  • Сформируйте установочный диск, в корневом каталоге которого должны находиться файлы autorun.inf, Install.wsf и каталог Setup со следующим содержимым:
    • dotnetfx30.exe
    • xnafx30_redist.msi
    • Lab58_Install.exe
  • Работу преподавателю сдайте на установочном диске

Контрольные вопросы и задания

Этот раздел написан под давлением классиков очень неохотно...

2.Контрольные вопросы

  1. Что такое pixel и texel, назовите их отличия
  2. Назовите предназначение методов LoadContent() и UnloadContent()
  3. В какой последовательности срабатывают типовые методы в заготовке игрового класса
  4. В какой формат преобразуются при компиляции файлы контента
  5. Что такое sprite в игровой терминологии
  6. Назовите предназначение библиотеки Microsoft XNA Game Studio 3.0
  7. Как осуществляется формирование установочного диска
  8. Для чего предназначена структура BoundingBox

2.Варианты для самостоятельной работы

  1. Добавьте возможность управлять движением подушки при помощи мыши
  2. Добавьте механизм увеличения скорости падения объектов при наборе определенного количества очков
  3. Разделите объекты на типы и добавьте возможность отнимать очки в случае пропущенного объекта определенного типа
  4. Добавьте возможность начислять бонусные очки в случае поимки наибольшего количества объектов за минимальное время. Алгоритм начисления бонуса придумайте сами
  5. Добавьте в табло игры счетчики пойманных и пропущенных объектов. Для этого подберите подходящий шрифт и его параметры
  6. Добавьте механизм переназначения клавиш управления игрой, например, приостановки игры по нажатию клавиши "Pause" вместо "Space"
  7. Добавьте возможность отключения/включения звуковых эффектов игры
  8. В режиме меню включите стандартный курсор Windows вместо рисованного курсора с изображением стрелы
  9. Устраните логическую некорректность, при которой автоматически не сбрасывается режим "Пауза в игре!" предыдущего сеанса с началом новой игры


Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >
Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?