firecolumnclient.cpp from FreePop at Krugle
Show firecolumnclient.cpp syntax highlighted
/***************************************************************************
firecolumnclient.cpp
-------------------
begin : Mon Jun 14 2004
copyright : (C) 2004 by Brendon Higgins
email : freepop-devel@lists.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <client.h>
#include <entity.h>
#include <firecolumn.h>
#include <firecolumnclient.h>
#include <maptilepos.h>
#include <worldpos.h>
#include <worldclient.h>
#include <ClanLib/display.h>
/**
* Class used to display the firecolumn ending animation.
*/
class FireColumnEndSprite: public Paintable {
private:
/**
* Our position.
*/
WorldPos pos;
/**
* Our sprite.
*/
CL_Sprite* sprite;
public:
/**
* Constructor.
*/
FireColumnEndSprite(WorldClient* w, const WorldPos& p);
/**
* Destructor.
*/
virtual ~FireColumnEndSprite();
virtual bool drawUpdate(const WorldClient* w, unsigned int d);
virtual void draw(const WorldClient* w) const;
virtual int drawSortIndex(const WorldClient* w) const;
};
CL_Sprite* FireColumnClient::fireSpriteCache = 0;
CL_Sprite* FireColumnClient::fireSpriteBeginCache = 0;
CL_Sprite* FireColumnClient::fireSpriteEndCache = 0;
FireColumnClient::FireColumnClient(WorldClient* w, const Identity& ident,
CL_NetPacket &p, int reason):
EntityClient(ident),
fireSprite(0) {
onFullUpdate(w, p);
if (reason != Entity::Create::NO_REASON) {
fireSprite = new CL_Sprite(*fireSpriteCache);
} else {
fireSprite = new CL_Sprite(*fireSpriteBeginCache);
}
}
FireColumnClient::~FireColumnClient() {
delete fireSprite;
}
WorldPos FireColumnClient::getPos() const {
return pos;
}
void FireColumnClient::draw(const WorldClient* w) const {
CL_Point gp = w->getMap()->findPos(pos);
fireSprite->draw(gp.x, gp.y);
}
bool FireColumnClient::drawUpdate(const WorldClient* w, unsigned int d) {
fireSprite->update(d / 1000.0f);
if (fireSprite->is_finished()) {
delete fireSprite;
fireSprite = new CL_Sprite(*fireSpriteCache);
}
return true;
}
void FireColumnClient::predict(const WorldClient* w, unsigned int d) {
pos += direction * d / 1000;
}
void FireColumnClient::onFullUpdate(WorldClient* w, CL_NetPacket& p) {
pos = WorldPos::extract(p.input);
direction = WorldPos::extract(p.input);
}
void FireColumnClient::onDestroy(WorldClient* w, int reason) {
if (reason == FireColumn::Destroy::FIZZLE) {
// Paintable hands its this pointer to the client,
// and it'll delete itself once it's done.
new FireColumnEndSprite(w, pos);
}
}
void FireColumnClient::loadSprites() {
fireSpriteCache = new CL_Sprite("effects/firecolumn/normal", app.getResources());
fireSpriteBeginCache = new CL_Sprite("effects/firecolumn/begin", app.getResources());
fireSpriteEndCache = new CL_Sprite("effects/firecolumn/end", app.getResources());
}
void FireColumnClient::freeSprites() {
delete fireSpriteCache;
delete fireSpriteBeginCache;
delete fireSpriteEndCache;
}
FireColumnEndSprite::FireColumnEndSprite(WorldClient* w, const WorldPos& p):
pos(p),
sprite(new CL_Sprite(*FireColumnClient::fireSpriteEndCache)) {
w->paintablesAdd(this);
}
FireColumnEndSprite::~FireColumnEndSprite() {
}
bool FireColumnEndSprite::drawUpdate(const WorldClient* w, unsigned int d) {
sprite->update(d / 1000.0f);
if (sprite->is_finished()) {
return false;
}
return true;
}
void FireColumnEndSprite::draw(const WorldClient* w) const {
CL_Point gp = w->getMap()->findPos(pos);
sprite->draw(gp.x, gp.y);
}
int FireColumnEndSprite::drawSortIndex(const WorldClient* w) const {
return w->getMap()->findPos(pos).y;
}
See more files for this project here