Пример #1
0
Файл: music.cpp Проект: vsrz/VHH
void Music::Initialize()
{
	menu_snd.openFromFile("./Resources/Sounds/menumusic.ogg");
	menu_snd.setVolume(60.0f);
	menu_snd.setLoop(true);
	battle_snd.openFromFile("./Resources/Sounds/battlemusic.ogg");
	battle_snd.setVolume(40.0f);
	battle_snd.setLoop(true);

	menu_snd.play();
}
Пример #2
0
int InitGL()					 // All Setup For OpenGL goes here
{
	glShadeModel(GL_SMOOTH);		 // Enables Smooth Shading
    glClearColor(0.0, 0.0, 0.0, 1.0);
	glClearDepth(1.0f);				// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);		// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);			// The Type Of Depth Test To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculation
    
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);    // Uses default lighting parameters
	glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
	glEnable(GL_NORMALIZE);
    
	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
	glEnable(GL_LIGHT1);
    
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    
    // and now some init I need to do for other stuff
    
    ilInit(); /* Initialization of DevIL */
    
    // mouse stuff
    pointer = toGLTexture("./dati/models/textures/mirino.png");
	lastx = middleX;
    lasty = middleY;
    relativeX = 0.0;
    relativeY = 0.0;
    glutWarpPointer(middleX, middleY); // put the cursor in the middle of the screen
    
	//for the menu

	InitMenu();

    // for the text
    
    t3dInit();
    
    // for the skybox
    
    initSkybox();
    
    // for the blend
    
    initAssets();

	// for the sounds
    if (!sound_hit.loadFromFile("./dati/audio/hit.wav")) return -1;
	if (!sound_miss.loadFromFile("./dati/audio/miss.wav")) return -1;
	if (!sound_youreempty.loadFromFile("./dati/audio/youreempty.wav")) return -1;
	if (!sound_ohno.loadFromFile("./dati/audio/ohno.wav")) return -1;
	music.setLoop(true);
	if (!music.openFromFile("./dati/audio/Rango_Theme.ogg")) return -1;
	music.play();
    
	return TRUE;					// Initialization Went OK
}
void SoundEngine::playMusic(sf::Music & Music)
{
	if (activeMusic == true)
	{
		Music.setLoop(true);
		Music.setVolume(20);
		Music.play();
	}
}
		void setLoop(bool val) {
			sound.setLoop(val);
		}
Пример #5
0
	void Music::SetLooping(bool isLooping)
	{ music.setLoop(isLooping); }
Пример #6
0
int main(void)
{
    // Update Überprüfung
    stringstream updateVerfuegbarText;
    updateVerfuegbarText << "Robber " << ROBBER_VERSION;

    if(newVersionAvailable())
    {
        // Neue Version verfügbar!
        cout << endl << "! Es steht eine Aktualisierung des Spiels zum Herunterladen bereit !" << endl << endl;
        updateVerfuegbarText << " (Update verfuegbar: " << LATEST_VERSION << " )";
    }
    else
    {
        // Keine neue Version verfügbar
        cout << endl << "Das Spiel läuft in der aktuellsten Version!" << endl << endl;
    }


    // Fenster- und Grafikeinstellungen
    sf::VideoMode aufloesung = sf::VideoMode::getDesktopMode();


    // Musik loopen!
    musik.setLoop(true);

// Fenster erstellen
#ifndef LINUX
    // Nur Windows

    sf::RenderWindow fenster(aufloesung, "Robber", sf::Style::None);

#else
    // Nur Linux

    sf::RenderWindow  fenster(aufloesung, "Robber", sf::Style::Fullscreen);

#endif

    // Fensterreferenz erstellen!
    globalFenster = &fenster;

    // Maximal 50 FPS
    fenster.setFramerateLimit(50);

    // vsync!
    fenster.setVerticalSyncEnabled(true);

    // Cursor off!
    fenster.setMouseCursorVisible(false);

    // SFML View erstellen!
    sf::View ansicht(sf::FloatRect(0,0, aufloesung.width, aufloesung.height));


    // Anzeigebereich festlegen
    ansicht.setViewport(sf::FloatRect(0,0, 1, 1));
    fenster.setView(ansicht);

    // AnimationList vorbereiten
    list<animation *> animationList;

    // Renderlist vorbereiten
    list<sf::Drawable *> renderList;

    // Hintergrundbild
    sf::Texture* hintergrundTextur = 0x0;
    sf::Sprite* hintergrund = 0x0;

    // Globale Schriftart laden!
    standardSchriftart.loadFromFile("resources/DejaVuSans.ttf");

    // Hauptmenü laden!
    aktuellesLevel = levelLaden("hauptmenu");
    aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);

    // Version im Spiel anzeigen!
    benachrichtigung version(updateVerfuegbarText.str(), 25, 25, 20);
    renderList.push_back((sf::Drawable *)&version.text);

    // DebugMsg anzeigen!
    renderList.push_back((sf::Drawable *)&debugMsg.text);

    // DebugMsg2 anzeigen!
    renderList.push_back((sf::Drawable *)&debugMsg2.text);



    // Benachrichtigung für Zeit erstellen
    benachrichtigung zeit("Zeit", 25, 150, 20);

    // Zeit nur anzeigen, wenn man nicht im Hauptmenü und nicht "Game Over" ist
    if(aktuellesLevel->name != "hauptmenu" && aktuellesLevel->name != "gameOver")
    {
        renderList.push_back((sf::Drawable *)&zeit.text);
    }


    // Benachrichtigung für Punkte erstellen
    benachrichtigung anzahlPunkte("0 Punkte", 25, 125, 20);
    if(aktuellesLevel->name != "hauptmenu" && aktuellesLevel->name != "gameOver")
    {
        renderList.push_back((sf::Drawable *)&anzahlPunkte.text);
    }


    // Entwicklernachricht anzeigen
    debugMsg.updateText("Game running in Debug Mode!");


    // Benachrichtigung für Lärm erstellen
    benachrichtigung schall("Lärm", 25, 175, 20);
    if(aktuellesLevel->name != "hauptmenu" && aktuellesLevel->name != "gameOver")
    {
        renderList.push_back((sf::Drawable *)&schall.text);
    }


    // Konsole erstellen!
    console::eingabeFeld.setFont(standardSchriftart);
    console::eingabeFeld.setColor(sf::Color::Red);
    console::eingabeFeld.setCharacterSize(20);

    // Konsole anzeigen lassen!
    renderList.push_back((sf::Drawable *)&console::eingabeFeld);


    // Spielertextur laden!
    sf::Texture spielerTexture;
    sf::Sprite spieler;
    spielerTexture.loadFromFile("resources/spieler.png");

    // Spielertextur zuordnen
    spieler.setTexture(spielerTexture);

    // Textur auf 1/4 Fläche verkleinern
    spieler.setScale(0.5, 0.5);

    // Mitt des Spielers für sämtliche Rotationen (Rotation, Translation)
    spieler.setOrigin(sf::Vector2f(50, 50));

    // Spieler auf Startposition setzen
    spieler.setPosition(aktuellesLevel->spielerPosition);

    // Spieler immer anzeigen!
    renderList.push_back(&spieler);

    // Dunkles Fenster um den Spieler (für dunkle Levels)
    sf::Texture dunkelTextur;
    sf::Sprite dunkel;
    dunkelTextur.loadFromFile("resources/Dunkel.png");

    // Dunkeltextur zuordnen
    dunkel.setTexture(dunkelTextur);

    // Zentrum der Dunkelheit ist auf dem Spieler
    dunkel.setOrigin(960*2, 540*2);

    // Dunkelheit mitverschieben
    dunkel.setPosition(spieler.getPosition());


    // Schallpegel: Am Anfang = 0
    float schallPegel = 0;

    // Standardposition (ist nicht wichtig)
    sf::Vector2i schallPosition(25, 25);
    int sX =  fenster.mapPixelToCoords(schallPosition).x;
    int sY =  fenster.mapPixelToCoords(schallPosition).y;

    // Animation für Schallmesser erstellen
    animation schallAnimation("resources/schall", 11, false, false, true, 1, sX, sY);

    // Mitte des Bildes ist Zentrum
    schallAnimation.sprite.setOrigin(75,75);

    // Animation wird hizugefügt: Muss nicht wiederholt werden.
    animationList.push_back(&schallAnimation);

    // Zoombegrenzung
    int zoomLevel = 0;

    // Input delay
    sf::Clock verzoegerung;

    // Musik
    string vorherigesLevel = "hauptmenu";
    hintergrundMusik("hauptmenu");

    // rand initialisieren (Zufallsseed aus der Zeit lesen)
    srand(time(0x0));

    sf::Sound schritt;
    sf::SoundBuffer schrittbuffer;
    schrittbuffer.loadFromFile("resources/sound/Schritte.wav");
    schritt.setBuffer(schrittbuffer);
    schritt.play();
    schritt.setLoop(true);

    // Solange das Fenster geöffnet ist:
    while(fenster.isOpen())
    {
        // Hat sich das Level geändert?
        if(aktuellesLevel->name != vorherigesLevel)
        {
            // Je nach Level entsprechende Musik abspielen
            if(aktuellesLevel->name == "hauptmenu")
            {
                hintergrundMusik("hauptmenu");
                musik.setVolume(50);
            }

            else if(aktuellesLevel->name == "gameOver")
            {
                hintergrundMusik("gameover");
                musik.setVolume(50);
            }

            else
            {
                // Wenn weder Menü noch Gameover -> main Musik
                hintergrundMusik("main");
                musik.setVolume(100);
            }

            // Zum Überprüfen nächstes Mal
            vorherigesLevel = aktuellesLevel->name;
        }


        // Eingabeüberprüfung!
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
        {
            // Bei Escape Hauptmenü laden
            // Gespeicherte Levels zurücksetzen
            for(auto l: levelListe)
            {
                cout << "Level '" << l.first << "' aus Speicher entfernt\n";
                delete l.second;
            }
            cout << "Alle " << levelListe.size() << " Level entfernt\n";
            levelListe.clear();


            // Punkte zurücksetzen
            spiel.punkte = 0;
            aktuellesLevel = levelLaden("hauptmenu");
            aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);


            // Spieler in die hauptmenu Level positionieren
            spieler.setPosition(520, 375);

            // Den Spieler wieder anzeigen
            renderList.push_back(&spieler);
            renderList.push_back((sf::Drawable *)&version.text);
            renderList.push_back((sf::Drawable *)&debugMsg.text);
            renderList.push_back((sf::Drawable *)&debugMsg2.text);
            renderList.push_back((sf::Drawable *)&console::eingabeFeld);
        }

        // Kollisionsdetektion
        sf::FloatRect spielerEcken = spieler.getGlobalBounds();

        // Zoom erneut auf 1 setzen
        float zoom = 1.0f;

        // Input loop

        // Nur wenn Konsole nicht aktiviert!
        if(!console::activated)
        {
            if(aktuellesLevel->name != "gameOver")
            {
                //rennen: doppelt so schnell, dafür aber laut
                int s;
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::LShift))
                {
                    s = 10;
                }
                else
                {
                    s = 5;
                }

                // Nur in eine Richtung auf einmal!
                // Nach vorne
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
                {
                    // Zuerst Kollision überprüfen!
                    spielerEcken.top -= s;

                    if(s == 10 && aktuellesLevel->dunkel)
                        schallPegel += 0.05;// schallpegel wird höher beim rennen

                    if(aktuellesLevel->checkCollision(spielerEcken))
                    {
                        // Nicht bewegen!
                        spielerEcken.top += s;
                    }
                    else
                    {
                        // Bewegen!
                        spieler.setRotation(0);
                        spieler.move(0, -s);
                    }

                }

                else
                    // Nach links
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
                    {
                        spielerEcken.left-=s;

                        if(s == 10 && aktuellesLevel->dunkel)
                        schallPegel += 0.05;// schallpegel wird höher beim rennen

                        if(aktuellesLevel->checkCollision(spielerEcken))
                        {
                            spielerEcken.left +=s;
                        }
                        else
                        {
                            spieler.setRotation(270);
                            spieler.move(-s, 0);
                        }
                    }
                    // Nach hinten
                    else if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                        {
                            // Zuerst Kollision überprüfen!
                            spielerEcken.top += s;

                            if(s == 10 && aktuellesLevel->dunkel)
                            schallPegel += 0.05;// schallpegel wird höher beim rennen

                            if(aktuellesLevel->checkCollision(spielerEcken))
                            {
                                // Nicht bewegen!
                                spielerEcken.top -= s;
                            }
                            else
                            {
                                // Bewegen!
                                spieler.setRotation(180);
                                spieler.move(0, s);
                            }

                        }

                        else
                            // Nach rechts
                            if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                            {
                                spielerEcken.width +=s;

                                if(s == 10 && aktuellesLevel->dunkel)
                                schallPegel += 0.05;// schallpegel wird höher beim rennen

                                if(aktuellesLevel->checkCollision(spielerEcken))
                                {
                                    spielerEcken.width -=s;
                                }
                                else
                                {
                                    spieler.setRotation(90);
                                    spieler.move(s, 0);
                                }

                            }



                // Kollision überprüfen
                if(aktuellesLevel->checkCollision(spielerEcken))
                {
                    spieler.move(5, 5);
                }


                // Reinzoomen (Begrenzung beachten)
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num0))
                {
                    if(zoomLevel > -10)
                    {
                        zoom -= 0.05;
                        zoomLevel--;
                        ansicht.zoom(zoom);
                    }
                }


                // Rauszoomen (Begrenzung beachten)
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num9))
                {
                    if(zoomLevel < 10)
                    {
                        zoom += 0.05;
                        zoomLevel++;
                        ansicht.zoom(zoom);
                    }
                }

                // Dunk8les Overlay wandert mit dem Spieler mit
                dunkel.setPosition(spieler.getPosition());
            }

            float minAbstand=10000;
            for(int i=0; i < aktuellesLevel->gegenspielers.size(); i++)
            {
                float abstand = aktuellesLevel->gegenspielers[i]->schrittAbstand(spielerEcken);
                if(abstand < minAbstand)
                {
                    minAbstand = abstand;
                }
            }
            if(minAbstand < 400)
            {
                float vol = 100 - minAbstand/4;
                if(vol < 0)
                    vol = 0;
                else if(vol > 100)
                    vol = 100;

                schritt.setVolume(100 - minAbstand/4);
            }




            // "Spiel beenden"-Feld möglich machen
            if(aktuellesLevel->name == "hauptmenu")
            {
                sf::FloatRect spielEnde;
                spielEnde = sf::FloatRect(50, 400, 370, 60);

                // Beim Überschneiden -> Fenster schliessen, Schleife wird verlassen, Spiel beendet
                if(spielEnde.intersects(spielerEcken))
                {
                    fenster.close();
                }
            }



            // Auf Pfeile achten: -> Wenn ja, wohin Teleportieren?
            int pfeilNummer = aktuellesLevel->checkCollisionPfeile(spielerEcken);

            // Wenn mit Pfeil geschnitten
            if(pfeilNummer != -1)
            {
                if(aktuellesLevel->pfeile[pfeilNummer]->farbe != 0 || (aktuellesLevel->pfeile[pfeilNummer]->farbe == 0 && spiel.gewonnen == true))
                {
                    // Lese x/y Koordinaten heraus, bevor sie verworfen werden!
                    float spielerX = aktuellesLevel->pfeile[pfeilNummer]->nX;
                    float spielerY = aktuellesLevel->pfeile[pfeilNummer]->nY;

                    // Neues Level laden
                    aktuellesLevel = levelLaden(aktuellesLevel->pfeile[pfeilNummer]->nLevel); // neuer Level wird durch den jeweiligen Pfeil bestummen

                    // Neues Level anzeigen
                    aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);

                    // Spieler an die dem i-ten Pfeil zugehörigen Position im neuen Level positionieren
                    spieler.setPosition(spielerX, spielerY);

                    // Wenn das Level dunkel ist
                    if(aktuellesLevel->dunkel)
                    {
                        if(aktuellesLevel->Wert == 1)
                            dunkelTextur.loadFromFile("resources/DunkelDecke.png");
                        else
                            dunkelTextur.loadFromFile("resources/Dunkel.png");
                        renderList.push_back(&dunkel);
                        renderList.push_back(&schallAnimation.sprite);
                        schallPegel = 0; // zurücksetzen
                    }

                    // Spieler und Benachrichtigungen wieder anzeigen
                    renderList.push_back(&spieler);
                    renderList.push_back((sf::Drawable *)&zeit.text);
                    renderList.push_back((sf::Drawable *)&anzahlPunkte.text);
                    renderList.push_back((sf::Drawable *)&version.text);
                    renderList.push_back((sf::Drawable *)&debugMsg.text);
                    renderList.push_back((sf::Drawable *)&debugMsg2.text);
                    renderList.push_back((sf::Drawable *)&console::eingabeFeld);

                    // Zeit für das Level zurücksetzen
                    Uhr.restart();

                }
            }

            // Schätze einsammeln
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::E) && verzoegerung.getElapsedTime().asSeconds() > 0.2)
            {
                int schaetzeNummer = aktuellesLevel->checkCollisionSchaetze(spielerEcken);
                if(schaetzeNummer != -1 && aktuellesLevel->schaetze[schaetzeNummer]->s->istBeendet() && !aktuellesLevel->schaetze[schaetzeNummer]->eingesammelt)
                {
                    renderList.remove(&aktuellesLevel->schaetze[schaetzeNummer]->s->sprite);
                    aktuellesLevel->schaetze[schaetzeNummer]->eingesammelt = true;
                    spiel.punkteHinzufuegen(10);
                }

                // Türe in der Nähe finden!
                int tuereNummer = aktuellesLevel->checkCollisionTuere(spielerEcken);

                // Türe nur öffnen wenn die, die in der Nähe ist, nicht gerade am Öffnen ist
                if(tuereNummer != -1 && aktuellesLevel->tueren[tuereNummer]->t->istBeendet())
                {
                    // Wenn tuere aufgeht ist es laut
                    schallPegel += 1;

                    float Ux = aktuellesLevel->tueren[tuereNummer]->posX;
                    float Uy = aktuellesLevel->tueren[tuereNummer]->posY;


                    // Neue Mauernkoordinaten berechnen!

                    // Fall 1: Rotation der Türe: 0°
                    if(aktuellesLevel->tueren[tuereNummer]->t->sprite.getRotation() == 0)
                    {
                        if(aktuellesLevel->tueren[tuereNummer]->offen)//tuere geschlossen -> tuere offen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-7, 193, 14));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-186, 14, 193));
                        }
                        else //tuere offen -> türe geschlossen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-186, 14, 193));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-7, 193, 14));
                        }
                    }
                    else if((aktuellesLevel->tueren[tuereNummer]->t->sprite.getRotation())-360 == -90)
                    {
                        if(aktuellesLevel->tueren[tuereNummer]->offen)//tuere geschlossen -> tuere offen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-186, 14, 193));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-186, Uy-7, 193, 14));
                        }
                        else //tuere offen -> türe geschlossen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-186, Uy-7, 193, 14));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-186, 14, 193));
                        }
                    }

                    else if(aktuellesLevel->tueren[tuereNummer]->t->sprite.getRotation()-360 == -180)
                    {
                        if(aktuellesLevel->tueren[tuereNummer]->offen)//tuere geschlossen -> tuere offen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-186, Uy-7, 193, 14));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-7, 14, 193));
                        }
                        else //tuere offen -> türe geschlossen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-7, 14, 193));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-186, Uy-7, 193, 14));
                        }
                    }

                    else if(aktuellesLevel->tueren[tuereNummer]->t->sprite.getRotation()-360 == -270)
                    {
                        if(aktuellesLevel->tueren[tuereNummer]->offen)//tuere geschlossen -> tuere offen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-7, 14, 193));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-7, 193, 14));
                        }
                        else //tuere offen -> türe geschlossen
                        {
                            aktuellesLevel->mauern.remove(sf::FloatRect(Ux-7, Uy-7, 193, 14));
                            aktuellesLevel->mauern.push_back(sf::FloatRect(Ux-7, Uy-7, 14, 193));
                        }
                    }

                    // Animation abspielen

                    aktuellesLevel->tueren[tuereNummer]->t->setRichtung(aktuellesLevel->tueren[tuereNummer]->offen);
                    aktuellesLevel->tueren[tuereNummer]->t->start();
                    aktuellesLevel->tueren[tuereNummer]->offen = !aktuellesLevel->tueren[tuereNummer]->offen;
                }

                // Zeit für Eingabeverzögerung zurücksetzen
                verzoegerung.restart();
            }
        }

        // Wenn die Konsole nocht nicht aktiviert ist -> Aktivieren wenn RShift gedrückt
        if(!console::activated && sf::Keyboard::isKeyPressed(sf::Keyboard::RShift))
        {
            if(!console::activated)
            {
                showConsole();
            }

        }

        // Wenn die Konsole aber aktiviert ist
        if(console::activated && sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
        {
            string befehl = console::eingabeText.str();

            // Debug: Befehl in der Kommandozeile ausgeben
            cout << "Ausfuehren: '" << befehl << "'" << endl;

            // Befehle auslesen
            if(befehl == "9990")
            {
                // 9990 cheat
                debugMsg2.updateText("----- LOL -----");
            }
            else if(befehl == "toggleWalls")
            {
                // Wände umschalten
                aktuellesLevel->collisionsActivated = (!aktuellesLevel->collisionsActivated);
            }
            else if(befehl.find("loadLevel ") == 0)
            {
                // Levelname auslesen
                aktuellesLevel->name = befehl.substr(befehl.find("loadLevel ") + 10);

                // Neues Level laden
                aktuellesLevel = levelLaden(aktuellesLevel->name);

                // Debugnachricht anzeigen
                cerr << "Lade: '" << aktuellesLevel->name << "'" << endl;

                // Level anzeigen
                aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);

                // Neue Spielerposition setzen!
                spieler.setPosition(aktuellesLevel->spielerPosition);


                // Wenn es dunkel ist -> Overlay anzeigen
                if(aktuellesLevel->dunkel)
                {
                    renderList.push_back(&dunkel);
                    renderList.push_back(&schallAnimation.sprite);
                }

                // Spieler und Labels wieder anzeigen!
                renderList.push_back(&spieler);
                renderList.push_back((sf::Drawable *)&zeit.text);
                renderList.push_back((sf::Drawable *)&anzahlPunkte.text);
                renderList.push_back((sf::Drawable *)&version.text);
                renderList.push_back((sf::Drawable *)&debugMsg.text);
                renderList.push_back((sf::Drawable *)&debugMsg2.text);
                renderList.push_back((sf::Drawable *)&console::eingabeFeld);

                // Uhr für Levelzeit neustarten
                Uhr.restart();
                schallPegel = 0;
            }
            else if(befehl == "dunkel")
            {
                if(dunkelBefehl == true)
                    renderList.remove(&dunkel);
                else
                {
                    if(aktuellesLevel->dunkel)
                    {
                        renderList.remove(&dunkel);
                        renderList.remove(&schallAnimation.sprite);
                    }

                    // Spieler und Labels wieder anzeigen!
                    renderList.remove(&spieler);
                    renderList.remove((sf::Drawable *)&zeit.text);
                    renderList.remove((sf::Drawable *)&anzahlPunkte.text);
                    renderList.remove((sf::Drawable *)&version.text);
                    renderList.remove((sf::Drawable *)&debugMsg.text);
                    renderList.remove((sf::Drawable *)&debugMsg2.text);
                    renderList.remove((sf::Drawable *)&console::eingabeFeld);

                    if(aktuellesLevel->dunkel)
                    {
                        renderList.push_back(&dunkel);
                        renderList.push_back(&schallAnimation.sprite);
                    }

                    // Spieler und Labels wieder anzeigen!
                    renderList.push_back(&spieler);
                    renderList.push_back((sf::Drawable *)&zeit.text);
                    renderList.push_back((sf::Drawable *)&anzahlPunkte.text);
                    renderList.push_back((sf::Drawable *)&version.text);
                    renderList.push_back((sf::Drawable *)&debugMsg.text);
                    renderList.push_back((sf::Drawable *)&debugMsg2.text);
                    renderList.push_back((sf::Drawable *)&console::eingabeFeld);
                }
                dunkelBefehl = !dunkelBefehl;
            }
            else if(befehl == "exit")
            {
                fenster.close();
            }

            // Wenn "Enter" gedrückt und Befehl eingelesen -> Konsole zurücksetzen und verstecken
            hideConsole();
        }



        // Event Poll! (Fenster schliessen, etc.)
        sf::Event event;
        while(fenster.pollEvent(event))
        {
            // Schliessen per "Kreuzchen" (x)
            if(event.type == sf::Event::Closed)
            {
                fenster.close();
            }

            else

                if(console::activated && event.type == sf::Event::TextEntered)
                {
                    // Wenn Konsole aktiviert, Eingabe lesen!
                    updateConsole(static_cast<char>(event.text.unicode));
                }
        }

        // Weil es keinen animationsschritt über 10 gibt -> Zurücksetzen
        if(schallPegel > 10)
            schallPegel = 10;

        // Mit static_cast<int>: float -> int
        schallAnimation.zeigeSchritt(static_cast<int>(schallPegel));

        // Ansicht anpassen! (Neu zentrieren)
        ansicht.setCenter(spieler.getPosition());
        fenster.setView(ansicht);

        // "Fixe" Benachrichtigungen neu setzen
        sf::Vector2i versionPosition(25, 25);
        sf::Vector2i debugPosition(25, 50);
        sf::Vector2i debug2Position(25, 75);
        sf::Vector2i consolePosition(25, 100);
        sf::Vector2i zeitPosition(25, 125);
        sf::Vector2i anzahlPunktePosition(25, 150);

        // Koordinatentransformation: Bildschirm -> Fenster
        version.text.setPosition(fenster.mapPixelToCoords(versionPosition));
        debugMsg.text.setPosition(fenster.mapPixelToCoords(debugPosition));
        debugMsg2.text.setPosition(fenster.mapPixelToCoords(debug2Position));
        console::eingabeFeld.setPosition(fenster.mapPixelToCoords(consolePosition));
        zeit.text.setPosition(fenster.mapPixelToCoords(zeitPosition));
        anzahlPunkte.text.setPosition(fenster.mapPixelToCoords(anzahlPunktePosition));

        // Position des Schallmessers auf dem Bildschirm
        sf::Vector2i schallPosition(100, 600);

        // Koordinatentransformation: Bildschirm -> Fenster
        float sX =  fenster.mapPixelToCoords(schallPosition).x;
        float sY =  fenster.mapPixelToCoords(schallPosition).y;

        // Schallmesser setzen
        schallAnimation.sprite.setPosition(sX, sY);


        // Animation Loop
        // = Alle Animationen ausführen, sodass das nächste Bild geladen wird
        for(animation* a : animationList)
        {
            a->animationAusfuehren();
        }


        // SFML: Fenster leeren!
        fenster.clear();

        for(auto object : renderList)
        {
            // Jedes Objekt anzeigen
            fenster.draw(*object);
        }

        // Fensterinhalt anzeigen
        fenster.display();


        // Debugstring aktualisieren
        stringstream debugMsgText;
        debugMsgText << "Spielerposition: " << spieler.getPosition().x << ", " << spieler.getPosition().y;

        debugMsg.updateText(debugMsgText.str());


        // Gegenspieler bewegen
        for(gegenspieler* g : aktuellesLevel->gegenspielers)
        {
            g->bewegen();
        }

        // Punkte aktualisieren
        stringstream anzahlPunkteAnzeige;
        anzahlPunkteAnzeige << "Punkte: " << spiel.punkte;
        anzahlPunkte.updateText(anzahlPunkteAnzeige.str());


        // Gegenspielerkontakt -> GameOver
        for(gegenspieler* g : aktuellesLevel->gegenspielers)
        {
            float dX = abs(g->sprite.getPosition().x - spieler.getPosition().x);
            float dY = abs(g->sprite.getPosition().y - spieler.getPosition().y);

            if(sqrt(dX*dX + dY*dY) < 120)
            {
                // Punkte zurücksetzen
                spiel.punkte = 0;

                cerr << "GAME OVER: GRUND 3" << endl;

                // Neues Level laden und anzeigen
                aktuellesLevel = levelLaden("gameOver"); // Wegen dem geht man GameOver ohne dass etwas passiert ist
                aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);

                // Hintergrund neu positionieren
                hintergrund->setOrigin(0, 0);

                // Spieler in Mitte setzen
                spieler.setPosition(960, 540);

                // Schall zurücksetzen
                schallPegel = 0;

                // Konsole wieder anzeigen, nachdem renderListe geleert wurde
                renderList.push_back((sf::Drawable *)&console::eingabeFeld);
            }
        }


        //Wenn der Pegel im roten Bereich ist, ist nicht sofort gameOver sondern erst nach einer Zufallszeit
        int Zufall = rand() % 200;
        if(schallPegel >= 7 && Zufall == 199)
        {
            // Punkte zurücksetzen
            spiel.punkte = 0;

            cerr << "GAME OVER: GRUND 2" << endl;

            // Neues Level laden und anzeigen
            aktuellesLevel = levelLaden("gameOver"); // Wegen dem geht man GameOver ohne dass etwas passiert ist
            aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);

            // Hintergrund neu positionieren
            hintergrund->setOrigin(0, 0);

            // Spieler in Mitte setzen
            spieler.setPosition(960, 540);

            // Schall zurücksetzen
            schallPegel = 0;

            // Konsole wieder anzeigen, nachdem renderListe geleert wurde
            renderList.push_back((sf::Drawable *)&console::eingabeFeld);
        }

        if(schallPegel > 0)
        {
            //Pegel nimmt mit der Zeit wieder ab
            schallPegel -= 0.005;
        }


        // Zeit aktualisieren
        int verbleibendeZeit;
        if(aktuellesLevel->Zeit.asSeconds() >= 0.5) // t
        {
            verbleibendeZeit = aktuellesLevel->Zeit.asSeconds() - Uhr.getElapsedTime().asSeconds();

            if(aktuellesLevel->checkCollisionLaser(spielerEcken) == true ??!??! verbleibendeZeit < 0)
            {
                spiel.punkte = 0;
                schallPegel = 0;
                cerr << "GAME OVER: GRUND 1" << endl;
                aktuellesLevel = levelLaden("gameOver");
                aktuellesLevel->loadToScreen(hintergrundTextur, hintergrund, renderList, animationList);
                hintergrund->setOrigin(0, 0);
                spieler.setPosition(960, 540);

                //ansicht.setCenter(fenster.mapPixelToCoords(sf::Vector2i(960, 540)));
                renderList.push_back((sf::Drawable *)&console::eingabeFeld);
            }

            stringstream zeitAnzeige;
            zeitAnzeige << "Zeit: " << verbleibendeZeit << " s";
            zeit.updateText(zeitAnzeige.str());
        }
        else
        {
Пример #7
0
ambiance::ambiance()
{
// INSTANCES D //

	ambDA.setVolume(0);
	ambDA.setLoop(false); 

	ambDB.setVolume(70);
	ambDB.setLoop(false); 

	ambDC.setVolume(100);
	ambDC.setLoop(false);

	ambDD.setVolume(100);
	ambDD.setLoop(false);

	ambDA.openFromFile(path+"ambDA01.ogg");
	ambDB.openFromFile(path+"ambDB01.ogg");
	ambDC.openFromFile(path+"ambDC01.ogg");
	ambDD.openFromFile(path+"ambDD01.ogg");

	// LOAD ALL FILES (AKA RONNYHAX) ////////////////////////////////////////////


	for(int i = 0; i < ARRAY_SIZE(ambAAFile); i++)
	{
		ALLambAA[i].openFromFile(path+ambAAFile[i]);
		ALLambAA[i].setVolume(0);
		ALLambAA[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambABFile); i++)
	{
		ALLambAB[i].openFromFile(path+ambABFile[i]);
		ALLambAB[i].setVolume(0);
		ALLambAB[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambBAFile); i++)
	{
		ALLambBA[i].openFromFile(path+ambBAFile[i]);
		ALLambBA[i].setVolume(0);
		ALLambBA[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambBBFile); i++)
	{
		ALLambBB[i].openFromFile(path+ambBBFile[i]);
		ALLambBB[i].setVolume(0);
		ALLambBB[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambBCFile); i++)
	{
		ALLambBC[i].openFromFile(path+ambBCFile[i]);
		ALLambBC[i].setVolume(0);
		ALLambBC[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambCAFile); i++)
	{
		ALLambCA[i].openFromFile(path+ambCAFile[i]);
		ALLambCA[i].setVolume(0);
		ALLambCA[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambCBFile); i++)
	{
		ALLambCB[i].openFromFile(path+ambCBFile[i]);
		ALLambCB[i].setVolume(0);
		ALLambCB[i].setLoop(true); 
	}

	for(int i = 0; i < ARRAY_SIZE(ambCCFile); i++)
	{
		ALLambCC[i].openFromFile(path+ambCCFile[i]);
		ALLambCC[i].setVolume(0);
		ALLambCC[i].setLoop(true); 
	}
	// RAND TIME & ARRAYLENGTH DEFINITION //
		srand (time(0));	
}