SFML - Tic-Tac-Toe weißes Fenster....

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • SFML - Tic-Tac-Toe weißes Fenster....

    Hay! Hab jetzt einmal Tic-Tac-Toe geschrieben. Sprites werden zugeordnet zum jeweiligem Image.
    Ich habe alles Mögliche ab gecheckt und mir ist aufgefallen, dass nicht mal in die Key-Abfragen gegangen wird, denn man kann das ganze, so hab ich es eingegeben, nicht mit Escape schließen.
    Somit ist zu schließen das er irgendwo in einer Schleife hängt.
    Vielleicht könnt ihr etwas finden.... Hier ist der Anfang meines Codes bis zur Event-Schleife. Anzumerken ist, das man den "Schließen"-Button nicht klicken kann. Er muss irgendwo hängen, noch vor der Event-Schleife.... Aber wo?

    Quellcode

    1. // SFML statisch linken(Projekteinstellungen->C++->Präprozessor)
    2. #define SFML_STATIC
    3. // Includes
    4. #include <SFML/Graphics.hpp>
    5. #include <SFML/Window.hpp>
    6. // Libs dem Projekt hinzufügen(Projekteinstellungen->Linker->Eingabe)
    7. #pragma comment(lib, "sfml-system-s-d.lib")
    8. #pragma comment(lib, "sfml-main-d.lib")
    9. #pragma comment(lib, "sfml-graphics-s-d.lib")
    10. #pragma comment(lib, "sfml-window-s-d.lib")
    11. int main()
    12. {
    13. struct S_Feld
    14. {
    15. bool Besetzt;
    16. bool Kreuz;
    17. bool Kreis;
    18. };
    19. bool Spieler=true;
    20. bool An=true;
    21. const int Hoehe=3;
    22. const int Breite=3;
    23. int x=0;
    24. int y=0;
    25. S_Feld Karte[Hoehe][Breite];
    26. //SFML Game initialisieren
    27. sf::RenderWindow Game(sf::VideoMode(800, 600, 32), "Tick-Tack-Toe");
    28. //SFML Event Handler erstellen
    29. sf::Event Event;
    30. //Create Image Buffer Background
    31. sf::Image ImageB;
    32. if(!ImageB.LoadFromFile("Background.png"))
    33. return EXIT_FAILURE;
    34. //Create Image Buffer "O"
    35. sf::Image ImageO;
    36. if(!ImageO.LoadFromFile("Kreis.png"))
    37. return EXIT_FAILURE;
    38. //Create Image Buffer "X"
    39. sf::Image ImageX;
    40. if(!ImageX.LoadFromFile("Kreuz.png"))
    41. return EXIT_FAILURE;
    42. //Create Image Buffer Markierung
    43. sf::Image ImageM;
    44. if(!ImageM.LoadFromFile("Markierung.png"))
    45. return EXIT_FAILURE;
    46. //SetColorKey ImageO
    47. ImageO.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
    48. //SetColorKey ImageX
    49. ImageX.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
    50. //SetColorKey ImageM
    51. ImageM.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
    52. //SpriteB
    53. sf::Sprite SpriteB;
    54. SpriteB.SetImage(ImageB);
    55. //SpriteO
    56. sf::Sprite SpriteO;
    57. SpriteO.SetImage(ImageO);
    58. //SpriteX
    59. sf::Sprite SpriteX;
    60. SpriteX.SetImage(ImageX);
    61. //SpriteM
    62. sf::Sprite SpriteM;
    63. SpriteM.SetImage(ImageM);
    64. //SpriteM2
    65. sf::Sprite SpriteM2;
    66. SpriteM2.SetImage(ImageM);
    67. //SpriteM3
    68. sf::Sprite SpriteM3;
    69. SpriteM3.SetImage(ImageM);
    70. //SpriteM4
    71. sf::Sprite SpriteM4;
    72. SpriteM4.SetImage(ImageM);
    73. //SpriteM5
    74. sf::Sprite SpriteM5;
    75. SpriteM5.SetImage(ImageM);
    76. //SpriteM6
    77. sf::Sprite SpriteM6;
    78. SpriteM6.SetImage(ImageM);
    79. //SpriteM7
    80. sf::Sprite SpriteM7;
    81. SpriteM7.SetImage(ImageM);
    82. //SpriteM8
    83. sf::Sprite SpriteM8;
    84. SpriteM8.SetImage(ImageM);
    85. //SpriteM9
    86. sf::Sprite SpriteM9;
    87. SpriteM9.SetImage(ImageM);
    88. //SetPosition SpriteB
    89. SpriteB.SetPosition (0, 0);
    90. //SetPosition SpriteO
    91. SpriteO.SetPosition (17, 2);
    92. //SetPosition SpriteX
    93. SpriteO.SetPosition (17, 2);
    94. //SetPosition SpriteM
    95. SpriteM.SetPosition (118, 72);
    96. //SetPosition SpriteM2
    97. SpriteM2.SetPosition(391, 72);
    98. //SetPosition SpriteM3
    99. SpriteM3.SetPosition(635, 72);
    100. //SetPosition SpriteM4
    101. SpriteM4.SetPosition(116, 275);
    102. //SetPosition SpriteM5
    103. SpriteM5.SetPosition(388, 275);
    104. //SetPosition SpriteM6
    105. SpriteM6.SetPosition(626, 275);
    106. //SetPosition SpriteM7
    107. SpriteM7.SetPosition(122, 473);
    108. //SetPosition SpriteM8
    109. SpriteM8.SetPosition(391, 473);
    110. //SetPosition SpriteM9
    111. SpriteM9.SetPosition(636, 473);
    112. while(Game.IsOpened())
    113. {
    114. //Event Handler Loop
    115. while(Game.GetEvent(Event))
    116. {
    117. if(Event.Type == sf::Event::Closed)
    118. Game.Close();
    119. }
    Alles anzeigen
  • Ich verstehe nicht was daran Falsch sein soll..... Zerbreche mir schon seit gestern Abend (23:47Uhr) den Kopf....
    Soll ich mal den ganzen Code posten? Wenn ja, sagt mir bitte nur was verursacht, dass das Fenster weiß bleibt. (Es sollte eigentlich Schwarz sein wenn es nicht geleert wird, oder? *denk*) Bitte nichts anderes, dass ich das hätte besser lösen können, oder das anders machen können.... Ich möchte mich selbst um diese Sachen kümmern, mich interessiert hierbei wirklich nur wieso das Fenster weiß bleibt.
    Also, wer den vollständigen Code benötigt, fragt hier dann mal nach, ich schreibe ihn sofort hier nieder.
  • Quellcode

    1. //Game Clear
    2. Game.Clear();
    3. //Sprites Zeichnen
    4. Game.Draw(SpriteB);
    5. //Wenn "An" true ist dann....
    6. if(An==true)
    7. {
    8. //Wenn Position 1x1 dann....
    9. if((y==1)&&(x==1))
    10. {
    11. //Diesen Sprite zeichnen
    12. Game.Draw(SpriteM);
    13. }
    14. //Wenn Position 1x2 dann....
    15. else if((y==1)&&(x==2))
    16. {
    17. //Diesen Sprite zeichnen
    18. Game.Draw(SpriteM2);
    19. }
    20. //Wenn Position 1x3 dann....
    21. else if((y==1)&&(x==3))
    22. {
    23. //Diesen Sprite zeichnen
    24. Game.Draw(SpriteM3);
    25. }
    26. //Wenn Position 2x1 dann....
    27. else if((y==2)&&(x==1))
    28. {
    29. //Diesen Sprite zeichnen
    30. Game.Draw(SpriteM4);
    31. }
    32. //Wenn Position 2x2 dann....
    33. else if((y==2)&&(x==2))
    34. {
    35. //Diesen Sprite zeichnen
    36. Game.Draw(SpriteM5);
    37. }
    38. //Wenn Position 2x3 dann....
    39. else if((y==2)&&(x==3))
    40. {
    41. //Diesen Sprite zeichnen
    42. Game.Draw(SpriteM6);
    43. }
    44. //Wenn Position 3x1 dann....
    45. else if((y==3)&&(x==1))
    46. {
    47. //Diesen Sprite zeichnen
    48. Game.Draw(SpriteM7);
    49. }
    50. //Wenn Position 3x2 dann....
    51. else if((y==3)&&(x==2))
    52. {
    53. //Diesen Sprite zeichnen
    54. Game.Draw(SpriteM8);
    55. }
    56. //Last but not least: Wenn Position 3x3 dann....
    57. else
    58. {
    59. //Diesen Sprite zeichnen
    60. Game.Draw(SpriteM9);
    61. }
    62. sf::Sleep(550);
    63. }
    64. else
    65. {
    66. Game.Clear();
    67. Game.Draw(SpriteB);
    68. sf::Sleep(245);
    69. An=true;
    70. }
    71. //Kreuze rendern
    72. //Schleife für y
    73. for(int y=0; y<Hoehe; y++)
    74. {
    75. //Schleife für x
    76. for(int x=0; x<Breite; x++)
    77. {
    78. //Wenn irgendwo auf der Karte "Kreuz=true" ist dann....
    79. if(Karte[x][y].Kreuz==true)
    80. {
    81. //Ein Kreuz zeichnen
    82. Game.Draw(SpriteX);
    83. }
    84. }
    85. }
    86. //Kreise rendern
    87. //Schleife für y
    88. for(int y=0; y<Hoehe; y++)
    89. {
    90. //Schleife für x
    91. for(int x=0; x<Breite; x++)
    92. {
    93. //Wenn irgendwo auf der Karte "Kreis=true" ist dann....
    94. if(Karte[x][y].Kreis==true)
    95. {
    96. //Einen Kreis zeichnen
    97. Game.Draw(SpriteO);
    98. }
    99. }
    100. }
    101. Game.Display();
    102. }
    Alles anzeigen


    Dazu hätte ich auch noch eine Frage: Wie kann man Sprites wieder verstecken?

    MfG
    Check
  • Hi,

    arbeite selbert auch mit SFML und versuche mal dein Problem zu interpretieren, also der Code sieht auf den ersten Blick in Ordnung aus!

    Checkmateing schrieb:

    Dazu hätte ich auch noch eine Frage: Wie kann man Sprites wieder verstecken?

    Das Bild einfach nicht Zeichnen? Evtl. mittels einer zusätzlichen bool Variable den Zeichnen-Status des jeweiligen Sprites abfragen.

    Checkmateing schrieb:

    Ich verstehe nicht was daran Falsch sein soll..... Zerbreche mir schon seit gestern Abend (23:47Uhr) den Kopf....
    Soll ich mal den ganzen Code posten? Wenn ja, sagt mir bitte nur was verursacht, dass das Fenster weiß bleibt. (Es sollte eigentlich Schwarz sein wenn es nicht geleert wird, oder? *denk*) Bitte nichts anderes, dass ich das hätte besser lösen können, oder das anders machen können.... Ich möchte mich selbst um diese Sachen kümmern, mich interessiert hierbei wirklich nur wieso das Fenster weiß bleibt.
    Also, wer den vollständigen Code benötigt, fragt hier dann mal nach, ich schreibe ihn sofort hier nieder.


    Richtig das Fenster ist schwarz wenn man die Standart Clear anweisung ohne weitere Parameter/Zeichnungen druchfürt.

    Checkmateing schrieb:

    Hay! Hab jetzt einmal Tic-Tac-Toe geschrieben. Sprites werden zugeordnet zum jeweiligem Image.
    Ich habe alles Mögliche ab gecheckt und mir ist aufgefallen, dass nicht mal in die Key-Abfragen gegangen wird, denn man kann das ganze, so hab ich es eingegeben, nicht mit Escape schließen.
    Somit ist zu schließen das er irgendwo in einer Schleife hängt.
    Vielleicht könnt ihr etwas finden.... Hier ist der Anfang meines Codes bis zur Event-Schleife. Anzumerken ist, das man den "Schließen"-Button nicht klicken kann. Er muss irgendwo hängen, noch vor der Event-Schleife.... Aber wo?


    Da dein Fenster weiß bleibt und du den "Schliessen"-Button nicht anklicken kanst, kannst du davon ausgehen das er vor der Renderschleife sich irgentwo aufhängt.
    Entweder ist es so wie du es gesagt hasst das die Bilder nicht geladen werden können, wobei dann eigentlich dein Programm beenden werden sollte.
    Also wird der Fehler nach dem Ladevorgang und vor der Renderschleife liegen.
    Ich würde nun darauf Tippen das er sich in CreateMaskFromColor aufhängt, aber genau kann man das jetzt nicht sagen.
    Was für Version von SFML nutzt du? Am einfachsten den Fehler zu finden wäre es mit nem Debugger drüber zu gehen.

    Mfg Rushh0ur
  • Ich benutze die Version 1.6.

    Der Debugger spukt sehr verständliche Fehlermeldungen aus. (Nach dem Motto, "Hallo Welt!"-Programm auf Stupidedia in PHP^^)

    Das CreateMaskFromColor habe ich zufällig im Internet gefunden, als ich mich ein bisschen über Event-Funktionen informieren wollte. Keine Ahnung warum das da kam. Ich glaube da hatte einer ein Problem mit dem Event-Teil seines Programmes und wollte wissen wie man Transparenz in einem Bild bei führt.
  • Einmal mit dem Debugger von Visualal Studio in Einzelschritten drüber und voila hat man den Fehler gefunden. :)

    Der übeltäter -> sf :: Sleep, schaut man in die Docu von SFML erfährt man das hier:
    Time to sleep, in seconds (must be >= 0)

    Und bei einem Wert von 5000, 550 bzw 245 macht das Programm mal ne weile Pause.

    Ich weiß nicht genau was du damit bezwecken wolltest, wenn du aber damit das Spiel "abbremsen" möchtest,
    dann würde ich dir empfehlen ganz einfach ein FrameLimit zu setzen oder halt die Pausen kleiner gestallten wobei das Game wahrschienlichen dann "laggen" wird.

    Zum Beispiel auf 50 Bilder Pro Secunde:

    Quellcode

    1. sf::RenderWindow Game(sf::VideoMode(800, 600, 32), "Tick-Tack-Toe");
    2. Game.SetFramerateLimit(50);


    Mfg Rushh0ur