Exemple #1
0
int Game::start(){
	//TODO: folgenden Code auf Exceptions statt ERROR codes umschreiben
	if (!initialize()){
		printf("Could not initialize => exit \n");
		SDL_Quit();
		return 1;
	}
	else {

		printf("Creating a Player...\n");
		Vector2D player_pos;
		player_pos.x = 300;
		player_pos.y = 300;
		Player* player = new Player(renderer);
		player->set_position(player_pos);
		drawable_objects.push_back(player);
		active_player = player;

		//printf("Creating 1. object...\n");
		//DrawableObject* first_test_object;
		//first_test_object = new DrawableObject(renderer);
		//drawable_objects.push_back(first_test_object);

		printf("Creating a chargeroid...\n");
		Chargeroid* chargeroid_test_object = new Chargeroid(renderer);
		drawable_objects.push_back(chargeroid_test_object);
		printf("Creating a second chargeroid...\n");
		Chargeroid* chargeroid_test_object2 = new Chargeroid(renderer);
		drawable_objects.push_back(chargeroid_test_object2);


		// MAIN GAME LOOP
		float time_passed = 0.;
		float last_time_in_s = get_current_time_in_s();
		float current_time_in_s = get_current_time_in_s();
		while (is_Running){
				current_time_in_s = get_current_time_in_s();
				time_passed = float(current_time_in_s - last_time_in_s);
				handle_input_events();
				update_game_state(time_passed);
				render_current_frame();
				last_time_in_s = current_time_in_s;
		}
		clean_up();

		return 0;
	}
}
void Game_Manager::update(float secTime)
{

    Manger((int)myPlayer.getPosY(), (int)((m_view2.getCenter().x + (myPlayer.getPosX() * 248)) / 248 - 4));
    actualisationNiveau((int) ((m_view2.getCenter().x + (myPlayer.getPosX() * 248)) / 248 - 4));
    if (myPlayer.getEnergy() <= 0)
    {
        execute_action(ACT_RESTART_APP);
    }

    if (is_tree)
    {
        int cost = 20;
        skill_button[0].update(100, 100);
        if (skill_button[0].is_activated())
        {
            skill_button[0].desactivate();
            is_tree = false;
        }
        skill_button[3].update(670, 290);

        if (skill_button[3].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[3].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_FDReduceCost(-10);
            skill_level++;

        }
        skill_button[4].update(870, 290);

        if (skill_button[4].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[4].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_FDReduceCooldown(-1.0f);
            skill_level++;

        }
        skill_button[5].update(1070, 290);

        if (skill_button[5].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[5].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_FDIncreaseDistance(1);
            skill_level++;

        }

        skill_button[6].update(1310, 290);

        if (skill_button[6].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[6].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_VAReduceCost(-10);
            skill_level++;

        }
        skill_button[7].update(1450, 290);

        if (skill_button[7].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[7].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_VAReduceCooldown(-1.0f);
            skill_level++;

        }
        skill_button[8].update(1650, 290);

        if (skill_button[8].is_activated() && myPlayer.getEnergy() > cost)
        {
            skill_button[8].desactivate();
            myPlayer.gainEnergy(-cost);
            myPlayer.m_VAIncreaseDistance(1);
            skill_level++;

        }
    }
    else if (is_menu_visible)
    {

        menu1.update();
        if (menu1.is_playing() == true)
        {
            ChoixDifficulter(menu1.getDifficulte());
            ChoixMonde(menu1.getWorld());
            is_menu_visible = false;
        }
        if (menu1.is_quitting() == true)
        {
            execute_action(ACT_CLOSE_APP);
        }
    }
    else
    {
        int retour = myPlayer.update(secTime, _difficulter);

        if (retour == 1)
        {
            execute_action(ACT_GO_RIGHT);
        }

        int posXPla =(int) ((m_view2.getCenter().x + (myPlayer.getPosX() * 248)) / 248 - 4);

        int posYpla =(int) myPlayer.getPosY();

        float hitLimit = (m_view2.getCenter().x + (myPlayer.getPosX() * 248)) / 248 - 4 - posXPla;

        if (((hitLimit > 0.75)) && (Map[posYpla][posXPla + 1].getObject() == 0) && (myPlayer.isEtheral()) && (myPlayer.playerState != VANISH))
        {

            myPlayer.setEtheral(0);
        }
        if (myPlayer.isEtheral())
        {
            retour = 2;
        }

        m_view2.move(500 * secTime, 0);

        if ((((Map[posYpla][posXPla + 1].getObject() != 0) || (Map[posYpla][posXPla].getObject() != 0))
                && (!(((hitLimit > 0.75)) && (Map[posYpla][posXPla + 1].getObject() == 0)))
                && (retour != 2)))
        {
            execute_action(ACT_GO_LEFT);
        }
        else
        {
            if ((myPlayer.playerState == SMASHED) && (Map[posYpla][posXPla + 2].getObject() == 0))
            {
                myPlayer.playerState = MOVING;
            }

        }

        if ((Map[posYpla][posXPla + 1].getLight() != 0) || (Map[posYpla][posXPla].getLight() != 0))
        {
            if ((!((Map[posYpla][posXPla].getLight() != 0) && (hitLimit > 0.75))) && (Map[posYpla][posXPla + 1].getLight() == 0))
            {
                myPlayer.setMovable(0);
                if (myPlayer.isLight() == 0)
                {
                    myPlayer.setLight(1);
                }
            }
            else
            {
                if (myPlayer.isMovable() == 0)
                {
                    myPlayer.setMovable(1);
                }
                if (myPlayer.isLight() == 1)
                {
                    cout << "UNLIGHT" << endl;
                    myPlayer.setLight(0);
                }
            }
        }
    }
    bool isEvent = handle_input_events();


}
void Game_Manager::update(float timeElapsed)
{
    handle_input_events();
    m_view1.zoom(zoom);


    
    if (monster_time.getElapsedTime().asSeconds() >= 45)
    {
        monster_time.restart();
        int a = rand() % 5 + 1;
        for (int i = 0; i <= a; i++)
        {
            monster_max++;
            monster1.push_back(Monster{ m_app, &m_view1, i });
            monster_state.push_back(true);
        }
    }



    zoom_time = clock_zoom.getElapsedTime();
    if (zoom_time.asSeconds() >  0.05  && zoom_change != ZOOM_NO_CHANGE)
    {
        clock_zoom.restart();
        if (zoom_change == ZOOM_ADD && zoom_rate >= -30)
        {
            zoom = 0.90f;
            zoom_rate--;
        }
        if (zoom_change == ZOOM_LESS  && zoom_rate <= 50)
        {
            zoom = 1.1f;
            zoom_rate++;
        }
        zoom_change = ZOOM_NO_CHANGE;
    }
    else
    {
        zoom = 1;
    }


    if (citizen_number == 0 || oxygen_number == 0.0f)
    {
        fail = true;
        reset();
    }

    if (cinematic_on)
    {
        cinematic_update();
    }

    if (!pause)
    {
        m_view1.setCenter(static_cast<float>(m_x_offset), static_cast<float>(m_y_offset));
        m_app->setView(m_view1);

        //radiation haldling
        radio_bar.scale(1.0f, my_map[selected_tile.clicked_y][selected_tile.clicked_x].get_radiation(), true);
        //oxygen_handling
        if (oxygen_clock.getElapsedTime().asSeconds() > 0.5f)
        {
            oxygen_clock.restart();
            oxygen_number -= 0.0008;
        }
        oxygen_bar.scale(oxygen_number, 1.0f, false);

        buttons[0].update(selected_tile.clicked_x* tile_size, selected_tile.clicked_y * tile_size);
        if (buttons[0].is_activated())
        {
            buttons[0].desactivate();
            execute_action(ACT_DIGING);
        }

        buttons[1].update(selected_tile.goal_x* tile_size, selected_tile.goal_y * tile_size + buttons[1].get_h());

        if (buttons[1].is_activated())
        {
            buttons[1].desactivate();
            execute_action(ACT_MOVE);
        }

        buttons[2].update((selected_tile.clicked_x + 1)* tile_size - buttons[2].get_h(), selected_tile.clicked_y * tile_size + buttons[2].get_h());
        if (buttons[2].is_activated())
        {
            buttons[2].desactivate();
            execute_action(ACT_STOP);
        }

        buttons[3].update(selected_tile.clicked_x* tile_size, selected_tile.clicked_y * tile_size + buttons[3].get_h());
        if (buttons[3].is_activated())
        {
            buttons[3].desactivate();
                if (isOccupied(selected_tile.clicked_x ,selected_tile.clicked_y) )
              {
               if (my_map[selected_tile.clicked_y][selected_tile.clicked_x].get_resources_id() == 0)
             {
            metal_number += my_map[selected_tile.clicked_y][selected_tile.clicked_x].get_ressources();
            }
            if (my_map[selected_tile.clicked_y][selected_tile.clicked_x].get_resources_id() == 1)
            {
                food_number += my_map[selected_tile.clicked_y][selected_tile.clicked_x].get_ressources();
            }
            }
        }

        buttons[4].update(m_screen_x - buttons[4].get_w() - 30, m_screen_y / 2 + buttons[4].get_h());
        if (buttons[4].is_activated())
        {
            buttons[4].desactivate();
            if (isOccupied(selected_tile.clicked_x, selected_tile.clicked_y))
            {
                execute_action(ACT_BUILD_WORKBENCH);
            }
        }

        buttons[5].update(m_screen_x - buttons[5].get_w() - 30, (m_screen_y / 2) + (buttons[5].get_h() + 80));
        if (buttons[5].is_activated())
        {
            buttons[5].desactivate();
            execute_action(ACT_BUILD_GENERATOR);

        }

        buttons[6].update(m_screen_x - buttons[5].get_w() - 30, (m_screen_y / 2) + (buttons[6].get_h() + 80 * 2));
        if (buttons[6].is_activated())
        {
            buttons[6].desactivate();
            execute_action(ACT_BUILD_FARM);
        }

        buttons[7].update(m_screen_x - buttons[7].get_w() - 30, (m_screen_y / 2) + (buttons[7].get_h() + 80 * 3));
        if (buttons[7].is_activated())
        {
            buttons[7].desactivate();

            execute_action(ACT_BUILD_ARMORY);
        }

        buttons[8].update(m_screen_x - buttons[8].get_w() - 30, (m_screen_y / 2) + (buttons[8].get_h() + 80 * 4));
        if (buttons[8].is_activated())
        {
            buttons[8].desactivate();

            execute_action(ACT_BUILD_AERATION);
        }

        buttons[9].update(m_screen_x - buttons[9].get_w() - 30, (m_screen_y / 2) + (buttons[9].get_h() + 80 * 5));
        if (buttons[9].is_activated())
        {
            buttons[9].desactivate();

            execute_action(ACT_BUILD_BUNKER);
        }

        for (int i = 0; i < citizen_max; i++) {
            if (citizen_state[i])
            {
                character1[i].update(my_map, timeElapsed);

                //my_map[character1[i].getY][character1[i].getX].addCharacter(*character1[i]);

                if (!character1[i].alive())
                {
                    citizen_number--;
                    citizen_state[i] = false;
                }
            }
        }

        for (int i = 0; i < monster_max; i++) {
            if (monster_state[i])
            {
                monster1[i].newGoal(character1[1].getX(), character1[1].getY());
                monster1[i].update(my_map, timeElapsed);
                if (!monster1[i].alive())
                {
                    monster_state[i] = false;
                }
            }
        }

        for (size_t x = 0; x < 5; x++)
        {
            for (size_t y = 0; y < 10; y++)
            {
                my_map[x][y].update(timeElapsed);
            }
        }
        //if the mouse is over the right tile

        selected_tile.x = m_selection_vector.x / tile_size;
        selected_tile.y = m_selection_vector.y / tile_size;
        if (selected_tile.x < 0)
        {
            selected_tile.x = 0;
        }
        if (selected_tile.x > 4)
        {
            selected_tile.x = 4;
        }
        if (selected_tile.y < 0)
        {
            selected_tile.y = 0;
        }

        if (mouse_vec.x < m_screen_x - buttons[6].get_w() - 30)
        {
            if (clicked)
            {
                if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
                {
                    if (selected_tile.goal_x != selected_tile.x
                        || selected_tile.goal_y != selected_tile.y)
                    {
                        selected_tile.previous_clicked_x = selected_tile.clicked_x;
                        selected_tile.previous_clicked_y = selected_tile.clicked_y;

                        selected_tile.clicked_x = selected_tile.x;
                        selected_tile.clicked_y = selected_tile.y;
                    }


                }
                if (sf::Mouse::isButtonPressed(sf::Mouse::Right))
                {

                    if (selected_tile.x != selected_tile.clicked_x
                        || selected_tile.y != selected_tile.clicked_y)
                    {
                        selected_tile.goal_x = selected_tile.x;
                        selected_tile.goal_y = selected_tile.y;
                        glissor_on = true;
                    }
                }
            }
        }

        citizen_number_text.refill("Still alive: " + std::to_string(citizen_number));
         food_number_text.refill("Food: " + std::to_string(food_number));
        metal_number_text.refill("Metal: " + std::to_string(metal_number));
    }
    combat(timeElapsed);
}