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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }