SDL_Rect (SDL 2.0) Неожиданные значения от использования SDL_Rect

Название может быть немного странным, так как я не уверен на 100% в основном источнике проблемы.

Немного предыстории: я делаю программу для управления запасами на дому

Проблема: у меня есть класс addItemForm, который предназначен для создания элемента, как следует из названия. Однако проблема заключается в.

Чтобы отобразить каждую отдельную отдельную часть формы, я создал несколько SDL_Rect, которые содержат координаты для рендеринга каждой текстуры:

SDL_Rect TformBackgroundRect;
SDL_Rect TinputBox;
SDL_Rect TinputBox2;
SDL_Rect TinputBox3;
SDL_Rect TinputNameRect;
SDL_Rect TinputQuantRect;
SDL_Rect TinputUnitRect;

однако, когда я попытался использовать их (после того, как они были инициализированы в конструкторе), на экране ничего не отображалось. Затем я создал SDL_Rects в конструкторе и затем сделал это:

formBackgroundRect = TformBackgroundRect;
inputBox = TinputBox;
inputBox2 = TinputBox2;
inputBox3 = TinputBox3;
inputNameRect = TinputNameRect;
inputQuantRect = TinputQuantRect;
inputUnitRect = TinputUnitRect;

Однако это тоже не сработало. Когда я попытался сделать какое-то обнаружение столкновения, оно тоже не сработало. Я напечатал значение x для inputBox (inputBox.x), и оно дало мне значение -8589993460!?!?

Хорошо, то, что я написал, вероятно, является бредом для большинства людей, так что я постараюсь опубликовать код для моего класса addItemForm ниже:

addItemForm.h

class addItemForm
{
public:
int xPos;
int yPos;

//These are the values for the width and height of the different textures.
int fbtWidth, fbtHeight;
int iFtWidth, iFtHeight;
int iNtWidth, iNtHeight;
int iQtWidth, iQtHeight;
int iUtWidth, iUtHeight;SDL_Color fontColor;

TTF_Font* formFont;SDL_Texture* formBackgroundTexture;
SDL_Texture* inputFieldTexture;SDL_Texture* inputNameText;
SDL_Texture* inputQuantityText;
SDL_Texture* inputUnitText;

SDL_Rect formBackgroundRect;
SDL_Rect inputBox;
SDL_Rect inputBox2;
SDL_Rect inputBox3;
SDL_Rect inputNameRect;
SDL_Rect inputQuantRect;
SDL_Rect inputUnitRect;

SDL_Rect TformBackgroundRect;
SDL_Rect TinputBox;
SDL_Rect TinputBox2;
SDL_Rect TinputBox3;
SDL_Rect TinputNameRect;
SDL_Rect TinputQuantRect;
SDL_Rect TinputUnitRect;

std::string inputNameString;
std::string inputQuantString;
std::string inputUnitString;

addItemForm(int x, int y);
~addItemForm();

void loadTextures();
void render();
void update(int x, int y, SDL_Event e);

void inputValuestoField(int x, int y, SDL_Event e);

void free();

private:

};

addItemForm.cpp

Button addItemButton(72, 65);

Button cancelEntry(383, 310);

bool isViewable = false;

addItemForm::addItemForm(int x, int y)
{
xPos = x;
yPos = y;formBackgroundTexture = NULL;
inputFieldTexture = NULL;

inputNameText = NULL;
inputQuantityText = NULL;
inputUnitText = NULL;fbtWidth = 0;
fbtHeight = 0;
iFtWidth = 0;
iFtHeight = 0;
iNtWidth = 0;
iNtHeight = 0;
iQtWidth = 0;
iQtHeight = 0;
iUtWidth = 0;
iUtHeight = 0;

formFont = TTF_OpenFont("media/cambria.ttf", 15);

//The rects which will dictate where the textures are displayed onto the screen
formBackgroundRect;
inputBox;
inputBox2;
inputBox3;
inputNameRect;
inputQuantRect;
inputUnitRect;//Defining the font colour:
fontColor;
fontColor.r = 0;
fontColor.b = 0;
fontColor.g = 0;
fontColor.a = 0;

addItemButton.loadFromFile("media/buttonAddItem.png");
cancelEntry.loadFromFile("media/buttonCancelEntry.png");
}
void addItemForm::loadTextures()
{
SDL_Surface* loadedSurface = NULL;

//loading Images

loadedSurface = IMG_Load("media/addItemForm/itemFormBG.png");
if(loadedSurface == NULL)
{
printf("Could Not load Image: itemFormBG\n");
printf("Error: %s\n", SDL_GetError());
}
else
{
SDL_SetColorKey(loadedSurface, SDL_TRUE, SDL_MapRGB(loadedSurface->format, 0, 0xFF, 0xFF) );
formBackgroundTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface);
fbtWidth = loadedSurface->w;
fbtHeight = loadedSurface->h;
loadedSurface = NULL;

}loadedSurface = IMG_Load("media/addItemForm/inputTextField.png");
if(loadedSurface == NULL)
{
printf("Could not load Image: inputTextField.png\n");
printf("Error: %s\n", SDL_GetError());
}
else
{
SDL_SetColorKey(loadedSurface, SDL_TRUE, SDL_MapRGB(loadedSurface->format, 0, 0xFF, 0xFF) );
inputFieldTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface);
iFtWidth = loadedSurface->w;
iFtHeight = loadedSurface->h;
loadedSurface = NULL;
}

//Loading text

SDL_Texture* tmpTextTexture = NULL;
std::string textArray[3] = {"Item Name:", "Quantity:", "Unit:"};
for (int i = 0; i < 3; i++)
{
loadedSurface = TTF_RenderText_Solid(formFont, textArray[i].c_str(), fontColor);
tmpTextTexture = SDL_CreateTextureFromSurface(gRenderer, loadedSurface);
switch (i)
{
case 0:
inputNameText = tmpTextTexture;
iNtWidth = loadedSurface->w;
iNtHeight = loadedSurface->h;
case 1:
inputQuantityText = tmpTextTexture;
iQtWidth = loadedSurface->w;
iQtHeight = loadedSurface->h;
case 2:
inputUnitText = tmpTextTexture;
iUtWidth = loadedSurface->w;
iUtHeight = loadedSurface->h;
}

loadedSurface = NULL;
tmpTextTexture = NULL;

}SDL_FreeSurface(loadedSurface);
SDL_DestroyTexture(tmpTextTexture);
}

void addItemForm::render()
{
SDL_Rect TformBackgroundRect = { xPos, yPos, fbtWidth, fbtHeight};
SDL_Rect TinputBox = {xPos + 127, yPos + 72, iFtWidth, iFtHeight};
SDL_Rect TinputBox2 = {xPos + 127, yPos + 122, iFtWidth, iFtHeight};
SDL_Rect TinputBox3 = {xPos + 127, yPos + 165, iFtWidth, iFtHeight};
SDL_Rect TinputNameRect = {xPos + 15 , yPos + 71, iNtWidth, iNtHeight};
SDL_Rect TinputQuantRect = {xPos + 15, yPos + 121, iQtWidth, iQtHeight};
SDL_Rect TinputUnitRect = {xPos  + 15, yPos + 164, iUtWidth, iUtHeight};

formBackgroundRect = TformBackgroundRect;
inputBox = TinputBox;
inputBox2 = TinputBox2;
inputBox3 = TinputBox3;
inputNameRect = TinputNameRect;
inputQuantRect = TinputQuantRect;
inputUnitRect = TinputUnitRect;

if(isViewable == true)
{
SDL_RenderCopy(gRenderer, formBackgroundTexture, NULL, &TformBackgroundRect);
SDL_RenderCopy(gRenderer, inputFieldTexture, NULL, &TinputBox);
SDL_RenderCopy(gRenderer, inputFieldTexture, NULL, &TinputBox2);
SDL_RenderCopy(gRenderer, inputFieldTexture, NULL, &TinputBox3);
SDL_RenderCopy(gRenderer, inputNameText, NULL, &TinputNameRect);
SDL_RenderCopy(gRenderer, inputQuantityText, NULL, &TinputQuantRect);
SDL_RenderCopy(gRenderer, inputUnitText, NULL, &TinputUnitRect);
cancelEntry.render();
}
addItemButton.render();
}
void addItemForm::update(int x, int y, SDL_Event e)
{
if( addItemButton.mouseAction(x, y, e) )
{
isViewable = true;
}
if( cancelEntry.mouseAction(x, y, e) )
{
isViewable = false;
}
inputValuestoField(x, y, e);
}
void addItemForm::inputValuestoField(int x, int y, SDL_Event e)
{
//Detect pressing on rect
//printf("InputBox.x : %i, inputBox.y: %i", inputBox.x, inputBox.y);
if( x >= inputBox.x && x <= (inputBox.x + inputBox.w) && y >= inputBox.y && y <= inputBox.y + inputBox.h && e.type == SDL_MOUSEBUTTONDOWN)
{
printf("\nHEYHEYHE PRESSING INPUTBOX 1");

}
//Start reading keyboard
//When enter is pressed/clicked away from box stop reading
//place text which was just input into the appropriate string (name, quantity, unit)}
void addItemForm::free()
{
SDL_DestroyTexture(formBackgroundTexture);
SDL_DestroyTexture(inputFieldTexture);

SDL_DestroyTexture(inputNameText);
SDL_DestroyTexture(inputQuantityText);
SDL_DestroyTexture(inputUnitText);

addItemButton.free();
cancelEntry.free();
}

addItemForm::~addItemForm()
{
free();
xPos = 0;
yPos = 0;

formBackgroundTexture = NULL;
inputFieldTexture = NULL;

inputNameText = NULL;
inputQuantityText = NULL;
inputUnitText = NULL;

isViewable = false;

formBackgroundRect;
inputBox;
inputBox2;
inputBox3;
inputNameRect;
inputQuantRect;
inputUnitRect;

}

Если кто-то не уверен в том, что я хочу сказать, я с удовольствием отвечу на любые вопросы о моем коде. Как я сформулировал все, скорее всего, трудно понять, и я очень благодарен всем, кто пытается помочь.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]