Beispiel #1
0
void ProcessEditModeCamera(){
    int x, y;
    Mouse::GetPos(&x, &y);

    if (x < 10) {
        Window::GetCamera()->Move(Vec2(-5, 0));
    } else if (x > Window::GetWidth() - 10) {
        Window::GetCamera()->Move(Vec2(5, 0));
    }

    if (y < 10) {
        Window::GetCamera()->Move(Vec2(0, -5));
    } else if (y > Window::GetHeight() - 10) {
        Window::GetCamera()->Move(Vec2(0, 5));
    }

    Vec2 cam_offset(Window::GetCamera()->X(), Window::GetCamera()->Y());

    if (Mouse::Pressed(MOUSE_LEFT)) {
        map->SetTile((Mouse::GetPos() + cam_offset) * Map::GRID_SCALE, static_cast<tile> (edit_tile));
    }
}
Beispiel #2
0
void DoInput(photon_instance &instance, float time){
    photon_input &input = instance.input;

    DoInputSingle(input.left, input);
    DoInputSingle(input.right, input);
    DoInputSingle(input.up, input);
    DoInputSingle(input.down, input);
    DoInputSingle(input.select, input);
    DoInputSingle(input.back, input);

    DoInputSingle(input.pause, input);

    DoInputSingle(input.interact, input);
    DoInputSingle(input.move_right, input);
    DoInputSingle(input.move_left, input);
    DoInputSingle(input.move_up, input);
    DoInputSingle(input.move_down, input);
    DoInputSingle(input.camera_right, input);
    DoInputSingle(input.camera_left, input);
    DoInputSingle(input.camera_up, input);
    DoInputSingle(input.camera_down, input);
    DoInputSingle(input.rotate_clockwise, input);
    DoInputSingle(input.rotate_counter_clockwise, input);
    DoInputSingle(input.zoom_in, input);
    DoInputSingle(input.zoom_out, input);
    DoInputSingle(input.next_item, input);
    DoInputSingle(input.previous_item, input);

    if(instance.gui.load_save_menu.loading || instance.gui.load_save_menu.saving){
        photon_gui_load_save_menu &load_save_menu = instance.gui.load_save_menu;
        if(IsActivated(input.select)){
            gui::ConfirmLoadSave(instance);
        }
        if(IsActivated(input.back)){
            gui::CancelLoadSave(instance);
        }
        if(IsActivated(input.left)){
            if(load_save_menu.cursor > 0){
                load_save_menu.cursor--;
            }
        }
        if(IsActivated(input.right)){
            if(++load_save_menu.cursor > load_save_menu.filename.length()){
                load_save_menu.cursor = load_save_menu.filename.length();
            }
        }
        if(IsActivated(input.up)){
            if(--load_save_menu.current_file_index < 0){
                load_save_menu.current_file_index = load_save_menu.file_list.size() - 1;
            }
            load_save_menu.filename = load_save_menu.file_list[load_save_menu.current_file_index];
        }
        if(IsActivated(input.down)){
            if(++load_save_menu.current_file_index >= (int)load_save_menu.file_list.size()){
                load_save_menu.current_file_index = 0;
            }
            load_save_menu.filename = load_save_menu.file_list[load_save_menu.current_file_index];
        }

    }else if(!instance.level.is_valid){
        photon_gui_button_list &menu = instance.gui.main_menu;
        if(IsActivated(input.select)){
            gui::ActivateButton(instance, menu, menu.highlighted);
        }
        if(IsActivated(input.up)){
            if(--menu.highlighted < 0){
                menu.highlighted = menu.buttons.size() - 1;
            }
        }
        if(IsActivated(input.down)){
            if(++menu.highlighted >= (int8_t)menu.buttons.size()){
                menu.highlighted = 0;
            }
        }
    }else if(instance.paused){
        photon_gui_button_list &menu = instance.gui.pause_menu;
        if(IsActivated(input.select)){
            gui::ActivateButton(instance, menu, menu.highlighted);
        }
        if(IsActivated(input.back) || IsActivated(input.pause)){
            instance.paused = false;
        }
        if(IsActivated(input.up)){
            if(--menu.highlighted < 0){
                menu.highlighted = menu.buttons.size() - 1;
            }
        }
        if(IsActivated(input.down)){
            if(++menu.highlighted >= (int8_t)menu.buttons.size()){
                menu.highlighted = 0;
            }
        }
    }else{
        instance.player.location.x += (input.move_right.current_state - input.move_left.current_state) * time * instance.camera_offset.z;
        instance.player.location.y += (input.move_up.current_state - input.move_down.current_state) * time * instance.camera_offset.z;

        glm::vec2 cam_offset(input.camera_right.current_state - input.camera_left.current_state,
                             input.camera_up.current_state - input.camera_down.current_state);

        // TODO - make a setting that enables/disables screen edges.
        // if only SDL_GetMouseState worked when the cursor is outside the window... oh well...
        if(SDL_GetMouseFocus() == instance.window.window_SDL){
            glm::ivec2 mouse;
            uint32_t buttons = SDL_GetMouseState(&mouse.x, &mouse.y);

            // if the mouse position is (0,0) chances are it hasn't recieved the first event yet... I should try to find a better way to fix this, but this will do for now...
            if(instance.settings.screen_edges && !(mouse == glm::ivec2(0))){
                cam_offset.x += (std::max(80 + mouse.x - int(instance.window.width),  0) - std::max(80 - mouse.x, 0)) / 80.0f;
                cam_offset.y += (std::max(80 - mouse.y, 0) - std::max(80 + mouse.y - int(instance.window.height), 0)) / 80.0f;
            }

            if(input.enable_mouse){
                glm::vec2 delta = WindowToWorldCoord(instance, mouse.x, mouse.y) - instance.player.location;
                if(buttons & SDL_BUTTON_LMASK){
                    if(glm::length(delta) > 0.5f){
                        instance.player.location += delta * time;
                    }
                }
                if(buttons & SDL_BUTTON_RMASK){
                    float angle = glm::degrees(glm::atan(delta.y, delta.x));

                    blocks::OnRotate(glm::uvec2(instance.player.location + 0.5f), instance.level, angle);
                }
            }
        }

        cam_offset *= instance.camera_offset.z * 0.5f * time * 2.0f;

        instance.camera_offset.x += cam_offset.x;
        instance.camera_offset.y += cam_offset.y;
        instance.camera_offset.x /= 1.0f + (time * 2.0f);
        instance.camera_offset.y /= 1.0f + (time * 2.0f);

        if(IsActivated(input.interact)){
            blocks::OnPhotonInteract(glm::uvec2(instance.player.location + glm::vec2(0.5f)), instance.level, instance.player);
        }
        if(IsActivated(input.rotate_clockwise)){
            blocks::OnRotate(glm::uvec2(instance.player.location + glm::vec2(0.5f)), instance.level);
        }
        if(IsActivated(input.rotate_counter_clockwise)){
            blocks::OnRotate(glm::uvec2(instance.player.location + glm::vec2(0.5f)), instance.level, true);
        }
        if(IsActivated(input.next_item)){
            player::NextItem(instance.player);
        }
        if(IsActivated(input.previous_item)){
            player::PreviousItem(instance.player);
        }

        instance.camera_offset.z -= (input.zoom_in.current_state - input.zoom_out.current_state) * instance.camera_offset.z * 0.5f * time;

        if(IsActivated(input.pause)){
            instance.paused = true;
        }
    }
}