Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по окну првязанному к Direct-у, Проблемы связанные с этим 
:(
    Опции темы
EgoBrain
Дата 13.1.2009, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



 Почему после закрытия окна, привязанного к Direct3D, переменные класса этого окна не инициализируются (обнуляются)?
Окно является элементом MdiChildren-ом. В Mdi-предке у меня поле, определяющее это MdiCheldren окно:
Код

...
public static Form2 form2;
...
По кнопке в предке:
Код

...
if(form2 != null)
{
    form2.Close();
        form2.Dispose();
}

form2 = new Form2();
form2.MdiParent = this;
form2.Show();
...
Окно заного пересоздается (то есть визуально это видно), а состояние сцены не сбросилось, 
то есть это указывает на то, что переменные определяющие сцену не инициализировались (они же
являются полями класса Form2).
Функция привязки и подготовки Direct3D вызывается в обработчике события Form2.Load();

Это сообщение отредактировал(а) EgoBrain - 13.1.2009, 05:51
PM MAIL ICQ Skype   Вверх
arilou
Дата 14.1.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



EgoBrain, покажи весь код, связанный с инициализицией Form2 и D3D.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
EgoBrain
Дата 14.1.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: 1
Всего: 2



Цитата(arilou @ 14.1.2009,  10:57)
EgoBrain, покажи весь код, связанный с инициализицией Form2 и D3D.

Ну вот тут я рисую в Form2:
Код

public partial class Form2 : Form
    {
//------Переменные устройства и визуализации----------------------------------------------------------------------
        public static int DeviceNumber = 0;

        public Device device = null;
        public PresentParameters pp = null;

        public static int BufferWidth = 800;
        public static int BufferHeight = 600;
        public static Format BufferFormat = Format.R5G6B5;

        public MultiSampleType SampleType = MultiSampleType.NonMaskable;

        //--Координаты положения камеры---------------------------------------------------------------------------
        public float xCamPos = 0.0f;
        public float yCamPos = 1.0f;
        public float zCamPos = 60.0f;
        //--------------------------------------------------------------------------------------------------------

        //--Общее освещение сцены---------------------------------------------------------------------------------
        public float xLight1 = 0.0f;
        public float yLight1 = -1.0f;
        public float zLight1 = -1.0f;
        //--------------------------------------------------------------------------------------------------------

        public bool isWireFrameMode = false; //--Флаг заполнение объектов сцены--

        //--Переменные управления пространством-------------------------------------------------------------------
        public static float XWorldAround, YWorldAround = 0f; //--Углы вращения сцены--
        private bool CanTurnAround = false; //--Флаг вращения сцены--
        private float XMouseDown, YMouseDown, XMouseMove, YMouseMove;
        private bool CanUpDown = false; //--Флаг поднятия/опускания мира--
        private float YWorldUpDown = 0f; //--Смещение по оси Y--
        private float XWorldUpDown = 0f; //--Смещение по оси X--
        //--------------------------------------------------------------------------------------------------------

//------Переменные рисования--------------------------------------------------------------------------------------
        private Microsoft.DirectX.Direct3D.Font font = null;
        
        public static ArrayList Objects = new ArrayList();
        
        //--Комната-----------------------------------------------------------------------------------------------
        private Mesh room = null; //--Параллелепипед представляющий помещение--
        private Material[] roomMaterial; //--Массив материалов параллелепипеда--
        private Texture[] roomTextures; //--Массив текстур параллепипеда--

        private static float xroomScale = 1f; //--Ширина помещения--
        private static float yroomScale = 1f; //--Высота помещения--
        private static float zroomScale = 1f; //--Длина помещения--
        //--------------------------------------------------------------------------------------------------------

        //--Система координат-------------------------------------------------------------------------------------
        private Mesh Dekart = null;
        private Material[] dekartMaterial; //--Массив материалов--
        private Texture[] dekartTextures; //--Массив текстур--

        private Mesh textX = null; private Material textXMaterial;//
        private Mesh textY = null; private Material textYMaterial;//--Объеты подписей осей--
        private Mesh textZ = null; private Material textZMaterial;//

        private static float xdekartScale = 1f; //--Ширина--
        private static float ydekartScale = 1f; //--Высота--
        private static float zdekartScale = 1f; //--Длина--

        private bool Xdekart = false; //
        private bool Ydekart = false; //
        private bool Zdekart = false; //--Флаги перемещения сцены по осям--
        //--------------------------------------------------------------------------------------------------------

//------Переменные движка-----------------------------------------------------------------------------------------
        public static bool FInitializeDirectX = true;

        private string DXError = "";
    
        public Form2()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
            InitializeComponent();
        }

        public void InitializeDirectX()
        {
            try
            {
                pp = new PresentParameters();
                pp.EnableAutoDepthStencil = true;
                pp.AutoDepthStencilFormat = DepthFormat.D16;
                pp.BackBufferCount = 1;
                pp.BackBufferWidth = BufferWidth;
                pp.BackBufferHeight = BufferHeight;
                pp.SwapEffect = SwapEffect.Discard;
                pp.MultiSample = SampleType;
                pp.Windowed = true;
                pp.BackBufferFormat = BufferFormat;

                device = new Device(DeviceNumber, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing,
                    pp);

                device.DeviceReset += new EventHandler(OnDeviceReset);
                device.DeviceResizing += new CancelEventHandler(CancelResize);

                Form1.settings = new Settings.CSettings();

                System.Drawing.Font localFont = new System.Drawing.Font("Arial", 8.0f, FontStyle.Italic);
                font = new Microsoft.DirectX.Direct3D.Font(device, localFont);

                //--Секция загрузки стандартных объектов программы--------------------------------------------------
                LoadMesh(@"..\..\objects\base\room.x", ref room, null, ref roomMaterial, ref roomTextures);
                LoadMesh(@"..\..\objects\base\dekart.x", ref Dekart, null, ref dekartMaterial, ref dekartTextures);
                //--------------------------------------------------------------------------------------------------

                //--Создание подписей осей--------------------------------------------------------------------------
                textX = Mesh.TextFromFont(device, new System.Drawing.Font("Arial", 14), "X", 0.001f, 0.4f);
                textXMaterial = new Material();
                textY = Mesh.TextFromFont(device, new System.Drawing.Font("Arial", 14), "Y", 0.001f, 0.4f);
                textYMaterial = new Material();
                textZ = Mesh.TextFromFont(device, new System.Drawing.Font("Arial", 14), "Z", 0.001f, 0.4f);
                textZMaterial = new Material();
                //--------------------------------------------------------------------------------------------------

                FInitializeDirectX = true;
            }
            catch (DirectXException ex)
            {
                DXError = ex.ToString();
                FInitializeDirectX = false;
                Form1.form1.Invalidate();
            }
        }

//------Функция обработки сброса устройства-------------------------------------------------------------------------
        private void OnDeviceReset(object sender, EventArgs e)
        {
            device.RenderState.NormalizeNormals = true;
        }

//------Функция обработки отмены сброса устройства------------------------------------------------------------------
        private void CancelResize(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
        }


Добавлено через 3 минуты и 29 секунд
Вот если быть наиболее конкретным (что-то вообще странное происходит) - переменные координат положения камеры
        
Код

public float xCamPos = 0.0f;
        public float yCamPos = 1.0f;
        public float zCamPos = 60.0f;

сбрасываются (после создания окна камера встает на место), а вот
Код

public static float XWorldAround, YWorldAround = 0f; //--Углы вращения сцены--

эти нет.

Добавлено через 8 минут и 56 секунд
Запостил, перечитал и увидел возможную причину проблемы, проверил действительно оно! оказалось, что static поля не сбросились! но почему - не понял. Как же так то? Наверное я не знаю что такое метод Form.Close()  smile 
PM MAIL ICQ Skype   Вверх
arilou
Дата 15.1.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Цитата(EgoBrain @  14.1.2009,  14:02 Найти цитируемый пост)
Запостил, перечитал и увидел возможную причину проблемы, проверил действительно оно! оказалось, что static поля не сбросились! но почему - не понял. Как же так то? Наверное я не знаю что такое метод Form.Close()  


Конечно не сбросились! Это же статик. Бегом в MSDN  smile  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.