1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

* fixed memory leak in battles

* blitting creature animatoins to rects (not tested!)
* a few minor improvements
This commit is contained in:
mateuszb
2008-04-20 15:56:03 +00:00
parent 4ff5788e51
commit 9674343453
11 changed files with 33 additions and 31 deletions

View File

@@ -233,7 +233,7 @@ void CTownList<T>::mouseMoved (SDL_MouseMotionEvent & sEvent)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if ((ny>SIZE || ny<0) || (from+ny>=items.size()))
{
LOCPLINT->statusbar->clear();
@@ -263,10 +263,10 @@ void CTownList<T>::clickLeft(tribool down)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if (ny>SIZE || ny<0)
return;
if (SIZE==5 && ((int)(ny+from))==selected && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE))
if (SIZE==5 && (ny+from)==selected && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE))
LOCPLINT->openTownWindow(items[selected]);//print town screen
else
select(ny+from);
@@ -322,7 +322,7 @@ void CTownList<T>::clickRight(tribool down)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if ((ny>5 || ny<0) || (from+ny>=items.size()))
{
return;

View File

@@ -8,7 +8,7 @@
#include "AdventureMapButton.h"
class CDefHandler;
class CCallback;
class CPath;
struct CPath;
class CAdvMapInt;
class CGHeroInstance;
class CGTownInstance;

View File

@@ -54,7 +54,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
}
}
//blitting menu background and terrain
////blitting menu background and terrain
blitAt(background, 0, 0);
blitAt(menu, 0, 556);
CSDL_Ext::update();
@@ -98,9 +98,9 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
//preparing cells and hexes
cellBorder = CGI->bitmaph->loadBitmap("CCELLGRD.BMP");
cellBorder = CSDL_Ext::alphaTransform(cellBorder);
CSDL_Ext::alphaTransform(cellBorder);
cellShade = CGI->bitmaph->loadBitmap("CCELLSHD.BMP");
cellShade = CSDL_Ext::alphaTransform(cellShade);
CSDL_Ext::alphaTransform(cellShade);
for(int h=0; h<187; ++h)
{
bfield[h].myNumber = h;
@@ -142,8 +142,8 @@ CBattleInterface::~CBattleInterface()
SDL_FreeSurface(cellBorder);
SDL_FreeSurface(cellShade);
for(int g=0; g<creAnims.size(); ++g)
delete creAnims[g];
for(std::map< int, CCreatureAnimation * >::iterator g=creAnims.begin(); g!=creAnims.end(); ++g)
delete g->second;
}
void CBattleInterface::activate()
@@ -531,7 +531,11 @@ CBattleHero::CBattleHero(std::string defName, int phaseG, int imageG, bool flipG
for(int i=0; i<dh->ourImages.size(); ++i) //transforming images
{
if(flip)
dh->ourImages[i].bitmap = CSDL_Ext::rotate01(dh->ourImages[i].bitmap);
{
SDL_Surface * hlp = CSDL_Ext::rotate01(dh->ourImages[i].bitmap);
SDL_FreeSurface(dh->ourImages[i].bitmap);
dh->ourImages[i].bitmap = hlp;
}
dh->ourImages[i].bitmap = CSDL_Ext::alphaTransform(dh->ourImages[i].bitmap);
}
dh->alphaTransformed = true;

View File

@@ -6,7 +6,7 @@
#include "CGameState.h"
class CGameState;
class CPath;
struct CPath;
class CGObjectInstance;
class SComponent;
class IChosen;

View File

@@ -2,7 +2,7 @@
#define CCURSORHANDLER_H
struct SDL_Thread;
struct CDefHandler;
class CDefHandler;
struct SDL_Surface;
class CCursorHandler //handles cursor

View File

@@ -327,11 +327,8 @@ int _tmain(int argc, _TCHAR* argv[])
THC tmh.getDif();
timeHandler pomtime;pomtime.getDif();
int xx=0, yy=0, zz=0;
SDL_Event sEvent;
srand ( time(NULL) );
SDL_Surface *temp;
std::vector<SDL_Surface*> Sprites;
float i;
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO/*|SDL_INIT_EVENTTHREAD*/)==0)
{
screen = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);

View File

@@ -1962,7 +1962,7 @@ void CPlayerInterface::buildChanged(const CGTownInstance *town, int buildingID,
}
void CPlayerInterface::battleStart(CCreatureSet * army1, CCreatureSet * army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, tribool side) //called by engine when battle starts; side=0 - left, side=1 - right
{
{
curint->deactivate();
curint = new CBattleInterface(army1,army2,hero1,hero2);
curint->activate();
@@ -2232,10 +2232,10 @@ void CHeroList::clickLeft(tribool down)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if (ny>=5 || ny<0)
return;
if (((int)(ny+from))==selected && (LOCPLINT->adventureInt->selection.type == HEROI_TYPE))
if ( (ny+from)==selected && (LOCPLINT->adventureInt->selection.type == HEROI_TYPE))
LOCPLINT->openHeroWindow(items[selected].first);//print hero screen
select(ny+from);
}
@@ -2294,7 +2294,7 @@ void CHeroList::mouseMoved (SDL_MouseMotionEvent & sEvent)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if ((ny>5 || ny<0) || (from+ny>=items.size()))
{
LOCPLINT->adventureInt->statusbar.clear();
@@ -2323,7 +2323,7 @@ void CHeroList::clickRight(tribool down)
int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
hx-=pos.x;
hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
float ny = (float)hy/(float)32;
int ny = hy/32;
if ((ny>5 || ny<0) || (from+ny>=items.size()))
{
return;

View File

@@ -17,7 +17,7 @@ class CStack;
class SComponent;
class CCreature;
struct SDL_Surface;
class CPath;
struct CPath;
class CCreatureAnimation;
class CSelectableComponent;
class CCreatureSet;

View File

@@ -478,7 +478,6 @@ SDL_Surface * CSDL_Ext::alphaTransform(SDL_Surface *src)
}
}
}
SDL_UpdateRect(src, 0, 0, src->w, src->h);
return src;
}

View File

@@ -781,11 +781,11 @@ int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str,
}
return ret;
}
int CCreatureAnimation::nextFrameMiddle(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder)
int CCreatureAnimation::nextFrameMiddle(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder, SDL_Rect * destRect)
{
return nextFrame(dest,x-fullWidth/2,y-fullHeight/2,attacker,incrementFrame,yellowBorder);
return nextFrame(dest,x-fullWidth/2,y-fullHeight/2,attacker,incrementFrame,yellowBorder,destRect);
}
int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder)
int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder, SDL_Rect * destRect)
{
if(dest->format->BytesPerPixel<3)
return -1; //not enough depth
@@ -829,7 +829,7 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
LeftMargin, RightMargin, TopMargin,BottomMargin,
i, add, FullHeight,FullWidth,
TotalRowLength, // length of read segment
NextSpriteOffset, RowAdd;
RowAdd;
unsigned char SegmentType, SegmentLength;
i=BaseOffset=SEntries[SIndex].offset;
@@ -884,7 +884,8 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
int yB = ftcp/(FullWidth+add) + y;
if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
{
putPixel(dest, xB + yB*dest->w, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k], yellowBorder);
if(!destRect || (destRect->x <= xB && destRect->x + destRect->w > xB && destRect->y <= yB && destRect->y + destRect->h > yB))
putPixel(dest, xB + yB*dest->w, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k], yellowBorder);
}
ftcp++; //increment pos
if ((TotalRowLength+k+1)>=SpriteWidth)
@@ -901,7 +902,8 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
int yB = ftcp/(FullWidth+add) + y;
if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
{
putPixel(dest, xB + yB*dest->w, palette[SegmentType], SegmentType, yellowBorder);
if(!destRect || (destRect->x <= xB && destRect->x + destRect->w > xB && destRect->y <= yB && destRect->y + destRect->h > yB))
putPixel(dest, xB + yB*dest->w, palette[SegmentType], SegmentType, yellowBorder);
}
ftcp++; //increment pos
}

View File

@@ -103,8 +103,8 @@ public:
void setType(int type); //sets type of animation and cleares framecount
int getType() const; //returns type of animation
int nextFrame(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false); //0 - success, any other - error //print next
int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false); //0 - success, any other - error //print next
int nextFrame(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next
int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next
int framesInGroup(int group) const; //retirns number of fromes in given group
};