4cffd9cfec872751c356ac17f10b0854c1774d92
[supertux.git] / src / worldmap / sprite_change.cpp
1 //  $Id$
2 //
3 //  SuperTux
4 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 #include <config.h>
20
21 #include "sprite_change.hpp"
22 #include "sprite/sprite_manager.hpp"
23 #include "sprite/sprite.hpp"
24 #include "video/drawing_context.hpp"
25
26 namespace WorldMapNS
27 {
28
29 SpriteChange::SpriteChange(const lisp::Lisp* lisp)
30   : change_on_touch(false), in_stay_action(false)
31 {
32   lisp->get("x", pos.x);
33   lisp->get("y", pos.y);
34   lisp->get("change-on-touch", change_on_touch);
35
36   std::string spritefile = "";
37   lisp->get("sprite", spritefile);
38   sprite.reset(sprite_manager->create(spritefile));
39
40   lisp->get("stay-action", stay_action);
41   lisp->get("initial-stay-action", in_stay_action);
42
43   lisp->get("stay-group", stay_group);
44
45   all_sprite_changes.push_back(this);
46 }
47
48 SpriteChange::~SpriteChange()
49 {
50   all_sprite_changes.remove(this);
51 }
52
53 void
54 SpriteChange::draw(DrawingContext& context)
55 {
56   if(in_stay_action && stay_action != "") {
57     sprite->set_action(stay_action);
58     sprite->draw(context, pos * 32, LAYER_OBJECTS-1);
59   }
60 }
61
62 void
63 SpriteChange::update(float )
64 {
65 }
66
67 void
68 SpriteChange::set_stay_action()
69 {
70   in_stay_action = true;
71 }
72
73 void
74 SpriteChange::clear_stay_action()
75 {
76   in_stay_action = false;
77
78   // if we are in a stay_group, also clear all stay actions in this group
79   if (stay_group != "") {
80     for (std::list<SpriteChange*>::iterator i = all_sprite_changes.begin(); i != all_sprite_changes.end(); i++) {
81       SpriteChange* sc = *i;
82       if (sc->stay_group != stay_group) continue;
83       sc->in_stay_action = false;
84     }
85   }
86 }
87
88 std::list<SpriteChange*> SpriteChange::all_sprite_changes;
89
90 }