mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-03 13:01:33 +02:00
Use CAnimation for creature projectiles
This commit is contained in:
parent
05bb8b13e9
commit
6cd0dd9843
@ -232,16 +232,10 @@ std::shared_ptr<CAnimation> Graphics::loadHeroFlagAnimation(const std::string &
|
||||
|
||||
for(const auto & rotation : rotations)
|
||||
{
|
||||
const int sourceGroup = rotation.first;
|
||||
const int targetGroup = rotation.second;
|
||||
const int sourceGroup = rotation.first;
|
||||
const int targetGroup = rotation.second;
|
||||
|
||||
for(size_t frame = 0; frame < anim->size(sourceGroup); ++frame)
|
||||
{
|
||||
anim->duplicateImage(sourceGroup, frame, targetGroup);
|
||||
|
||||
IImage * image = anim->getImage(frame, targetGroup);
|
||||
image->verticalFlip();
|
||||
}
|
||||
anim->createFlippedGroup(sourceGroup, targetGroup);
|
||||
}
|
||||
|
||||
return anim;
|
||||
@ -262,15 +256,10 @@ std::shared_ptr<CAnimation> Graphics::loadHeroAnimation(const std::string &name)
|
||||
|
||||
for(const auto & rotation : rotations)
|
||||
{
|
||||
const int sourceGroup = rotation.first;
|
||||
const int targetGroup = rotation.second;
|
||||
const int sourceGroup = rotation.first;
|
||||
const int targetGroup = rotation.second;
|
||||
|
||||
for(size_t frame = 0; frame < anim->size(sourceGroup); ++frame)
|
||||
{
|
||||
anim->duplicateImage(sourceGroup, frame, targetGroup);
|
||||
IImage * image = anim->getImage(frame, targetGroup);
|
||||
image->verticalFlip();
|
||||
}
|
||||
anim->createFlippedGroup(sourceGroup, targetGroup);
|
||||
}
|
||||
|
||||
return anim;
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include "CBattleInterface.h"
|
||||
#include "CCreatureAnimation.h"
|
||||
|
||||
#include "../CDefHandler.h"
|
||||
#include "../CGameInfo.h"
|
||||
#include "../CMusicHandler.h"
|
||||
#include "../CPlayerInterface.h"
|
||||
@ -786,11 +785,11 @@ bool CShootingAnimation::init()
|
||||
spi.dx = animSpeed;
|
||||
spi.dy = 0;
|
||||
|
||||
SDL_Surface * img = owner->idToProjectile[spi.creID]->ourImages[0].bitmap;
|
||||
IImage * img = owner->idToProjectile[spi.creID]->getImage(0);
|
||||
|
||||
// Add explosion anim
|
||||
Point animPos(destPos.x - 126 + img->w / 2,
|
||||
destPos.y - 105 + img->h / 2);
|
||||
Point animPos(destPos.x - 126 + img->width() / 2,
|
||||
destPos.y - 105 + img->height() / 2);
|
||||
|
||||
owner->addNewAnim( new CSpellEffectAnimation(owner, catapultDamage ? "SGEXPL.DEF" : "CSGRCK.DEF", animPos.x, animPos.y));
|
||||
}
|
||||
@ -802,7 +801,7 @@ bool CShootingAnimation::init()
|
||||
owner->initStackProjectile(shooter);
|
||||
|
||||
// only frames below maxFrame are usable: anything higher is either no present or we don't know when it should be used
|
||||
size_t maxFrame = std::min<size_t>(angles.size(), owner->idToProjectile.at(spi.creID)->ourImages.size());
|
||||
size_t maxFrame = std::min<size_t>(angles.size(), owner->idToProjectile.at(spi.creID)->size(0));
|
||||
|
||||
assert(maxFrame > 0);
|
||||
|
||||
|
@ -432,9 +432,6 @@ CBattleInterface::~CBattleInterface()
|
||||
for (auto & elem : creAnims)
|
||||
delete elem.second;
|
||||
|
||||
for (auto & elem : idToProjectile)
|
||||
delete elem.second;
|
||||
|
||||
for (auto & elem : idToObstacle)
|
||||
delete elem.second;
|
||||
|
||||
@ -1006,20 +1003,21 @@ void CBattleInterface::newStack(const CStack *stack)
|
||||
|
||||
void CBattleInterface::initStackProjectile(const CStack * stack)
|
||||
{
|
||||
CDefHandler *&projectile = idToProjectile[stack->getCreature()->idNumber];
|
||||
|
||||
const CCreature *creature;//creature whose shots should be loaded
|
||||
if (stack->getCreature()->idNumber == CreatureID::ARROW_TOWERS)
|
||||
const CCreature * creature;//creature whose shots should be loaded
|
||||
if(stack->getCreature()->idNumber == CreatureID::ARROW_TOWERS)
|
||||
creature = CGI->creh->creatures[siegeH->town->town->clientInfo.siegeShooter];
|
||||
else
|
||||
creature = stack->getCreature();
|
||||
|
||||
projectile = CDefHandler::giveDef(creature->animation.projectileImageName);
|
||||
std::shared_ptr<CAnimation> projectile = std::make_shared<CAnimation>(creature->animation.projectileImageName);
|
||||
projectile->preload();
|
||||
|
||||
for (auto & elem : projectile->ourImages) //alpha transforming
|
||||
{
|
||||
CSDL_Ext::alphaTransform(elem.bitmap);
|
||||
}
|
||||
if(projectile->size(1) != 0)
|
||||
logAnim->error("Expected empty group 1 in stack projectile");
|
||||
else
|
||||
projectile->createFlippedGroup(0, 1);
|
||||
|
||||
idToProjectile[stack->getCreature()->idNumber] = projectile;
|
||||
}
|
||||
|
||||
void CBattleInterface::stackRemoved(int stackID)
|
||||
@ -3173,23 +3171,18 @@ void CBattleInterface::showProjectiles(SDL_Surface *to)
|
||||
continue; // wait...
|
||||
}
|
||||
|
||||
SDL_Surface *image = idToProjectile[it->creID]->ourImages[it->frameNum].bitmap;
|
||||
size_t group = it->reverse ? 1 : 0;
|
||||
IImage * image = idToProjectile[it->creID]->getImage(it->frameNum, group, true);
|
||||
|
||||
SDL_Rect dst;
|
||||
dst.h = image->h;
|
||||
dst.w = image->w;
|
||||
dst.x = it->x - dst.w / 2;
|
||||
dst.y = it->y - dst.h / 2;
|
||||
if(image)
|
||||
{
|
||||
SDL_Rect dst;
|
||||
dst.h = image->height();
|
||||
dst.w = image->width();
|
||||
dst.x = it->x - dst.w / 2;
|
||||
dst.y = it->y - dst.h / 2;
|
||||
|
||||
if (it->reverse)
|
||||
{
|
||||
SDL_Surface *rev = CSDL_Ext::verticalFlip(image);
|
||||
CSDL_Ext::blit8bppAlphaTo24bpp(rev, nullptr, to, &dst);
|
||||
SDL_FreeSurface(rev);
|
||||
}
|
||||
else
|
||||
{
|
||||
CSDL_Ext::blit8bppAlphaTo24bpp(image, nullptr, to, &dst);
|
||||
image->draw(to, &dst, nullptr);
|
||||
}
|
||||
|
||||
// Update projectile
|
||||
@ -3207,7 +3200,7 @@ void CBattleInterface::showProjectiles(SDL_Surface *to)
|
||||
it->y = it->catapultInfo->calculateY(it->x);
|
||||
|
||||
++(it->frameNum);
|
||||
it->frameNum %= idToProjectile[it->creID]->ourImages.size();
|
||||
it->frameNum %= idToProjectile[it->creID]->size(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -128,7 +128,9 @@ private:
|
||||
const CCreatureSet *army1, *army2; //copy of initial armies (for result window)
|
||||
const CGHeroInstance *attackingHeroInstance, *defendingHeroInstance;
|
||||
std::map<int, CCreatureAnimation *> creAnims; //animations of creatures from fighting armies (order by BattleInfo's stacks' ID)
|
||||
std::map<int, CDefHandler *> idToProjectile; //projectiles of creatures (creatureID, defhandler)
|
||||
|
||||
std::map<int, std::shared_ptr<CAnimation>> idToProjectile;
|
||||
|
||||
std::map<int, CDefHandler *> idToObstacle; //obstacles located on the battlefield
|
||||
std::map<int, SDL_Surface *> idToAbsoluteObstacle; //obstacles located on the battlefield
|
||||
|
||||
|
@ -1643,6 +1643,17 @@ void CAnimation::playerColored(PlayerColor player)
|
||||
image.second->playerColored(player);
|
||||
}
|
||||
|
||||
void CAnimation::createFlippedGroup(const size_t sourceGroup, const size_t targetGroup)
|
||||
{
|
||||
for(size_t frame = 0; frame < size(sourceGroup); ++frame)
|
||||
{
|
||||
duplicateImage(sourceGroup, frame, targetGroup);
|
||||
|
||||
IImage * image = getImage(frame, targetGroup);
|
||||
image->verticalFlip();
|
||||
}
|
||||
}
|
||||
|
||||
float CFadeAnimation::initialCounter() const
|
||||
{
|
||||
if (fadingMode == EMode::OUT)
|
||||
|
@ -135,6 +135,8 @@ public:
|
||||
void horizontalFlip();
|
||||
void verticalFlip();
|
||||
void playerColored(PlayerColor player);
|
||||
|
||||
void createFlippedGroup(const size_t sourceGroup, const size_t targetGroup);
|
||||
};
|
||||
|
||||
const float DEFAULT_DELTA = 0.05f;
|
||||
|
Loading…
x
Reference in New Issue
Block a user