Skip to content

Commit 3d42c0f

Browse files
authored
Initial implementation of zoom in and out; (#147)
added fullscreen mode;
1 parent d3930c9 commit 3d42c0f

File tree

11 files changed

+112
-37
lines changed

11 files changed

+112
-37
lines changed

resources/maps/Tucson.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
{
44
"scale": { "x": 2.5, "y": 2.5 },
55
"tiles": { "x": 16, "y": 16 },
6-
"camera": "follow"
6+
"camera": "follow",
7+
"zoom": {"min": 0.25, "max": 2.5}
78
},
89
"background-music":
910
{
@@ -594,7 +595,7 @@
594595
"texture": "textures/car1.png",
595596
"size": { "x": 77, "y": 41 },
596597
"scale": { "x": 1.4, "y": 1.4 },
597-
"frame-count": 3,
598+
"frame-count": 1,
598599
"states":
599600
[
600601
{ "id": "down", "source": { "x": 0, "y": 0 } },
@@ -612,7 +613,7 @@
612613
"texture": "textures/car2.png",
613614
"size": { "x": 96, "y": 63 },
614615
"scale": { "x": 1.0, "y": 1.0 },
615-
"frame-count": 2,
616+
"frame-count": 1,
616617
"states":
617618
[
618619
{ "id": "down", "source": { "x": 0, "y": 0 } },

src/Background.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ void Background::initBackground(const sf::RenderTarget& target)
9191
_cameraType = CameraType::FIXED;
9292
}
9393
}
94+
95+
if (bg.contains("zoom")
96+
&& bg["zoom"].contains("min")
97+
&& bg["zoom"].contains("max"))
98+
{
99+
_minzoom = bg["zoom"]["min"].get<float>();
100+
_maxzoom = bg["zoom"]["max"].get<float>();
101+
}
94102
}
95103

96104
void Background::initZones()

src/Background.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ class Background : public sf::Sprite
9595

9696
CameraType cameraType() const { return _cameraType; }
9797

98+
float minzoom() const { return _minzoom; }
99+
float maxzoom() const { return _maxzoom; }
100+
98101
protected:
99102
std::unique_ptr<sf::Texture> _texture;
100103
ZoneSet _zones;
@@ -107,6 +110,10 @@ class Background : public sf::Sprite
107110
std::unique_ptr<nl::json> _json;
108111
std::string _mapname;
109112
CameraType _cameraType = CameraType::FIXED;
113+
114+
float _minzoom = 0.f;
115+
float _maxzoom = 0.f;
116+
110117
};
111118

112119
} // namespace tt

src/Scenes/Scene.cpp

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,8 @@ Scene::Scene(std::string_view name, const SceneSetup& setup)
253253
_weakPlayer{ setup.player },
254254
_weakHud{ setup.hud },
255255
_itemFactory{ *(setup.itemFactory) },
256-
_logger { log::initializeLogger("Scene") }
256+
_logger { log::initializeLogger("Scene") },
257+
_gameView { _window.getView() }
257258
{
258259
_logger->info("creating scene '{}'", _sceneName);
259260

@@ -466,7 +467,9 @@ ScreenAction Scene::update(sf::Time elapsed)
466467
std::stringstream ss1;
467468
ss1 << "P(" << getPlayerTile()
468469
<< ") G(" << _player->getGlobalCenter()
469-
<< ") T(" << elapsed.asSeconds() << ")";
470+
<< ") T(" << elapsed.asSeconds()
471+
<< ") V(" << _gameView.getSize()
472+
<< ")";
470473

471474
_debugWindow.setText(ss1.str());
472475

@@ -475,19 +478,21 @@ ScreenAction Scene::update(sf::Time elapsed)
475478

476479
void Scene::draw()
477480
{
478-
// always adjust the view
479481
adjustView();
480-
Screen::draw();
482+
_window.setView(_gameView);
483+
484+
Screen::draw(); // draws the background
481485

482486
beforeDraw();
483487

484488
std::for_each(_items.begin(), _items.end(),
485-
[this](ItemPtr item)
486-
{
487-
_window.draw(*item);
489+
[this](ItemPtr item)
490+
{
491+
_window.draw(*item);
488492
});
489493

490494
_window.draw(*_player);
495+
491496
_window.setView(_window.getDefaultView());
492497
_hudPtr->draw();
493498
_descriptionText.draw();
@@ -842,32 +847,31 @@ void Scene::adjustView()
842847
{
843848
return;
844849
}
845-
846-
auto view = _window.getView();
850+
847851
auto [xpos,ypos] = _player->getGlobalCenter();
848852

849853
if (xpos < (_window.getSize().x / 2))
850854
{
851-
xpos = view.getCenter().x;
855+
xpos = _gameView.getCenter().x;
852856
}
853857
else if (auto totalWidth = _background->getGlobalBounds().width;
854858
xpos > (totalWidth - (_window.getSize().x / 2)))
855859
{
856-
xpos = totalWidth - (view.getSize().x / 2);
860+
xpos = totalWidth - (_gameView.getSize().x / 2);
857861
}
858862

859863
if (ypos < (_window.getSize().y / 2))
860864
{
861-
ypos = view.getCenter().y;
865+
ypos = _gameView.getCenter().y;
862866
}
863867
else if (auto totalHeight = _background->getGlobalBounds().height;
864868
ypos > (totalHeight - (_window.getSize().y / 2)))
865869
{
866-
ypos = totalHeight - (view.getSize().y / 2);
870+
ypos = totalHeight - (_gameView.getSize().y / 2);
867871
}
868872

869-
view.setCenter(xpos, ypos);
870-
_window.setView(view);
873+
_gameView.setCenter(xpos, ypos);
874+
// _window.setView(view);
871875
}
872876

873877
PollResult Scene::privatePollHandler(const sf::Event& e)
@@ -1127,6 +1131,38 @@ PollResult Scene::privatePollHandler(const sf::Event& e)
11271131
_player->dance();
11281132
}
11291133
break;
1134+
1135+
case sf::Keyboard::Equal:
1136+
{
1137+
constexpr float ZOOM_AMOUNT = 0.05f;
1138+
if (_background->minzoom() == 0.f
1139+
&& _background->maxzoom() == 0.f)
1140+
{
1141+
break;
1142+
}
1143+
1144+
auto viewSize = _gameView.getSize();
1145+
const auto defaultSize = _window.getDefaultView().getSize();
1146+
1147+
if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)
1148+
|| sf::Keyboard::isKeyPressed(sf::Keyboard::RShift))
1149+
{
1150+
viewSize.x += defaultSize.x * ZOOM_AMOUNT;
1151+
viewSize.y += defaultSize.y * ZOOM_AMOUNT;
1152+
}
1153+
else
1154+
{
1155+
viewSize.x -= defaultSize.x * ZOOM_AMOUNT;
1156+
viewSize.y -= defaultSize.y * ZOOM_AMOUNT;
1157+
}
1158+
1159+
if (float ratio = (viewSize.x / defaultSize.x);
1160+
ratio >= _background->minzoom() && ratio <= _background->maxzoom())
1161+
{
1162+
_gameView.setSize(viewSize);
1163+
}
1164+
}
1165+
break;
11301166
}
11311167
}
11321168

src/Scenes/Scene.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ class Scene : public Screen
223223
DelayedSoundPtr _walkSound;
224224
DelayedSoundPtr _pickupSound;
225225

226+
sf::View _gameView;
227+
226228
private:
227229
void createItems();
228230
virtual void updateCurrentTile(const TileInfo& info);

src/Screens/SettingsScreen.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ void SettingsScreen::initGui()
9797
_sfxValLbl->setText(fmt::format("Sound FX {}%", value));
9898
});
9999
_gui->add(_sfxSlider);
100+
101+
_fullscreenCB = tgui::CheckBox::create("Fullscreen");
102+
_fullscreenCB->setPosition(_sfxValLbl->getPosition().x, 360);
103+
_fullscreenCB->setChecked(settings->value("video.fullscreen", true));
104+
_fullscreenCB->getRenderer()->setTextColor(sf::Color::White);
105+
_fullscreenCB->setTextSize(20);
106+
_gui->add(_fullscreenCB);
100107
}
101108

102109
void SettingsScreen::draw()
@@ -115,6 +122,8 @@ void SettingsScreen::saveSettings()
115122
tempValue = static_cast<std::uint32_t>(_sfxSlider->getValue());
116123
settings->set("audio.volume.sfx", std::to_string(tempValue));
117124

125+
settings->set("video.fullscreen", _fullscreenCB->isChecked() ? "true" : "false");
126+
118127
_resources.settings()->save();
119128
_result = ScreenAction{ScreenActionType::CHANGE_SCREEN, SCREEN_INTRO};
120129
}

src/Screens/SettingsScreen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class SettingsScreen : public Screen
2727

2828
tgui::Label::Ptr _sfxValLbl;
2929
tgui::Slider::Ptr _sfxSlider;
30+
tgui::CheckBox::Ptr _fullscreenCB;
3031

3132
ScreenAction _result;
3233
sf::Font _font;

src/Vehicle.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ std::uint16_t Vehicle::update()
9494
if (_vehicleState == VehicleState::MOVING
9595
&& _movementClock.getElapsedTime().asMilliseconds() > 100)
9696
{
97-
move();
97+
doMove();
9898
_movementClock.restart();
9999
}
100100

@@ -106,7 +106,7 @@ std::uint16_t Vehicle::update()
106106
return TimeStep::NOOP;
107107
}
108108

109-
void Vehicle::move()
109+
void Vehicle::doMove()
110110
{
111111
auto[xpos, ypos, h, w] = getGlobalBounds();
112112
auto currentTile = _bg->getTileFromGlobal(sf::Vector2f{ xpos, ypos });

src/Vehicle.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class Vehicle : public Item
7979
tt::AudioLocator::sound()->play(_hornsound);
8080
}
8181

82-
void move();
82+
void doMove();
8383

8484
private:
8585
void setDirection(std::uint32_t dir);

src/main.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ amb::SettingsPtr registerSettings()
6060

6161
retval->registerBool("logs.music.enabled", false);
6262
retval->registerBool("logs.sfx.enabled", false);
63+
retval->registerBool("logs.sfx.enabled", false);
64+
retval->registerBool("video.fullscreen", true);
6365

6466
return retval;
6567
}
@@ -204,12 +206,21 @@ int main(int argc, char *argv[])
204206
}
205207
logger->debug("initializing window size {}x{}", width, height);
206208

207-
auto win = std::make_shared<sf::RenderWindow>(
208-
sf::VideoMode( static_cast<unsigned int>(width),
209-
static_cast<unsigned int>(height) ),
210-
APP_NAME_LONG,
211-
sf::Style::Titlebar | sf::Style::Close
212-
);
209+
std::shared_ptr<sf::RenderWindow> win;
210+
if (settings->value("video.fullscreen", true))
211+
{
212+
win = std::make_shared<sf::RenderWindow>(
213+
sf::VideoMode(static_cast<unsigned int>(width), static_cast<unsigned int>(height)),
214+
APP_NAME_LONG,
215+
sf::Style::Fullscreen);
216+
}
217+
else
218+
{
219+
win = std::make_shared<sf::RenderWindow>(
220+
sf::VideoMode(static_cast<unsigned int>(width), static_cast<unsigned int>(height)),
221+
APP_NAME_LONG,
222+
sf::Style::Titlebar | sf::Style::Close);
223+
}
213224

214225
win->setFramerateLimit(60);
215226

0 commit comments

Comments
 (0)