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

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

11

28.01.2011, 17:42

Wie gesagt, lass es so wie es ist, und übergeb dem thread einfach ein objekt von Intro...

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

12

28.01.2011, 17:46

Schau dir mal Events an, dann kannst du auf "ready" verzichten:

http://www.codeguru.com/cpp/cpp/cpp_mana…icle.php/c14447

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

13

28.01.2011, 17:46

Ja so wie Nox es gerade vorgeschlagen hat, wollte ich es auch gerade schreiben. Allerdings finde ich diese Lösung nicht wirklich die beste, aber es sollte funktionieren.

Und was du da schreibst ist keine Begründung für Threads. Man zeichnet eben das Intro und stoppt die Zeit, nach einer bestimmten Zeit blendet man irgendeinen Namen ein, nach ein paar Sekunden blendet man ihn wieder aus und das nächste erscheint. Das alles funktioniert wunderbar ohne Threads. Immer Nacheinander Zeichen und Eingaben überprüfen und das Zeichnen eben zeitabhängig machen.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

14

28.01.2011, 17:48

Das meiste wurde schon gesagt. Von mir gibt es dazu noch eine kleine Checkliste:
1. brauchst du wirklich threads (die machen das Programm und vorallem das Debuggen sehr schnell sehr umständlich)?
2. soll es wirklich eine Klassenmethode sein?
3. muss dein Thread wirklich die Infos einer Klasse wissen?
Falls drei Mal "ja" die Antwort ist folgender "Kniff":


sf::Thread animation_thread(&Intro::drawIntro,this);

void Intro::drawIntro(void* UserData)
{
Intro* ptr = static_cast<Intro*>(UserData);

Ok das mit dem Posten hier geht schnell von dannen, ich habe jetzt deine Tipps benutzt Nox, danke dir, ich benutze doch einen Thread!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

15

28.01.2011, 19:15

wieso machst du es dir immer so schwer? mal ganz davon abgesehn, dass du für ein intro sicher kein thread brauchst könntest du auch einfach von sf::Thread erben. dann musst du nicht mit funktions oder methodenzeigern hantieren.
steht aber auch im offiziellen tutorial zu den threads der sfml.

ausserdem verwendet man Terminate nur im äussersten notfall, das kann abstürze verursachen. steht auch im tutorial.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

16

28.01.2011, 19:16

Wofür brauchst Du denn sleep(5000). Das macht imho keinen Sinn.

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

17

28.01.2011, 19:18

Wofür brauchst Du denn sleep(5000). Das macht imho keinen Sinn.

Das war doch nur ein Lückenfüller Mensch!
Ich werde da später richtigen Code einsetzten!
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

18

28.01.2011, 19:25

Verzeih mir, aber in dem Post klang es so, als wäre es ein Problem.
NachoMan hat aber recht, in so einem Fall wäre es besser von sf::Thread zu erben.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

19

29.01.2011, 00:18

Developer_X: Ich hoffe du hast dir nicht nur Nox Code durchgelesen.

Zitat


1. brauchst du wirklich threads (die machen das Programm und vorallem das Debuggen sehr schnell sehr umständlich)?
2. soll es wirklich eine Klassenmethode sein?
3. muss dein Thread wirklich die Infos einer Klasse wissen?


Ich halte wenig davon, ein Feature zu verwenden, nur weil man dieses Feature eben auch mal ausprobieren möchte - zumindest nicht in einem Projekt, das auch irgendwie was werden soll und wenn man es eben absolut nicht braucht.
Ein Sleep als Lückenfüller, halte ich im Übrigen für keine gute Idee, weil es etwas simuliert, was kein Code durch das Sleep ersetzt wird machen wird; es wird nämlich pausiert.

Ich möchte dir mit etwas Pseudocode verdeutlichen, wie sich dein Problem ohne Threads bequem lösen lässt.

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
while( intro_wird_angezeigt )
{
    intro->draw();
    intro->update();
}

void intro::draw()
{
    if( intro_time > 2.0 )
         mein_name->show();
    if( intro_time > 5.0 )
         mein_name->hide();
         spieltitel->show();
    //...
   intro_time += frame_time;
}

void intro::update()
{
   if( is_key_pressed( ESC ) )
         exit_intro();
         start_main_menu();
}

So könnte es beispielsweise ganz grob aussehen. Es wird immer ein Frame gerendert, die Eingaben überprüft, ein Frame gerendert, Eingaben überprüft...und es werden verschiedene Anzeigen gemacht; ganz nach deinen Wünschen. Oder was genau hast du vor, dass du unbedingt Threads benötigst?

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

20

29.01.2011, 09:09

Wenn es so einfach wäre, ich zeige dir mal meinen Code :

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
void Intro::start()
{
    sf::Thread thread(&drawIntro,this);

    thread.Launch();

    while(window->IsOpened()&&!ready)
    {
        sf::Event Event;
        while (window->GetEvent(Event))
        {
            if (Event.Type == sf::Event::KeyReleased)
            {
                if(close_able&&Event.Key.Code == sf::Key::Escape)
                {
                    thread.Terminate();
                    window->Close();
                }
            }
        }
        window->Display();

        Sleep(1000/25);
    }

    thread.Terminate();
}

void Intro::drawIntro(void* UserData)
{
    Intro* ptr = static_cast<Intro*>(UserData);
    ptr->ready = false;

    //  Load Images and Musics
    vector<sf::Image*> images;
    vector<sf::Music*> musics;

    for(int i = 0;i<ptr->infos.size();i++)
    {
        sf::Image* image = new sf::Image();
        image->LoadFromFile(ptr->infos[i].image);
        sf::Music* music = new sf::Music();
        music->OpenFromFile(ptr->infos[i].music);

        images.push_back(image);
        musics.push_back(music);
    }

    //  Start Animation
    float black = 255;

    for(int i = 0;i<images.size();i++)
    {
        musics[i]->Play();

        sf::Sprite s;
        s.SetImage(*images[i]);

        s.SetPosition(ptr->WIDTH/2 -images[i]->GetWidth()/2,
                      ptr->HEIGHT/2-images[i]->GetHeight()/2);

        // Dunkel verschwinden lassen
        for(;black>0.0f;black-=2)
        {
            ptr->drawInfo(&s,black);
            sf::Sleep(0.010);
        }

        // Kurz Warten
        sf::Sleep(1.000);

        //  Dunkel machen
        for(;black<255;black+=2)
        {
            ptr->drawInfo(&s,black);
            sf::Sleep(0.010);
        }

        musics[i]->Stop();
    }

    //  Lösche die Bilder und Musik Daten aus dem Arbeitsspeicher
    for(int i = 0;i<ptr->infos.size();i++)
    {
        delete images[i];
        delete musics[i];
    }


    ptr->ready = true;
}

void Intro::drawInfo(sf::Sprite* s,float trans)
{
    window->Draw(*s);
    window->Draw(sf::Shape::Rectangle(0,0,WIDTH,HEIGHT,sf::Color(0,0,0,trans)));

    window->Display();
}


Also was der macht, kannst du ja an den Kommentierungen nachlesen.

Doch um ehrlich zu sein, wenn ich das starte, dann sieht man nur schwarz, egal was man macht, warum?

Ich habe auch schon in der Methode drawInfo das Sprite in eine Datei schreiben lassen und ja, das Sprite wurde korrekt geladen.

Woran liegt es denn, dass nichts auf dem Bildschirm erscheint?

M.f.G.: Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige