From d9d0550c66d4c1912b11102662ce9cb028b2b43b Mon Sep 17 00:00:00 2001 From: Maurizio Monge Date: Wed, 11 Jul 2007 16:47:32 +0200 Subject: [PATCH] Linearized (and greately simplified) the pool (work in progress). --- src/graphicalapi.h | 20 ++++---- src/piecepool.cpp | 135 +++++++++++++++++++++-------------------------------- src/piecepool.h | 56 +++++++++++++--------- 3 files changed, 97 insertions(+), 114 deletions(-) diff --git a/src/graphicalapi.h b/src/graphicalapi.h index 8332d35..fcc78bd 100644 --- a/src/graphicalapi.h +++ b/src/graphicalapi.h @@ -25,10 +25,10 @@ typedef boost::shared_ptr SpritePtr; */ class GraphicalAPI { public: - enum AnimationType { - Normal, - Instant - }; + enum AnimationType { + Normal, + Instant + }; virtual ~GraphicalAPI() { } @@ -58,7 +58,7 @@ public: * \return the newly created sprite. */ virtual NamedSprite setPiece(const Point& p, const AbstractPiece* piece, bool show) = 0; - + /** * Create a new piece, but do not add it to the graphical system. * \return the newly created sprite. @@ -92,7 +92,7 @@ public: * \return the newly created sprite. */ virtual NamedSprite insertPoolPiece(int pool, int index, const AbstractPiece* piece) = 0; - + /** * Create a movement animation. * \param sprite The sprite to be animated. @@ -100,14 +100,14 @@ public: * \return A newly created animation moving \a sprite between the specified squares. */ virtual AnimationPtr moveAnimation(const NamedSprite& sprite, const Point& to, AnimationType type) = 0; - + /** * Create an appear animation. * \param sprite The sprite to be shown. * \return A newly created animation showing \a sprite. */ virtual AnimationPtr appearAnimation(const NamedSprite& sprite, AnimationType type) = 0; - + /** * Create a disappear animation. * \param sprite The sprite to be hidden. @@ -115,14 +115,14 @@ public: * \sa appearAnimation. */ virtual AnimationPtr disappearAnimation(const NamedSprite& sprite, AnimationType type) = 0; - + /** * Create a destruction animation. * \param sprite The sprite to be destroyed. * \return A newly created animation destroying \a sprite. */ virtual AnimationPtr destroyAnimation(const NamedSprite& sprite, AnimationType type) = 0; - + /** * Create a morphing animation. * \param sprite The sprite to be morphed. diff --git a/src/piecepool.cpp b/src/piecepool.cpp index 5ab29f4..ed057f7 100644 --- a/src/piecepool.cpp +++ b/src/piecepool.cpp @@ -16,8 +16,10 @@ /*****************************************************************************************/ PiecePool::PiecePool(Board* b, Canvas::Abstract* parent) : PieceGroup(parent) -, m_sprites(0,0) , m_board(b) +, m_flipped(false) +, m_square_size(0) +, m_width(1) , m_fill(0) , m_dragged_index(-1) { setGridWidth(1); @@ -44,7 +46,7 @@ Point PiecePool::flipPoint(const Point& p) const { /*****************************************************************************************/ void PiecePool::setGridWidth(int w) { - m_sprites.changeSize(w, (m_fill+w-1)/w); + m_width = w; } int PiecePool::fill() { @@ -78,25 +80,18 @@ void PiecePool::insertSprite(int index, const NamedSprite& nsprite) { return; } - setFill(m_fill+1); - Point i = m_sprites.nTh(index); - - NamedSprite replacep = m_sprites[i]; - m_sprites[i] = nsprite; - m_sprites[i].sprite()->show(); - m_sprites[i].sprite()->moveTo(converter()->toReal(i)); - fadeIn(i); - - int speed = 1; - for( i=m_sprites.next(i); i<=m_sprites.last(); i=m_sprites.next(i)) { - if(!replacep) - break; - NamedSprite tmp = replacep; - replacep = m_sprites[i]; - m_sprites[i] = tmp; - animatePiece(m_sprites[i].sprite(), i, (1.0+1.0/speed)*0.4); - speed++; + m_sprite.resize(m_sprites.size()+1); + + for(int i = m_sprites.size()-2; i >= index; i--) { + double speed = (1.0+1.0/(i - index + 1))*0.4; + m_sprites[i] = m_sprites[i-1]; + m_sprites[i]->moveTo(toReal(i)); //BROKEN animate to that point? } + + m_sprites[index] = nsprite; + m_sprites[index].sprite()->show(); + m_sprites[index].sprite()->moveTo(toReal(index)); + //BROKEN fadeIn(index); } /*****************************************************************************************/ @@ -107,13 +102,12 @@ NamedSprite PiecePool::getSprite(int index) { if(m_dragged && index > m_dragged_index) index--; - if(index < 0 || index >= fill() ) { + if(index < 0 || index >= m_sprites.size() ) { ERROR("invalid index " << index); return NamedSprite(); } - Point i = m_sprites.nTh(index); - return m_sprites[i]; + return m_sprites[index]; } /*****************************************************************************************/ @@ -129,46 +123,33 @@ NamedSprite PiecePool::takeSprite(int index) { if(m_dragged && index > m_dragged_index) index--; - if(index < 0 || index >= fill() ) { + if(index < 0 || index >= m_sprites.size() ) { ERROR("invalid index " << index); return NamedSprite(); } - Point i = m_sprites.nTh(index); - NamedSprite piece = takeNamedSprite(i); - - return piece; + return takeSpriteAt(index); } /*****************************************************************************************/ -NamedSprite PiecePool::takeNamedSprite(const Point& _i) { - Point i = _i; - if(i < m_sprites.first() || m_sprites.last() < i ) { - ERROR("invalid index " << i); +NamedSprite PiecePool::takeSpriteAt(int index) { + if(index < 0 || index >= m_sprites.size() ) { + ERROR("invalid index " << index); return NamedSprite(); } - NamedSprite piece = m_sprites[i]; - if(!piece.sprite()) + NamedSprite retv = m_sprites[index]; + if(!retv) return NamedSprite(); - Point previ = i; - int speed = 1; - i = m_sprites.next(i); - for(; i<=m_sprites.last(); i=m_sprites.next(i)) { - m_sprites[previ] = m_sprites[i]; - - if(m_sprites[previ]) { - animatePiece(m_sprites[previ].sprite(), previ, (1.0+1.0/speed)*0.4); - speed++; - } - - previ = i; + for(int i = index; i < m_sprites.size()-1; i++) { + double speed = (1.0+1.0/(i - index + 1))*0.4; + m_sprites[i] = m_sprites[i+1]; + m_sprites[i]->moveTo(toReal(i)); //BROKEN animate to that point? } - m_sprites[previ] = NamedSprite(); - setFill(m_fill-1); + m_sprites.resize(m_sprites.size()-1); - return piece; + return retv; } /*****************************************************************************************/ @@ -204,33 +185,16 @@ void PiecePool::flipAndMoveBy(QPoint p) { moveTo(pos() + deltapos); m_flipped = !m_flipped; - for(Point i=m_sprites.first(); i<=m_sprites.last(); i=m_sprites.next(i)) - if(m_sprites[i]) { - if(m_anim_movement) { - enqueue(AnimationPtr(new InstantAnimation(m_sprites[i].sprite(), - m_sprites[i].sprite()->pos() - deltapos))); - enqueue(AnimationPtr(new MovementAnimation(m_sprites[i].sprite(), - converter()->toReal(i), 1.0))); - } - else - enqueue(AnimationPtr(new InstantAnimation(m_sprites[i].sprite(), - converter()->toReal(i)))); - } -} - -/*****************************************************************************************/ -void PiecePool::updateSprites() { - - // adjust piece positions - for (Point i = m_sprites.first(); i <= m_sprites.last(); i = m_sprites.next(i)) { - boost::shared_ptr p = m_sprites[i].sprite(); - - if (p) { - // drawing sprite - p->setPixmap( m_loader( m_sprites[i].name() ) ); - adjustSprite(i); - } + for(int i=0;ipos() - deltapos))); + enqueue(AnimationPtr(new MovementAnimation(m_sprites[i].sprite(), + toReal(i), 1.0))); } + else + enqueue(AnimationPtr(new InstantAnimation(m_sprites[i].sprite(), + toReal(i)))); } /*****************************************************************************************/ @@ -238,10 +202,19 @@ void PiecePool::onResize(int new_size, bool force_reload) { if(m_square_size == new_size && !force_reload) return; - PieceGroup::onResize(new_size); + m_square_size = new_size; + m_loader.setSize(m_square_size); // update the sprites - updateSprites(); + for (int i=0;isetPixmap( m_loader( m_sprites[i].name() ) ); + enqueue(AnimationPtr(new InstantAnimation(s, toReal(i)))); + } + } } /*****************************************************************************************/ @@ -281,17 +254,17 @@ void PiecePool::onMousePress(const QPoint& pos, int button) { cancelDragging(); //never remove implicitly a piece from the pool } - Point p = converter()->toLogical(pos); - NamedSprite got = takeNamedSprite(p); + int index = toLogical(pos); + NamedSprite got = takeSpriteAt(index); if(!got) return; got.sprite()->hide(); /* recreate the sprite, as "got" may be being animated */ - QPixmap px = m_board->m_loader( got.name() ); QPoint at = pos + this->pos() - m_board->pos() - QPoint(px.width(), px.height())/2; - m_dragged = NamedSprite( got.name(), SpritePtr(new Sprite(px, m_board->piecesGroup(), at)) ); + m_dragged = NamedSprite( got.name(), SpritePtr(new Sprite(m_board->m_loader( got.name() ), + m_board->piecesGroup(), at) ) ); m_dragged.sprite()->raise(); m_dragged.sprite()->show(); #if 0 diff --git a/src/piecepool.h b/src/piecepool.h index 9fa09c6..71f75c9 100644 --- a/src/piecepool.h +++ b/src/piecepool.h @@ -23,34 +23,39 @@ * stack of pieces and lets you drop them on the board, notifying * the board. */ -class PiecePool : public PieceGroup { -public: - typedef Grid PieceGrid; +class PiecePool : public ClickableCanvas { private: /** displayed m_sprites */ - PieceGrid m_sprites; + std::vector m_sprites; /** refrence board */ class Board* m_board; + /** true if flipped */ + bool m_flipped; + + /** size if a square */ + int m_square_size; + + /** the width of the pool (ie how many pieces) */ + int m_width; + + /** the number of pieces on the pool */ + int m_fill; + + /** loader class, to load pieces */ + SpriteLoader m_loader; + /** the piece that is being dragged, if any */ NamedSprite m_dragged; /** the index of the piece being dragged */ int m_dragged_index; - /** the number of pieces on the pool */ - int m_fill; - /** internal function, resizes the grid vector to hold x pieces */ void setFill(int x); - /** redefinition of PointConverter::flipPoint - if the PiecePool is flipped it will be drawn using the position as - lower bound. Further, the points are ordered in a snake-like way */ - virtual Point flipPoint(const Point& p) const; //custom flip function - /** removes the drag putting it back together with his friends in the pool. if fadeOff is true the current drag will fade off while a new piece will fade in the pool, while if fadeOff is false the fade off is not done. @@ -58,14 +63,14 @@ private: board and we don't want a clone that is fading off */ void cancelDragging(bool fadeOff = true); - /** this internal function updates the sprite images after the board has been resized */ - void updateSprites(); + /** takes the named sprite */ + NamedSprite takeSpriteAt(int i); - /** fetch the sprite */ - boost::shared_ptr spriteAt(const Point& p) { return m_sprites[p].sprite(); } + /** converts an index to the upper left point of the corresponding square */ + QPoint toReal(int i); - /** takes the named sprite */ - NamedSprite takeNamedSprite(const Point& p); + /** finds to which index corresponds the point p, or -1 if corresponds to none */ + int toLogical(const QPoint& p); public: friend class GraphicalSystem; @@ -76,6 +81,14 @@ public: ~PiecePool(); + /** returns the sprite loader */ + SpriteLoader* loader() { return &m_loader; } + + /** returns the sprite loader */ + const SpriteLoader* loader() const { return &m_loader; } + + /** returns the flipped value */ + bool flipped() const { return m_flipped; } /** returns the number of pieces in the pool */ int fill(); @@ -98,15 +111,12 @@ public: grid height will be recalculated) */ void setGridWidth(int w); - /** \return the size of the grid */ - virtual Point gridSize() const { return m_sprites.getSize(); } - /** piecesGroup overload */ virtual Canvas::Abstract* piecesGroup(); /** the rect that will be covered by the pool */ - virtual QRect boardRect() { return QRect(pos(), QSize(m_square_size*gridSize().x, - (flipped()?-1:1)*m_square_size*gridSize().y)); } + virtual QRect boardRect() { return QRect(pos(), QSize(m_square_size*m_width, + (m_flipped?-1:1)*m_square_size*((m_sprites.size()+m_width-1)/m_width)) ); } /** flips and moves the pieces in the pool at the same time */ void flipAndMoveBy(QPoint p); -- 2.11.4.GIT