diff --git a/CMakeLists.txt b/CMakeLists.txt index 62c7159..17c4ba9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,37 +11,20 @@ add_subdirectory(libs/blah) # add our source add_executable(game src/main.cpp - src/world.h src/world.cpp - src/game.h src/game.cpp - src/content.h src/content.cpp - src/masks.h - src/factory.h src/factory.cpp - src/assets/sprite.h src/assets/sprite.cpp - src/assets/tileset.h src/assets/tileset.cpp - src/components/animator.h src/components/animator.cpp - src/components/collider.h src/components/collider.cpp - src/components/player.h src/components/player.cpp - src/components/mover.h src/components/mover.cpp - src/components/tilemap.h src/components/tilemap.cpp - src/components/hurtable.h src/components/hurtable.cpp - src/components/timer.h src/components/timer.cpp - src/components/enemy.h - src/components/ghost_frog.h src/components/ghost_frog.cpp - src/components/orb.h src/components/orb.cpp ) @@ -51,14 +34,4 @@ target_link_libraries(game blah) if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten") set_target_properties(game PROPERTIES LINK_FLAGS "-s USE_SDL=2 -s USE_WEBGL2=1 --preload-file ${CMAKE_SOURCE_DIR}/content@/content") set(CMAKE_EXECUTABLE_SUFFIX ".html") -endif() - -# copy SDL2 to the build directory -set(SDL2_DLL "" CACHE FILEPATH "SDL2 DLL Path") -if (SDL2_ENABLED) - if (EXISTS ${SDL2_DLL}) - add_custom_command( - TARGET game POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${SDL2_DLL} $) - endif() -endif() +endif() \ No newline at end of file diff --git a/libs/blah b/libs/blah index 78b8140..9beb7ef 160000 --- a/libs/blah +++ b/libs/blah @@ -1 +1 @@ -Subproject commit 78b8140f539b0d0911b4426826201fcf95e568bf +Subproject commit 9beb7eff58ae78810fa7f4d9830f8c46c0c0531a diff --git a/src/assets/sprite.h b/src/assets/sprite.h index 6ebd967..b383459 100644 --- a/src/assets/sprite.h +++ b/src/assets/sprite.h @@ -28,7 +28,7 @@ namespace TL }; String name; - Vec2 origin; + Vec2f origin; Vector animations; const Animation* get_animation(const String& name) const; diff --git a/src/assets/tileset.cpp b/src/assets/tileset.cpp index 9c64fcb..b5c2921 100644 --- a/src/assets/tileset.cpp +++ b/src/assets/tileset.cpp @@ -1,9 +1,10 @@ #include "tileset.h" +#include "../game.h" using namespace TL; const Subtexture& Tileset::random_tile() const { - int i = Calc::rand_int(columns * rows); + int i = Game::rand_int(0, columns * rows); return tiles[i]; } diff --git a/src/components/animator.cpp b/src/components/animator.cpp index 8e1e700..2816b4c 100644 --- a/src/components/animator.cpp +++ b/src/components/animator.cpp @@ -72,11 +72,11 @@ void Animator::render(Batch& batch) if (in_valid_state()) { batch.push_matrix( - Mat3x2::create_transform(entity()->position + offset, m_sprite->origin, scale, 0)); + Mat3x2f::create_transform(entity()->position + offset, m_sprite->origin, scale, 0)); auto& anim = m_sprite->animations[m_animation_index]; auto& frame = anim.frames[m_frame_index]; - batch.tex(frame.image, Vec2::zero, Color::white); + batch.tex(frame.image, Vec2f::zero, Color::white); batch.pop_matrix(); } diff --git a/src/components/animator.h b/src/components/animator.h index 5875637..4cb92e0 100644 --- a/src/components/animator.h +++ b/src/components/animator.h @@ -16,7 +16,7 @@ namespace TL float m_frame_counter = 0; public: - Vec2 scale = Vec2::one; + Vec2f scale = Vec2f::one; Point offset = Point::zero; Animator() = default; diff --git a/src/components/collider.cpp b/src/components/collider.cpp index 92fc1b2..aec45cc 100644 --- a/src/components/collider.cpp +++ b/src/components/collider.cpp @@ -8,7 +8,7 @@ Collider::Collider() active = false; } -Collider Collider::make_rect(const RectI& rect) +Collider Collider::make_rect(const Recti& rect) { Collider collider; collider.m_shape = Shape::Rect; @@ -32,13 +32,13 @@ Collider::Shape Collider::shape() const return m_shape; } -RectI Collider::get_rect() const +Recti Collider::get_rect() const { BLAH_ASSERT(m_shape == Shape::Rect, "Collider is not a Rectangle"); return m_rect; } -void Collider::set_rect(const RectI& value) +void Collider::set_rect(const Recti& value) { BLAH_ASSERT(m_shape == Shape::Rect, "Collider is not a Rectangle"); m_rect = value; @@ -142,7 +142,7 @@ void Collider::render(Batch& batch) { static const Color color = Color::red; - batch.push_matrix(Mat3x2::create_translation(entity()->position)); + batch.push_matrix(Mat3x2f::create_translation(entity()->position)); if (m_shape == Shape::Rect) { @@ -169,8 +169,8 @@ void Collider::render(Batch& batch) bool TL::Collider::rect_to_rect(const Collider* a, const Collider* b, Point offset) { - RectI ar = a->m_rect + a->entity()->position + offset; - RectI br = b->m_rect + b->entity()->position; + Recti ar = a->m_rect + a->entity()->position + offset; + Recti br = b->m_rect + b->entity()->position; return ar.overlaps(br); } @@ -178,7 +178,7 @@ bool TL::Collider::rect_to_rect(const Collider* a, const Collider* b, Point offs bool TL::Collider::rect_to_grid(const Collider* a, const Collider* b, Point offset) { // get a relative rectangle to the grid - RectI rect = a->m_rect + a->entity()->position + offset - b->entity()->position; + Recti rect = a->m_rect + a->entity()->position + offset - b->entity()->position; // get the cells the rectangle overlaps int left = Calc::clamp((int)Calc::floor(rect.x / (float)b->m_grid.tile_size), 0, b->m_grid.columns); diff --git a/src/components/collider.h b/src/components/collider.h index 3c50f00..538f46c 100644 --- a/src/components/collider.h +++ b/src/components/collider.h @@ -20,12 +20,12 @@ namespace TL Collider(); - static Collider make_rect(const RectI& rect); + static Collider make_rect(const Recti& rect); static Collider make_grid(int tile_size, int columns, int rows); Shape shape() const; - RectI get_rect() const; - void set_rect(const RectI& value); + Recti get_rect() const; + void set_rect(const Recti& value); bool get_cell(int x, int y) const; void set_cell(int x, int y, bool value); void set_cells(int x, int y, int w, int h, bool value); @@ -47,7 +47,7 @@ namespace TL }; Shape m_shape = Shape::None; - RectI m_rect; + Recti m_rect; Grid m_grid; static bool rect_to_rect(const Collider* a, const Collider* b, Point offset); diff --git a/src/components/ghost_frog.cpp b/src/components/ghost_frog.cpp index eb25267..d8f32f1 100644 --- a/src/components/ghost_frog.cpp +++ b/src/components/ghost_frog.cpp @@ -44,7 +44,7 @@ void GhostFrog::update() } // flip sprite - anim->scale = Vec2(m_facing, 1); + anim->scale = Vec2f(m_facing, 1); // NORMAL STATE if (m_state == st_readying_attack) @@ -76,9 +76,9 @@ void GhostFrog::update() if (Time::on_time(m_timer, 0.8f)) { mover->speed.x = m_facing * 250; - hitbox->set_rect(RectI(-4 + m_facing * 4, -12, 8, 12)); + hitbox->set_rect(Recti(-4 + m_facing * 4, -12, 8, 12)); - RectI rect(8, -8, 20, 8); + Recti rect(8, -8, 20, 8); if (m_facing < 0) rect.x = -(rect.x + rect.w); @@ -97,7 +97,7 @@ void GhostFrog::update() // end attack state else if (m_timer >= anim->animation()->duration()) { - hitbox->set_rect(RectI(-4, -12, 8, 12)); + hitbox->set_rect(Recti(-4, -12, 8, 12)); if (health > 0) { @@ -107,7 +107,7 @@ void GhostFrog::update() { phase = 1; health = max_health_2; - m_side = Calc::rand_int(0, 2) == 0 ? -1 : 1; + m_side = Game::rand_int(0, 2) == 0 ? -1 : 1; set_state(st_floating); } } @@ -142,7 +142,7 @@ void GhostFrog::update() // SHOOTING STATE else if (m_state == st_shoot) { - mover->speed = Calc::approach(mover->speed, Vec2::zero, 300 * Time::delta); + mover->speed = Vec2f::approach(mover->speed, Vec2f::zero, 300 * Time::delta); m_facing = Calc::sign(player_x - x); if (m_facing == 0) @@ -182,7 +182,7 @@ void GhostFrog::update() { if (m_reflect_count < 2) { - if (Vec2(orb->entity()->position - orb->target()).length() < 16) + if (Vec2f(orb->entity()->position - orb->target()).length() < 16) { auto sign = Calc::sign(orb->entity()->position.x - x); if (sign != 0) @@ -197,7 +197,7 @@ void GhostFrog::update() } else { - if (Vec2(orb->entity()->position - orb->target()).length() < 8) + if (Vec2f(orb->entity()->position - orb->target()).length() < 8) { Factory::pop(world(), entity()->position + Point(0, -8)); orb->entity()->destroy(); @@ -215,7 +215,7 @@ void GhostFrog::update() if (Time::on_interval(0.25f)) { - auto offset = Point(Calc::rand_int(-16, 16), Calc::rand_int(-16, 16)); + auto offset = Point(Game::rand_int(-16, 16), Game::rand_int(-16, 16)); Factory::pop(world(), entity()->position + Point(0, -8) + offset); } diff --git a/src/components/mover.h b/src/components/mover.h index 110c321..8afb144 100644 --- a/src/components/mover.h +++ b/src/components/mover.h @@ -11,11 +11,11 @@ namespace TL class Mover : public Component { private: - Vec2 m_remainder; + Vec2f m_remainder; public: Collider* collider = nullptr; - Vec2 speed; + Vec2f speed; float gravity = 0; float friction = 0; std::function on_hit_x; diff --git a/src/components/player.cpp b/src/components/player.cpp index 9d04590..b87a1ff 100644 --- a/src/components/player.cpp +++ b/src/components/player.cpp @@ -24,38 +24,37 @@ namespace Player::Player() { - input_move.add_dpad(0); - input_move.add_left_stick(0, 0.2f); - input_move.add(Key::Left, Key::Right, Key::Up, Key::Down); + input_move = Input::register_binding(StickBinding()); + input_move->add_dpad(0); + input_move->add_left_stick(0, 0.2f); + input_move->add(Key::Left, Key::Right, Key::Up, Key::Down); - input_jump.press_buffer = 0.15f; - input_jump.add(Key::X, Button::A); + input_jump = Input::register_binding(ButtonBinding()); + input_jump->press_buffer = 0.15f; + input_jump->add(Key::X, Button::A); - input_attack.press_buffer = 0.15f; - input_attack.add(Key::C, Button::X); + input_attack = Input::register_binding(ButtonBinding()); + input_attack->press_buffer = 0.15f; + input_attack->add(Key::C, Button::X); } void Player::update() { - input_move.update(); - input_jump.update(); - input_attack.update(); - auto mover = get(); auto anim = get(); auto hitbox = get(); auto was_on_ground = m_on_ground; m_on_ground = mover->on_ground(); - int input = input_move.sign().x; + int input = input_move->sign().x; // Sprite Stuff { // land squish if (!was_on_ground && m_on_ground) - anim->scale = Vec2(m_facing * 1.5f, 0.7f); + anim->scale = Vec2f(m_facing * 1.5f, 0.7f); // lerp scale back to one - anim->scale = Calc::approach(anim->scale, Vec2(m_facing, 1.0f), Time::delta * 4); + anim->scale = Vec2f::approach(anim->scale, Vec2f(m_facing, 1.0f), Time::delta * 4); // set m_facing anim->scale.x = Calc::abs(anim->scale.x) * m_facing; @@ -114,25 +113,25 @@ void Player::update() // Invoke Jumping { - if (input_jump.pressed() && mover->on_ground()) + if (input_jump->pressed() && mover->on_ground()) { - input_jump.consume_press(); - anim->scale = Vec2(m_facing * 0.65f, 1.4f); + input_jump->consume_press(); + anim->scale = Vec2f(m_facing * 0.65f, 1.4f); mover->speed.x = input * max_air_speed; m_jump_timer = jump_time; } } // Begin Attack - if (input_attack.pressed()) + if (input_attack->pressed()) { - input_attack.consume_press(); + input_attack->consume_press(); m_state = st_attack; m_attack_timer = 0; if (!m_attack_collider) - m_attack_collider = entity()->add(Collider::make_rect(RectI())); + m_attack_collider = entity()->add(Collider::make_rect(Recti())); m_attack_collider->mask = Mask::player_attack; if (m_on_ground) @@ -148,11 +147,11 @@ void Player::update() // setup hitbox if (m_attack_timer < 0.2f) { - m_attack_collider->set_rect(RectI(-16, -12, 16, 8)); + m_attack_collider->set_rect(Recti(-16, -12, 16, 8)); } else if (m_attack_timer < 0.5f) { - m_attack_collider->set_rect(RectI(8, -8, 16, 8)); + m_attack_collider->set_rect(Recti(8, -8, 16, 8)); } else if (m_attack_collider) { @@ -190,7 +189,7 @@ void Player::update() { mover->speed.y = -100; m_jump_timer -= Time::delta; - if (!input_jump.down()) + if (!input_jump->down()) m_jump_timer = 0; } @@ -209,7 +208,7 @@ void Player::update() if (!m_on_ground) { float grav = gravity; - if (m_state == st_normal && Calc::abs(mover->speed.y) < 20 && input_jump.down()) + if (m_state == st_normal && Calc::abs(mover->speed.y) < 20 && input_jump->down()) grav *= 0.4f; mover->speed.y += grav * Time::delta; @@ -230,7 +229,7 @@ void Player::update() m_attack_collider = nullptr; } - mover->speed = Vec2(-m_facing * 100, -80); + mover->speed = Vec2f(-m_facing * 100, -80); health--; m_hurt_timer = hurt_duration; diff --git a/src/components/player.h b/src/components/player.h index 6d93618..4932ddf 100644 --- a/src/components/player.h +++ b/src/components/player.h @@ -18,9 +18,9 @@ namespace TL int health = max_health; - StickBinding input_move; - Binding input_jump; - Binding input_attack; + StickBindingRef input_move; + ButtonBindingRef input_jump; + ButtonBindingRef input_attack; Player(); void update() override; diff --git a/src/components/tilemap.cpp b/src/components/tilemap.cpp index 7231fa1..87ca66e 100644 --- a/src/components/tilemap.cpp +++ b/src/components/tilemap.cpp @@ -52,12 +52,12 @@ void Tilemap::set_cells(int x, int y, int w, int h, const Subtexture* tex) void Tilemap::render(Batch& batch) { - batch.push_matrix(Mat3x2::create_translation(entity()->position)); + batch.push_matrix(Mat3x2f::create_translation(entity()->position)); for (int x = 0; x < m_columns; x ++) for (int y = 0; y < m_rows; y ++) if (m_grid[x + y * m_columns].texture) { - batch.tex(m_grid[x + y * m_columns], Vec2(x * m_tile_width, y * m_tile_height)); + batch.tex(m_grid[x + y * m_columns], Vec2f(x * m_tile_width, y * m_tile_height)); } batch.pop_matrix(); } diff --git a/src/content.cpp b/src/content.cpp index fd87abc..36de477 100644 --- a/src/content.cpp +++ b/src/content.cpp @@ -43,7 +43,10 @@ FilePath Content::path() } while (!Directory::exists(root) && up.length() < 30); if (!Directory::exists(root)) - BLAH_ERROR("Unable to find content directory!"); + { + Log::error("Unable to find content directory!"); + return ""; + } Log::info("Content Path: %s", root.cstr()); } @@ -105,7 +108,7 @@ void Content::load() for (int x = 0; x < columns; x++) for (int y = 0; y < rows; y++) { - auto subrect = RectI(x * Game::tile_width, y * Game::tile_height, Game::tile_width, Game::tile_height); + auto subrect = Recti(x * Game::tile_width, y * Game::tile_height, Game::tile_width, Game::tile_height); auto subimage = frame.image.get_sub_image(subrect); packer.add(pack_index, subimage); pack_index++; @@ -128,11 +131,11 @@ void Content::load() { Sprite sprite; sprite.name = info.name; - sprite.origin = Vec2::zero; + sprite.origin = Vec2f::zero; if (info.aseprite.slices.size() > 0 && info.aseprite.slices[0].has_pivot) { - sprite.origin = Vec2( + sprite.origin = Vec2f( info.aseprite.slices[0].pivot.x, info.aseprite.slices[0].pivot.y); } @@ -199,7 +202,7 @@ void Content::load() void Content::unload() { - font.dispose(); + font = SpriteFont(); } TextureRef Content::atlas() diff --git a/src/factory.cpp b/src/factory.cpp index e8b4622..0935982 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -20,7 +20,7 @@ Entity* Factory::player(World* world, Point position) anim->play("idle"); anim->depth = -10; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -12, 8, 12))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -12, 8, 12))); hitbox->mask = Mask::player; auto mover = en->add(Mover()); @@ -38,7 +38,7 @@ Entity* Factory::bramble(World* world, Point position) anim->play("idle"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -8, 8, 8))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -8, 8, 8))); hitbox->mask = Mask::enemy; auto hurtable = en->add(Hurtable()); @@ -78,7 +78,7 @@ Entity* Factory::spitter(World* world, Point position) anim->play("idle"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-6, -12, 12, 12))); + auto hitbox = en->add(Collider::make_rect(Recti(-6, -12, 12, 12))); hitbox->mask = Mask::enemy; auto hurtable = en->add(Hurtable()); @@ -110,12 +110,12 @@ Entity* Factory::bullet(World* world, Point position, int direction) anim->play("idle"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -4, 8, 8))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -4, 8, 8))); hitbox->mask = Mask::enemy; auto mover = en->add(Mover()); mover->collider = hitbox; - mover->speed = Vec2(direction * 40, 0); + mover->speed = Vec2f(direction * 40, 0); mover->gravity = 130; mover->on_hit_x = [](Mover* self) { self->entity()->destroy(); }; mover->on_hit_y = [](Mover* self) { self->speed.y = -60; }; @@ -203,7 +203,7 @@ Entity* Factory::mosquito(World* world, Point position) anim->play("fly"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -4, 8, 8))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -4, 8, 8))); hitbox->mask = Mask::enemy; auto mover = en->add(Mover()); @@ -225,7 +225,7 @@ namespace anim->play("idle"); anim->depth = -1; - auto hitbox = en->add(Collider::make_rect(RectI(-6, -16, 12, 16))); + auto hitbox = en->add(Collider::make_rect(Recti(-6, -16, 12, 16))); hitbox->mask = Mask::solid; } } @@ -275,7 +275,7 @@ Entity* Factory::blob(World* world, Point position) anim->play("idle"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -8, 8, 8))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -8, 8, 8))); hitbox->mask = Mask::enemy; auto mover = en->add(Mover()); @@ -307,7 +307,7 @@ Entity* Factory::blob(World* world, Point position) auto dir = Calc::sign(player->entity()->position.x - self->entity()->position.x); if (dir == 0) dir = 1; - self->get()->scale = Vec2(dir, 1); + self->get()->scale = Vec2f(dir, 1); mover->speed.x = dir * 40; } } @@ -347,7 +347,7 @@ Entity* Factory::ghost_frog(World* world, Point position) anim->play("sword"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -12, 8, 12))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -12, 8, 12))); hitbox->mask = Mask::enemy; auto mover = en->add(Mover()); @@ -374,7 +374,7 @@ Entity* Factory::orb(World* world, Point position) anim->play("idle"); anim->depth = -5; - auto hitbox = en->add(Collider::make_rect(RectI(-4, -4, 8, 8))); + auto hitbox = en->add(Collider::make_rect(Recti(-4, -4, 8, 8))); hitbox->mask = Mask::enemy; auto mover = en->add(Mover()); @@ -384,7 +384,7 @@ Entity* Factory::orb(World* world, Point position) auto hurtable = en->add(Hurtable()); hurtable->hurt_by = Mask::player_attack; - hurtable->collider = en->add(Collider::make_rect(RectI(-8, -8, 16, 16))); + hurtable->collider = en->add(Collider::make_rect(Recti(-8, -8, 16, 16))); hurtable->on_hurt = [](Hurtable* self) { self->get()->on_hit(); }; return en; diff --git a/src/game.cpp b/src/game.cpp index 6041acd..4cd3074 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -8,6 +8,7 @@ #include "components/mover.h" #include "assets/sprite.h" #include "factory.h" +#include using namespace TL; @@ -24,7 +25,7 @@ void Game::startup() Content::load(); // framebuffer for the game - buffer = FrameBuffer::create(width, height); + buffer = Target::create(width, height); // set batcher to use Nearest Filter batch.default_sampler = TextureSampler(TextureFilter::Nearest); @@ -32,7 +33,7 @@ void Game::startup() // load first room load_room(Point(0, 0)); - camera = Vec2(room.x * width, room.y * height); + camera = Vec2f(room.x * width, room.y * height); fullscreen = false; } @@ -102,7 +103,7 @@ void Game::load_room(Point cell, bool is_reload) { tilemap->set_cell(x, y, &jumpthrus->random_tile()); auto jumpthru_en = world.add_entity(offset + Point(x * tile_width, y * tile_height)); - auto jumpthru_col = jumpthru_en->add(Collider::make_rect(RectI(0, 0, 8, 4))); + auto jumpthru_col = jumpthru_en->add(Collider::make_rect(Recti(0, 0, 8, 4))); jumpthru_col->mask = Mask::jumpthru; break; } @@ -176,6 +177,7 @@ void Game::update() m_transition = false; world.clear(); load_room(Point(0, 0)); + camera = Vec2f(0, 0); } // Toggle Fullscreen @@ -191,8 +193,8 @@ void Game::update() { if (Time::on_interval(0.05f)) { - m_shake.x = Calc::rand_int(0, 2) == 0 ? -1 : 1; - m_shake.y = Calc::rand_int(0, 2) == 0 ? -1 : 1; + m_shake.x = rand_int(0, 2) == 0 ? -1 : 1; + m_shake.y = rand_int(0, 2) == 0 ? -1 : 1; } } else @@ -206,7 +208,7 @@ void Game::update() if (player) { auto pos = player->entity()->position; - auto bounds = RectI(room.x * width, room.y * height, width, height); + auto bounds = Recti(room.x * width, room.y * height, width, height); if (!bounds.contains(pos)) { // target room @@ -275,8 +277,8 @@ void Game::update() m_next_ease = Calc::approach(m_next_ease, 1.0f, Time::delta / transition_duration); // get last & next camera position - auto last_cam = Vec2(m_last_room.x * width, m_last_room.y * height); - auto next_cam = Vec2(m_next_room.x * width, m_next_room.y * height); + auto last_cam = Vec2f(m_last_room.x * width, m_last_room.y * height); + auto next_cam = Vec2f(m_next_room.x * width, m_next_room.y * height); // LERP camera position camera = last_cam + (next_cam - last_cam) * Ease::cube_in_out(m_next_ease); @@ -289,7 +291,7 @@ void Game::update() { auto player = world.first(); if (player) - player->get()->speed = Vec2(0, -150); + player->get()->speed = Vec2f(0, -150); } // delete old objects (except player!) @@ -312,7 +314,7 @@ void Game::render() buffer->clear(0x150e22); // push camera offset - batch.push_matrix(Mat3x2::create_translation(-camera + m_shake)); + batch.push_matrix(Mat3x2f::create_translation(-camera + m_shake)); // draw gameplay objects world.render(batch); @@ -381,17 +383,17 @@ void Game::render() // draw buffer to the screen { float scale = Calc::min( - App::backbuffer->width() / (float)buffer->width(), - App::backbuffer->height() / (float)buffer->height()); + 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; + Vec2f screen_center = Vec2f(App::backbuffer()->width(), App::backbuffer()->height()) / 2; + Vec2f buffer_center = Vec2f(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); + App::backbuffer()->clear(Color::black); + batch.push_matrix(Mat3x2f::create_transform(screen_center, buffer_center, Vec2f::one * scale, 0)); + batch.tex(buffer->texture(0), Vec2f::zero, Color::white); batch.pop_matrix(); - batch.render(App::backbuffer); + batch.render(App::backbuffer()); batch.clear(); } } @@ -400,3 +402,8 @@ void Game::shake(float time) { m_shake_timer = time; } + +int Game::rand_int(int min, int max) +{ + return min + (rand() % (max - min)); +} diff --git a/src/game.h b/src/game.h index fd8f89d..b730cd1 100644 --- a/src/game.h +++ b/src/game.h @@ -21,10 +21,10 @@ namespace TL static inline const char* ending = "YOU SAVED POND\nAND YOU ARE\nA REAL HERO"; World world; - FrameBufferRef buffer; + TargetRef buffer; Batch batch; Point room; - Vec2 camera; + Vec2f camera; bool fullscreen = false; void load_room(Point cell, bool is_reload = false); @@ -34,6 +34,8 @@ namespace TL void render(); void shake(float time); + static int rand_int(int min, int max); + private: bool m_draw_colliders; bool m_transition = false; diff --git a/src/main.cpp b/src/main.cpp index 06b5533..b03273a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,42 +4,19 @@ using namespace Blah; using namespace TL; -namespace +int main() { Game game; - void startup() - { - game.startup(); - } - - void shutdown() - { - game.shutdown(); - } - - void update() - { - game.update(); - } - - void render() - { - game.render(); - } -} - -int main() -{ Config config; config.name = "Sword II: Adventure of Frog"; config.width = 1280; config.height = 720; - config.on_startup = startup; - config.on_shutdown = shutdown; - config.on_update = update; - config.on_render = render; + config.on_startup = [&]() { game.startup(); }; + config.on_shutdown = [&]() { game.shutdown(); }; + config.on_update = [&]() { game.update(); }; + config.on_render = [&]() { game.render(); }; App::run(&config); } \ No newline at end of file