SFML community forums
Help => Graphics => Topic started by: Hair_FTW on September 06, 2011, 11:43:00 pm
-
Hello.
I Programmed a Tic Tac Toe game using C++ and SFML. It's very simples, 2 players, no menu no sound. And i didn't use oop.
The game on Debug runs fine, but on Release doesn't. As soon as the mouse cursor runs over the game window a wild "X" appears. After that, it works fine. Why is that happening? I'm using Code::Blocks.
The game uses 4 800x800 images (win, loose, tie and the board) and 2 200x200 (circle and cross). Here is the code (i'm sorry for the mess, it's my first "project", also sorry for the variable names, i'm portuguese).
///Headers///
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
///Namespaces///
using namespace std;
using namespace sf;
int main ()
{
///Variables///
char tabuleirodejogo [3][3];
for (int i=0; i<3; i++)
{
for (int u=0; u<3; u++)
{
tabuleirodejogo[i][u] = 'n';
}
}
///Window///
RenderWindow Janela (VideoMode(800,800,32), "Tic Tac Toe");
///Images///
Image Tabuleiro, Jogador_X, Jogador_O, Ganhou_X, Ganhou_O, Empate;
if (!Tabuleiro.LoadFromFile("tabuleiro.jpg"))
return EXIT_FAILURE;
if (!Jogador_X.LoadFromFile("Jogador X.png"))
return EXIT_FAILURE;
if (!Jogador_O.LoadFromFile("Jogador O.png"))
return EXIT_FAILURE;
if (!Ganhou_X.LoadFromFile("Ganhou X.png"))
return EXIT_FAILURE;
if (!Ganhou_O.LoadFromFile("Ganhou O.png"))
return EXIT_FAILURE;
if (!Empate.LoadFromFile("Empate.png"))
return EXIT_FAILURE;
Jogador_X.SetSmooth(false);
Jogador_O.SetSmooth(false);
///Sprites///
Sprite tabuleiro;
tabuleiro.SetImage(Tabuleiro);
Janela.Draw(tabuleiro);
Sprite jx;
jx.SetImage(Jogador_X);
Sprite jo;
jo.SetImage(Jogador_O);
Sprite go(Ganhou_O);
Sprite gx(Ganhou_X);
Sprite empate(Empate);
///Loop///
while (Janela.IsOpened())
{
///Player X///
while (1)
{
Event jogarx;
(Janela.GetEvent(jogarx));
if (jogarx.Type == Event::Closed)
Janela.Close();
if ((tabuleirodejogo[0][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y < 245))
{
tabuleirodejogo[0][0] = 'x';
jx.SetPosition(35.f,28.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[0][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 265) && (jogarx.MouseButton.Y < 250) && (jogarx.MouseButton.X < 520))
{
tabuleirodejogo[0][1] = 'x';
jx.SetPosition(301.f,28.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[0][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.Y < 250) && (jogarx.MouseButton.X > 536))
{
tabuleirodejogo[0][2] = 'x';
jx.SetPosition(562.f,28.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[1][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
{
tabuleirodejogo[1][0] = 'x';
jx.SetPosition(35.f,290.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[1][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 265) && (jogarx.MouseButton.X < 520) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
{
tabuleirodejogo[1][1] = 'x';
jx.SetPosition(301.f,290.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[1][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 536) && (jogarx.MouseButton.Y < 505) && (jogarx.MouseButton.Y > 260))
{
tabuleirodejogo[1][2] = 'x';
jx.SetPosition(562.f,290.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[2][0] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X < 250) && (jogarx.MouseButton.Y > 520))
{
tabuleirodejogo[2][0] = 'x';
jx.SetPosition(35.f,555.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[2][1] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 270) && (jogarx.MouseButton.X < 520) && (jogarx.MouseButton.Y > 520))
{
tabuleirodejogo[2][1] = 'x';
jx.SetPosition(301.f,555.f);
Janela.Draw(jx);
break;
}
if ((tabuleirodejogo[2][2] == 'n') && (jogarx.Key.Code == Mouse::Left) && (jogarx.MouseButton.X > 535) && (jogarx.MouseButton.Y > 520))
{
tabuleirodejogo[2][2] = 'x';
jx.SetPosition(562.f,555.f);
Janela.Draw(jx);
break;
}
Janela.Display();
}
///Player X won///
if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[0][1] == 'x' && tabuleirodejogo[0][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[1][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[1][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[2][0] == 'x' && tabuleirodejogo[2][1] == 'x' && tabuleirodejogo[2][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[1][0] == 'x' && tabuleirodejogo[2][0] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][1] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[2][1] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][2] == 'x' && tabuleirodejogo[1][2] == 'x' && tabuleirodejogo[2][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[2][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[2][0] == 'x' && tabuleirodejogo[1][1] == 'x' && tabuleirodejogo[0][2] == 'x')
{
Janela.Draw(gx);
Janela.Display();
Sleep(3.f);
break;
}
///Tie///
else if(tabuleirodejogo[0][0] != 'n' && tabuleirodejogo[0][1] != 'n' && tabuleirodejogo[0][2] != 'n' && tabuleirodejogo[1][0] != 'n' && tabuleirodejogo[1][1] != 'n' && tabuleirodejogo[1][2] != 'n' && tabuleirodejogo[2][0] != 'n' && tabuleirodejogo[2][1] != 'n' && tabuleirodejogo[2][2] != 'n')
{
Janela.Draw(empate);
Janela.Display();
Sleep(3.f);
break;
}
///Player O///
while (1)
{
Event jogaro;
(Janela.GetEvent(jogaro));
if (jogaro.Type == Event::Closed)
Janela.Close();
if ((tabuleirodejogo[0][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y < 245))
{
tabuleirodejogo[0][0] = 'o';
jo.SetPosition(35.f,28.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[0][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 265) && (jogaro.MouseButton.Y < 250) && (jogaro.MouseButton.X < 520))
{
tabuleirodejogo[0][1] = 'o';
jo.SetPosition(301.f,28.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[0][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.Y < 250) && (jogaro.MouseButton.X > 536))
{
tabuleirodejogo[0][2] = 'o';
jo.SetPosition(562.f,28.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[1][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
{
tabuleirodejogo[1][0] = 'o';
jo.SetPosition(35.f,290.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[1][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 265) && (jogaro.MouseButton.X < 520) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
{
tabuleirodejogo[1][1] = 'o';
jo.SetPosition(301.f,290.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[1][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 536) && (jogaro.MouseButton.Y < 505) && (jogaro.MouseButton.Y > 260))
{
tabuleirodejogo[1][2] = 'o';
jo.SetPosition(562.f,290.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[2][0] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X < 250) && (jogaro.MouseButton.Y > 520))
{
tabuleirodejogo[2][0] = 'o';
jo.SetPosition(35.f,555.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[2][1] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 270) && (jogaro.MouseButton.X < 520) && (jogaro.MouseButton.Y > 520))
{
tabuleirodejogo[2][1] = 'o';
jo.SetPosition(301.f,555.f);
Janela.Draw(jo);
break;
}
if ((tabuleirodejogo[2][2] == 'n') && (jogaro.Key.Code == Mouse::Left) && (jogaro.MouseButton.X > 535) && (jogaro.MouseButton.Y > 520))
{
tabuleirodejogo[2][2] = 'o';
jo.SetPosition(562.f,555.f);
Janela.Draw(jo);
break;
}
Janela.Display();
}
///Player O Won///
if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[0][1] == 'o' && tabuleirodejogo[0][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[1][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[1][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[2][0] == 'o' && tabuleirodejogo[2][1] == 'o' && tabuleirodejogo[2][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[1][0] == 'o' && tabuleirodejogo[2][0] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][1] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[2][1] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][2] == 'o' && tabuleirodejogo[1][2] == 'o' && tabuleirodejogo[2][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[0][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[2][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
else if (tabuleirodejogo[2][0] == 'o' && tabuleirodejogo[1][1] == 'o' && tabuleirodejogo[0][2] == 'o')
{
Janela.Draw(go);
Janela.Display();
Sleep(3.f);
break;
}
///Tie///
else if(tabuleirodejogo[0][0] != 'n' && tabuleirodejogo[0][1] != 'n' && tabuleirodejogo[0][2] != 'n' && tabuleirodejogo[1][0] != 'n' && tabuleirodejogo[1][1] != 'n' && tabuleirodejogo[1][2] != 'n' && tabuleirodejogo[2][0] != 'n' && tabuleirodejogo[2][1] != 'n' && tabuleirodejogo[2][2] != 'n')
{
Janela.Draw(empate);
Janela.Display();
Sleep(3.f);
break;
}
}
return EXIT_SUCCESS;
}
Translation:
tabuleirodojogo = boardofthegame
Jogador_X = Player_X
Ganhou_X = Win_X
Empate = Tie
Janela = Window
Do you people know why it runs fine on Debug but on Release don't?
Also why is it that the debug exe. has 5 megabytes and the release version only 1?
Cheers
-
Im not a code expert, so I cant tell you about your actual problem, but about the debug vs release thing here: http://haacked.com/archive/2004/02/14/difference-between-debug-vs-release-build.aspx
-
To your question "Why is debug.exe bigger than release.exe" is because debug contains alot of debugging code in the SFML area. All of this debug code is literally for that reason; debugging. It helps narrow down errors and what not.
Release doesn't contain these debug lines, so naturally it's alot less to process.
As to why release isn't working as well, I don't know. Sorry.
-
"One can expect to see funny errors in release builds due to compiler optimizations or differences in memory layout or initialization. These are ususally referred to as Release - Only bugs :)"
Does this means that the code is fine (it is doing everything it is supposed to do in debug)? Released games (sold) come in debug or release version?
-
Are you linking the debugtarget with debuglibraries, and release with releaselibs?
Also, debug will always be bigger since they contain debugging symbols, to help with stuff like trace stack etc.
-
Are you linking the debugtarget with debuglibraries, and release with releaselibs?
Also, debug will always be bigger since they contain debugging symbols, to help with stuff like trace stack etc.
Yes i am.
I managed to correct the error. I added in the "if" sections event.Type == Event::MouseButtonPressed and now it works.
Cheers