mapcreator git · master
SDL3 2.5D game and engine using assets, with map editor
C++ 99.3%git clone https://git.christianimmanuel.de/sdl-graphics/mapcreator.gitwget https://git.christianimmanuel.de/sdl-graphics/mapcreator/archive/mapcreator.tar.gzAdd plant can grow
src/character/character.cpp | 5 +++- src/defaults/defaults.hpp | 2 +- src/game/state_playing.cpp | 5 ++++ src/objects/object.cpp | 12 ++++++-- src/vegetables/vegetables.cpp | 66 +++++++++++++++++++++++++------------------ src/vegetables/vegetables.hpp | 9 ++++++ 6 files changed, 68 insertions(+), 31 deletions(-) diff --git a/src/character/character.cpp b/src/character/character.cpp index 158f4b4..8e781a2 100644 --- a/src/character/character.cpp +++ b/src/character/character.cpp @@ -817,7 +817,8 @@ Character::plant_Start() { set_Status(CharacterStatus::PLANTING); handle_Animation(); planting_logic.is_planting = true; - planting_logic.tile_world = tile_world; + planting_logic.tile_world = tile_world; + planting_logic.type = static_cast<InventoryVegetable*>(selected_item)->type; } void @@ -837,9 +838,11 @@ Character::plant_Vegetable() { if (planting_logic.duration >= planting_logic.duration_max) { const VegetableData::CropDefinition* crop_def = VegetableData::get_DataByType(planting_logic.type); + std::cout << "DEF " << (int)planting_logic.type << " " << crop_def->name << std::endl; Vegetable* v = new Vegetable(crop_def, planting_logic.tile_world); TileObject to = {{0,0}, true, v->id}; size_t id = Map::get_IdFromTilePoint(planting_logic.tile_world); + std::cout << " " << id << std::endl; Map::tile_map[id].objects.push_back(to); plant_Stop(); diff --git a/src/defaults/defaults.hpp b/src/defaults/defaults.hpp index d39388f..b10631a 100644 --- a/src/defaults/defaults.hpp +++ b/src/defaults/defaults.hpp @@ -42,7 +42,7 @@ namespace Default { extern SDL_Color menu_hovering_color; - void set_DeltaTime(); + void set_DeltaTime(); double get_TimeSinceStartInSec(); diff --git a/src/game/state_playing.cpp b/src/game/state_playing.cpp index d0aed1d..eb7a3b2 100644 --- a/src/game/state_playing.cpp +++ b/src/game/state_playing.cpp @@ -142,6 +142,11 @@ void StatePlaying::Update(Game* game) { // SET Map offset Map::set_Offset(game->input); + // VEGETABLES + for (Vegetable* veg : VegetableData::all_vegetables) { + veg->Grow(Default::get_TimeSinceStartInSec()); + } + // CHARACTER player->handle_Input(game->input, game->win_size); player->handle_Move(); diff --git a/src/objects/object.cpp b/src/objects/object.cpp index 94edfdb..4794381 100644 --- a/src/objects/object.cpp +++ b/src/objects/object.cpp @@ -188,7 +188,7 @@ Object::print_CollisionMap() { void Object::Draw(SDL_Renderer* renderer, SDL_FPoint position, bool is_transparent, int transparency) { SDL_Point obj_set_pos = get_SetPosition(); - SDL_FRect obj_src = { + SDL_FRect obj_src { static_cast<float>(obj_set_pos.x) * static_cast<float>(Tile::tile_size), static_cast<float>(obj_set_pos.y) * static_cast<float>(Tile::tile_size), static_cast<float>(dimension.x * static_cast<int>(Tile::tile_size)), @@ -196,10 +196,18 @@ Object::Draw(SDL_Renderer* renderer, SDL_FPoint position, bool is_transparent, i }; int size = Tile::get_Size(); - SDL_FRect dst = { Scale(position.x + Map::offset.x), + SDL_FRect dst; + if (object_type == ObjectType::VEGETABLE) { + dst = { Scale(position.x + Map::offset.x), + Scale(position.y + Map::offset.y-7), + Scale(dimension.x * size), + Scale(dimension.y * size) }; + } else { + dst = { Scale(position.x + Map::offset.x), Scale(position.y + Map::offset.y), Scale(dimension.x * size), Scale(dimension.y * size) }; + } SDL_Texture* tex = Tile::tilesets[tileset_type][tileset_id].texture; diff --git a/src/vegetables/vegetables.cpp b/src/vegetables/vegetables.cpp index 8328349..080ead2 100644 --- a/src/vegetables/vegetables.cpp +++ b/src/vegetables/vegetables.cpp @@ -4,6 +4,8 @@ namespace VegetableData { + std::vector<Vegetable*> all_vegetables; + const CropDefinition crop_defs[(int)Type::COUNT] = { { "",0,0,0,0,0,0,0,0,0,0,0 }, { "carrot", 2,1, 5,1, 6,1, 7,1, 23,0, (5-2+1)+1}, @@ -37,9 +39,14 @@ Vegetable::Vegetable(const VegetableData::CropDefinition* cd, 0), definition(cd), growth_stage(0), - last_update_sec(0.0), + last_update_sec(Default::get_TimeSinceStartInSec()), equipement_slot(EquipmentSlot::HAND_RIGHT) { + tileset_object_x = definition->start_tile_x; + tileset_object_y = definition->start_tile_y; + VegetableData::all_vegetables.push_back(this); + + objects.push_back(this); update_TilesetId(); } @@ -60,28 +67,30 @@ Vegetable::get_DataByType() { SDL_Point Vegetable::get_SetPosition() { - const VegetableData::CropDefinition& data = get_DataByType(); - return {data.icon_tile_x, data.icon_tile_y}; + return { tileset_object_x, tileset_object_y }; } + +static constexpr double SECONDS_PER_STAGE = 5.0; void Vegetable::Grow(double current_seconds) { if (current_seconds <= last_update_sec) return; double delta_sec = current_seconds - last_update_sec; - last_update_sec = current_seconds; - // each second = 1 stage - size_t delta_stages = static_cast<size_t>(delta_sec); + size_t delta_stages = static_cast<size_t>(delta_sec / SECONDS_PER_STAGE); + //std::cout << "GROW " << delta_stages << " " << delta_sec << " " << SECONDS_PER_STAGE << std::endl; + + if (delta_stages == 0) + return; - if (delta_stages > 0) { - growth_stage += delta_stages; + last_update_sec += static_cast<double>(delta_stages) * SECONDS_PER_STAGE; - if (growth_stage >= definition->total_stages) - growth_stage = definition->total_stages - 1; + growth_stage += delta_stages; + if (growth_stage >= definition->total_stages) + growth_stage = definition->total_stages - 1; - update_TilesetId(); - } + update_TilesetId(); } bool Vegetable::is_Rotten() const { @@ -114,21 +123,24 @@ void Vegetable::Collect(Inventory*, Messages*) { - void Vegetable::update_TilesetId() { - // stage mapping - int sx = definition->start_tile_x; - int sy = definition->start_tile_y; - - int grown_start = 0; - int grown_end = (definition->grown_tile_x - definition->start_tile_x); - - if (growth_stage <= grown_end) { - tileset_object_id = sx + growth_stage; // linear x progression - } else if (growth_stage == definition->total_stages - 1) { - tileset_object_id = definition->rotten_tile_x; - } else { - tileset_object_id = definition->grown_tile_x; + const auto& d = *definition; + + int grown_end = d.grown_tile_x - d.start_tile_x; + + if (growth_stage <= static_cast<size_t>(grown_end)) { + // Regular growth stages, all on the start row + tileset_object_x = static_cast<size_t>(d.start_tile_x) + growth_stage; + tileset_object_y = d.start_tile_y; + } + else if (growth_stage == d.total_stages - 1) { + // Rotten stage + tileset_object_x = d.rotten_tile_x; + tileset_object_y = d.rotten_tile_y; + } + else { + // Fully grown but not rotten + tileset_object_x = d.grown_tile_x; + tileset_object_y = d.grown_tile_y; } } - diff --git a/src/vegetables/vegetables.hpp b/src/vegetables/vegetables.hpp index 168f8da..3e2ba2e 100644 --- a/src/vegetables/vegetables.hpp +++ b/src/vegetables/vegetables.hpp @@ -8,7 +8,11 @@ class Messages; enum class ItemType; enum class EquipmentSlot; +class Vegetable; + namespace VegetableData { + extern std::vector<Vegetable*> all_vegetables; + enum class Type { NONE, CARROT, @@ -40,6 +44,8 @@ namespace VegetableData { const CropDefinition* get_DataByType(Type type); const SDL_Point get_IconTilePosByType(Type type); + + } @@ -50,6 +56,9 @@ public: size_t growth_stage; // 0 = planted, last = rotten double last_update_sec; // seconds since game start + int tileset_object_x = 0; + int tileset_object_y = 0; + EquipmentSlot equipement_slot; Vegetable(const VegetableData::CropDefinition* cd,