Программа должна отрисовывать 10 кругов по нажатию клавиши пробеле, именно одно нажатие один круг, у меня это не работает, помогите допилить .
#include "SDL.h"
#include
#include
#include
#include
#include
using namespace std;
void task()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* window = SDL_CreateWindow(u8"Лабораторная №22",
100, 100,
1500, 1000, SDL_WINDOW_SHOWN);
SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderClear(render); SDL_RenderPresent(render);
int corx[10];
int cory[10];
int rad[10];
double ras;
bool clik = false;
for (int j = 0; j < 10; j++)
{
corx[j] = rand() % (1000 - 50 + 1) + 50;
cory[j] = rand() % (1000 - 50 + 1) + 50;
rad[j] = rand() % (50 - 5 + 1) + 5;
}
SDL_Point cor[10][360];
SDL_Point point[360];
SDL_Event event;
bool quit = false;
while (!quit) {
SDL_PollEvent(&event);
if (event.type == SDL_QUIT) quit = true;
for (int g = 0; g < 10; g++) {
if ((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_SPACE) && (clik == false)) {
for (int i = 0; i < 360; i++)
{
ras = sqrt((corx[g] - corx[g]) * (corx[g] - corx[g]) + (cory[g] - cory[g]) * (cory[g] - cory[g]));
if (rad[g] + rad[g + 1] >= ras) {
double u = 3.14 / 180 * i;
SDL_SetRenderDrawColor(render, 255, 0, 255, 0);
point[i].x = int(corx[g] + rad[g] * cos(u));
cor[g][i].x = point[i].x;
point[i].y = int(cory[g] + rad[g] * sin(u));
cor[g][i].y = point[i].y;
SDL_RenderDrawPoints(render, point, 360);
}
SDL_RenderPresent(render);
} clik = true;
}
// else continue;
if ((event.type == SDL_KEYUP)&&(event.key.keysym.sym == SDLK_SPACE))
clik = false;
}
if (event.button.button == SDL_BUTTON_LEFT) {
for (int i = 0; i < 360; i++)
for (int g = 0; g < 10; g++) {
double u = 3.14 / 180 * i;
if ((event.button.x >= corx[g] - rad[g] - cos(u)) && (event.button.x <= corx[g] + rad[g] + cos(u)) && (event.button.y >= cory[g] - rad[g] - cos(u)) && (event.button.y <= cory[g] + rad[g] + sin(u)))
{
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderDrawPoints(render, cor[g], 360);
}
}
}
SDL_RenderPresent(render);
}
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
SDL_Quit();
}
int main(int argc, char* argv[])
{
srand(time(0));
task();
return 1;
}
C/C++
Работа в SDL c окружностями c++
ИМХО Вы как-то переусложнили. + Вынесите отрисовку окружности в отдельную функцию, раз Вы её вызываете несколько раз. + есть более быстрые алгоритмы отрисовки окружности не требующие работы с плав. точкой в т. ч.
( н-р https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма )
Пример (в C++ лучше < random > чем rand, но не до этого). Чертит линию при нажатии пробела, но не при его удержании (я так понял в этом проблема):
#include < iostream >
#include < cstdlib >
#include < SDL2/SDL.h >
int main(int argc, char *argv[]) {
srand(time(NULL));
SDL_Init( SDL_INIT_EVERYTHING );
SDL_Window* window = SDL_CreateWindow(u8"Лабораторная №22", 100, 100, 1500, 1000, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "Could not create window: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}
SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
if (!render) {
std::cerr << "Could not create render: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderClear(render); SDL_RenderPresent(render);
for(bool isPressed = false;;) {
SDL_Event windowEvent;
if (SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT:
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
case SDL_KEYDOWN:
if (windowEvent.key.keysym.sym == SDLK_SPACE && !isPressed) {
isPressed = true;
SDL_SetRenderDrawColor(render, 255, 255, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(render, 0, 0, 1500, rand()%1000);
SDL_RenderPresent(render);
}
break;
case SDL_KEYUP:
if (windowEvent.key.keysym.sym == SDLK_SPACE) {
isPressed = false;
}
break;
}
}
}
}
ЗЫЖ: У меня по крайней мере работает ;) И гляньте ещё SDL_GetKeyState - может Вам так даже удобнее будет (хотя она более затратная в Вашем случае)
_www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetkeystate.html
( н-р https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма )
Пример (в C++ лучше < random > чем rand, но не до этого). Чертит линию при нажатии пробела, но не при его удержании (я так понял в этом проблема):
#include < iostream >
#include < cstdlib >
#include < SDL2/SDL.h >
int main(int argc, char *argv[]) {
srand(time(NULL));
SDL_Init( SDL_INIT_EVERYTHING );
SDL_Window* window = SDL_CreateWindow(u8"Лабораторная №22", 100, 100, 1500, 1000, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "Could not create window: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}
SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
if (!render) {
std::cerr << "Could not create render: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderClear(render); SDL_RenderPresent(render);
for(bool isPressed = false;;) {
SDL_Event windowEvent;
if (SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT:
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
case SDL_KEYDOWN:
if (windowEvent.key.keysym.sym == SDLK_SPACE && !isPressed) {
isPressed = true;
SDL_SetRenderDrawColor(render, 255, 255, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(render, 0, 0, 1500, rand()%1000);
SDL_RenderPresent(render);
}
break;
case SDL_KEYUP:
if (windowEvent.key.keysym.sym == SDLK_SPACE) {
isPressed = false;
}
break;
}
}
}
}
ЗЫЖ: У меня по крайней мере работает ;) И гляньте ещё SDL_GetKeyState - может Вам так даже удобнее будет (хотя она более затратная в Вашем случае)
_www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetkeystate.html
Похожие вопросы
- C и C++ вопросы
- Лабораторная работа по алгоритмам (C++)
- Помогите решить задачку по теме работа с файлами C++
- Чем именно отличается C от C++? Конкретно
- Покажите различие между c# и c++
- В чем разница между C и C++?
- Написать массив на C(не C++) пожалуйста!!! простым языком с пояснениями
- Меня бесит вопрос по c++ и c#
- Почему C обскакал C++?
- Помогите пожалуйста решить задачу на C ИЛИ C#
Это офигенная книга. У меня ещё где-то лежит.