Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

1

24.12.2013, 00:55

[C++] [SFML] Render-Window verliert nach dem Erstellen den Focus.

C-/C++-Quelltext

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
#include "CGame.hpp"
#include <iostream>

using namespace std;

int main()
{
    int players=0;
    int humanPlayers=0;
    int kiPlayers=0;
    int lifes=0;
    bool badInput=false;
    
    cout << "I welcome you to a new game of Kosmosgeballer" << endl;
    
    do
    {
        badInput=false;
        cout << "How many Humans want to fight out in Space today, sir? (0 to 2):";
        cin >> humanPlayers;
        if (cin.fail() || cin.bad())
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Bad Input, my Dear" << endl;
            badInput=true;
        }
        if (humanPlayers < 0 || humanPlayers > 2)
        {
            cout << "No Sir, wrong Number!" << endl;
            badInput=true;
        }
    } while (badInput);
    
    
    do
    {
        badInput=false;
        cout << "Good! And how much of those robotic Idiots? (0 to "<< (4 - humanPlayers)<<"):";
        cin >> kiPlayers;
        if (cin.fail() || cin.bad())
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Bad Input, my Dear" << endl;
            badInput=true;
        }
        if (kiPlayers < 0 || kiPlayers > (4 - humanPlayers))
        {
            cout << "No Sir, wrong Number!" << endl;
            badInput=true;
        }
    } while (badInput);
    
    do
    {
        badInput=false;
        cout << "Excellent! And how much Lifes do all the players get? (1 to 20):";
        cin >> lifes;
        if (cin.fail() || cin.bad())
        {
            cin.clear();
            while (cin.get() != '\n');
            cout << "Bad Input, my Dear" << endl;
            badInput=true;
        }
        if (lifes < 1 || lifes > 20)
        {
            cout << "No Sir, wrong Number!" << endl;
            badInput=true;
        }
    } while (badInput);
    

    players=humanPlayers + kiPlayers;
    CGame game(players, humanPlayers, lifes);


    game.run();

return 0;
}


Das game wird erstellt, inkl. Render-Window, allerdings hat es nicht den Fokus. Man muss also erst einmal reinklicken, damit die Key-Events erkannt werden. Was sich im Fullscreen-Modus als recht nervig erweist.
Das Problem besteht auch nur, wenn ich mit cin etwas abfrage. Erstelle ich das game inkl. Fenster ohne vorherige Eingaben, gibt es keine Probleme.

Wie erreiche ich, dass das neu erstellte Fenster direkt den Focus hat?

Gruß und Dank sei euch gewiss,
Marcel

2

24.12.2013, 01:14

C-/C++-Quelltext

1
2
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Vllt hilfts.
Aber den Code von höherer Relevanz zu sehen wär vllt auch hilfreich. (=> Der wo die sf::RenderWindow-Instanz benutzt wird)

MfG
Check

3

24.12.2013, 21:00

Du hast ja 2 Fenster offen einmal die Konsole und einmal das SFML Fenster.
Überlege dir mal für welches der beiden cin ist und dann fällt vielleicht der Groschen!

Gruß koschi.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

4

25.12.2013, 14:04

Er schrieb folgendes.

Zitat

Das game wird erstellt, inkl. Render-Window, ...

Da die Instanz nach std::cin erstellt wird, macht das wenig Sinn, zumindest erscheint es so, dass innerhalb der Instanz kein std::cin mehr gebraucht wird und ansonsten ist alles davor, demnach ist nur ein Fenster offen.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

25.12.2013, 20:18

Nein, Check. Wenn die Konsole offen ist, ist sie offen und verschwindet nicht einfach wieder von allein.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

25.12.2013, 21:33

Natürlich. Ich meine das auch bezogen auf einen begrenzten Zeitpunkt.

MfG
Check

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

7

28.12.2013, 14:35

C-/C++-Quelltext

1
2
std::cin.clear();
std::cin.ignore(std::numeric_limits::max(), '\n');

Vllt hilfts.
Aber den Code von höherer Relevanz zu sehen wär vllt auch hilfreich. (=> Der wo die sf::RenderWindow-Instanz benutzt wird)

MfG
Check
Nein, das klappt leider nicht.
Nein, Check. Wenn die Konsole offen ist, ist sie offen und verschwindet nicht einfach wieder von allein.
Ok, aber wie schließe ich sie wieder, bevor ich das neue Fenster öffne?

Ich liefere mal den Code des CGame-Konstruktors, in dessen Installationsliste auch das RenderWindow erstellt wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CGame::CGame(int players, int humanPlayers, int lifes)
: _timePerFrame(sf::seconds(1.f/60.f))
, _window(sf::VideoMode::getDesktopMode(), "Kosmosgeballer beta - v0.1", sf::Style::Fullscreen)
, _view(sf::FloatRect(0.f,0.f,1920.f,1080.f))
{
    _gameOver=false;
    _humanPlayerCount=humanPlayers;
    _backgroundTexture.loadFromFile("Media/Textures/Background2.png");
    _backgroundImage.setTexture(_backgroundTexture);

    _window.setView(_view);

    if ((_window.getSize().x / _window.getSize().y) <= (16.f/9.f))
        _view.setViewport(sf::FloatRect(0.f, ((_window.getSize().y/2.f)-((_window.getSize().x/(16.f/9.f))/2.f))/_window.getSize().y, 1.f, (_window.getSize().x/(16.f/9.f))/_window.getSize().y));
    else _view.setViewport(sf::FloatRect(((_window.getSize().x/2.f)-((_window.getSize().y*(16.f/9.f))/2.f))/_window.getSize().x, 0.f, (_window.getSize().y*(16.f/9.f))/_window.getSize().x, 1.f));

    for (int i=0; i<players; i++)
    {
        _playerlist.emplace_back (_window, i, lifes);
        _playerlist.back().reset(_playerlist, 0);
        if (i >= humanPlayers) _mutterlist.emplace_back (i, _playerlist);
    }
}

8

28.12.2013, 15:26

*klick* :(

MfG
Check

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

9

28.12.2013, 15:33

Das hab ich auch schon gelesen :(

Nur bedenke, von wann Laurent's Post ist, März 2011. Ich hätte angenommen, dass es mittlerweile gefixt wurde.

10

28.12.2013, 16:21

Wenn dann in der 2.1

MfG
Check

Werbeanzeige