2b45e609db82de7ad8322cbf3dbfc979ef304da1
[supertux.git] / src / object / rock.cpp
1 #include <config.h>
2
3 #include "rock.h"
4 #include "special/sprite.h"
5 #include "special/sprite_manager.h"
6 #include "lisp/writer.h"
7 #include "video/drawing_context.h"
8 #include "resources.h"
9
10 Rock::Rock(const lisp::Lisp& reader)
11 {
12   reader.get("x", bbox.p1.x);
13   reader.get("y", bbox.p1.y);
14   bbox.set_size(31.8, 31.8);
15   sprite = sprite_manager->create("rock");
16   grabbed = false;
17   flags |= FLAG_SOLID;
18 }
19
20 Rock::~Rock()
21 {
22   delete sprite;
23 }
24
25 void
26 Rock::write(lisp::Writer& writer)
27 {
28   writer.start_list("rock");
29
30   writer.write_float("x", bbox.p1.x);
31   writer.write_float("y", bbox.p1.y);
32
33   writer.end_list("rock");
34 }
35
36 void
37 Rock::draw(DrawingContext& context)
38 {
39
40   sprite->draw(context, get_pos(), LAYER_OBJECTS);
41 }
42
43 void
44 Rock::action(float elapsed_time)
45 {
46   if(!grabbed) {
47     flags |= FLAG_SOLID;
48     flags &= ~FLAG_NO_COLLDET;
49     movement = physic.get_movement(elapsed_time);
50   } else {
51     physic.set_velocity(0, 0);
52     flags &= ~FLAG_SOLID;
53     flags |= FLAG_NO_COLLDET;
54   }
55   
56   grabbed = false;
57 }
58
59 HitResponse
60 Rock::collision(GameObject& , const CollisionHit& )
61 {
62   if(grabbed)
63     return FORCE_MOVE;
64
65   physic.set_velocity(0, 0);
66   return CONTINUE;
67 }
68
69 void
70 Rock::grab(MovingObject& , const Vector& pos)
71 {
72   movement = pos - get_pos();
73   grabbed = true;
74 }
75