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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

17.10.2011, 22:41

Lade Bildschirm

Hallo
Ich habe da mal so ein Kleine Problem.
Ich habe Klassen für alle Möglcihe Spilzustände ( Intro, Game, Credits, None )
setzten tue ich sie mit:

C-/C++-Quelltext

1
m_pIntro->Init();

Wobei Intro ein Pointer ist: CIntro* m_pIntro = new CIntro;
Nun zu dem Problem: Immer wenn ich Init oder Exit aufrufe Bleibt das Programm stehen weil es Lädt.
Ich möchte aber einen Lade BIldschirm ( einfach nur ein Bild ).
Ich habe schon gedacht das man das mit mehreren Threeads macht.
Wie würdet ihr das Realisieren?
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

2

17.10.2011, 22:55

Ein Bild anzuzeigen sollte ansich kein Problem sein, es wird ja angezeigt, bis du es neu zeichnest also kannst du in der Zwischenzeit auch laden.
Ladebalken wird schwerer, erstens musst du eine ungefähre Prozentzahl ausrechnen (also wissen, wie viele Objekte du insgesamt laden musst oder so) und für eine flüssige Animation wirst du zweitens wohl Threads benutzen wollen (obwohl die ansich nicht schwer sind, solange man fast nichts synchronisieren muss).
Lieber dumm fragen, als dumm bleiben!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

18.10.2011, 13:01

Ich habe immoment es mir so gedacht das so bald SetGameState aufgerufen wird eine Variable auf true gesetzte wird. In der Render FUnktion wird dann geguckt ob diese Variable auf true ist und rendert dann das Bild. Aller dings passiert nichts. Bleibt alles Dunkel^^
MfG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

4

18.10.2011, 13:10

Wahrscheinlich machst du es so :

1. Laden
2. Wenn geladen wird, Bild rendern

Da ist es klar wieso es schwarz bleibt, da Schritt 2 auf Schritt 1 wartet.

Du kannst es soch machen:

1. Variable setzen, dass geladen werden muss
2. Wenn geladen werden muss Bild zeichnen
3. Wenn geladen werden muss laden

lg

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

5

18.10.2011, 13:14

Ein interessantes Thema. Bisher habe ich auch immer alle in eine init Methode gepackt und das Programm lief erst dann los, wenn alles im Speicher war.

Nur was macht man wenn man immer größere Spiele entwickelt? Was sollte man immer am Anfang initialisieren, was erst zur Laufzeit?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

18.10.2011, 13:22

Naja, wenn es wirklich viele Daten sind, die geladen werden müssen würde ich das so machen, dass das Zeugs erst geladen wird, wenn man es braucht. Levels werden dann halt beim Level laden grösstenteils geladen und allenfalls noch Geometrydaten (vor allem Landschaft) wird wahrscheinlich dynamisch geladen werden müssen.

Bei kleineren Sachen würde ich einfach mal schauen ob man es verkraften kann alles am Anfang zu laden. Das ist dann natürlich toll, weil das Laden der einzelnen Levels dann relativ schnell geht.

Einen Ladescreen kann man gut so machen, dass man einen State macht, wo man das anzeigt und dann kann man das Laden in einem seperaten Thread machen, wo man dann mit einer Variable o.ä. dem Hauptthread mitteilt, wenn das Laden vorbei ist (oder auch einen Zwischenbericht wie viel noch zu laden ist).

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

18.10.2011, 13:42

@iWumbo
Ja^^ Das will ich ja habe aber keine anhnung wie ich es Realiesieren soll^^
Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool CMain::SetGameState( GameState NewGameState )
{
    bool r = true;

    l = true; // Für das Lade Bild in der Render Funktion

    // Alten Spielzustand entladen
    switch(m_GameState)
    {
        case GS_INTRO:      m_pIntro->IntroExit();      break;
        case GS_GAME:       m_pGame->GameExit();        break;
        case GS_CREDITS:            m_pCredits->CredExit();     break;
    }
//....... Neuen Spielzustand laden und l wieder auf false setzten

In der Render Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool CMain::MainRender(float fTimePassed)
{
    bool r = true;

    if( l == true )
    {
        // Hier dann das Bild Rendern
    }
    else
    {
    // Aktuellen Spielzustand rendern
    switch(m_GameState)
    {
        case GS_INTRO:      r = m_pIntro->IntroRender( fTimePassed );   break;
        case GS_GAME:       r = m_pGame->GameRender( fTimePassed );     break;
        case GS_CREDITS:            r = m_pCredits->CredRender( fTimePassed );  break;
    }

Wie gesagt kein Plan wie ich das Mit dem Bild hinbekomme^^
Danke
MfG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

18.10.2011, 13:46

Zu den Lademöglichkeiten werden in Game Coding Complete von Mike McShaffry einige diskutiert. Sachen zur Laufzeit nachladen bringt nämlich einige Probleme mit sich. Ein großes Problem ist es zum Beispiel, dass die Daten dann auch da sein müssen, wenn sie gebraucht werden. Eine Möglichkeit dieses Problem zu lösen, ist es dann zum Beispiel Passagen im Spiel einzubauen, bei denen der Spieler einfach etwas aufgehalten wird. Das kann zum Beispiel ein Fahrstuhl sein, oder ein langer Gang. Dabei gibt es dann natürlich auch andere Konzepte. Dies hier funktioniert für ein lineares Spiel, aber Open World Games können damit nichts anfangen. Dafür gibts dann halt wieder andere Möglichkeiten. Dazu findest du aber sicherlich auch Sachen im Netz.
Wie du ein einfaches Ladebild machst ist ja schon beantwortet. Und für einen Ladebalken müsstest du dann halt mit Threads arbeiten.


Edit:
Mach dir doch einen weiteren GameState für den Ladebildschirm. Dieser Rendert sich einmal und setzt dann den State auf den gewollten. Dieser läd sich, wobei der Ladescreen ja noch auf dem Bildschirm ist.
Du könntest dem Ladescreen den Folgestate im Konstruktor übergeben. Je nachdem wie du das mit deiner Update und deiner Render Funktion löst, macht der State dann halt solange nichts, bis er sich zum ersten mal gezeichnet hat. Danach kann er dann den GameState austauschen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

9

18.10.2011, 13:56

Danke das ist eine gute Idee! Manchmal stehe ich bisschen auf der Leitung^^
Ich werde mich dann mal ran machen.
Wenn ich fertig bin und es funktioneiert, oder auch nicht, melde ich mich nochmal.
MfG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

10

18.10.2011, 15:39

So habe es jetzt erstmal ohne State gemacht.
Ich habe jetzt in SetGameState folgenden Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    m_pLoad->LoadInit();
    m_pLoad->LoadRender();

    // Alten Spielzustand entladen
    switch(m_GameState)
    {
        case GS_INTRO:      m_pIntro->IntroExit();      break;
        case GS_GAME:       m_pGame->GameExit();        break;
        case GS_CREDITS:    m_pCredits->CredExit();     break;
    }

    m_pLoad->LoadRender();
//....
//.... usw

Jetzt habe ich nur das Problem das der Ladebildschirm immer erst dann kommt wenn alles erledigt ist. Aber ich rufe doch Render vor laden und entladen auf!?
Habe es getestet wenn ich alles weg lasse kommt sofort der Ladebildschirm wenn ich dann noch etwas laden will und davor auch Render aufrufe kommt der Ladebildschirm erst wenn geladen ist!
Warum?
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige