1// SuperTux
2// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17#include "object/skull_tile.hpp"
18
19#include "math/random.hpp"
20#include "object/player.hpp"
21#include "sprite/sprite.hpp"
22#include "supertux/sector.hpp"
23
24static const float CRACKTIME = 0.3f;
25static const float FALLTIME = 0.8f;
26
27SkullTile::SkullTile(const ReaderMapping& mapping) :
28 MovingSprite(mapping, "images/objects/skull_tile/skull_tile.sprite", LAYER_TILES, COLGROUP_STATIC),
29 physic(),
30 timer(),
31 hit(false),
32 falling(false)
33{
34}
35
36HitResponse
37SkullTile::collision(GameObject& other, const CollisionHit& )
38{
39 auto player = dynamic_cast<Player*> (&other);
40 if (player)
41 hit = true;
42
43 return FORCE_MOVE;
44}
45
46void
47SkullTile::draw(DrawingContext& context)
48{
49 Vector pos = get_pos();
50 // shaking
51 if (timer.get_timegone() > CRACKTIME) {
52 pos.x += static_cast<float>(graphicsRandom.rand(-3, 3));
53 }
54
55 m_sprite->draw(context.color(), pos, m_layer);
56}
57
58void
59SkullTile::update(float dt_sec)
60{
61 if (falling) {
62 m_col.m_movement = physic.get_movement(dt_sec);
63 if (!Sector::get().inside(m_col.m_bbox)) {
64 remove_me();
65 return;
66 }
67 } else if (hit) {
68 if (timer.check()) {
69 falling = true;
70 physic.enable_gravity(true);
71 timer.stop();
72 } else if (!timer.started()) {
73 timer.start(FALLTIME);
74 }
75 } else {
76 timer.stop();
77 }
78 hit = false;
79}
80
81/* EOF */
82