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();
|
|
|
|
|
}
|
|
|
|
|
}
|