fix segfault for real
This commit is contained in:
@@ -47,15 +47,18 @@ void Aquarium::ensureEntitiesSorted() {
|
|||||||
|
|
||||||
void Aquarium::redraw() {
|
void Aquarium::redraw() {
|
||||||
clearCurrentFrame();
|
clearCurrentFrame();
|
||||||
|
|
||||||
ensureBigEntityExists();
|
ensureBigEntityExists();
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Entity>> newEntities;
|
// Use static vectors to avoid per-frame allocations
|
||||||
bool entities_modified = false;
|
static std::vector<std::unique_ptr<Entity>> newEntities;
|
||||||
|
static std::vector<size_t> entitiesToRemove;
|
||||||
|
|
||||||
// Update and check for removal/replacement
|
newEntities.clear();
|
||||||
for (auto it = entities.begin(); it != entities.end();) {
|
entitiesToRemove.clear();
|
||||||
auto &entity = *it;
|
|
||||||
|
// Update all entities and collect changes
|
||||||
|
for (size_t i = 0; i < entities.size(); ++i) {
|
||||||
|
auto &entity = entities[i];
|
||||||
entity->update();
|
entity->update();
|
||||||
|
|
||||||
// Handle fish bubble spawning
|
// Handle fish bubble spawning
|
||||||
@@ -69,30 +72,32 @@ void Aquarium::redraw() {
|
|||||||
if (entity->shouldBeRemoved()) {
|
if (entity->shouldBeRemoved()) {
|
||||||
auto replacement = entity->createReplacement();
|
auto replacement = entity->createReplacement();
|
||||||
if (replacement) {
|
if (replacement) {
|
||||||
*it = std::move(replacement);
|
entity = std::move(replacement); // Replace in-place
|
||||||
entities_modified = true;
|
entities_need_sorting = true;
|
||||||
++it;
|
|
||||||
} else {
|
} else {
|
||||||
it = entities.erase(it);
|
entitiesToRemove.push_back(i); // Mark for removal
|
||||||
entities_modified = true;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add new entities if any
|
// Remove entities in reverse order to maintain indices
|
||||||
|
for (auto it = entitiesToRemove.rbegin(); it != entitiesToRemove.rend();
|
||||||
|
++it) {
|
||||||
|
entities.erase(entities.begin() + *it);
|
||||||
|
entities_need_sorting = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add new entities (only if we have them)
|
||||||
if (!newEntities.empty()) {
|
if (!newEntities.empty()) {
|
||||||
|
// Reserve space to minimize reallocations
|
||||||
|
entities.reserve(entities.size() + newEntities.size());
|
||||||
|
|
||||||
for (auto &newEntity : newEntities) {
|
for (auto &newEntity : newEntities) {
|
||||||
entities.emplace_back(std::move(newEntity));
|
entities.emplace_back(std::move(newEntity));
|
||||||
}
|
}
|
||||||
entities_modified = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only sort if entities were modified
|
|
||||||
if (entities_modified) {
|
|
||||||
entities_need_sorting = true;
|
entities_need_sorting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ensureEntitiesSorted();
|
ensureEntitiesSorted();
|
||||||
|
|
||||||
// Draw all entities
|
// Draw all entities
|
||||||
|
|||||||
@@ -5,4 +5,4 @@
|
|||||||
Castle::Castle()
|
Castle::Castle()
|
||||||
: Entity(Aquarium::getInstance().getWidth() - 32,
|
: Entity(Aquarium::getInstance().getWidth() - 32,
|
||||||
Aquarium::getInstance().getHeight() - 13),
|
Aquarium::getInstance().getHeight() - 13),
|
||||||
image(castleAsset.image), mask(castleAsset.mask) {}
|
image(getCastleAsset().image), mask(getCastleAsset().mask) {}
|
||||||
|
|||||||
@@ -6,8 +6,9 @@
|
|||||||
SeaMonster::SeaMonster() : SeaMonster(getRandomDirection()) {}
|
SeaMonster::SeaMonster() : SeaMonster(getRandomDirection()) {}
|
||||||
|
|
||||||
SeaMonster::SeaMonster(int asset_index)
|
SeaMonster::SeaMonster(int asset_index)
|
||||||
: Entity(asset_index == 0), frames(seaMonsterAssets[asset_index].frames),
|
: Entity(asset_index == 0),
|
||||||
mask(seaMonsterAssets[asset_index].mask), speed(SEAMONSTER_SPEED) {
|
frames(getSeaMonsterAssets()[asset_index].frames),
|
||||||
|
mask(getSeaMonsterAssets()[asset_index].mask), speed(SEAMONSTER_SPEED) {
|
||||||
|
|
||||||
const auto &aquarium = Aquarium::getInstance();
|
const auto &aquarium = Aquarium::getInstance();
|
||||||
y = WATER_SURFACE_OFFSET;
|
y = WATER_SURFACE_OFFSET;
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
Ship::Ship() : Ship(getRandomDirection()) {}
|
Ship::Ship() : Ship(getRandomDirection()) {}
|
||||||
|
|
||||||
Ship::Ship(int asset_index)
|
Ship::Ship(int asset_index)
|
||||||
: Entity(asset_index == 0), image(shipAssets[asset_index].image),
|
: Entity(asset_index == 0), image(getShipAssets()[asset_index].image),
|
||||||
mask(shipAssets[asset_index].mask), speed(SHIP_SPEED) {
|
mask(getShipAssets()[asset_index].mask), speed(SHIP_SPEED) {
|
||||||
|
|
||||||
const auto &aquarium = Aquarium::getInstance();
|
const auto &aquarium = Aquarium::getInstance();
|
||||||
y = 0;
|
y = 0;
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
Whale::Whale() : Whale(getRandomDirection()) {}
|
Whale::Whale() : Whale(getRandomDirection()) {}
|
||||||
|
|
||||||
Whale::Whale(int asset_index)
|
Whale::Whale(int asset_index)
|
||||||
: Entity((asset_index == 0)), frames(whaleAssets[asset_index].frames),
|
: Entity((asset_index == 0)), frames(getWhaleAssets()[asset_index].frames),
|
||||||
mask(whaleAssets[asset_index].mask), speed(WHALE_SPEED) {
|
mask(getWhaleAssets()[asset_index].mask), speed(WHALE_SPEED) {
|
||||||
|
|
||||||
const auto &aquarium = Aquarium::getInstance();
|
const auto &aquarium = Aquarium::getInstance();
|
||||||
y = 0;
|
y = 0;
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ struct CastleAsset {
|
|||||||
std::vector<std::string> mask;
|
std::vector<std::string> mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline CastleAsset castleAsset = {
|
inline const CastleAsset& getCastleAsset() {
|
||||||
|
static const CastleAsset castleAsset = {
|
||||||
{
|
{
|
||||||
R"( T~~)",
|
R"( T~~)",
|
||||||
R"( |)",
|
R"( |)",
|
||||||
@@ -38,3 +39,5 @@ inline CastleAsset castleAsset = {
|
|||||||
R"( y y y y)",
|
R"( y y y y)",
|
||||||
R"( yyyyyyy)"}
|
R"( yyyyyyy)"}
|
||||||
};
|
};
|
||||||
|
return castleAsset;
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,8 +8,9 @@ struct SeaMonsterAsset {
|
|||||||
std::vector<std::string> mask;
|
std::vector<std::string> mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
const SeaMonsterAsset seaMonster = {
|
inline const SeaMonsterAsset& getSeaMonster() {
|
||||||
{// Frame 1
|
static const SeaMonsterAsset seaMonster = {
|
||||||
|
{
|
||||||
{
|
{
|
||||||
R"(?????????_???_?????????????????????_???_???????_a_a???)",
|
R"(?????????_???_?????????????????????_???_???????_a_a???)",
|
||||||
R"(???????_{.`=`.}_??????_???_??????_{.`=`.}_????{/ ''\_?)",
|
R"(???????_{.`=`.}_??????_???_??????_{.`=`.}_????{/ ''\_?)",
|
||||||
@@ -24,7 +25,14 @@ const SeaMonsterAsset seaMonster = {
|
|||||||
R"( W W )",
|
R"( W W )",
|
||||||
R"()",
|
R"()",
|
||||||
R"()",
|
R"()",
|
||||||
R"()"}};
|
R"()"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return seaMonster;
|
||||||
|
}
|
||||||
|
|
||||||
inline const std::vector<SeaMonsterAsset> seaMonsterAssets =
|
inline const std::vector<SeaMonsterAsset>& getSeaMonsterAssets() {
|
||||||
createBidirectionalFramedAssets(seaMonster);
|
static const std::vector<SeaMonsterAsset> seaMonsterAssets =
|
||||||
|
createBidirectionalFramedAssets(getSeaMonster());
|
||||||
|
return seaMonsterAssets;
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,13 +3,27 @@
|
|||||||
#include "../SpriteUtils.h"
|
#include "../SpriteUtils.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
const AssetPair ship = {
|
inline const AssetPair &getShip() {
|
||||||
{R"( | | | )", R"( )_) )_) )_) )",
|
static const AssetPair ship = {
|
||||||
R"( )___))___))___)\ )", R"( )____)____)_____)\\ )",
|
{
|
||||||
R"(_____|____|____|____\\\__)", R"(\ /????)"},
|
R"( | | | )",
|
||||||
{R"( y y y )", R"()", R"( w )",
|
R"( )_) )_) )_) )",
|
||||||
R"( ww )", R"(yyyyyyyyyyyyyyyyyyyywwwyy)",
|
R"( )___))___))___)\ )",
|
||||||
|
R"( )____)____)_____)\\ )",
|
||||||
|
R"(_____|____|____|____\\\__)",
|
||||||
|
R"(\ /????)"},
|
||||||
|
{
|
||||||
|
R"( y y y )",
|
||||||
|
R"()",
|
||||||
|
R"( w )",
|
||||||
|
R"( ww )",
|
||||||
|
R"(yyyyyyyyyyyyyyyyyyyywwwyy)",
|
||||||
R"(y y )"}};
|
R"(y y )"}};
|
||||||
|
return ship;
|
||||||
|
}
|
||||||
|
|
||||||
inline const std::vector<AssetPair> shipAssets =
|
inline const std::vector<AssetPair> &getShipAssets() {
|
||||||
createBidirectionalAssets({ship});
|
static const std::vector<AssetPair> shipAssets =
|
||||||
|
createBidirectionalAssets({getShip()});
|
||||||
|
return shipAssets;
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ struct WhaleAsset {
|
|||||||
std::vector<std::string> mask;
|
std::vector<std::string> mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
const WhaleAsset whale = {
|
inline const WhaleAsset& getWhale() {
|
||||||
|
static const WhaleAsset whale = {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
R"( )",
|
R"( )",
|
||||||
@@ -93,6 +94,11 @@ const WhaleAsset whale = {
|
|||||||
R"()"
|
R"()"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
return whale;
|
||||||
|
}
|
||||||
|
|
||||||
inline const std::vector<WhaleAsset> whaleAssets =
|
inline const std::vector<WhaleAsset>& getWhaleAssets() {
|
||||||
createBidirectionalFramedAssets(whale);
|
static const std::vector<WhaleAsset> whaleAssets =
|
||||||
|
createBidirectionalFramedAssets(getWhale());
|
||||||
|
return whaleAssets;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user