SDL реагирует на клавиатуру без прописанной команды
#include <iostream>
#include <cstdlib> // для system
#include <conio.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <ctime>
#include <math.h>
#include <cmath>
using namespace std;
const double pi = 3.141592653589793238463;
double winx = 683;
double winy = 384;
double hx = winx / 2;
double hy = winy / 2;
double dim = 10;
double dot1[11] = { static_cast<double>(-2000),static_cast<double>(2300),static_cast<double>(-2000),2,3,5,5,5,5,5,5 };
double dot2[11] = { static_cast<double>(-2000),static_cast<double>(2300),static_cast<double>(2000),1,4,6,6,6,6,6,6 };
double dot3[11] = { static_cast<double>(-2000),static_cast<double>(-1700),static_cast<double>(-2000),1,4,7,7,7,7,7,7 };
double dot4[11] = { static_cast<double>(-2000),static_cast<double>(-1700),static_cast<double>(2000),2,3,8,8,8,8,8,8 };
double dot5[11] = { static_cast<double>(2000),static_cast<double>(2300),static_cast<double>(-2000),1,6,7,7,7,7,7,7 };
double dot6[11] = { static_cast<double>(2000),static_cast<double>(2300),static_cast<double>(2000),2,5,8,8,8,8,8,8 };
double dot7[11] = { static_cast<double>(2000),static_cast<double>(-1700),static_cast<double>(-2000),3,5,8,8,8,8,8,8 };
double dot8[11] = { static_cast<double>(2000),static_cast<double>(-1700),static_cast<double>(2000),4,6,7,7,7,7,7,7 };
//double dotc[11] = { static_cast<double>(0),static_cast<double>(0),static_cast<double>(0),1,2,3,4,5,6,7,8 };
/*double rectdot1[4] = { static_cast<double>(hx - dim / 2),static_cast<double>(hy - dim / 2),2,3 };
double rectdot2[4] = { static_cast<double>(hx + dim / 2),static_cast<double>(hy - dim / 2),1,4 };
double rectdot3[4] = { static_cast<double>(hx - dim / 2),static_cast<double>(hy + dim / 2),1,4 };
double rectdot4[4] = { static_cast<double>(hx + dim / 2),static_cast<double>(hy + dim / 2),2,3 };*/
//double rectcent[2] = { static_cast<double>(posx),static_cast<double>(posy) };
double* wld[9] = { dot1, dot2, dot3, dot4, dot5, dot6, dot7, dot8/*,dotc*/ };
double wldrel[9][2];
double retina = 22;
double pix = 0.252;
double newx;
double newy;
double newz;
SDL_Window* window = SDL_CreateWindow("Fade", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, winx, winy, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
double wldgraph[9][11];
int delta = 1;
double biasm;
double ang = 0;
double globang = 0;
double d = 17;
double posx = 0;
double posy = 0;
double posz = 0;
double angx = 0;
double angy = 0;
void draw() {
//SDL_RenderDrawPoint(renderer, posx, posy);
//SDL_RenderDrawLine(renderer, 0, 0, posx, posy);
//SDL_RenderDrawLine(renderer, 0, 0, rectdot1[0], rectdot1[1]);*/
for (int i = 0;i < 9; i++) {
double x = wldgraph[i][0];
double y = wldgraph[i][1];
double z = wldgraph[i][2];
double yf = -(y * d / (x + d));
double xf = -(z * d / (x + d));
if (x < -d) {
yf = -yf;
xf = -xf;
}
double yff = (yf * winy * pix / retina) / pix + hy;
double xff = (xf * winx * pix / retina) / pix + hx;
wldrel[i][0] = xff;
wldrel[i][1] = yff;
/*printf("%f", xff);
cout << endl;
printf("%f", yff);
cout << endl;*/
}
for (int i = 0;i < 9; i++) {
double x = wldgraph[i][0];
double y = wldgraph[i][1];
double z = wldgraph[i][2];
for (int q = 3;q < 11;q++) {
double xrel = wldgraph[static_cast<int>(wldgraph[i][q] - 1)][0];
double yrel = wldgraph[static_cast<int>(wldgraph[i][q] - 1)][1];
double zrel = wldgraph[static_cast<int>(wldgraph[i][q] - 1)][2];
if ((x > 0 && x / (abs(z) + d) >= d / retina && x / (abs(y) + d) >= d / retina/*|| i == 8*/)) {
SDL_RenderDrawLine(renderer, wldrel[i][0], wldrel[i][1], wldrel[static_cast<int>(wldgraph[i][q] - 1)][0], wldrel[static_cast<int>(wldgraph[i][q] - 1)][1]);
//SDL_RenderDrawLine(renderer, wld[i][2], wld[i][0], wld[static_cast<int>(wld[i][q] - 1)][2], wld[static_cast<int>(wld[i][q] - 1)][0]);
}
}
}
}
int main(int argc, char* argv[])
{
for (int i = 0;i < 8;i++) {
for (int q = 0;q < 11;q++) {
wldgraph[i][q] = static_cast<double>(wld[i][q]);
}
}
if (window == nullptr) {
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
return 1;
}
if (renderer == nullptr) {
std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
return 1;
}
double biasx = 0;
double biasz = 0;
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
draw();
SDL_RenderPresent(renderer);
SDL_Event event;
const Uint8* state = SDL_GetKeyboardState(NULL);
double xmouse = 0;
double ymouse = 0;
while (1 == 1) {
while (SDL_PollEvent(&event)) {
//if (event.type == SDL_KEYDOWN) {
// if (state[SDL_SCANCODE_D] == 1) {
// biasz -= delta;
// delta++;
// }
// if (state[SDL_SCANCODE_A] == 1) {
// biasz += delta;
// delta++;
// }
// if (state[SDL_SCANCODE_W] == 1) {
// biasx += delta;
// delta++;
// }
// if (state[SDL_SCANCODE_S] == 1) {
// biasx -= delta;
// delta++;
// }
// posx += biasx;
// posz += biasz;/*
// for (int i = 0; i < 8; i++) {
// wldgraph[i][0] = wld[i][0] - posx;
// wldgraph[i][2] = wld[i][2] - posz;
// }*/
// biasx = 0;
// biasz = 0;
// /*if (clock() % 1000000 == 0) {
// delta = 1;
// }*/
// if (delta > 15) {
// delta = 15;
// }
//}
if (event.type == SDL_MOUSEMOTION) {
xmouse = -event.motion.xrel;
ymouse = event.motion.yrel;
if (xmouse != 0) {
double per = xmouse / winx;
ang = per * 6.28;
angx += ang;
if (angx > 360 * 0.017) {
angx -= 360 * 0.017;
}
if (angx < 360 * 0.017) {
angx += 360 * 0.017;
}
}
/*if (ymouse != 0) {
double per = ymouse / winy;
double ang = per * 6.28;
for (int i = 0;i < 8;i++) {
float y = wld[i][1];
float x = wld[i][0];
double angb = atan2(x, y);
double ang1 = angb - ang;
globang += ang1;
double r = sqrt(pow(x, 2) + pow(y, 2));
float newx = r * sin(ang1);
float newy = r * cos(ang1);
wld[i][0] = newx;
wld[i][1] = newy;
}
}*/
}
for (int i = 0; i < 8; i++) {
/*wldgraph[i][0] = wld[i][0] - posx;
wldgraph[i][2] = wld[i][2] - posz*/;
double x = wldgraph[i][0];
double z = wldgraph[i][2];
double angb = atan2(z, x);
double ang1 = angb - ang;
double r = sqrt(pow(x, 2) + pow(z, 2));
newz = r * sin(ang1);
newx = r * cos(ang1);
wldgraph[i][0] = newx;
wldgraph[i][2] = newz;
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
draw();
SDL_RenderPresent(renderer);
}
}
}
Это полный файл Проблема возникает на этом участке кода:
if (event.type == SDL_MOUSEMOTION) {
xmouse = -event.motion.xrel;
ymouse = event.motion.yrel;
if (xmouse != 0) {
double per = xmouse / winx;
ang = per * 6.28;
angx += ang;
if (angx > 360 * 0.017) {
angx -= 360 * 0.017;
}
if (angx < 360 * 0.017) {
angx += 360 * 0.017;
}
}
/*if (ymouse != 0) {
double per = ymouse / winy;
double ang = per * 6.28;
for (int i = 0;i < 8;i++) {
float y = wld[i][1];
float x = wld[i][0];
double angb = atan2(x, y);
double ang1 = angb - ang;
globang += ang1;
double r = sqrt(pow(x, 2) + pow(y, 2));
float newx = r * sin(ang1);
float newy = r * cos(ang1);
wld[i][0] = newx;
wld[i][1] = newy;
}
}*/
}
for (int i = 0; i < 8; i++) {
/*wldgraph[i][0] = wld[i][0] - posx;
wldgraph[i][2] = wld[i][2] - posz*/;
double x = wldgraph[i][0];
double z = wldgraph[i][2];
double angb = atan2(z, x);
double ang1 = angb - ang;
double r = sqrt(pow(x, 2) + pow(z, 2));
newz = r * sin(ang1);
newx = r * cos(ang1);
wldgraph[i][0] = newx;
wldgraph[i][2] = newz;
}
Как видите, там прописано некое изменение переменных, но ели запустить этот код, то тоже самое изменение будет совершаться если нажать на любую кнопку клавиатуры. Я даже закомментировал фрагмент, обрабатывающий нажатия на клавиатуру. Если же цикл занести в это условие: if (event.type == SDL_MOUSEMOTION), то реакции на клавиши нет. В чем проблема?
Ожидается: переменные wldgraph[i][0] и wldgraph[i][2] будут изменяться если я повожу мышкой по окну.
Результат: переменные изменяются как при движении мыши, так и при нажатии на клавишу и видимо любого SDL_Event