1
0
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:
AlexVinS 2017-09-05 20:04:17 +03:00
parent 05bb8b13e9
commit 6cd0dd9843
6 changed files with 47 additions and 51 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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
{

View File

@ -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

View File

@ -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)

View File

@ -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;