0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 108

SDL ячейки

06.03.2017, 22:37. Показов 1702. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Обращаюсь к вам за советом. Каким образом мне отслеживать нажатие на любой из нарисованных клеток. (Можно предложить другой способ рисования клеток)
Код того, как я рисую :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void cell() 
{ 
SDL_SetRenderDrawColor(gRenderer, 0x00, 0x00, 0xFF, 0xFF); 
int x = 20; 
int y = 20; 
int step = 20; 
 
   for (x ; x < SCREEN_WIDTH; x += step) 
   { 
   for (y ; y <= (SCREEN_HEIGHT - 40 ); y += step) 
   { 
      SDL_RenderDrawLine(gRenderer, 20, y, x, y); 
   } 
      SDL_RenderDrawLine(gRenderer, x, 20, x, y); 
      y = 20; 
   } 
}
Миниатюры
SDL ячейки  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2017, 22:37
Ответы с готовыми решениями:

Не компилируются SDL приложения
Здравствуйте! Я использую code::blocks и скачана верная сборка SDL. Подключил все либы и инклуды правильно, линки прописал верно. Пытаюсь...

Ноты на нотоносце. SDL
Программа показывает случайные ноты. Как их рисовать в окне используя SDL? Вопрос самый первый - можно ли инициализацию окна и слоёв и...

SDL утечка памяти
Всем доброго времени суток! Написал функцию (использую sdl и си): bool Draw_Text(TScene* Scene, int x, int y, int textsize, char...

6
9030 / 2930 / 491
Регистрация: 05.10.2013
Сообщений: 7,875
Записей в блоге: 215
06.03.2017, 22:51
Вам нужно найти как получить координаты клика мышки. Зная их вы сможете определить на какой клетке был клик с помощью if.
1
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 108
07.03.2017, 06:42  [ТС]
Координаты получить не проблема. Я до другого пока не дошел. Как программе дать понять, что куда я кликнул - это ячейка. (Планирую поле потом сделать безразмерным)
Попробую сделать массив с квадратами и рисовать их. НО и другие предложения принимаются :-)
0
9030 / 2930 / 491
Регистрация: 05.10.2013
Сообщений: 7,875
Записей в блоге: 215
07.03.2017, 08:32
Лучший ответ Сообщение было отмечено Frodo4500 как решение

Решение

Определить по какой ячейки кликнули можно так. Допустим у вас есть двумерный массив ваших ячееек. Скажем, вы создали класс Cell у которого есть X, Y, Width, Height. И в этом двумерном массиве храняться экземпляры класса Cell. Пусть Width и Height равны 10. Вы кликаете в точку с координатами (15, 18). Чтобы определить, по какой ячейке был клик нужно в цикле пробежаться по ячейкам, до тех пор пока вы не найдёте ячейку с нужными координатами. Для этого вы проверяете сначал по X, что если координаты клика находятся промежутке Xячеки + XwidthЯчейки и по Y тоже, то клик бы по данной ячейке, если нет, то проверяете следующую.
1
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 108
18.03.2017, 15:39  [ТС]
Приветствую.
https://www.cyberforum.ru/grap... 33233.html
Вы мне ответили :
Определить по какой ячейки кликнули можно так. Допустим у вас есть двумерный массив ваших ячееек. Скажем, вы создали класс Cell у которого есть X, Y, Width, Height. И в этом двумерном массиве храняться экземпляры класса Cell. Пусть Width и Height равны 10. Вы кликаете в точку с координатами (15, 18). Чтобы определить, по какой ячейке был клик нужно в цикле пробежаться по ячейкам, до тех пор пока вы не найдёте ячейку с нужными координатами. Для этого вы проверяете сначал по X, что если координаты клика находятся промежутке Xячеки + XwidthЯчейки и по Y тоже, то клик бы по данной ячейке, если нет, то проверяете следующую.
Вот только не получается у меня ((
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
#include <SDL.h>
#include <string>
#include <iostream>
#include <array>
#include <vector>
 
SDL_Window* window = NULL;
SDL_Surface *windowSurface = NULL;
SDL_Surface *imageSurface = NULL;
SDL_Renderer* renderer = NULL;
 
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
 
using namespace std;
 
void field();
void CreateImage(int MyVar);
void close();
 
void CreateImage(int MyVar)
{
    windowSurface = SDL_GetWindowSurface(window);
    switch (MyVar)
    {
    case 0:
        imageSurface = SDL_LoadBMP("btn_red.bmp");
        break;
    case 1:
        imageSurface = SDL_LoadBMP("btn_green.bmp");
        break;
    case 2:
        imageSurface = SDL_LoadBMP("btn_blue.bmp");
        break;
    default:
        break;
    }
 
    SDL_BlitSurface(imageSurface, NULL, windowSurface, NULL);
}
 
class Cell
{
public:
    int MyX;
    int MyY;
    int MyWidth;
    int MyHeight;
    int arr[][4];
    Cell() 
    { 
        MyX = 0; MyY = 0; MyWidth = 0; MyHeight = 0; 
    }
    Cell(int x, int y) : MyX(x), MyY(y), MyWidth(20), MyHeight(20)
    {
    };
    void show()
    {
        SDL_Rect outlineRect = { MyX, MyY, MyWidth , MyHeight };
        SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
        SDL_RenderDrawRect(renderer, &outlineRect);
    }
};
 
void field()
{
    SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(renderer);
    int x = 20;
    int y = 20;
    int step = 20;
    for (x; x < (SCREEN_WIDTH - 20); x += step)
    {
        for (y; y < (SCREEN_HEIGHT - 40); y += step)
        {
            Cell h(x, y);
            MyMass(h);
            h.show();
        }
        Cell h(x, y);
        MyMass(h);
        h.show();
        y = 20;
    }
    SDL_RenderPresent(renderer);
}
 
void MyMass(Cell h)
{
    Cell* MyArray = new Cell[h]; // здесь пишет, что массив неизвестного размера(но клеток может быть больше, чем сейчас - в результате точно указать размер не могу)
}
 
void close()
{
    SDL_FreeSurface(imageSurface);
    imageSurface = NULL;
    window = NULL;
    windowSurface = NULL;
    renderer = NULL;
    SDL_DestroyWindow(window);
    SDL_Quit();
}
 
int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("sdl game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
 
    field();
 
    int x;
    int y;
 
    bool isRunning = true;
    SDL_Event e;
 
    while (isRunning)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT)
                isRunning = false;
 
            switch (e.type)
            {
            case SDL_MOUSEMOTION:
                x = e.motion.x;
                y = e.motion.y;
                if ( x > 50 && x < 60 && y > 50 && y < 60)
                    CreateImage(0);
            }
            if (e.type == SDL_KEYDOWN)
                switch (e.key.keysym.sym)
                {
                case SDLK_1:
                    CreateImage(0);
                    break;
                case SDLK_2:
                    CreateImage(1);
                    break;
                case SDLK_3:
                    CreateImage(2);
                    break;
                default:
                    break;
                }
        
        }
        //SDL_UpdateWindowSurface(window);
 
    }
    close();
 
    return 0;
}
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
18.03.2017, 15:48
Цитата Сообщение от Frodo4500 Посмотреть сообщение
И в этом двумерном массиве храняться экземпляры класса Cell. Пусть Width и Height равны 10.
Если все ячейки одинакового размера можно просто целочисленно разделить координаты курсора на размер ячейки. Результат деления будет индексом в массиве ячеек.
1
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 108
20.03.2017, 23: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
#include <SDL.h>
#include <string>
#include <iostream>
#include <array>
#include <vector>
 
SDL_Window* window = NULL;
SDL_Surface *windowSurface = NULL;
SDL_Surface *imageSurface = NULL;
SDL_Renderer* renderer = NULL;
 
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
 
using namespace std;
 
void field();
void MyMass(int X, int Y);
void close();
 
class Cell
{
public:
    int MyX;
    int MyY;
    int MyWidth;
    int MyHeight;
    Cell() 
    { 
        MyX = 0; MyY = 0; 
    }
    Cell(int x, int y) : MyX(x), MyY(y)
    {
        MyMass(x, y);
    };
    void show()
    {
        SDL_Rect outlineRect = { MyX, MyY, 20 , 20 };
        SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
        SDL_RenderDrawRect(renderer, &outlineRect);
    }
};
 
void field()
{
    SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(renderer);
    int x = 20;
    int y = 20;
    int step = 20;
    for (x; x < (SCREEN_WIDTH - 20); x += step)
    {
        for (y; y < (SCREEN_HEIGHT - 40); y += step)
        {
            Cell h(x, y);
            h.show();
        }
        Cell h(x, y);
        h.show();
        y = 20;
    }
    SDL_RenderPresent(renderer);
}
 
void MyMass(int X, int Y)
{
    int a = 1;
    vector<vector<int> > tab(a);
    tab[a].resize(2);
    tab[a][2] = {X};
    a++;
}
 
void close()
{
    SDL_FreeSurface(imageSurface);
    imageSurface = NULL;
    window = NULL;
    windowSurface = NULL;
    renderer = NULL;
    SDL_DestroyWindow(window);
    SDL_Quit();
}
 
int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("sdl game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
 
    field();
 
    int x;
    int y;
 
    bool isRunning = true;
    SDL_Event e;
 
    while (isRunning)
    {
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT)
                isRunning = false;
        }
        //SDL_UpdateWindowSurface(window);
 
    }
    close();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.03.2017, 23:18
Помогаю со студенческими работами здесь

Книги по SDL/C++ на русском!
Уважаемые форумчане! Есть у кого-нибудь ссылки на русские издания книг Game Programming in C++ Start to Finish и Learn C++ by Making Games....

SDL ошибка при рендере
Пытаюсь отрендерить картинку через поток -&gt; выдаёт ошибку. Участок кода не может указать, а ассемблер я не знаю. void Texture::Render(...

Не отображается текстура SDL + OpenGL
Вот код SDL_Window *window = NULL; SDL_Surface *surf = NULL; SDL_GLContext glContext; unsigned int texture; void init() {...

Изменение координат окна в SDL
В общем, занялся я SDL, да вот проблемка: всё работает как надо, но само окно находится где-то недалеко от левого верхнего угла....

Неправильно работает программа, использующая SDL
Программа должна открывать окно и отрисовывать в нём картинку. С кодом всё нормально, инклюды, либы добавил. Пр открытии из visual studio с...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru