コード例 #1
0
ファイル: main.cpp プロジェクト: asibilev/invaders
int main() {
    _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    // direction for player auto-moving
    int direction = ObjectWay::undefined;

    // init logic configuration
    Config config;
    initConfig(&config);

    // init render object
    Render* render = new Render(config.screen_width, config.screen_height);
    if(!render->init()) {
        delete render;
        return EXIT_FAILURE;
    }

    // init logic object
    Logic* logic = new Logic();
    logic->flush(config);
    logic->init(config);

    sf::Clock clock;
    sf::Event event;

    while (render->getWindow()->isOpen()) {
        sf::Int32 msec = clock.getElapsedTime().asMilliseconds();
        logic->setTime(msec);

        // check in loop for events
        while(render->getWindow()->pollEvent(event)) {
            if(event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                render->close();

            if(event.type == sf::Event::KeyReleased) 
                if (event.key.code == sf::Keyboard::Right || event.key.code == sf::Keyboard::Left)
                    direction = ObjectWay::undefined;
            
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
                logic->spawnRocket(); // launch rocket
            
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                direction = ObjectWay::right;
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                direction = ObjectWay::left;

            if(direction != ObjectWay::undefined) {
                ObjectPosition pos = logic->getPlayer().position;
                if(direction == ObjectWay::right)
                    pos.x += config.speed_player;
                else
                    pos.x -= config.speed_player;

                if(pos.x > 0 && pos.x < (float)config.screen_width-25.0f)
                    logic->setPlayerPosition(pos);
            }

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return) && logic->getLifes() <= 0) {
                logic->clearObjects();
                logic->flush(config);
            }
        }

        // clear screen
        render->clear();
        
        if(logic->getLifes() > 0) {
            if(logic->getEnemiesCount() == 0) {
                // set new round and respawn enemies
                logic->setNewRound();
                logic->spawnEnemies(0.0f, 40.f, 10, 3);
            }

            logic->spawnBomb();       // fire bomb randomly

            logic->moveEnemies();     // move enemies
            logic->moveRockets();     // move rockets
            logic->moveBombs();       // move bombs

            logic->collideEnemies();  // collide with enemies
            logic->collideRockets();  // collide with rockets
            logic->collideBombs();    // collide with bombs

            // draw logic objects
            drawObjects(logic, render);
        } else {
            // logic is over, draw score
            render->drawFarewell(logic->getScore());
            logic->clearObjects();
        }

        // render screen
        render->display();
    }


    delete logic;
    delete render;
    return EXIT_SUCCESS;
}