Browse Source

zooming, and nicer input handling

opengl-renderer-broken
Martin Dørum 4 years ago
parent
commit
a6267cd1ae
3 changed files with 71 additions and 12 deletions
  1. 46
    9
      libswan/include/swan/Game.h
  2. 13
    0
      libswan/src/Game.cc
  3. 12
    3
      src/main.cc

+ 46
- 9
libswan/include/swan/Game.h View File

@@ -1,6 +1,6 @@
#pragma once

#include <vector>
#include <bitset>
#include <map>
#include <string>

@@ -20,16 +20,46 @@ public:
std::unique_ptr<Mod> loadMod(const std::string &path);
void createWorld(const std::string &worldgen, std::vector<std::unique_ptr<Mod>> &&mods);

void onKeyDown(SDL_Keysym sym) { pressed_keys_[sym.scancode] = true; }
void onKeyUp(SDL_Keysym sym) { pressed_keys_[sym.scancode] = false; }
void onMouseMove(Sint32 x, Sint32 y) { mouse_pos_ = { x, y }; }
void onMouseDown(Sint32 x, Sint32 y, Uint8 button) { mouse_pos_ = { x, y }; pressed_buttons_[button] = true; }
void onMouseUp(Sint32 x, Sint32 y, Uint8 button) { mouse_pos_ = { x, y }; pressed_buttons_[button] = false; }
void onKeyDown(SDL_Keysym sym) {
pressed_keys_[sym.scancode] = true;
did_press_keys_[sym.scancode] = true;
}

void onKeyUp(SDL_Keysym sym) {
pressed_keys_[sym.scancode] = false;
did_release_keys_[sym.scancode] = true;
}

void onMouseMove(Sint32 x, Sint32 y) {
mouse_pos_ = { x, y };
}

void onMouseDown(Sint32 x, Sint32 y, Uint8 button) {
mouse_pos_ = { x, y };
pressed_buttons_[button] = true;
did_press_buttons_[button] = true;

}
void onMouseUp(Sint32 x, Sint32 y, Uint8 button) {
mouse_pos_ = { x, y };
pressed_buttons_[button] = false;
did_release_buttons_[button] = true;
}

void onScrollWheel(Sint32 y) {
did_scroll_ = (y > 0 ? 1 : -1 );
}

bool isKeyPressed(SDL_Scancode code) { return pressed_keys_[code]; }
TilePos getMouseTile();
bool wasKeyPressed(SDL_Scancode code) { return did_press_keys_[code]; }
bool wasKeyReleased(SDL_Scancode code) { return did_release_keys_[code]; }
Vec2i getMousePos() { return mouse_pos_; }
bool isMousePressed(Uint8 button) { return pressed_buttons_[button]; }
bool wasMousePressed(Uint8 button) { return did_press_buttons_[button]; }
bool wasMouseReleased(Uint8 button) { return did_release_buttons_[button]; }
int wasWheelScrolled() { return did_scroll_; }

TilePos getMouseTile();

void draw();
void update(float dt);
@@ -42,9 +72,16 @@ public:
Win &win_;

private:
std::unordered_map<SDL_Scancode, bool> pressed_keys_;
std::bitset<SDL_NUM_SCANCODES> pressed_keys_;
std::bitset<SDL_NUM_SCANCODES> did_press_keys_;
std::bitset<SDL_NUM_SCANCODES> did_release_keys_;

Vec2i mouse_pos_;
std::unordered_map<Uint8, bool> pressed_buttons_;
std::bitset<SDL_BUTTON_X2> pressed_buttons_;
std::bitset<SDL_BUTTON_X2> did_press_buttons_;
std::bitset<SDL_BUTTON_X2> did_release_buttons_;

int did_scroll_ = 0;
};

}

+ 13
- 0
libswan/src/Game.cc View File

@@ -49,6 +49,19 @@ void Game::draw() {

void Game::update(float dt) {
world_->update(dt);

// Zoom the window using the scroll wheel
win_.zoom_ += wasWheelScrolled() * 0.1 * win_.zoom_;
if (win_.zoom_ > 3)
win_.zoom_ = 3;
else if (win_.zoom_ < 0.3)
win_.zoom_ = 0.3;

did_scroll_ = 0;
did_press_keys_.reset();
did_release_keys_.reset();
did_press_buttons_.reset();
did_release_buttons_.reset();
}

void Game::tick(float dt) {

+ 12
- 3
src/main.cc View File

@@ -149,17 +149,26 @@ int main(int argc, char **argv) {
case SDL_MOUSEMOTION:
imgui_io.MousePos.x = (float)evt.motion.x;
imgui_io.MousePos.y = (float)evt.motion.y;
game.onMouseMove(evt.motion.x, evt.motion.y);
if (!imgui_io.WantCaptureMouse)
game.onMouseMove(evt.motion.x, evt.motion.y);
break;

case SDL_MOUSEBUTTONDOWN:
imgui_io.MouseDown[sdlButtonToImGuiButton(evt.button.button)] = true;
game.onMouseDown(evt.button.x, evt.button.y, evt.button.button);
if (!imgui_io.WantCaptureMouse)
game.onMouseDown(evt.button.x, evt.button.y, evt.button.button);
break;

case SDL_MOUSEBUTTONUP:
imgui_io.MouseDown[sdlButtonToImGuiButton(evt.button.button)] = false;
game.onMouseUp(evt.button.x, evt.button.y, evt.button.button);
if (!imgui_io.WantCaptureMouse)
game.onMouseUp(evt.button.x, evt.button.y, evt.button.button);
break;

case SDL_MOUSEWHEEL:
imgui_io.MouseWheel += (float)evt.wheel.y;
if (!imgui_io.WantCaptureMouse)
game.onScrollWheel(evt.wheel.y);
break;
}
}

Loading…
Cancel
Save