Files
tiny_link/src/game.cpp

104 lines
2.1 KiB
C++
Raw Normal View History

2021-01-02 13:51:50 -08:00
#include "game.h"
#include "content.h"
2021-01-02 16:20:01 -08:00
#include "masks.h"
2021-01-02 17:50:25 -08:00
#include "assets/tileset.h"
2021-01-02 16:20:01 -08:00
#include "components/collider.h"
2021-01-02 17:50:25 -08:00
#include "components/tilemap.h"
2021-01-02 17:05:12 -08:00
#include "factory.h"
2021-01-02 13:51:50 -08:00
using namespace TL;
void Game::startup()
{
// load our content
Content::load();
// framebuffer for the game
2021-01-02 17:50:25 -08:00
buffer = FrameBuffer::create(width, height);
2021-01-02 13:51:50 -08:00
// set batcher to use Nearest Filter
batch.default_sampler = TextureSampler(TextureFilter::Nearest);
2021-01-02 16:20:01 -08:00
2021-01-02 17:05:12 -08:00
m_draw_colliders = true;
2021-01-02 16:20:01 -08:00
2021-01-02 17:05:12 -08:00
load_map();
}
2021-01-02 16:20:01 -08:00
2021-01-02 17:05:12 -08:00
void Game::load_map()
{
world.clear();
2021-01-02 16:20:01 -08:00
2021-01-02 17:05:12 -08:00
// add a test player
2021-01-02 17:50:25 -08:00
Factory::player(&world, Point(width / 2, height - 32));
2021-01-02 17:05:12 -08:00
2021-01-02 17:50:25 -08:00
// get the castle tileset for now
auto castle = Content::find_tileset("castle");
// make the floor
auto floor = world.add_entity();
auto tm = floor->add(Tilemap(8, 8, 40, 23));
tm->set_cells(0, 20, 40, 3, &castle->tiles[0]);
tm->set_cells(0, 18, 10, 2, &castle->tiles[0]);
auto c2 = floor->add(Collider::make_grid(8, 40, 23));
c2->set_cells(0, 20, 40, 3, true);
c2->set_cells(0, 18, 10, 2, true);
2021-01-02 17:05:12 -08:00
c2->mask = Mask::solid;
2021-01-02 13:51:50 -08:00
}
void Game::shutdown()
{
}
void Game::update()
{
2021-01-02 16:20:01 -08:00
if (Input::pressed(Key::F1))
m_draw_colliders = !m_draw_colliders;
2021-01-02 17:05:12 -08:00
if (Input::pressed(Key::F2))
load_map();
2021-01-02 13:51:50 -08:00
2021-01-02 16:20:01 -08:00
world.update();
2021-01-02 13:51:50 -08:00
}
void Game::render()
{
// draw gameplay stuff
{
2021-01-02 16:20:01 -08:00
buffer->clear(0x4488aa);
world.render(batch);
if (m_draw_colliders)
{
auto collider = world.first<Collider>();
while (collider)
{
collider->render(batch);
collider = (Collider*)collider->next();
}
}
2021-01-02 13:51:50 -08:00
2021-01-02 17:50:25 -08:00
batch.tex(Content::atlas());
2021-01-02 13:51:50 -08:00
batch.render(buffer);
batch.clear();
}
// draw buffer to the screen
{
float scale = Calc::min(
App::backbuffer->width() / (float)buffer->width(),
App::backbuffer->height() / (float)buffer->height());
Vec2 screen_center = Vec2(App::backbuffer->width(), App::backbuffer->height()) / 2;
Vec2 buffer_center = Vec2(buffer->width(), buffer->height()) / 2;
App::backbuffer->clear(Color::black);
batch.push_matrix(Mat3x2::create_transform(screen_center, buffer_center, Vec2::one * scale, 0));
batch.tex(buffer->attachment(0), Vec2::zero, Color::white);
batch.pop_matrix();
batch.render(App::backbuffer);
batch.clear();
}
}