Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3

Совместное создание игры

08.01.2025, 12:45. Показов 46262. Ответов 942
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий администратора 
Обсуждение вынесено из темы Ищу человека для совместного изучения программирования


Цитата Сообщение от Royal_X Посмотреть сообщение
Вот на моем неигровом ноуте последний UE без проблем запускается и не тормозит даже.
ок.
если ТС готов варганить со мной сапера, то я сделаю ещё одну попытку его(пожалуй 4 версию) установить и испытать.

собсно что нужно: формально отображать некие графические модели на экране в нужном его месте нужного масштаба,
для теста сойдут спрайты - а потом можно и анимированные модели голых девочек,
на усмотрение геймдиза))

и больше ничаво.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2025, 12:45
Ответы с готовыми решениями:

Для чего создан язык С++?
Для чего создан язык С++????

создан массив
создан массив автовладельцев, для каждого известны Ф.И.О., номер, адрес...,Выяснить есть ли автовладельцы у которых имеются больше 1-ой...

Теория игр, массивы
Есть задание (прикрепил его в виде файла к сообщению). Есть решение для 12-ого варианта на BORLANDC, у меня 2-ой. Я изменил в начале...

942
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
16.01.2025, 21:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от XLAT Посмотреть сообщение
мой эксперименты с тетрисом полностью на кодогенерации
ты так и не ответил, используешь еще Unity?
***
Если зайти на самый популярный сайт индюшатины, itch.io, то можно увидеть на каком движке были созданы те или иные игры. По количеству игр статистика такая:
Unity - 99 488 игр
Godot - 21 556
Unreal Engine - 13 858
GameMaker - 10 229
Ren'Py - 4 726
Construct 2 - 2 796
SFML ака Эталон - 275

Кстати, стоит отметить, что Godot появился относительно недавно, а вот некоторые движки существуют со времен Ноя. Godot очень быстро набирает популярность.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.01.2025, 21:53
Я писал... Давно это было...
Спрайты ворованные.


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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
#include<math.h>
#include<vector>
#include<cstdlib>
           #include< windows.h>
//#include <thread>
#include <iostream>
      #include <conio.h>
//#include <SFML/Graphics.hpp>// Переставил подключение вниз (был конфликт)
                 #include<opencv2/opencv.hpp>
                    #include <SFML/Graphics.hpp>
                       #include <SFML/Audio.hpp>
using namespace sf;
using namespace std;
 
 
const short WIDTH_MAP = 800;
const short HEIGHT_MAP = 600;
//=================
class Animation {
    std::vector<IntRect>frames;// Вектор для координат (рамок)
     double totalProgress;
   sf::Sprite *target;
        public:
Animation(sf::Sprite& target) { 
       this->target = &target;
       totalProgress = 0.0;
          }
 void addFrame(IntRect frame) {// добавить прямоугольник (рамку)
       frames.push_back(std::move(frame)); 
          }
 void clear_frames(){ frames.resize(0); }// Очистка рамочного вектора
 //------------------------------- 
  void update(double elapsed) {
         totalProgress += 0.005*elapsed;// <--- вырезает
 if (totalProgress > frames.size()) totalProgress -= frames.size(); // Обнуляет счётчик   
        target->setTextureRect( frames[(int)totalProgress] );// Вырезает рамкой вынутой из вектора
          } };
 
//=================
class Bullet
{
public:
    CircleShape shape;
    Vector2f currVelocity;
    float maxSpeed;
 
    Bullet(float radius = 6.f)
        : currVelocity(0.f, 0.f), maxSpeed(20.f)
    {
        this->shape.setRadius(radius);
        this->shape.setFillColor(Color::Green);
             } };
//============================
int tempX(0);//временная коорд Х.Снимаем ее после нажатия прав клав мыши
int tempY(0);//коорд Y
float d_istance = 0;//это расстояние от объекта до тыка курсора
 
int p_x(500), p_y(300);
bool isMove(true);
bool scre_en(true);// -- муха на экран
//============================
 
int _tmain( int argc, _TCHAR* argv[]) {
 
 // Адрес в родной каталог с привиченной "lenna.jpg"(правильный алгоритм)
        wchar_t cmdline[MAX_PATH] = { '\0' };
char char_line[MAX_PATH]={'\0'};
    GetModuleFileName(GetModuleHandle(NULL), cmdline, MAX_PATH);
            
// ---------- преобразование wchar_t to char (#include< windows.h>)
          WideCharToMultiByte(CP_ACP, 0, cmdline, -1, char_line, wcslen(cmdline), NULL, NULL);                 
 
    //----------------------
*strrchr(char_line,'\\')='\0'; // ====== ноль вместо последнего слеша; (wchar_t)
   strcat(char_line,"\\sprite\\777.png");// --- добавим имя файла    (не увеличивай длину динамического массива           
 
//==================================
   RenderWindow window(VideoMode(WIDTH_MAP, HEIGHT_MAP), "360 Shooter!", Style::Default);
                                    window.setFramerateLimit(60);
            Texture t1, t2, t_fl, t_fl_dead, back, gay;
t1.loadFromFile(char_line);
    Sprite player(t1);  // создали функцию спрайта hgry-fly-1.png
    player.setPosition(220, 220); 
    //--------------------------------
    *strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
    strcat(char_line, "\\888.png");// --- добавим имя файла  (не увеличивай длину динамического массива 
//  RectangleShape enemy;
t2.loadFromFile(char_line);  
    Sprite enemy(t2);  // создали функцию спрайта
    enemy.setPosition(Vector2f(650, 300));
    //--------------------------------
    *strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
    strcat(char_line, "\\hungry-fly-1.png");// --- добавим имя файла (не увеличивай длину динамического массива         
    //--------------------------------
t_fl.loadFromFile(char_line);
Sprite myCharacter1(t_fl);  // создали функцию спрайта =========================== (МУХА) 
//-----------------------------
*strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
strcat(char_line, "\\hungry-fly-dead.png");// --- добавим имя файла  (не увеличивай длину динамического массива         
t_fl_dead.loadFromFile(char_line);
Sprite myCharacter2(t_fl_dead);  // создали функцию спрайта ===================== (МУХА ДОХЛАЯ) 
//--------------------------------
*strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
strcat(char_line, "\\img0.jpg");// --- добавим имя файла (не увеличивай длину динамического массива         
back.loadFromFile(char_line);
Sprite my_back(back);  // создали функцию спрайта
 
//--------------------------------
*strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
strcat(char_line, "\\fang.png");// --- добавим имя файла (не увеличивай длину динамического массива         
//--------------------------------  
gay.loadFromFile(char_line);
Sprite myCharacter(gay);  // создали функцию спрайта (человечек)
myCharacter.setPosition(Vector2f(605, 125));
 
            
//--------------------------------
*strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
strcat(char_line, "\\Zoom.wav");// --- добавим имя файла (не увеличивай длину динамического массива 
sf::Music music;//создаем объект музыки
music.openFromFile(char_line);//загружаем файл
music.setVolume(50);  //уровень звука можно как int переменную юзать
music.setLoop(true);//если нужно круговое воспроизведение трека
music.play();//воспроизводим музыку
//music.stop();
//--------------------------------
*strrchr(char_line, '\\') = '\0'; // ====== ноль вместо последнего слеша; (wchar_t)
strcat(char_line, "\\boom.wav");// --- добавим имя файла (не увеличивай длину динамического массива 
sf::Music boom;//создаем объект музыки
boom.openFromFile(char_line);//загружаем файл
boom.setVolume(50);  //уровень звука можно как int переменную юзать
//music.setLoop(true);//если нужно круговое воспроизведение трека
//boom.play();//воспроизводим музыку
//boom.stop();
 
 
Animation *animation = new Animation(myCharacter);// <<< -- человечек (класс на куче... Грузит лист) ______
   for (int i = 40; i < 40 * 6; i = i + 40 ){
            animation->addFrame(sf::IntRect(i, 244, 40, 50));// Грузит рамки в вектор
                  }
    // Load the image...
Animation animation1(myCharacter1);// <<< ---- Лист C МУХАМИ в класс _______________
          animation1.addFrame( sf::IntRect(0, 0, 256, 256) );// Грузит координаты в вектор (прямоугольник)
    animation1.addFrame( sf::IntRect(256, 0, 256, 256) );   
    // do this for as many frames as you need
    
//Bullets
    Bullet b1;
    std::vector<Bullet> bullets;
    //Vectors
    Vector2f playerCenter;
    Vector2f mousePosWindow;
    Vector2f aimDir;
    Vector2f aimDirNorm;  
    
    Clock clock; // засекаем время с последнего тика( мультипликация мухи) 
    Clock clock1;// движение мухи по вектору
//==================================  
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            //----------------- Одна пуля            
            //  if (event.type == sf::Event::MouseButtonPressed)        
            //  {
            //  b1.shape.setPosition(playerCenter);
            //           b1.currVelocity = aimDirNorm * b1.maxSpeed;
            //          bullets.push_back(Bullet(b1)); }
            //----------------- Одна пуля           
 
            if (event.type == Event::Closed)
                window.close();
        }
        //Update  Vectors
                       playerCenter = Vector2f(player.getPosition());
                       mousePosWindow = Vector2f(Mouse::getPosition(window));
        aimDir = mousePosWindow - playerCenter;
        aimDirNorm = aimDir / sqrt(pow(aimDir.x, 2) + pow(aimDir.y, 2));
 
        float PI = 3.14159265f;
        float deg = atan2(aimDirNorm.y, aimDirNorm.x) * 180 / PI;
        player.setOrigin(player.getLocalBounds().width / 2, player.getLocalBounds().height / 2);// вращать через середи    
        player.setRotation(deg + 90);
 
        //Set Final Rotation of Ship
        //   std::cout << deg << "\n";
        //========================================================    Перемещение мухи по вектору в случайное место
        static long Slp_(0);//  Под счётчик паузы
        static short n(0);//  Под счётчик замены мух
        float time1 = clock1.getElapsedTime().asMicroseconds();
                clock1.restart();
        time1 = time1 / 200;// (1 + rand() % 200);
        //------------------------   tempX   tempY  ---> target
        if (isMove && scre_en){
d_istance = sqrt((tempX - p_x)*(tempX - p_x) + (tempY - p_y)*(tempY - p_y));//считаем дистанцию (длину от точки А до точки Б).длина вектора
            if (d_istance > 6){//этим условием убираем дергание во время конечной позиции спрайта (ПОДБИРАТЬ)
                p_x += 0.1*time1*(tempX - p_x) / d_istance;//идем по иксу с помощью вектора нормали
                p_y += 0.1*time1*(tempY - p_y) / d_istance;//идем по игреку так же
        
                } else isMove = false;// Дошли до точки. stop
            }
        //------------------------------------------------------------------------------------
        if (!isMove){// Новые координаты для полёта мухи
                tempX = 1 + rand() % (WIDTH_MAP - 1);//рандомное по иксу от 1 до ширина карты-1,
                tempY = 1 + rand() % (HEIGHT_MAP - 1);//по игреку так же
                 isMove = true;
                    }
        //------------------------------------------------------------------------------------
        if (!scre_en){// Дохлая муха падает
        if (p_y > HEIGHT_MAP){  p_x = 1 + rand() % (WIDTH_MAP - 1);// рандомное по иксу от 1 до ширина карты-1,
                ++n;// Замена мух
                ++Slp_;// Задержка мухи в тактах основного цикла
                if (n > 2)n = 0;// Переключение мух <<<<<<<<<<<< ======================== КОНЕЦ
                if (n == 0){
                    animation1.clear_frames();
                    animation1.addFrame(sf::IntRect(0, 0, 256, 256));// Грузит координаты в вектор (прямоугольник)
                    animation1.addFrame(sf::IntRect(256, 0, 256, 256)); }
                //------------------ Замена мух             
                if (n == 1){
                    animation1.clear_frames();
                    animation1.addFrame(sf::IntRect(512, 0, 256, 256));// Грузит координаты в вектор (прямоугольник)
                    animation1.addFrame(sf::IntRect(768, 0, 256, 256)); }
                //------------------ Замена мух
                if (n == 2){
                    animation1.clear_frames();
                    animation1.addFrame(sf::IntRect(1024, 0, 256, 256));// Грузит координаты в вектор (прямоугольник)
                    animation1.addFrame(sf::IntRect(1280, 0, 256, 256)); }
                //------------------            
                //sf::sleep(sf::seconds(3));//< --------- Задержка три секунды
                if (Slp_ == 80){ Slp_ = 0;
                    boom.stop(); music.play();//воспроизводим музыку снова
                    scre_en = true; }// < ------- Всё снова
            } else p_y += 0.1*time1;//< --- пока дохлая муха не долетела до низа 
        }
        //========================================================        
        //Player control
        if (Keyboard::isKeyPressed(Keyboard::Left)) player.move(-10.f, 0.f);
        if (Keyboard::isKeyPressed(Keyboard::Right)) player.move(10.f, 0.f);
        if (Keyboard::isKeyPressed(Keyboard::Up)) player.move(0.f, -10.f);
        if (Keyboard::isKeyPressed(Keyboard::Down)) player.move(0.f, 10.f);
 
        //ВРАГИ
        //E N E M Y
        enemy.setColor(sf::Color(225, 225, 225, 200)); //если нет столкновения возвращаем цвет
 
        //СТРЕЛЯЕМ (Много пуль)
       if (Mouse::isButtonPressed(Mouse::Left))
       {
     b1.shape.setPosition(playerCenter);
      b1.currVelocity = aimDirNorm * b1.maxSpeed;
    bullets.push_back(Bullet(b1)); }// ---- Добавляет новый элемент в конец вектора после его текущего последнего элемента
        
//==================================================
        for (size_t i = 0; i < bullets.size(); i++)
        {
            bullets[i].shape.move(bullets[i].currVelocity);// Движение пули
             //Out of bounds
            if (bullets[i].shape.getPosition().x < 0 || bullets[i].shape.getPosition().x > window.getSize().x
                || bullets[i].shape.getPosition().y < 0 || bullets[i].shape.getPosition().y > window.getSize().y)
                                { bullets.erase(bullets.begin() + i);// ---------- Удаляет пулю вышедшую за координаты
                                          } else {
                                           //Enemy collision
                 if (bullets[i].shape.getGlobalBounds().intersects(enemy.getGlobalBounds()))
                                      {
                        bullets.erase(bullets.begin() + i);
                         enemy.setColor(sf::Color(120, 0, 12, 38));//При столкновении окрашиваем
                       // enemy.erase(bullets);// ?/???????
                       enemy.setPosition(20,20);// (было минус сто )
                        //vector<tempObject>().swap(tempVector);
                                      break; }
//--------------------------------------
                 if (bullets[i].shape.getGlobalBounds().intersects(myCharacter1.getGlobalBounds()))
                                   {                 //    ------- ПОПАДАНИЕ В МУХУ
                                       bullets.erase(bullets.begin() + i);
                                       boom.play();//воспроизводим музыку
                                        music.stop();
                                                                scre_en = false;// <-------------------- Попал
                                         break; }
//--------------------------------------                                   
                 if (bullets[i].shape.getGlobalBounds().intersects(myCharacter.getGlobalBounds()))
                                   {
                                       bullets.erase(bullets.begin() + i);
                              myCharacter.setPosition(20, 20);// (было минус сто )
                                       break; }
            
                                    }  }
            window.clear();
//=============  О т р и с о в к а =====================
        /* создаем переменную время, getElapsedTime() - дать прошедшее время( возьмем  его в микросикундах) */
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart(); // перезагружает часы
time = time / 500; //здесь происходит регулировка скорости мультипликации      
        
window.draw(my_back);
 
    // In your main loop:
    if (scre_en){
        animation1.update(time);// Мультипликация (читает спрайты из вектора в классе)
        myCharacter1.setScale(0.4, 0.4);// изменение размера
        myCharacter1.setPosition(Vector2f(p_x, p_y));
        window.draw(myCharacter1);
    }
    else{
        myCharacter1.setPosition(Vector2f(WIDTH_MAP, HEIGHT_MAP));// Телепортация мухи за край поля
        myCharacter2.setScale(0.4, 0.4);// изменение размера    
        myCharacter2.setPosition(p_x, p_y);//
        window.draw(myCharacter2);
    }
 
time = time / 2; //здесь происходит регулировка скорости мультипликации 
        animation->update(time);// Мультипликация (читает спрайты из вектора в классе)
        myCharacter.setScale(2.0, 2.0);// изменение размера 
        window.draw(myCharacter);
//======================================================
        
            window.draw(player);
     for (size_t i = 0; i < bullets.size(); i++)
        {
               window.draw(bullets[i].shape); }// Выпускает пули
    window.draw(enemy);
         window.display();
    }   
//-------------------------------
                                                                                          delete animation;
    return 0;
           }
1
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.01.2025, 21:57
final_file (3).mp4
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.01.2025, 21:59
sprite.rar
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
16.01.2025, 21:59
Наталья8, столько кода, чтобы иконка стреляла?
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.01.2025, 22:01
Код написать, получаешь удовлетворение.
Вроде что то делал.
А в интернете ты всё равно ни кого не обманешь.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
16.01.2025, 22:22
Цитата Сообщение от Наталья8 Посмотреть сообщение
Код написать, получаешь удовлетворение.
а когда код еще и полезен, то получаешь вдвойне удовлетворения
а когда он полезен другим людям, то получаешь втрое больше удовлетворения
Поэтому советую создать игру и опубликовать, чтобы все желающие играли.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.01.2025, 22:29
Только не игру. Пустая работа.
Этого мусора столько,
что всё равно ни кто играть в твоё чудо не станет.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
16.01.2025, 22:37
Цитата Сообщение от Наталья8 Посмотреть сообщение
что всё равно ни кто играть в твоё чудо не станет
Неправда. Даже среди индюшатины есть хорошие игры. Заходишь сюда https://itch.io/games и ищешь игру по своему вкусу. Почти все игры бесплатные. И ты сам тоже можешь опубликовать свою игру.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
17.01.2025, 13:55  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
ты так и не ответил, используешь еще Unity?
1.
и да и нет.

в текущий момент нет.

юнька для меня это задачка про то как сделать физику ту, которая мене нужна.

хз, может помру раньше и не успею))

Цитата Сообщение от Royal_X Посмотреть сообщение
SFML ака Эталон - 275
да.

выше тяжегрузы, а сфмл'ка это легкомоторный самолет, где любая крыша аэродром.


2.
чтобы в коде постоянно не декодировать на сфмл набил перекомпоновщик текстуры:
теперь твоя текстура сразу в нужном виде:


перекомпоновщик текстуры
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
#define SFML_STATIC
///----------------------------------------------------------------------------|
/// Перестановщик тайлов внутри прямоугольной текстуры.
///----------------------------------------------------------------------------:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <memory>
#include <array>
#include <list>
#include <map>
 
#include <SFML/Graphics.hpp>
 
#define  l(v)  std::wcout << #v << " = " << (v) << "\n";
 
///----------------------------------------------------------------------------|
/// Конфиг.
///----------------------------------------------------------------------------:
struct  Config
{
    sf::Vector2i winsize{700 * 1366 / 768, 700};
    sf::Font font;
 
    unsigned NX = 4,
             NY = 4;
 
    std::vector<unsigned> a
    {
    /// {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12 }
        {  9, 10, 11,  0,  1,  2,  3,  4,  5,  6,  7,  8, 12 }
    ///                +   +   +   +   +   +   +   +   +
    };
}cfg;
 
 
///----------------------------------------------------------------------------|
/// T2T.
///----------------------------------------------------------------------------:
struct  TaskT2T   : sf::Sprite
{       TaskT2T()
        {
            texture.loadFromFile("minesweeper_tiles.png");
 
            l(texture.getSize().x)
            l(texture.getSize().y)
 
            scale(0.5f,0.5f);
            move (0, 40);
 
            go();
        }
 
    void go()
    {
        const unsigned NX = cfg.NX;
        const unsigned NY = cfg.NY;
 
        unsigned W = texture.getSize().x;
        unsigned H = texture.getSize().y;
 
        rt.create(W * NY, H / NY);
 
        sf::IntRect rect(128, 128, W / NX, H / NY);
 
        const unsigned STEPx = W / NX;
        const unsigned STEPy = H / NY;
 
        sf::Sprite sp; sp.setTexture(texture);
 
        unsigned cnt = 0;
 
        for    (unsigned j = 0; j < NY; ++j)
        {   for(unsigned i = 0; i < NX; ++i)
            {
                rect.left = i * STEPx;
                rect.top  = j * STEPy;
 
                sp.setTextureRect(rect);
                sp.setPosition   (STEPx * cfg.a[cnt], 0);
 
                rt.draw(sp);
 
                ++cnt;
 
                if(cnt == cfg.a.size()) goto m;
            }
        }
    m:
        sf::Image img;
                  img = rt.getTexture().copyToImage();
                  img.flipVertically ();
                  img.saveToFile     ("a.png");
 
        texture.loadFromImage(img);
        setTexture(texture);
    }
 
    sf::Texture    texture;
    sf::RenderTexture   rt;
};
 
 
///----------------------------------------------------------------------------|
/// RenderLoop
///----------------------------------------------------------------------------:
struct  RenderLoop
{       RenderLoop() : window(sf::VideoMode(cfg.winsize.x,
                                            cfg.winsize.y), "TaskT2T")
        {
            cfg.font.loadFromFile ("consola.ttf");
 
            window.setVerticalSyncEnabled(true);
        //  window.setFramerateLimit     (50  );
 
            text.setFont             (cfg.font);
            text.setCharacterSize          (28);
            text.setStyle   (sf::Text::Regular);
            text.setFillColor(sf::Color::White);
        }
 
    void run() { loop(); };
 
private:
    ///--------------------|
    /// Главное окно.      |
    ///--------------------:
    sf::RenderWindow window;
 
    ///--------------------|
    /// Графич. примитив.  |
    ///--------------------:
    sf::Text           text;
 
    ///--------------------|
    /// Целевая задача.    |
    ///--------------------:
    TaskT2T         taskT2T;
 
    void process_mouse(const sf::Vector2i& mouse_pos)
    {   std::string s("mouse::XY = [");
                    s += std::to_string(mouse_pos.x) + ", ";
                    s += std::to_string(mouse_pos.y) + "]" ;
        text.setString(s);
    }
 
    ///--------------------|
    /// Главный цикл.      |
    ///--------------------:
    void loop()
    {
        sf::Vector2i mouse_pos;
 
        while (window.isOpen())
        {
            ///---------------------|
            /// Обработка сообщений.|
            ///---------------------:
            for (sf::Event event; window.pollEvent(event);)
            {
                if (event.type == sf::Event::Closed) window.close();
 
                if (event.type == sf::Event::KeyPressed)
                {
                }
 
                ///------------------------------------|
                /// MouseMoved только здесь.           |
                ///------------------------------------:
                if (event.type == sf::Event::MouseMoved)
                {   mouse_pos  =  sf::Mouse::getPosition(window);
                    process_mouse(mouse_pos);
                }
            }
 
            window.clear();
 
            ///-----------------|
            /// Отрисовка...    |
            ///-----------------:
            window.draw(taskT2T);
            window.draw   (text);
 
            ///-----------------|
            /// На дисплей...   |
            ///-----------------:
            window.display    ();
        }
    }
};
 
 
///----------------------------------------------------------------------------|
/// Start.
///----------------------------------------------------------------------------:
int main()
{
    std::wcout << "START ...\n\n";
 
    std::unique_ptr<RenderLoop> testmain(new RenderLoop);
                                testmain->run();
 
    std::wcout << "FINISHED!\n";
}
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
17.01.2025, 14:20  [ТС]
Цитата Сообщение от Наталья8 Посмотреть сообщение
Только не игру
вопрос стоял так: что будем делать, резак или сапёра?
вы хвост задрали, типа вы не уж настолько по настоящему голодранец, чтобы кто-то вам помогал - обойдетесь сами,
поэтому оставалась нам делать только сапера))
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
17.01.2025, 14:42
Цитата Сообщение от XLAT Посмотреть сообщение
твоя текстура сразу в нужном виде
я в своем сапере на GDI+ тоже менял ту мою первоначальную текстуру. Оказалось, что для представления одного спрайта достаточно 16х16 пикселей и не будет потери визуальной информации. А дальше типа можно даже увеличить через код даже до 8к) Именно так я добился сапера в 32 КБ.
Со сжатием без потерь, в итоге один спрайт занял 824 байт. В итоге, все 13 спрайтов заняли 10,4 KБ.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
17.01.2025, 14:50  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
В итоге, все 13 спрайтов заняли 10,4 KБ.
в релизе спрайты будут 3d-моделями голых баб весом по 1 гб каждая)
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
17.01.2025, 14:55
Если бы я делал на сишке, то уже сделал бы.)) Эх..
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
17.01.2025, 14:58
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Если бы я делал на сишке
так WinAPI внутри на сишке) все равно сишка
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
17.01.2025, 15:28
Цитата Сообщение от Royal_X Посмотреть сообщение
так WinAPI внутри на сишке)
И что? Это просто вызов функций апиишных. Просто обработка событий. А сама игра - объекты, которые тоже могут вызывать апиишные функции. В данной конкретной игре применение gdi+ избыточно, можно обойтись обычным gdi и bitblt напрямую в контекст.Но это технические детали. Главное: как вот так написать, чтобы самому не плеваться на свой код через некоторое время. Я же не просто взял сапера. Это просто тестовый проектик. А далее хочу свой старый сишный консольный морской бой сделать гуишым и переписать на плюсы. Но это так: развлекуха. Просто тренировка.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
17.01.2025, 15:48
Цитата Сообщение от CoderHuligan Посмотреть сообщение
В данной конкретной игре применение gdi+ избыточно
Согласен, что можно было и на более старых инструментах. Однако, более старые инструменты, как вот gdi, меня не интересуют.
Вот GDI+, как и DirectX, уже написан на С++ и содержит более интересные штуки, чем это старье.

Добавлено через 6 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
WinAPI внутри на сишке
именно я про старые функции. А в целом WinAPI постепенно переходит на С++.

например, для создания диалога для открытия или сохранения файла, раньше был простенький сишный Common File Dialog. Начиная с виста уже очень мощный Common Item Dialog на С++. Однако, пацаны любят старье, ибо в пару строк создают диалог, тогда как современными функциями нужно больше писать...
Я вот всегда использую новинки, и вам рекомендую использовать Common Item Dialog

Вот IMFMediaEngine тоже уже на С++. Хотя, подозреваю, что многие будут юзать старинный сишный плеер, учитывая, что чтобы работать с IMFMediaEngine, нужно потратить почти столько же энергии, сколько работая с DirectX.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
17.01.2025, 16:36
Цитата Сообщение от Royal_X Посмотреть сообщение
Однако, пацаны любят старье
Я вот хочу чтобы прога могла запуститься на ОС начиная по крайней мере с xp. Не люблю, когда забывают об обратной совместимости, вынуждая людей переходить на все новые оси, браузеры, железо и пр. Конечно, под более современные оси надо предусматривать и более новые вещи. Но всё можно решать в ран-тайм в зависимости от конкретной оси. Или компилировать под разные оси отдельные дистры.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,552
17.01.2025, 16:41
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я вот хочу чтобы прога могла запуститься на ОС начиная по крайней мере с xp.
Практика показывает, что нельзя создать нормальную прогу, которая одновременно хорошо работала бы как на XP, так и на 10, 11...
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
17.01.2025, 17:21
Цитата Сообщение от Royal_X Посмотреть сообщение
нельзя создать нормальную прогу
"Нормальную" - понятие расплывчатое. Если я создаю в vs2010 или в Delphi7, то у меня нормально работает от xp до win 10. Проверено. А как там в других средах я не ведаю. Ну да: интерфейс немного устаревший, ну дык мне не в продакшен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2025, 17:21

Решение матричных игр. Есть у кого такая программа написанная уже...
Требуется программа по решению матричных игр... С выбором размера матрицы и выдачей решения... Может кто смогёт такую сбатцать?

Запуск приложений(старых игр) в оконном режиме
День добрый, подскажите, хотелось бы реализовать свое желание запуска старых игр windo`вых(типа StarCraft) в оконном режиме, с чего начать,...

Алгоритм календаря игр (например в футболе)
необходимо составить календарь футбольных матчей, допустим есть 6 команд char *teams = {&quot;TEAM A&quot;,&quot;TEAM B&quot;,&quot;TEAM...

Движок для игр
Всем привет!!!, хотел узнать возможно ли создать движок на C++ чтобы экспортировать модели из 3ds max а после в самом движке можно было...

Выбор IDE для создания 2D игр
Здравствуйте. Задача сделать пака 2ух – мерные драчки загружая в проект анимацию-как удар(ы) и реакция на удар...(лучше всего секвенцию...


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

Или воспользуйтесь поиском по форуму:
300
Закрытая тема Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru