Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 10.02.2013
Сообщений: 5

Асинхронные клиент-сервер,Виндовс форма и БД, пишу не совсем простую онлайн игру

11.02.2013, 14:26. Показов 2529. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток господа программисты.
Начну с того, что сам не учился на программиста в своё время, тогда просто ещё не было этого =).
Теперь сам потихоньку осваиваю программирование. Начал с языка ботов Autoit, не плохо получалось с написанием скриптов для ботов онлайн игр. Но для полноценного написания кода онлайн игрушки Autoit конечно же не подходит,
тогда остановился на C#.
Создал эту тему на форуме, с надеждой, что есть не мало людей которым будет интересно не только просматривать тему
ради любопытства и примеров кода в этой теме, но и самим решать множество задач разной сложности, которые тут
будут литься рекой =).
В общем с Windows Form я уже более-менее познакомился и могу кое что писать с помощью VS2010.
Сейчас задачка стоит в том, что бы подружить асинхронный клиент и сервер с формой, проще говоря из консольного
приложения переделать в Windows Form. Сразу могу сказать, что в теме клиент-сервер я совсем новичок =(.
На просторах интернета нашёл примеры кода асинхронных клиент-сервер.

клиент:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
 
namespace TestSocketAsyncClient
{
    class Client
    {
        private Socket Sock;
        private SocketAsyncEventArgs SockAsyncArgs;
        private byte[] buff;
 
        //В конструкторе они будут инициализироваться:
        public Client()
        {
            buff = new byte[1024];
            Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SockAsyncArgs = new SocketAsyncEventArgs();
            SockAsyncArgs.Completed += SockAsyncArgs_Completed;
        }
 
        //Для соединения с сервером служит метод ConnectAsync,
        //которому передается адрес и порт для соединения с сервером:
        public void ConnectAsync(string Address, int Port)
        {
            SockAsyncArgs.RemoteEndPoint = new DnsEndPoint(Address, Port);
            ConnectAsync(SockAsyncArgs);
        }
        private void ConnectAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.ConnectAsync(e);
            if (!willRaiseEvent)
                ProcessConnect(e);
        }
 
        //После того, как соединение установлено, можно и посылать данные. Для этого служит 
        //функция SendAsync. Организация этой функции похожа на ConnectAsync:
        public void SendAsync(string data)
        {
            if (Sock.Connected && data.Length > 0)
            {
                byte[] buff = Encoding.UTF8.GetBytes(data);
                SocketAsyncEventArgs e = new SocketAsyncEventArgs();
                e.SetBuffer(buff, 0, buff.Length);
                e.Completed += SockAsyncArgs_Completed;
                SendAsync(e);
            }
        }
        private void SendAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.SendAsync(e);
            if (!willRaiseEvent)
                ProcessSend(e);
        }
 
        private void ReceiveAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.ReceiveAsync(e);
            if (!willRaiseEvent)
                ProcessReceive(e);
        }
        // Функция SockAsyncArgs_Completed просто вызывает соответствующую функцию Process* 
        // после завершения какой-либо операции:
        void SockAsyncArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Connect:
                    ProcessConnect(e);
                    break;
                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    ProcessSend(e);
                    break;
            }
        }
 
        //После того, как отправили данные, надо бы прочитать ответ. Поэтому в ProcessSend мы вызываем
        //функцию ReceiveAsync, которая обеспечит прием данных:
        private void ProcessSend(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                ReceiveAsync(SockAsyncArgs);
            }
            else
            {
                Console.WriteLine("Dont send");
            }
        }
 
        //А в функции ProcessReceive мы просто выводим на экран то что приняли:
       private void ProcessReceive(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                string str = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
                Console.WriteLine("Receive: {0}", str);
            }
            else
            {
                Console.WriteLine("Dont recieve");
            }
        }
 
        //А в ProcessConnect мы просто проверяем, были ли ошибки, и, если их не было, 
        //устанавливаем буфер и выводим сообщение о том, что соединение успешно:
        private void ProcessConnect(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                Console.WriteLine("Connected to {0}...", e.RemoteEndPoint.ToString());
                SockAsyncArgs.SetBuffer(buff, 0, buff.Length);
            }
            else
            {
                Console.WriteLine("Dont connect to {0}", e.RemoteEndPoint.ToString());
            }
        }
    }
}
сервер:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace TestSocketAsyncServer
{
    class Server
    {
        private Socket Sock;
        private SocketAsyncEventArgs AcceptAsyncArgs;
 
        public Server()
        {
            Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            AcceptAsyncArgs = new SocketAsyncEventArgs();
            AcceptAsyncArgs.Completed += AcceptCompleted;
        }
 
        private void AcceptCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                ClientConnection Client = new ClientConnection(e.AcceptSocket);
            }
            e.AcceptSocket = null;
            AcceptAsync(AcceptAsyncArgs);
        }
        private void AcceptAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.AcceptAsync(e);
            if (!willRaiseEvent)
                AcceptCompleted(Sock, e);
        }
 
        public void Start(int Port)
        {
            Sock.Bind(new IPEndPoint(IPAddress.Any,Port));
            Sock.Listen(50);
            AcceptAsync(AcceptAsyncArgs);
        }
        public void Stop()
        {
            Sock.Close();
        }
 
    }
}
class ClientConnection
    {
        private static int ClientNumber = 0;
 
        private Socket Sock;
        private SocketAsyncEventArgs SockAsyncEventArgs;
        private byte[] buff;
 
        public ClientConnection(Socket AcceptedSocket)
        {
            ClientNumber++;
            buff = new byte[1024];
            Sock = AcceptedSocket;
            SockAsyncEventArgs = new SocketAsyncEventArgs();
            SockAsyncEventArgs.Completed += SockAsyncEventArgs_Completed;
            SockAsyncEventArgs.SetBuffer(buff, 0, buff.Length);
 
            ReceiveAsync(SockAsyncEventArgs);
        }
 
        private void SockAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    ProcessSend(e);
                    break;
            }
        }
 
        private void ProcessSend(SocketAsyncEventArgs e)
        {
            if(e.SocketError == SocketError.Success)
                ReceiveAsync(SockAsyncEventArgs);
        }
 
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                string str = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
                Console.WriteLine("Incoming msg from #{0}: {1}", ClientNumber, str);
                SendAsync("You send " + str);
            }
        }
 
        private void ReceiveAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.ReceiveAsync(e);
            if (!willRaiseEvent)
                ProcessReceive(e);
        }
        private void SendAsync(string data)
        {
            byte [] buff = Encoding.UTF8.GetBytes(data);
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.Completed += SockAsyncEventArgs_Completed;
            e.SetBuffer(buff, 0, buff.Length);
            SendAsync(e);
        }  
        private void SendAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.SendAsync(e);
            if (!willRaiseEvent)
                ProcessSend(e);
        }
 
 
    }
}
и прмерно такая форма клиента:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   #endregion
 
        private System.Windows.Forms.Button button1;      // Подключиться к серверу(Connected)
        private System.Windows.Forms.Button button2;      // Отправить сообщение(Send)
        private System.Windows.Forms.TextBox txtLog;      // Вывод символов в окно формы(Log)
        private System.Windows.Forms.TextBox txtIp;        // Поле для ввода символов адреса сервера(IP)
        private System.Windows.Forms.TextBox txtUser;     // Поле для ввода символов имя клиента(Nickname)
        private System.Windows.Forms.TextBox txtpassword1;//Поле для ввода пароля(password1)
        private System.Windows.Forms.TextBox txtpassword2;//Поле для ввода пароля(password2)
        private System.Windows.Forms.TextBox txtMessage;// Поле для ввода символов сообщения   
        private System.Windows.Forms.Label Nickname;         //
        private System.Windows.Forms.Label IPServer;           //
        private System.Windows.Forms.Label password1;           //
        private System.Windows.Forms.Label password2;           //
форма сервера :
C#
1
2
3
4
5
6
   #endregion
 
        private System.Windows.Forms.Button button1;      // Начать прослушивать порт        
        private System.Windows.Forms.TextBox txtLog;      // Вывод символов в окно формы(Log)
        private System.Windows.Forms.TextBox txtIp;        // Поле для ввода символов адреса сервера(IP)       
        private System.Windows.Forms.Label IPServer;           //
На форме клиента 2 кнопки - "Подключиться" и "Отправить", при подключении надо чтобы кнопка "Подключиться"
превращалась в "Отключиться".
3 TextBox для регистрации и авторизации клиента(позже надо будет сделать БД).
2 TextBox для ввода и вывода символов.
Форма сервера - TextBox для IP сервера, TextBox для вывода символов(Log) и кнопка для запуска сервера.

Я пока не могу соединить форму с кодом клиента или сервера, точнее вставить то в форму код вставил, но как переделать
вывод символов из консоли в TextBox не знаю.

так не работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 //А в ProcessConnect мы просто проверяем, были ли ошибки, и, если их не было, 
            //устанавливаем буфер и выводим сообщение о том, что соединение успешно:
            private void ProcessConnect(SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    //   Console.WriteLine
                    txtLog.Text += "Connected to {0}..." + e.RemoteEndPoint.ToString();
                    SockAsyncArgs.SetBuffer(buff, 0, buff.Length);
 
                }
                else
                {
                    //  Console.WriteLine
                    txtLog.Text += "Dont connect to {0}" + e.RemoteEndPoint.ToString();
 
                }
            }
Прошу сильно не ругаться и плевать, так как я совсем новичок в этом деле, а просто помочь примерами кода (с подробными комментариями).
И возможно у кого то будет время прокомментировать подробнее примеры клиента и сервера выше?
Подробные комментарии в коде помогут многим новичкам. Осваивать язык на примерах с пояснениями
гораздо удобнее и быстрее. А таких примеров очень-очень мало, я имею ввиду с подробными комментариями к каждой строке кода на русском языке.
Ну для начала пока достаточно, как осилим эту задачку, тогда продолжим написание игры дальше =).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2013, 14:26
Ответы с готовыми решениями:

Онлайн игра, надо написать асинхронные клиент-сервер и сервер-посредник на C#
Доброго времени суток гос-да программисты. У меня к Вам предложение о сотрудничестве. Есть совершенно новый, совсем сырой проект онлайн...

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки. Основа сокета была взята из примера на...

Клиент-сервер. Синхронные и асинхронные сокеты
Здравствуйте, в чем разница между синхронными и асинхронными сокетами? слышал что с асинхронным сокетом ненадо парится по поводу потоков....

5
1 / 1 / 0
Регистрация: 10.02.2013
Сообщений: 5
11.02.2013, 20:18  [ТС]
подскажите пожалуйста в чём ошибка кода?
как сделать правильно?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
 
namespace WindowsFormsApplication2
{
    public partial class Form1
    {
        private Socket Sock;
        private SocketAsyncEventArgs SockAsyncArgs;
        private byte[] buff;
 
 
        //В конструкторе они будут инициализироваться:
        public void ClientS()
        {
 
            buff = new byte[1024];
            Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SockAsyncArgs = new SocketAsyncEventArgs();
            SockAsyncArgs.Completed += SockAsyncArgs_Completed;
        }
 
        //Для соединения с сервером служит метод ConnectAsync,
        //которому передается адрес и порт для соединения с сервером:
        public void ConnectAsync(string Address, int Port)
        {
            SockAsyncArgs.RemoteEndPoint = new DnsEndPoint(Address, Port);
            ConnectAsync(SockAsyncArgs);
        }
 
        private void ConnectAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.ConnectAsync(e);
            if (!willRaiseEvent)
                ProcessConnect(e);
        }
 
 
        //После того, как соединение установлено, можно и посылать данные. Для этого служит 
        //функция SendAsync. Организация этой функции похожа на ConnectAsync:
 
 
        private void SendAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.SendAsync(e);
            if (!willRaiseEvent)
                ProcessSend(e);
        }
 
        private void ReceiveAsync(SocketAsyncEventArgs e)
        {
            bool willRaiseEvent = Sock.ReceiveAsync(e);
            if (!willRaiseEvent)
                ProcessReceive(e);
        }
 
        public void SendAsync(string data)
        {
            if (Sock.Connected && data.Length > 0)
            {
                byte[] buff = Encoding.UTF8.GetBytes(data);
                SocketAsyncEventArgs e = new SocketAsyncEventArgs();
                e.SetBuffer(buff, 0, buff.Length);
                e.Completed += SockAsyncArgs_Completed;
                SendAsync(e);
            }
        }
 
        // Функция SockAsyncArgs_Completed просто вызывает соответствующую функцию Process* 
        // после завершения какой-либо операции:
        private void SockAsyncArgs_Completed(object sender, SocketAsyncEventArgs e)
        {
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Connect:
                    ProcessConnect(e);
                    break;
                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    ProcessSend(e);
                    break;
            }
        }
 
        //После того, как отправили данные, надо бы прочитать ответ. Поэтому в ProcessSend мы вызываем
        //функцию ReceiveAsync, которая обеспечит прием данных:
        private void ProcessSend(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                ReceiveAsync(SockAsyncArgs);
            }
            else
            {
                Console.WriteLine("Dont send");
            }
        }
 
        //А в функции ProcessReceive мы просто выводим на экран то что приняли:
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                string str = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);
                txtMessage.Text = "Receive: {0}" + str;
            }
            else
            {
                txtMessage.Text = ("Dont recieve");
            }
        }
 
        //А в ProcessConnect мы просто проверяем, были ли ошибки, и, если их не было, 
        //устанавливаем буфер и выводим сообщение о том, что соединение успешно:
        private void ProcessConnect(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                // Console.WriteLine
                txtMessage.Text = "Connected to {0}...";
                e.RemoteEndPoint.ToString();
                SockAsyncArgs.SetBuffer(buff, 0, buff.Length);
            }
            else
            {
                //  Console.WriteLine
                txtMessage.Text = "Dont connect to {0}";
                e.RemoteEndPoint.ToString();
            }
        }
 
        private void btnConnect_Click(object sender, EventArgs e)
        {
 
 
            ConnectAsync("127.0.0.1", 4505);
 
                while (true)
            {
                string data = txtMessage.Text;
                SendAsync(data);
            }
        }
 
    }
 
}
скрин ошибки
Миниатюры
Асинхронные клиент-сервер,Виндовс форма и БД, пишу не совсем простую онлайн игру  
0
1 / 1 / 0
Регистрация: 10.02.2013
Сообщений: 5
11.02.2013, 20:22  [ТС]
вне формы т.е. консольный вариант этого кода, отлично работает.
0
28 / 28 / 6
Регистрация: 25.12.2008
Сообщений: 186
11.02.2013, 21:06
C#
1
2
3
4
5
6
7
8
9
//В конструкторе они будут инициализироваться:
        public void ClientS()
        {
 
            buff = new byte[1024];
            Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SockAsyncArgs = new SocketAsyncEventArgs();
            SockAsyncArgs.Completed += SockAsyncArgs_Completed;
        }
Не вижу вызова этой функции.
Без нее SockAsyncArgs. не существует как таковых...
0
1 / 1 / 0
Регистрация: 10.02.2013
Сообщений: 5
12.02.2013, 16:10  [ТС]
при таком вызове:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 private void btnConnect_Click(object sender, EventArgs e)
        {
 
            ClientS();
            ConnectAsync("127.0.0.1", 4505);
 
            while (true)
             
            {
                string data = txtMessage.Text;
                SendAsync(data);
            }
        }
зависание формы, но при закрытии отладки, сервер получает пустое сообщение.

Добавлено через 18 часов 3 минуты
За 5 дней не нашёл ни одного примера кода асинхронного клиент-сервер в форме, встречались только консольные, да и те не очень ...
0
 Аватар для dreamorder
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 60
14.02.2013, 16:07
мне тож такую задачу надо решить, но пока решения не нашёл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2013, 16:07
Помогаю со студенческими работами здесь

Создать простую комуникацию клиент-сервер, для общего понимания принципов
Пытаюсь создать простую комуникацию клиент-сервер, чтобы понять, как это вообще работает. Есть код клиента: #include <sys/types.h> ...

Онлайн чат. Сервер+клиент
Всем привет! Мне захотелось сделать свой онлайн чат для своих друзей, но так как я любитель в C#, я никогда не делал чат толком. Все...

Онлайн чат. Сервер+клиент
Всем доброго времени суток! У меня возникла идея сделать чат на Android. Сделал для пк, используя .NET Framework 2.0. Теперь хочу...

Онлайн РПГ, Клиент-сервер
Нашел в интернете один проект: http://www.plati.ru/asp/pay.asp?idd=1875116 Подскажите мне пожалуйста. Стоит ли его покупать? Стоит ли он...

Пишу сервер(с++) клиент(с#). Кто знает про System.Security.Cryptography (RSA)?
Логика в которой нуждаюсь в помощи: Сервер с++: Сначала создается PublicKey. Потом PublicKey шифруется словом и превращается в...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru