Mercurial > projects > myrrdin
annotate src/animatedsprite.d @ 4:292df259cc85
view + sprite consumers, animated sprite working
author | fred@reichbier.de |
---|---|
date | Fri, 18 Jul 2008 16:12:41 +0200 |
parents | |
children |
rev | line source |
---|---|
4
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
1 module animatedsprite; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
2 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
3 import dsfml.window.all; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
4 import dsfml.system.all; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
5 import dsfml.graphics.all; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
6 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
7 class Frame { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
8 Image image; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
9 int length; // length in frames |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
10 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
11 this(Image image, int length) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
12 this.image = image; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
13 this.length = length; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
14 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
15 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
16 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
17 class Animation { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
18 private Frame[] frames; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
19 private int current_frame_idx; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
20 private Frame current_frame; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
21 private int frame_counter; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
22 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
23 this() { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
24 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
25 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
26 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
27 void add_frame(Image image, int length) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
28 this.frames ~= new Frame(image, length); |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
29 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
30 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
31 void play() { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
32 this.current_frame = this.frames[0]; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
33 this.current_frame_idx = 0; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
34 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
35 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
36 Image get_image() { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
37 if(this.frame_counter >= this.current_frame.length) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
38 this.frame_counter = 0; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
39 this.current_frame_idx++; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
40 if (this.frames.length <= this.current_frame_idx) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
41 // animation stop |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
42 return null; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
43 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
44 this.current_frame = this.frames[this.current_frame_idx]; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
45 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
46 this.frame_counter++; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
47 return this.current_frame.image; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
48 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
49 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
50 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
51 class AnimatedSprite : Sprite { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
52 private Animation current_animation = null; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
53 private bool is_loop = false; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
54 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
55 /* play an animation now. */ |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
56 void play_animation(Animation animation, bool loop=false) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
57 this.current_animation = animation; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
58 this.is_loop = loop; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
59 this.current_animation.play(); |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
60 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
61 |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
62 /* update everything. Perfect for an animated sprite */ |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
63 void update() { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
64 if(this.current_animation) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
65 Image img = this.current_animation.get_image(); |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
66 if(img) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
67 this.setImage(img); |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
68 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
69 else if (this.is_loop) { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
70 this.current_animation.play(); // is a loop, play again |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
71 } else { |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
72 this.current_animation = null; |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
73 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
74 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
75 } |
292df259cc85
view + sprite consumers, animated sprite working
fred@reichbier.de
parents:
diff
changeset
|
76 } |