Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/47: Рейтинг темы: голосов - 47, средняя оценка - 4.62
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132

Создание игры!

19.10.2023, 21:37. Показов 13180. Ответов 158
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна помощь в создании игры!
Аналог (похожая игра): http://scsc.techclub.su/Alg/pitman2.html Алмазоискатель.zip
Хочу создать такую же игру, но самим. Всё тоже самое, но без вступления, без инструкций и т.д. , нужна сама игра (управление такое же (блок-схемы) ), но карту для прохождения нужно будет загружать отдельно (просто запустить игру, потом туда загрузить карту и проходить).
Язык не важен (если надо, изучу новый ).
Цель данного проекта: научить детей программированию (с начала объяснить с блок-схем, а потом научить программировать).
Поэтому прощу помочь (пожалуйста): Где лучше это осуществить, какой язык, с написанием кода (ну или если кто-то делал до этого похожую игру) или помогите скопировать данный код примера (уже пробовал, но не запускается, поэтому решил сюда написать ) . Игра не для меня - а для детей 5 класса (или 7 класс, ну или для первокурсников кто в первые будет изучать программирование).

1) Вот где это лучше осуществить? Хотел в VBA (excel), но непонятно как сделать кнопки управления. Чтобы не нужен был интернет, просто файл где находится приложение-игра и много карт (разных уровней сложности). Сама игра напоминает Scratch.
2) Какой язык нужен? Данный пример, написан на JavaScript, с этим Языком не знаком, поэтому может другой язык выбрать или начать изучать этот?
3) Какое приложение понадобиться?
и т.д.

Заранее спасибо!!!

Не по теме:

С миру по нитке — голому рубаха

Миниатюры
Создание игры!  
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2023, 21:37
Ответы с готовыми решениями:

Можно ли достать версию игры, чтобы в c# отображать версию внутри игры?
Хочу использовать значение версии из менюшки, когда для обновления указываю новую версию. Сейчас я...

Есть ли способ компиляции всех шейдеров игры при первом запуске игры?
У меня есть 2 карты: главное меню, и основная карта с геймплеем. Основная карта запускается с...

Выкладывание игры на Яндекс игры
Здраствуйте, подскажите, как исправить такую ошибку - После перехода на другую вкладку,...

158
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 09:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Informatikc Посмотреть сообщение
Блоки-действия: Вверх, Влево, Вправо, Вниз.
гуд.
всё гениальное это просто.

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

Цитата Сообщение от Informatikc Посмотреть сообщение
По-поводу "Змейки"
у меня такой концепт:
выделить класс таких простых игор,
которые можно будет собирать из однотипных блоков.

далее, сначала просто нужен перечень этих блоков.
например, такие структуры(классы)
- игровой мир это Поле из Клеток.
- персонаж, занимающий одну клетку.
- персонаж, занимающий несколько клеток.
- стандартные методы через которые этот персонаж взаимодействует с миром.
- и тд и тп.

т.е. для лабиринта, тетриса, змейки, арканоида и тд, нужно иметь класс для рисования Поля Клеток.

собсно, кратко.

далее всё наше кодирование можно свести к десятку количества таких концептов.

Цитата Сообщение от Informatikc Посмотреть сообщение
пусть будет лабиринт
какие у вас есть соображения/идеи того, как вы будете этот лабиринт рисовать???
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 09:47
к часам и тп добавил тестовый объект с шейдерами:
https://github.com/BDOTimer/CF... Shaders_01
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 10:08
Informatikc,
фильм Вы смотрели "Матрица" ???

это к вопросу:
Цитата Сообщение от XLAT Посмотреть сообщение
какие у вас есть соображения/идеи того, как вы будете этот лабиринт рисовать???
+ озвученный концепт:
Цитата Сообщение от XLAT Посмотреть сообщение
- игровой мир это Поле из Клеток.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 10:35
Цитата Сообщение от XLAT Посмотреть сообщение
фильм Вы смотрели "Матрица" ???
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
#include <iostream>
#include <vector>
 
///-----------------------|
/// Ячейка матрицы.       |
///-----------------------:
struct Cell
{
    int status = int('.');
};
 
///-----------------------|
/// Для удобства.         |
///-----------------------:
using massiv_t = std::vector<Cell    >;
using matrix_t = std::vector<massiv_t>;
 
///-----------------------|
/// Процедура печати.     |
///-----------------------:
std::ostream& operator<<(std::ostream& o, const matrix_t& m)
{   for    (const auto& r : m)
    {   o << "   ";
        for(const auto& e : r)
        {   o << char(e.status);
        }   o << '\n';
    }       o << '\n';
    return  o;
}
 
///-----------------------|
/// Добавим стенки.       |
///-----------------------:
void add_walls(matrix_t& m)
{
    for(auto& e : m.front()) e.status = int('#');
 
    m.back() = m.front();
 
    for(auto& r : m)
    {   r.front().status = int('#'); r.back() = r.front();
    }
}
 
///-----------------------|
/// Тест.                 |
///-----------------------:
int main()
{
    std::cout << "...Hello world!\n";
 
    ///-------------------|
    /// Матрица 10 x 20.  |
    ///-------------------:
    matrix_t matrix(10, massiv_t(20));
 
    ///-------------------|
    /// Добавим стенки.   |
    ///-------------------:
    add_walls     (matrix);
 
    ///-------------------|
    /// Вывод на печать.  |
    ///-------------------:
    std::cout <<   matrix ;
}


это можно легко нарисовать и в нашей блохе...
1
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132
07.11.2023, 11:14  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
Informatikc,
фильм Вы смотрели "Матрица" ???
конечно же смотрел
Поле - это матрица размером M на N. Числа 0 и 1, где 0 - пустота, 1 - забор (наверное так)
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 11:20
Цитата Сообщение от Informatikc Посмотреть сообщение
Поле - это матрица размером M на N. Числа 0 и 1, где 0 - пустота, 1 - забор (наверное так)
верно,
пустота может быть трава, песок, ...
забор может быть горы, лес, река, ...

но, ок, это дизайнерский штучки ...

Добавлено через 2 минуты
Informatikc,
лабиринт вы хотите генерировать, будет много всяких разных
или руками рисовать, будет только то что нарисуете?
1
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132
07.11.2023, 11:24  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
генерировать
наверное, но поле должно быть не таким большим, например 15 на 10 (или как у Вас в коде) или чуть побольше (чтобы долго его не проходить)
###############
#.............................#
#.............................#
#.............................#
#.............................#
#.............................#
#.............................#
#.............................#
# ............................#
#.............................#
###############
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 11:32
Цитата Сообщение от Informatikc Посмотреть сообщение
но поле должно быть не таким большим, например 15 на 10
это не нашей стороне решать,
это пусть решает игрок,
задавая размеры в настройках игры.

Добавлено через 2 минуты
Informatikc,
вот ссыль на генератор:
https ://ru.
stackoverflow.com/questions/482663/Простой-алгоритм-генерации-лабиринта-на-c-cc
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 13:33
Цитата Сообщение от XLAT Посмотреть сообщение
вот ссыль на генератор:
похоже ли это на лабиринт?


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
///----------------------------------------------------------------------------|
/// Лабиринт Красса.
///----------------------------------------------------------------------------:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <stack>
#include <ctime>
 
///-----------------------|
/// Ячейка матрицы.       |
///-----------------------:
enum   CellState { Close, Open };
struct Cell
{   int x;
    int y;
 
    CellState Left   = CellState::Close;
    CellState Right  = CellState::Close;
    CellState Top    = CellState::Close;
    CellState Bottom = CellState::Close;
 
    bool Visited;
 
    int status = int(' ');
};
 
///-----------------------|
/// Для удобства.         |
///-----------------------:
using massiv_t = std::vector<Cell    >;
using matrix_t = std::vector<massiv_t>;
 
///-----------------------|
/// Процедура печати.     |
///-----------------------:
std::ostream& operator<<(std::ostream& o, const matrix_t& m)
{   for    (const auto& r : m)
    {   o << "   ";
        for(const auto& e : r)
        {   o << char(e.status);
        }
        o << '\n';
    }
    o << '\n';
    return  o;
}
 
///-----------------------|
/// Добавим стенки.       |
///-----------------------:
void add_walls(matrix_t& m)
{   for(auto& e : m.front()) e.status = int('#');
 
    m.back() = m.front();
 
    for(auto& r : m)
    {   r.front().status = int('#');
        r.back() = r.front();
    }
 
    for     (size_t y = 1; y < m.size ();        y+=3)
        for (size_t x = 1; x < m.front().size(); x+=3)
        {   m[y][x].status = int('#');
        }
}
 
///----------------------------------------------------------------------------|
/// Лабиринт Красса.
///----------------------------------------------------------------------------:
using namespace std;
 
int generator_labirint_Krass(matrix_t& labyrinth)
{   const int width  = labyrinth.back().size(),
              height = labyrinth       .size();
 
    // Заполняем начальные данные для ячеек:
    for     (int y = 0; y < height; y++)
        for (int x = 0; x < width;  x++)
        {   labyrinth[y][x].x = x;
            labyrinth[y][x].y = y;
            labyrinth[y][x].Visited = false;
        }
 
    // Выбираем первую ячейку откуда начнем движение:
    srand(time(NULL));
    int startX = rand() % width;
    int startY = rand() % height;
 
    labyrinth[startY][startX].Visited = true;
 
    // Заносим нашу ячейке в path и начинаем строить путь:
    stack<Cell> path;
    path.push(labyrinth[startY][startX]);
 
    while (!path.empty())
    {   Cell Z = path.top();
 
        // Cмотрим варианты, в какую сторону можно пойти:
        vector<Cell> nextStep;
 
        if (Z.x > 0 && (labyrinth[Z.y][Z.x - 1].Visited == false))
        {
            nextStep.push_back(labyrinth[Z.y][Z.x - 1]);
        }
 
        if (Z.x < width - 1 && (labyrinth[Z.y][Z.x + 1].Visited == false))
        {
            nextStep.push_back(labyrinth[Z.y][Z.x + 1]);
        }
 
        if (Z.y > 0 && (labyrinth[Z.y - 1][Z.x].Visited == false))
        {
            nextStep.push_back(labyrinth[Z.y - 1][Z.x]);
        }
 
        if (Z.y < height - 1 && (labyrinth[Z.y + 1][Z.x].Visited == false))
        {
            nextStep.push_back(labyrinth[Z.y + 1][Z.x]);
        }
 
 
        if (!nextStep.empty())
        {   // Выбираем сторону из возможных вариантов:
            Cell next = nextStep[rand() % nextStep.size()];
 
            // Открываем сторону, в которую пошли на ячейках:
            if (next.x != Z.x)
            {   if (Z.x - next.x > 0)
                {   labyrinth[   Z.y][   Z.x].Left  = Open;
                    labyrinth[next.y][next.x].Right = Open;
                }
                else
                {   labyrinth[   Z.y][   Z.x].Right = Open;
                    labyrinth[next.y][next.x].Left  = Open;
                }
            }
            if (next.y != Z.y)
            {   if (Z.y - next.y > 0)
                {   labyrinth[   Z.y][   Z.y].Top    = Open;
                    labyrinth[next.y][next.y].Bottom = Open;
                }
                else
                {   labyrinth[   Z.y][   Z.x].Bottom = Open;
                    labyrinth[next.y][next.x].Top    = Open;
                }
            }
 
            labyrinth[next.y][next.x].Visited = true;
            path.push(next);
 
        }
        else
        {   // Если пойти никуда нельз¤, возвращаемс¤ к предыдущему узлу:
            path.pop();
        }
    }
 
    //... где-то тут визуализируем labyrinth...
 
    return 0;
}
 
void renderCells(matrix_t& out, matrix_t& Cells)
{
    const int width  = Cells.back().size(),
              height = Cells       .size();
 
    const size_t B = 1;
 
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {   if (Cells[y][x].Top == CellState::Close)
            {
                out[y*3+B][x*3+1+B].status = int('#');
            }
 
            if (Cells[y][x].Left == CellState::Close)
            {
                out[y*3+1+B][x*3+B].status = int('#');
            }
 
            if (Cells[y][x].Right == CellState::Close)
            {
                out[y*3+1+B][x*3+2+B].status = int('#');
            }
 
            if (Cells[y][x].Bottom == CellState::Close)
            {
                out[y*3+2+B][x*3+1+B].status = int('#');
            }
        }
    }
}
 
///-----------------------|
/// Тест.                 |
///-----------------------:
int main()
{   std::cout << "...Hello world!\n";
 
    rand();
 
    ///-------------------|
    /// Матрица 10 x 20.  |
    ///-------------------:
    matrix_t matrix(10, massiv_t(20));
    matrix_t out   (32, massiv_t(62));
 
    ///-------------------|
    /// Добавим стенки.   |
    ///-------------------:
    add_walls(out);
 
    generator_labirint_Krass(matrix);
 
    std::cout << "...generator ready!\n";
 
    renderCells(out, matrix);
 
    ///-------------------|
    /// Вывод на печать.  |
    ///-------------------:
    std::cout <<   out ;
 
    std::cout << "...cout ready!\n";
}
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 16:40
ещё один алгоритм генератора лабиринта:
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
///----------------------------------------------------------------------------|
/// Лабиринт BestMordaEver.
/// https://habr.com/ru/articles/319532/
///----------------------------------------------------------------------------:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <ctime>
 
using matrix_t = std::vector<std::vector<int>>;
 
struct  Labitinth_BestMordaEver : matrix_t
{       Labitinth_BestMordaEver(size_t H = 31, size_t W = 51) :
            matrix_t( H, std::vector<int>(W, wall)),
            height  ( H   ),
            width   ( W   ),
            maze    (*this)
        {
            gen();
        }
 
    enum eTYPE
    {   wall = 0,
        pass = 1
    };
 
    ///---------------------------------|
    /// Показать в консольном окне.     |
    ///---------------------------------:
    void debug() const
    {   for    (auto&  r : maze)
        {   for(auto&  e : r   )
            {   switch(e)
                {   case wall: std::cout << "0 "; break;
                    case pass: std::cout << "  "; break;
                }
            }
            std::cout<<std::endl;
        }   std::cout<<std::endl;
    }
 
    size_t height, width;
 
    std::vector<std::vector<int>>& maze;
 
    void generator()
    {   // Массив заполняется землей-ноликами
        for    (auto& r : maze)
        {   for(auto& e : r   )
            {   e = wall;
            }
        }
        gen();
    }
 
private:
    ///---------------------------------|
    /// Собственно сам алгоритм.        |
    ///---------------------------------:
    void gen()
    {   size_t x = 3,
                   y = 3;
 
        /// TODO ...
        /// Да, 10000 это костыль, ...
        for(int a = 0; a < 10000; ++a)
        {
            ///----------------------------|
            /// Уменьшаем костыль.         |
            ///----------------------------:
            if(a%500 == 0 && ended()) break;
 
            maze[y][x] = pass;
 
            while(true)
            {   ///---------------------------------------------|
                /// По две клетки в одном направлении за прыжок.|
                ///---------------------------------------------:
                switch(rand()%4)
                {   ///---------|
                    /// Вверх.  |
                    ///---------:
                    case 0:
                    {   if( y != 1 &&
                            maze[y-2][x] == wall)
                        {   maze[y-1][x]  = pass;
                            maze[y-2][x]  = pass;
                            y-=2;
                        }
                    }
                    ///---------|
                    /// Вниз.   |
                    ///---------:
                    case 1:
                    {   if( y != height-2 &&
                            maze[y+2][x] == wall)
                        {   maze[y+1][x]  = pass;
                            maze[y+2][x]  = pass;
                            y+=2;
                        }
                    }
                    ///---------|
                    /// Налево. |
                    ///---------:
                    case 2:
                    {   if( x != 1 &&
                            maze[y][x-2] == wall)
                        {   maze[y][x-1]  = pass;
                            maze[y][x-2]  = pass;
                            x-=2;
                        }
                    }
                    ///---------|
                    /// Направо.|
                    ///---------:
                    case 3:
                    {   if( x != width-2 &&
                            maze[y][x+2] == wall)
                        {   maze[y][x+1]  = pass;
                            maze[y][x+2]  = pass;
                            x+=2;
                        }
                    }
                }
                if(deadend(x,y)) break;
            }
 
            if(deadend(x,y))
            {   ///--------------------------------|
                /// Вытаскиваем крота из тупика    |
                ///--------------------------------:
                do
                {   x = 2*(rand()%((width -1)/2))+1;
                    y = 2*(rand()%((height-1)/2))+1;
                }
                while(maze[y][x] != pass);
            }
        }
    }
 
    ///---------------------------------|
    /// Определяет тупики.              |
    ///---------------------------------:
    bool deadend(size_t x, size_t y) const
    {   int a = 0;
 
        if(x == 1        || maze[y][x-2] == pass) a+=1;
        if(y == 1        || maze[y-2][x] == pass) a+=1;
        if(x == width -2 || maze[y][x+2] == pass) a+=1;
        if(y == height-2 || maze[y+2][x] == pass) a+=1;
 
        return a == 4 ? 1 : 0;
    }
 
    ///---------------------------------|
    /// Если что копать?                |
    ///---------------------------------:
    bool ended()
    {   for    (auto& r : maze )
        {   for(auto& e : r    )
            {   if   (e == wall) return false;
            }
        }
        return true;
    }
};
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   srand((unsigned)time(NULL));
    Labitinth_BestMordaEver run(29,39);
                            run.debug();
}
1
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132
07.11.2023, 17:45  [ТС]
Как смог нарисовал компас (будет в нижнем левом углу)
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
#define SFML_STATIC
#include <SFML/Graphics.hpp>
 
int main() {
  const int compassSize = 400;
 
  sf::RenderWindow window(sf::VideoMode(compassSize, compassSize), "Compass");
 
  while (window.isOpen()) {
    sf::Event event;
    while (window.pollEvent(event)) {
      if (event.type == sf::Event::Closed) window.close();
    }
 
    window.clear(sf::Color::White);
 
    sf::CircleShape circle(compassSize / 2);
    circle.setFillColor(sf::Color::Transparent);
    circle.setOutlineThickness(2);
    circle.setOutlineColor(sf::Color::Black);
    circle.setOrigin(compassSize / 2, compassSize / 2);
    circle.setPosition(compassSize / 2, compassSize / 2);
 
    window.draw(circle);
 
    sf::ConvexShape northTriangle;
    northTriangle.setPointCount(3);
    northTriangle.setPoint(
        0,
        sf::Vector2f(compassSize / 2, compassSize / 2 - compassSize / 4 - 10));
    northTriangle.setPoint(
        1, sf::Vector2f(compassSize / 2 - 15, compassSize / 2 - 10));
    northTriangle.setPoint(
        2, sf::Vector2f(compassSize / 2 + 15, compassSize / 2 - 10));
    northTriangle.setFillColor(sf::Color::Red);
 
    window.draw(northTriangle);
 
    sf::ConvexShape eastTriangle;
    eastTriangle.setPointCount(3);
    eastTriangle.setPoint(
        0,
        sf::Vector2f(compassSize / 2 + compassSize / 4 + 10, compassSize / 2));
    eastTriangle.setPoint(
        1, sf::Vector2f(compassSize / 2 + 10, compassSize / 2 - 15));
    eastTriangle.setPoint(
        2, sf::Vector2f(compassSize / 2 + 10, compassSize / 2 + 15));
    eastTriangle.setFillColor(sf::Color::Green);
 
    window.draw(eastTriangle);
 
    sf::ConvexShape southTriangle;
    southTriangle.setPointCount(3);
    southTriangle.setPoint(
        0,
        sf::Vector2f(compassSize / 2, compassSize / 2 + compassSize / 4 + 10));
    southTriangle.setPoint(
        1, sf::Vector2f(compassSize / 2 - 15, compassSize / 2 + 10));
    southTriangle.setPoint(
        2, sf::Vector2f(compassSize / 2 + 15, compassSize / 2 + 10));
    southTriangle.setFillColor(sf::Color::Blue);
 
    window.draw(southTriangle);
 
    sf::ConvexShape westTriangle;
    westTriangle.setPointCount(3);
    westTriangle.setPoint(
        0,
        sf::Vector2f(compassSize / 2 - compassSize / 4 - 10, compassSize / 2));
    westTriangle.setPoint(
        1, sf::Vector2f(compassSize / 2 - 10, compassSize / 2 - 15));
    westTriangle.setPoint(
        2, sf::Vector2f(compassSize / 2 - 10, compassSize / 2 + 15));
    westTriangle.setFillColor(sf::Color::Magenta);
 
    window.draw(westTriangle);
 
    sf::CircleShape center(18);
    center.setFillColor(sf::Color::Black);
    center.setOrigin(13, 13);
    center.setPosition(compassSize / 2 - 5, compassSize / 2 - 5);
 
    window.draw(center);
 
    window.display();
  }
 
  return 0;
}
Миниатюры
Создание игры!  
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 19:01
Цитата Сообщение от Informatikc Посмотреть сообщение
Как смог нарисовал компас
нужно бы его согласовать к стандартному интерфейсу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace Objects
{
    ///-------------------------|
    /// Интерфейс объекта.      |--------------------------------------------!!!
    ///-------------------------:
    struct      IObject : sf::Drawable
    {   virtual~IObject(){}
        virtual void update   (                        ) = 0;
        virtual bool RPControl(std::string_view command,
                               std::vector<float>& arg ) = 0;
        virtual void input(const sf::Event&       event) = 0;
 
        std::string_view     name;
 
    private:
    };
}
Добавлено через 11 минут
типа так:
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
#define SFML_STATIC
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <SFML/Graphics.hpp>
 
namespace Objects
{
    ///-------------------------|
    /// Интерфейс объекта.      |--------------------------------------------!!!
    ///-------------------------:
    struct      IObject : sf::Drawable
    {   virtual~IObject(){}
        virtual void update   (                        ) = 0;
        virtual bool RPControl(std::string_view command,
                               std::vector<float>& arg ) = 0;
        virtual void input(const sf::Event&       event) = 0;
 
        std::string_view     name;
 
    private:
    };
}
 
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
const int compassSize = 400;
 
struct  Compas   : Objects::IObject
{       Compas() :
            circle(compassSize / 2),
            center(18)
        {
            circle.setFillColor(sf::Color::Transparent);
            circle.setOutlineThickness(2);
            circle.setOutlineColor(sf::Color::Black);
            circle.setOrigin(compassSize / 2, compassSize / 2);
            circle.setPosition(compassSize / 2, compassSize / 2);
 
            //////////////////
            northTriangle.setPointCount(3);
            northTriangle.setPoint(
                0,
                sf::Vector2f(compassSize / 2, compassSize / 2 - compassSize / 4 - 10));
            northTriangle.setPoint(
                1, sf::Vector2f(compassSize / 2 - 15, compassSize / 2 - 10));
            northTriangle.setPoint(
                2, sf::Vector2f(compassSize / 2 + 15, compassSize / 2 - 10));
            northTriangle.setFillColor(sf::Color::Red);
 
            ///////////////////
            eastTriangle.setPointCount(3);
            eastTriangle.setPoint(
                0,
                sf::Vector2f(compassSize / 2 + compassSize / 4 + 10, compassSize / 2));
            eastTriangle.setPoint(
                1, sf::Vector2f(compassSize / 2 + 10, compassSize / 2 - 15));
            eastTriangle.setPoint(
                2, sf::Vector2f(compassSize / 2 + 10, compassSize / 2 + 15));
            eastTriangle.setFillColor(sf::Color::Green);
 
            //////////////////
            southTriangle.setPointCount(3);
            southTriangle.setPoint(
                0,
                sf::Vector2f(compassSize / 2, compassSize / 2 + compassSize / 4 + 10));
            southTriangle.setPoint(
                1, sf::Vector2f(compassSize / 2 - 15, compassSize / 2 + 10));
            southTriangle.setPoint(
                2, sf::Vector2f(compassSize / 2 + 15, compassSize / 2 + 10));
            southTriangle.setFillColor(sf::Color::Blue);
 
            //////////////////
            westTriangle.setPointCount(3);
            westTriangle.setPoint(
                0,
                sf::Vector2f(compassSize / 2 - compassSize / 4 - 10, compassSize / 2));
            westTriangle.setPoint(
                1, sf::Vector2f(compassSize / 2 - 10, compassSize / 2 - 15));
            westTriangle.setPoint(
                2, sf::Vector2f(compassSize / 2 - 10, compassSize / 2 + 15));
            westTriangle.setFillColor(sf::Color::Magenta);
 
            //////////////////
            center.setFillColor(sf::Color::Black);
            center.setOrigin(13, 13);
            center.setPosition(compassSize / 2 - 5, compassSize / 2 - 5);
 
            //loop();
        }
 
    sf::CircleShape  circle       ;
    sf::ConvexShape  northTriangle;
    sf::ConvexShape  eastTriangle ;
    sf::ConvexShape  southTriangle;
    sf::ConvexShape  westTriangle ;
    sf::CircleShape  center       ;
 
    void update   (                        ){}
    bool RPControl(std::string_view command,
                  std::vector<float>& arg ) { return false;}
    void input(const sf::Event&       event){}
 
    ///-----------------|
    /// На рендер.      |
    ///-----------------:
    virtual void draw(sf::RenderTarget& target,
                      sf::RenderStates  states) const
    {
        target.draw(circle       , states);
        target.draw(northTriangle, states);
        target.draw(eastTriangle , states);
        target.draw(southTriangle, states);
        target.draw(westTriangle , states);
        target.draw(center       , states);
    }
};
 
///----------------------------------------------------------------------------|
/// Run
///----------------------------------------------------------------------------:
struct  Run
{   Run() : window(sf::VideoMode(800, 600), "Lesson")
 
    {   hero.setPosition    ( 50, 100          );
        hero.setFillColor   (sf::Color(0,128,0));
        hero.setSize        ({700, 450}        );
        hero.setOutlineColor(sf::Color(222,0,0));
        hero.setOutlineThickness           (5.f);
 
        font .loadFromFile  ("c:/windows/fonts/georgia.ttf"); ///<-------!!!
 
        text.setFont                (font);
        text.setCharacterSize         (50);
        text.setStyle  (sf::Text::Regular);
        text.setFillColor(sf::Color::Blue);
 
    }
 
    sf::RenderWindow window;
    sf::RectangleShape hero;
    sf::Font           font;
    sf::Text           text;
 
    void process_mouse(const sf::Vector2i& mouse_pos)
    {   std::string s("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();
 
                ///------------------------------------|
                /// MouseMoved только здесь.           |
                ///------------------------------------:
                if (event.type == sf::Event::MouseMoved)
                {   mouse_pos  =  sf::Mouse::getPosition(window);
                    process_mouse(mouse_pos);
                }
            }
 
            window.clear   ();
            window.draw(hero);
            window.draw(text);
 
            for(const auto& o : m) window.draw(*o);
 
            window.display ();
        }
    }
 
    std::vector<Objects::IObject*> m;
    void add(Objects::IObject* o){m.push_back(o);}
};
 
///----------------------------------------------------------------------------|
/// Start.
///----------------------------------------------------------------------------:
int main()
{   std::unique_ptr<Run>      run(new Run);
    std::unique_ptr<Compas>   o  (new Compas);
                              run->add(o.get());
                              run->loop();
}
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
07.11.2023, 19:58
Цитата Сообщение от XLAT Посмотреть сообщение
нужно бы его согласовать к стандартному интерфейсу:
понятие интерфейса:

интерфейсы нам нужны, потому что куча геймерских объектов будут взаимодействовать через интерфейсы.
Концепт Интерфейса один из самых мощных в программировании.

также можно провести аналогию понятия Интерфейса с понятием Стандарта -
какую попало гайку вы не сможете накрутить на данный вам болт.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.11.2023, 18:34
Цитата Сообщение от XLAT Посмотреть сообщение
1. змейка состоит из звеньев.
2. эти звенья тела змейки удобно хранить в массиве std::list<sf::Vector2f>.
3. каждое звено это координаты поля, где это звено располагается.
4. у змейки есть голова и есть хвост.
5. при перемещении в голову змейки добавляется одно звено с координатами поля где это звено находится
6. одновременно удаляется последнее звено хвоста.
7. если голова съедает яблоко, то хвост(последнее звено хвоста) не удаляется.


https://github.com/BDOTimer/CFru/tree/main/matrix
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.11.2023, 11:38

https://github.com/BDOTimer/CF... zm-test-01

основная задача этого теста автоподстройка масштаба под карты разного размера...
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
11.11.2023, 10:14
ок.
дальше шо в ближайшем плане:
выше код имеет недостаток - спрайты уникально идентифицируются, а это не гуд.
согласно Дейкстре, что данные это Запись-Структура-Множество,
нуно перейти от идентифицирования спрайтов к их индексированию.

ибо пока в проге всего 3 спрайта, то как бы всё хорошо, а если их 1000?

это я и исправлю следующим образом:

1. соединю генератор карт с ручным редактированием в единой автоматической загрузке данного множества спрайтов.
2. ...

Informatikc, а у вас планы какие по проекту?
1
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132
11.11.2023, 10:59  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
а у вас планы какие по проекту?
Ну, завтра хотел попробовать нарисовать и сделать кнопку (старт/стоп) - если получится
Или я не правильно понял вопрос?
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
11.11.2023, 11:40
Цитата Сообщение от Informatikc Посмотреть сообщение
нарисовать и сделать кнопк
хорошая затея,

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

какой вам ближе?
1
97 / 47 / 6
Регистрация: 25.09.2022
Сообщений: 132
11.11.2023, 12:03  [ТС]
Второй вариант
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
11.11.2023, 12:31
Informatikc,
обратите внимание на то что это всего лишь "шкурка",
для которой, чтобы её нарисовать, нужен художник.

если вы до сих пор не художник,
но сможете нарисовать типа такую,
но так чтобы понравилось(на зачёт) 80% респондентам,
то вы автоматом становитесь художником))

Informatikc,
у нас щас есть фон(тот, который кислотно-оранжевый),
передранный из ТЗ(клонируемой игры),

чем бы Вы его заменили?

т.е. там замена технически будет проста - в ресурсах нужно будет поменять текстуру.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2023, 12:31

создание игры DirectX и C++
посовтуйте пожалусто книгу ,можно онлайн (легче изучать), по созданию игры в жанре космического...

Создание игры на любой платформе
Итак, требуется создать игровое приложение (неважно, какое - главное, БОЛЬШОЕ) на любой платформе....

Создание простой игры
Совсем недавно начал изучать XNA, и появилась такая проблема: Пишу игру по примеру из книги,...

Создание 2D игры (на С/c++)...(вопросы)
Здравствуйте. Решил написать 2-х мерный шутер с видом с верху (приложил скриншоты как всё должно...

Создание мультиплейра для игры с закр. исходником
Я так понимаю, что это возможно, взять например SAMP, только каким образом реализовано?Исходники...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru