You are not logged in.

  • Login

1

Friday, February 4th 2011, 11:41pm

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?

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// SFML statisch linken(Projekteinstellungen->C++->Präprozessor)
#define SFML_STATIC
 
// Includes
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
 
// Libs dem Projekt hinzufügen(Projekteinstellungen->Linker->Eingabe)
#pragma comment(lib, "sfml-system-s-d.lib")
#pragma comment(lib, "sfml-main-d.lib")
#pragma comment(lib, "sfml-graphics-s-d.lib")
#pragma comment(lib, "sfml-window-s-d.lib")
 
int main()
{
	struct S_Feld
	{
		bool Besetzt;
		bool Kreuz;
		bool Kreis;
	};
	bool Spieler=true;
	bool An=true;
	const int Hoehe=3;
	const int Breite=3;
	int x=0;
	int y=0;
	S_Feld Karte[Hoehe][Breite];
	//SFML Game initialisieren
	sf::RenderWindow Game(sf::VideoMode(800, 600, 32), "Tick-Tack-Toe");
	//SFML Event Handler erstellen
	sf::Event Event;
 
	//Create Image Buffer Background
	sf::Image ImageB;
	if(!ImageB.LoadFromFile("Background.png"))
		return EXIT_FAILURE;
	//Create Image Buffer "O"
	sf::Image ImageO;
	if(!ImageO.LoadFromFile("Kreis.png"))
		return EXIT_FAILURE;
	//Create Image Buffer "X"
	sf::Image ImageX;
	if(!ImageX.LoadFromFile("Kreuz.png"))
		return EXIT_FAILURE;
	//Create Image Buffer Markierung
	sf::Image ImageM;
	if(!ImageM.LoadFromFile("Markierung.png"))
		return EXIT_FAILURE;
 
	//SetColorKey ImageO
	ImageO.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
	//SetColorKey ImageX
	ImageX.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
	//SetColorKey ImageM
	ImageM.CreateMaskFromColor(sf::Color(255, 0, 0), 0);
 
	//SpriteB
	sf::Sprite SpriteB;
	SpriteB.SetImage(ImageB);
	//SpriteO
	sf::Sprite SpriteO;
	SpriteO.SetImage(ImageO);
	//SpriteX
	sf::Sprite SpriteX;
	SpriteX.SetImage(ImageX);
	//SpriteM
	sf::Sprite SpriteM;
	SpriteM.SetImage(ImageM);
	//SpriteM2
	sf::Sprite SpriteM2;
	SpriteM2.SetImage(ImageM);
	//SpriteM3
	sf::Sprite SpriteM3;
	SpriteM3.SetImage(ImageM);
	//SpriteM4
	sf::Sprite SpriteM4;
	SpriteM4.SetImage(ImageM);
	//SpriteM5
	sf::Sprite SpriteM5;
	SpriteM5.SetImage(ImageM);
	//SpriteM6
	sf::Sprite SpriteM6;
	SpriteM6.SetImage(ImageM);
	//SpriteM7
	sf::Sprite SpriteM7;
	SpriteM7.SetImage(ImageM);
	//SpriteM8
	sf::Sprite SpriteM8;
	SpriteM8.SetImage(ImageM);
	//SpriteM9
	sf::Sprite SpriteM9;
	SpriteM9.SetImage(ImageM);
 
 
	//SetPosition SpriteB
	SpriteB.SetPosition (0, 0);
	//SetPosition SpriteO
	SpriteO.SetPosition (17, 2);
	//SetPosition SpriteX
	SpriteO.SetPosition (17, 2);
	//SetPosition SpriteM
	SpriteM.SetPosition (118, 72);
	//SetPosition SpriteM2
	SpriteM2.SetPosition(391, 72);
	//SetPosition SpriteM3
	SpriteM3.SetPosition(635, 72);
	//SetPosition SpriteM4
	SpriteM4.SetPosition(116, 275);
	//SetPosition SpriteM5
	SpriteM5.SetPosition(388, 275);
	//SetPosition SpriteM6
	SpriteM6.SetPosition(626, 275);
	//SetPosition SpriteM7
	SpriteM7.SetPosition(122, 473);
	//SetPosition SpriteM8
	SpriteM8.SetPosition(391, 473);
	//SetPosition SpriteM9
	SpriteM9.SetPosition(636, 473);
 
	while(Game.IsOpened())
	{
		//Event Handler Loop
		while(Game.GetEvent(Event))
		{
			if(Event.Type == sf::Event::Closed)
				Game.Close();
		}

2

Saturday, February 5th 2011, 2:00pm

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.

3

Sunday, February 6th 2011, 11:13am

zeig mal den code wo gecleart und geflipt wird

4

Sunday, February 6th 2011, 11:23am

C/C++ Quellcode

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


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

MfG
Check

5

Thursday, February 10th 2011, 5:59pm

Ist nämlich alles richtig, oder?
Ich werde auch nicht schlau daraus.... Ö.o

MfG
Check

6

Thursday, February 10th 2011, 6:53pm

kenne mich mit SFML überhaupt nicht aus
sieht mir auch recht kaputt aus (also SFML, nicht dein zeug)

7

Thursday, February 10th 2011, 7:13pm

Es heißt aber sie soll besser sein wie die SDL.
Ich denke es liegt bestimmt mal wieder an MVC. :rolleyes:

MfG
Check

8

Thursday, February 10th 2011, 7:24pm

mit "besser" wäre ich immer vorsichtig

9

Thursday, February 10th 2011, 8:16pm

Ich zitiere die Anderen. :P

MfG
Check

10

Friday, February 11th 2011, 9:55pm

Ich denke es liegt an den Files. Werde es Morgen mal austesten und die *.png Files in paint.NET nochmal als *.png abspeichern. Ich habe gelesen, dass "schlecht" "erstellte" *.png Files die SFML nicht so gut einlesen könne, was uns zum Problem bringt das er nichts laden kann. Wie gesagt, teste es Morgen mal aus.

MfG
Check

11

Saturday, February 12th 2011, 9:18pm

Ich empfehle IrfanView oder/und Gimp

12

Sunday, February 13th 2011, 5:57pm

Bleibt leider weiß....

13

Tuesday, February 15th 2011, 12:43am

Hi,

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

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.

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.

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

14

Tuesday, February 15th 2011, 8:09pm

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.

15

Wednesday, February 23rd 2011, 5:06pm

Weiß niemand die Lösung? Ich kann es nicht finden. :[
Vielleicht habe ich gerade zu viel mit Latein zu tun.... <.<

MfG
Check

16

Wednesday, February 23rd 2011, 6:17pm

Lad mal dein kompletes Projekt hoch ich werde mal drüber schauen, wenn du willst.

Mfg Rushh0ur

17

Wednesday, February 23rd 2011, 8:43pm

Ich tu´s ungern, weil ich weiß das viele Sachen drin sind, die man hätte einfacher lösen können, was ich aber mit Absicht nicht getan habe.
Aber weil ich den Fehler nicht finde: (:D)
*Klick*

MfG
Check

18

Wednesday, February 23rd 2011, 9:29pm

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:

C/C++ Quellcode

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


Mfg Rushh0ur

19

Wednesday, February 23rd 2011, 9:49pm

Das hatte er bestimmt von der SDL_Delay, weil da ist es in millisekunden angegeben worden

20

Thursday, February 24th 2011, 4:09pm

Ne, habe es vom Windows-Sleep abgeleitet... :rolleyes:

MfG
Check

Social bookmarks