Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250

Не удаляется объект из памяти

18.10.2015, 14:55. Показов 1370. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня возникла следующая проблема: Мне нужно сделать форму, на которой бы отображались настройки программы. И каждый раз, когда мне надо сменить настройки у меня остаются те же самые настройки, которые я оставил ранее до нажатия кнопки "отмена"(т.е. был выбран CheckBox1, нажал "отмена", запускаю настройки заново, а он опять true, хотя должен был быть false).

В чём может быть дело и как "решить" данный вопрос?

Вот код самой формы:
C#
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
    public partial class SetSettingsForm : Form
    {
        private DialogResult _DialogResult;
 
        private Form1.Settings _NewSettings;
        private Form1.Settings _OldSettings;
 
        private Button _Btn_OK = new Button();
        private Button _Btn_Cancel = new Button();
 
        private CheckBox _ChkBox_ShowProgramm = new CheckBox();
        private CheckBox _ChkBox_UseDefaultWay = new CheckBox();
        private Button _Btn_SetPath = new Button();
        private Label _Lbl_Path = new Label();
        private HScrollBar _SrlBar_FormOpacity = new HScrollBar();
        private Label _Lbl_Apacity = new Label();
        private ComboBox _CmbBox_SetImageFormat = new ComboBox();
        private Label _Lbl_SetImgageFormat = new Label();
 
        public Form1.Settings Get_NewSettings
        {
            get { return this._NewSettings; }
        }
 
        public Form1.Settings Get_OldSettings
        {
            get { return this._OldSettings; }
        }
 
        public SetSettingsForm(Form1.Settings _OldSettings)
        {
            InitializeComponent();
            {
                this._OldSettings = _OldSettings;
                this._NewSettings = _OldSettings;
                this.Text = "Настройка";
                this.BackColor = Color.Black;
                this.Size = new Size(350, 250);
                this.MinimumSize = this.Size;
                this.MaximumSize = this.Size;
                this.StartPosition = FormStartPosition.CenterScreen;
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
                this.ControlBox = false;
                {
                    this._ChkBox_ShowProgramm = new CheckBox();
                    {
                        this._ChkBox_ShowProgramm.Text = "Отображать программу на скриншоте";
                        this._ChkBox_ShowProgramm.Checked = this._NewSettings.Get_ShowProgramm;
                        this._ChkBox_ShowProgramm.ForeColor = Color.White;
                        this._ChkBox_ShowProgramm.AutoSize = true;
                        this._ChkBox_ShowProgramm.Left = 5;
                        this._ChkBox_ShowProgramm.Top = 15;
                        this._ChkBox_ShowProgramm.CheckedChanged += this.OnCheckBoxChecked_ShowProgramm;
                        this._ChkBox_ShowProgramm.Checked = this._OldSettings.Get_ShowProgramm;
                    }
                    this.Controls.Add(this._ChkBox_ShowProgramm);
                    this._ChkBox_UseDefaultWay = new CheckBox();
                    {
                        this._ChkBox_UseDefaultWay.Text = "Использовать указанный путь";
                        this._ChkBox_UseDefaultWay.Checked = this._NewSettings.Get_ShowProgramm;
                        this._ChkBox_UseDefaultWay.ForeColor = Color.White;
                        this._ChkBox_UseDefaultWay.AutoSize = true;
                        this._ChkBox_UseDefaultWay.Left = 5;
                        this._ChkBox_UseDefaultWay.Top = this._ChkBox_ShowProgramm.Top + this._ChkBox_ShowProgramm.Size.Height + 5;
                        this._ChkBox_UseDefaultWay.CheckedChanged += this.OnCheckBoxChecked_UseDefaultWay;
                        this._ChkBox_UseDefaultWay.Checked = this._OldSettings.Get_UseDefaultWay;
                    }
                    this.Controls.Add(this._ChkBox_UseDefaultWay);
                    this._Btn_SetPath = new Button();
                    {
                        this._Btn_SetPath.Size = new Size(15, 15);
                        this._Btn_SetPath.BackColor = Color.White;
                        this._Btn_SetPath.Left = 5;
                        this._Btn_SetPath.Top = this._ChkBox_UseDefaultWay.Top + this._ChkBox_UseDefaultWay.Size.Height + 5;
                        this._Btn_SetPath.Click += this.OnButtonClick_SetPath;
                        if (this._ChkBox_UseDefaultWay.Checked)
                        {
                            this._Btn_SetPath.Enabled = true;
                            this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName.ToString());
                            this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay.ToString());
                        }
                        else
                        {
                            this._Btn_SetPath.Enabled = false;
                            this._NewSettings.Set_DefaultWay = "Путь не выбран";
                            this._Lbl_Path.Text = String.Empty;
                        }
                    }
                    this.Controls.Add(this._Btn_SetPath);
                    this._Lbl_Path = new Label();
                    {
                        if (String.Compare(this._NewSettings.Get_DefaultWay.ToString(), String.Empty.ToString()) != 0) this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay.ToString());
                        else this._Lbl_Path.Text = "Путь не задан";
                        this._Lbl_Path.ForeColor = Color.White;
                        this._Lbl_Path.AutoSize = true;
                        this._Lbl_Path.Left = this._Btn_SetPath.Left + this._Btn_SetPath.Size.Width + 5;
                        this._Lbl_Path.Top = this._Btn_SetPath.Top + 2;
                    }
                    this.Controls.Add(this._Lbl_Path);
                    this._Lbl_Apacity = new Label();
                    {
                        this._Lbl_Apacity.Text = String.Format("Прозрачность формы: {0,2}%", (this._NewSettings.Get_OpacityLevel * 100).ToString());
                        this._Lbl_Apacity.AutoSize = true;
                        this._Lbl_Apacity.ForeColor = Color.White;
                        this._Lbl_Apacity.Left = 5;
                        this._Lbl_Apacity.Top = this._Btn_SetPath.Top + this._Btn_SetPath.Size.Height + 5;
                    }
                    this.Controls.Add(this._Lbl_Apacity);
                    this._SrlBar_FormOpacity = new HScrollBar();
                    {
                        this._SrlBar_FormOpacity.Maximum = 109;
                        this._SrlBar_FormOpacity.Minimum = 15;
                        this._SrlBar_FormOpacity.Value = Convert.ToInt32(this._OldSettings.Get_OpacityLevel * 100);
                        this._SrlBar_FormOpacity.Size = new Size(this.ClientSize.Width - 10, 25);
                        this._SrlBar_FormOpacity.Left = 5;
                        this._SrlBar_FormOpacity.Top = this._Lbl_Apacity.Top + this._Lbl_Apacity.Size.Height + 5;
                        this._SrlBar_FormOpacity.ValueChanged += this.OnScrillingBar_SetOpacityLevel;
                    }
                    this.Controls.Add(this._SrlBar_FormOpacity);
                    this._Lbl_SetImgageFormat = new Label();
                    {
                        this._Lbl_SetImgageFormat.Text = "Сохранять скриншоты в формате:";
                        this._Lbl_SetImgageFormat.AutoSize = true;
                        this._Lbl_SetImgageFormat.ForeColor = Color.White;
                        this._Lbl_SetImgageFormat.Left = 5;
                        this._Lbl_SetImgageFormat.Top = this._SrlBar_FormOpacity.Top + this._SrlBar_FormOpacity.Size.Height + 5;
                    }
                    this.Controls.Add(this._Lbl_SetImgageFormat);
 
                    this._CmbBox_SetImageFormat = new ComboBox();
                    {
                        this._CmbBox_SetImageFormat.Size = new Size(this.ClientSize.Width - 10, 25);
                        this._CmbBox_SetImageFormat.Left = 5;
                        this._CmbBox_SetImageFormat.Top = this._Lbl_SetImgageFormat.Top + this._Lbl_SetImgageFormat.Size.Height + 5;
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.jpeg");
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.bmp");
                        this._CmbBox_SetImageFormat.Items.Add("Изображения в формате *.png");
                        this._CmbBox_SetImageFormat.Items.Add("Анимация в формате *.gif");
                        this._CmbBox_SetImageFormat.Items.Add("Иконки в формате *.ico");
                        this._CmbBox_SetImageFormat.SelectedIndex = this._OldSettings.Get_ID_ImageFormat;
                        this._CmbBox_SetImageFormat.Text = this._CmbBox_SetImageFormat.Items[this._OldSettings.Get_ID_ImageFormat - 1].ToString();
                        this._CmbBox_SetImageFormat.SelectedIndexChanged += this.OnComboBoxSelectedItemChange_ImageFormat;
                    }
                    this.Controls.Add(this._CmbBox_SetImageFormat);
 
                    this._Btn_OK = new Button();
                    {
                        this._Btn_OK.BackColor = Color.White;
                        this._Btn_OK.Text = "ОК";
                        this._Btn_OK.Size = new Size(50, 25);
                        this._Btn_OK.Left = this.ClientSize.Width - 75 - 5 - this._Btn_OK.Size.Width - 5;
                        this._Btn_OK.Top = this.ClientSize.Height - this._Btn_OK.Size.Height - 5;
                        this._Btn_OK.Click += this.OnButtonClick_OK;
                    }
                    this.Controls.Add(this._Btn_OK);
                    this._Btn_Cancel = new Button();
                    {
                        this._Btn_Cancel.BackColor = Color.White;
                        this._Btn_Cancel.Text = "Отмена";
                        this._Btn_Cancel.Size = new Size(75, 25);
                        this._Btn_Cancel.Left = this.ClientSize.Width - this._Btn_Cancel.Size.Width - 5;
                        this._Btn_Cancel.Top = this.ClientSize.Height - this._Btn_Cancel.Size.Height - 5;
                        this._Btn_Cancel.Click += this.OnButtonClick_Cancel;
                    }
                    this.Controls.Add(this._Btn_Cancel);
                }
            }
            System.GC.Collect();
        }
 
        private void OnCheckBoxChecked_ShowProgramm(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_ShowProgramm = this._ChkBox_ShowProgramm.Checked;
        }
 
        private void OnCheckBoxChecked_UseDefaultWay(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_UseDefaultWay = this._ChkBox_UseDefaultWay.Checked;
            if (this._ChkBox_UseDefaultWay.Checked)
            {                
                this._Btn_SetPath.Enabled = true;
                this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
                this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay);
            }
            else
            {
                this._Btn_SetPath.Enabled = false;
                this._NewSettings.Set_DefaultWay = String.Empty;
            }
        }
 
        private void OnButtonClick_SetPath(Object Sender, EventArgs E)
        {
            FolderBrowserDialog _FolderDialog = new FolderBrowserDialog();
            {
                _FolderDialog.SelectedPath = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
                _FolderDialog.ShowNewFolderButton = true;
            }
            if (_FolderDialog.ShowDialog() != DialogResult.Cancel)
            {
                this._NewSettings.Set_DefaultWay = _FolderDialog.SelectedPath;
                this._Lbl_Path.Text = String.Format("Выбран путь: {0}", this._NewSettings.Get_DefaultWay);
            }
        }
 
        private void OnScrillingBar_SetOpacityLevel(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_OpacityLevel = Convert.ToDouble(this._SrlBar_FormOpacity.Value) / 100;
            this._Lbl_Apacity.Text = String.Format("Прозрачность формы: {0,2}%", (this._NewSettings.Get_OpacityLevel * 100));
        }
 
        private void OnComboBoxSelectedItemChange_ImageFormat(Object Sender, EventArgs E)
        {
            this._NewSettings.Set_ID_ImageFormat = this._CmbBox_SetImageFormat.SelectedIndex + 1;
        }
 
        private void OnButtonClick_OK(Object Sender, EventArgs E)
        {
            this._DialogResult = DialogResult.OK;
            this.Close();
        }
 
        private void OnButtonClick_Cancel(Object Sender, EventArgs E)
        {
            this._DialogResult = DialogResult.Cancel;
            this.Close();
        }
 
        public DialogResult _ShowDialog()
        {
            this.ShowDialog();
            return this._DialogResult;
        }
    }
}
Вот код вызова данной формы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            this._Img_Settings.BackgroundImage = new Bitmap(Properties.Resources._5_2);
            this.Refresh();
            System.Threading.Thread.Sleep(125);
            this._Img_Settings.BackgroundImage = new Bitmap(Properties.Resources._5_1);
            this.Refresh();
            System.Threading.Thread.Sleep(125);
            //Вот здесь и начинаются основные действия
            this.Visible = false;
            {
                SetSettingsForm _SetSettingsForm = new SetSettingsForm(this._Settings);//Вот тут я, якобы, создаю "новый объект"
                if (_SetSettingsForm._ShowDialog() != DialogResult.Cancel)
                {
                    this._Settings = _SetSettingsForm.Get_NewSettings;//Ну, это мы уже получаем новые настройки из формы
                    //_SetSettingsForm.Dispose();//Этот метод мне не помог, к стати...
                    System.IO.File.Delete(String.Format("C:\\Users\\{0}\\Documents\\Settins\\Settings.dat", Environment.UserName));
                    this.SaveSettings(this._Settings);
                    this.Opacity = this._Settings.Get_OpacityLevel;
                }
            }
            this.Visible = true;
            System.GC.Collect();//Даже Dispose пробовал-не помогает...
        }
P.S. Я бы мог запустить отладку, но у меня "ругается" на отсутствие файла, мол, "нет загружаемых символов для этого документа"...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2015, 14:55
Ответы с готовыми решениями:

удаляется ли объект или происходит утечка памяти?
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? std::list<A*> entities; ...

Говорит что объект есть, но в коде точно видно что объект удаляется
Добрый день. Вот небольшой пример кода. IF NOT OBJECT_ID('tempdb..#TMP_1') IS NULL DROP TABLE #TMP_1 SELECT 1 as c INTO #TMP_1 ...

Не удаляется объект
Доброго времени суток, в коде я удаляю объект, и сразу же добавляю вместо него другой, но проблема в том, что объект не всегда удаляеться,...

4
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
18.10.2015, 15:42
Лучший ответ Сообщение было отмечено Jack Wade как решение

Решение

Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
2
3
4
5
public SetSettingsForm(Form1.Settings _OldSettings)
{
    InitializeComponent();
    this._OldSettings = _OldSettings;
    this._NewSettings = _OldSettings;
После этого _OldSettings и _NewSettings указывают на один и тот же объект. Поэтому когда изменение поля внутри _NewSettings приводит к изменению поля внутри _OldSettings. Если тебе нужен новый объект, то создай его копию. Также изучи что такое ссылочные типы.

Цитата Сообщение от Jack Wade Посмотреть сообщение
private Form1.Settings _NewSettings;
Данная строка говорит что тип Settings объявлен внутри класса Form1. При этом он используется в других местах. Вынеси его из Form1 чтобы он был сам по себе.

Цитата Сообщение от Jack Wade Посмотреть сообщение
this._NewSettings.Set_DefaultWay = String.Format("C:\\Users\\{0}\\Desktop", Environment.UserName);
String.Format("C:\\Users\\{0}\\Documents \\Settins\\Settings.dat", Environment.UserName));
Путь к папке "Рабочий стол" и "Мои документы" надо получать с помощью метода Environment.GetFolderPath и далее строить путь с помощью Path.Combine
C#
1
2
this._NewSettings.Set_DefaultWay = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
Path.Combibe(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"Settins\Settings.dat");
Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void OnButtonClick_OK(Object Sender, EventArgs E)
{
this._DialogResult = DialogResult.OK;
this.Close();
}
private void OnButtonClick_Cancel(Object Sender, EventArgs E)
{
this._DialogResult = DialogResult.Cancel;
this.Close();
}
public DialogResult _ShowDialog()
{
this.ShowDialog();
return this._DialogResult;
}
Это плохой код. Удали его и никогда больше так не делай. Вместо этого нужно указать DialogResult у кнопок и назначить AcceptButton и CancelButton у формы. Далее ты будешь вызывать стандартный ShowDialog() и он тебе вернет DialogResult.

Цитата Сообщение от Jack Wade Посмотреть сообщение
//
C#
1
_SetSettingsForm.Dispose();
//Этот метод мне не помог, к стати...
Перед применением метода неплохо понимать для чего он нужен. Dispose() нужен для освобождения неуправляемых ресурсов и он здесь никак не поможет т.к. настоящая проблема в том что ты не понимаешь что такое ссылочный тип.

Цитата Сообщение от Jack Wade Посмотреть сообщение
C#
1
System.GC.Collect();
//Даже Dispose пробовал-не помогает...
Вызовы GC.Collect() не нужны. Убери их.

P.S. Еще пара моментов так сказать вдогонку.

1. Почему ты не пользуешься дизайнером, а пишешь код создания контролов вручную?

2. У тебя в коде постоянно встречаются пары свойств(?) класса Settings: Get_ShowProgramm/Set_ShowProgramm, Get_UseDefaultWay/Set_UseDefaultWay и т.п. ЗАЧЕМ ЭТО??? Свойства изначально содержат get/set под одной крышей. Соответственно ты можешь писать просто ShowProgramm, UseDefaultWay, OpacityLevel и т.д.

P.P.S Просто удивительно сколько можно напортачить в коротком коде.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.10.2015, 16:15
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вместо этого нужно указать DialogResult у кнопок и назначить AcceptButton и CancelButton у формы.
Большой минус такого подхода — автоматически биндятся клавиши Enter и Escape на соответствующий функционал, что очень сильно бесит, если в форме настроек есть текстовое поле с возможностью ввода нескольких строк или какой-нибудь выпадающий список, выбор которого удобно отменять esc'ом.
1
68 / 41 / 14
Регистрация: 24.02.2013
Сообщений: 250
18.10.2015, 17:31  [ТС]
OwenGlendower, большое спасибо за ответ!

Написал метод для "клонирования" объекта. Теперь всё работает, как надо.

Собственно, сам метод:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
            public Settings GetCopy()
            {
                return this.MemberwiseClone() as Settings;
            }
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
18.10.2015, 17:39
А почему вы не используете встроенные в .NET средства для сохранения настроек?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2015, 17:39
Помогаю со студенческими работами здесь

Почему удаляется объект?
Помогите, пожалуйста, понять почему удаляется объект и как это исправить? Идея следующая: В Source.cpp я создаю два объекта, вызывая...

Не удаляется объект из списка
у меня есть список: private List<T> List = new List<T>(); где класс Т: public class T : MonoBehaviour { public GameObject...

Объект удаляется до возвращения его из функции
Есть следующий код перегрузки операции "+" для сложения матриц: Matrix operator+(const Matrix &x) { Matrix result(*this); ...

Не удаляется объект после уничтожения shared_ptr
Добрый день Не могу понт почему так происходит? class Widget { public: void sayHello(){ cout <<...

Confirm - при нажатии на cancel объект всё равно удаляется
Всем добрый вечер, Помогите пожалуйста найти решение по такому вопросу: При нажатии на "удаление объекта" выводится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru