Mario: add basic big mario logic
This commit is contained in:
+36
-35
@@ -42,42 +42,43 @@ void MarioBlock::visit(SDLPP::Visitor &visitor) {
|
||||
destroy();
|
||||
}
|
||||
#else
|
||||
if (visitor.getFromId() == MARIO_TOP_DETECT &&
|
||||
dynamic_cast<MarioVisitor &>(visitor).canDestroy()) {
|
||||
// TODO if big mario and _can_be_destroyed
|
||||
if (_destructible && !hasCoin()) {
|
||||
destroy();
|
||||
} else if (_bouncable) {
|
||||
BounceVisitor bv;
|
||||
bv.setVisitorType(VisitorType::Terrain);
|
||||
if (visitor.getFromId() == MARIO_TOP_DETECT) {
|
||||
auto &mario_visitor = dynamic_cast<MarioVisitor &>(visitor);
|
||||
if (mario_visitor.canDestroy()) {
|
||||
if ((_destructible && !hasCoin()) || (_can_be_destroyed && mario_visitor.isBig() && !hasCoin())) {
|
||||
destroy();
|
||||
} else if (_bouncable) {
|
||||
BounceVisitor bv;
|
||||
bv.setVisitorType(VisitorType::Terrain);
|
||||
|
||||
setPos(getPos() - SDLPP::Vec2D<double>(0, BLOCK_SIZE));
|
||||
if (getCollisions().size() < 2)
|
||||
addCollision(
|
||||
SDLPP::RectColider(0.1, 0.1, 0.8, 0.8, BOUNCE_COLLISION));
|
||||
updateSizeAndPosition();
|
||||
g_playground->visitCollisions(*this, bv);
|
||||
setPos(getPos() + SDLPP::Vec2D<double>(0, BLOCK_SIZE));
|
||||
updateSizeAndPosition();
|
||||
if (bv.canBounce())
|
||||
bounce();
|
||||
}
|
||||
if (hasCoin()) {
|
||||
removeCoin();
|
||||
auto coin =
|
||||
createTerrainBlock(COIN_ID, LandType::OVERWORLD, renderer);
|
||||
coin->setPos(getPos());
|
||||
std::dynamic_pointer_cast<CoinBlock>(coin)->setParent(this);
|
||||
dynamic_cast<MarioVisitor &>(visitor).setCoin();
|
||||
dynamic_cast<MarioVisitor &>(visitor).setCoinBlock(coin);
|
||||
}
|
||||
if (hasMushroom()) {
|
||||
removeMushroom();
|
||||
auto mushroom =
|
||||
createTerrainBlock(MUSHROOM_ID, LandType::OVERWORLD, renderer);
|
||||
mushroom->setPos(getPos());
|
||||
std::dynamic_pointer_cast<MushroomBlock>(mushroom)->setParent(this);
|
||||
dynamic_cast<MarioVisitor &>(visitor).setMushroomBlock(mushroom);
|
||||
setPos(getPos() - SDLPP::Vec2D<double>(0, BLOCK_SIZE));
|
||||
if (getCollisions().size() < 2)
|
||||
addCollision(
|
||||
SDLPP::RectColider(0.1, 0.1, 0.8, 0.8, BOUNCE_COLLISION));
|
||||
updateSizeAndPosition();
|
||||
g_playground->visitCollisions(*this, bv);
|
||||
setPos(getPos() + SDLPP::Vec2D<double>(0, BLOCK_SIZE));
|
||||
updateSizeAndPosition();
|
||||
if (bv.canBounce())
|
||||
bounce();
|
||||
}
|
||||
if (hasCoin()) {
|
||||
removeCoin();
|
||||
auto coin =
|
||||
createTerrainBlock(COIN_ID, LandType::OVERWORLD, renderer);
|
||||
coin->setPos(getPos());
|
||||
std::dynamic_pointer_cast<CoinBlock>(coin)->setParent(this);
|
||||
dynamic_cast<MarioVisitor &>(visitor).setCoin();
|
||||
dynamic_cast<MarioVisitor &>(visitor).setCoinBlock(coin);
|
||||
}
|
||||
if (hasMushroom()) {
|
||||
removeMushroom();
|
||||
auto mushroom =
|
||||
createTerrainBlock(MUSHROOM_ID, LandType::OVERWORLD, renderer);
|
||||
mushroom->setPos(getPos());
|
||||
std::dynamic_pointer_cast<MushroomBlock>(mushroom)->setParent(this);
|
||||
dynamic_cast<MarioVisitor &>(visitor).setMushroomBlock(mushroom);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user