|
@@ -7,42 +7,48 @@ use ggez::{Context, GameResult};
|
7
|
7
|
use std::env;
|
8
|
8
|
use std::path;
|
9
|
9
|
|
|
10
|
+const TARGET_ANIMATION_FPS: u32 = 10;
|
|
11
|
+
|
10
|
12
|
struct SpriteInfo {
|
11
|
|
- start: na::Point2<f32>,
|
|
13
|
+ start_y: f32,
|
12
|
14
|
tile_count: u16,
|
13
|
15
|
relative_tile_width: f32,
|
14
|
16
|
relative_tile_height: f32,
|
|
17
|
+ current_frame: u16,
|
15
|
18
|
}
|
16
|
19
|
|
17
|
20
|
impl SpriteInfo {
|
18
|
|
- pub fn new(start: na::Point2<f32>, tile_count: u16) -> Self {
|
|
21
|
+ pub fn new(start_y: f32, tile_count: u16) -> Self {
|
|
22
|
+ // FIXME BS NOW: en fait ca ce base sur la hauteur complète de l'image
|
19
|
23
|
let relative_tile_width: f32 = 1.0 / tile_count as f32;
|
20
|
24
|
Self {
|
21
|
|
- start,
|
|
25
|
+ start_y,
|
22
|
26
|
tile_count,
|
23
|
27
|
relative_tile_width,
|
24
|
28
|
relative_tile_height: 1.0,
|
|
29
|
+ current_frame: 0,
|
25
|
30
|
}
|
26
|
31
|
}
|
27
|
32
|
|
28
|
33
|
pub fn from_type(type_: &SpriteType) -> Self {
|
29
|
34
|
match type_ {
|
30
|
|
- SpriteType::WalkingSoldier => Self::new(na::Point2::new(0.0, 0.0), 7),
|
|
35
|
+ SpriteType::WalkingSoldier => Self::new(0.0, 7),
|
|
36
|
+ SpriteType::JumpingSoldier => Self::new(24.0, 2),
|
31
|
37
|
}
|
32
|
38
|
}
|
33
|
39
|
}
|
34
|
40
|
|
35
|
41
|
enum SpriteType {
|
36
|
42
|
WalkingSoldier,
|
|
43
|
+ JumpingSoldier,
|
37
|
44
|
}
|
38
|
45
|
|
39
|
46
|
fn sprite_batch_part_from_sprite_info(
|
40
|
47
|
sprite_info: &SpriteInfo,
|
41
|
|
- frame_i: u32,
|
42
|
48
|
) -> graphics::DrawParam {
|
43
|
49
|
let src = graphics::Rect::new(
|
44
|
|
- frame_i as f32 * sprite_info.relative_tile_width,
|
45
|
|
- 0.0,
|
|
50
|
+ sprite_info.current_frame as f32 * sprite_info.relative_tile_width,
|
|
51
|
+ sprite_info.start_y,
|
46
|
52
|
sprite_info.relative_tile_width,
|
47
|
53
|
sprite_info.relative_tile_height,
|
48
|
54
|
);
|
|
@@ -61,12 +67,22 @@ impl SceneItem {
|
61
|
67
|
position,
|
62
|
68
|
}
|
63
|
69
|
}
|
|
70
|
+
|
|
71
|
+ pub fn tick_frame(&mut self) {
|
|
72
|
+ self.sprite_info.current_frame += 1;
|
|
73
|
+ if self.sprite_info.current_frame >= self.sprite_info.tile_count {
|
|
74
|
+ self.sprite_info.current_frame = 0;
|
|
75
|
+ }
|
|
76
|
+ }
|
|
77
|
+}
|
|
78
|
+
|
|
79
|
+enum Message {
|
|
80
|
+
|
64
|
81
|
}
|
65
|
82
|
|
66
|
83
|
struct MainState {
|
67
|
84
|
scene_items_sprite_batch: graphics::spritebatch::SpriteBatch,
|
68
|
85
|
scene_items: Vec<SceneItem>,
|
69
|
|
- i: u32,
|
70
|
86
|
}
|
71
|
87
|
|
72
|
88
|
impl MainState {
|
|
@@ -75,8 +91,14 @@ impl MainState {
|
75
|
91
|
let batch = graphics::spritebatch::SpriteBatch::new(image);
|
76
|
92
|
|
77
|
93
|
let mut scene_items = vec![];
|
78
|
|
- for x in 0..10 {
|
79
|
|
- for y in 0..10 {
|
|
94
|
+ for x in 0..1 {
|
|
95
|
+ for y in 0..4 {
|
|
96
|
+ let type_ = if y % 2 == 0 {
|
|
97
|
+ SpriteType::WalkingSoldier
|
|
98
|
+ } else {
|
|
99
|
+ SpriteType::JumpingSoldier
|
|
100
|
+ };
|
|
101
|
+
|
80
|
102
|
scene_items.push(SceneItem::new(
|
81
|
103
|
SpriteType::WalkingSoldier,
|
82
|
104
|
na::Point2::new(x as f32 * 24.0, y as f32 * 24.0),
|
|
@@ -87,19 +109,19 @@ impl MainState {
|
87
|
109
|
let s = MainState {
|
88
|
110
|
scene_items_sprite_batch: batch,
|
89
|
111
|
scene_items,
|
90
|
|
- i: 0,
|
91
|
112
|
};
|
92
|
113
|
Ok(s)
|
93
|
114
|
}
|
94
|
115
|
}
|
|
116
|
+
|
95
|
117
|
impl event::EventHandler for MainState {
|
96
|
118
|
fn update(&mut self, ctx: &mut Context) -> GameResult {
|
97
|
|
- if check_update_time(ctx, 5) {
|
98
|
|
- self.i += 1;
|
99
|
|
- }
|
100
|
|
- if self.i > 6 {
|
101
|
|
- self.i = 0;
|
|
119
|
+ while check_update_time(ctx, TARGET_ANIMATION_FPS) {
|
|
120
|
+ for scene_item in self.scene_items.iter_mut() {
|
|
121
|
+ scene_item.tick_frame();
|
|
122
|
+ }
|
102
|
123
|
}
|
|
124
|
+
|
103
|
125
|
Ok(())
|
104
|
126
|
}
|
105
|
127
|
|
|
@@ -107,7 +129,7 @@ impl event::EventHandler for MainState {
|
107
|
129
|
graphics::clear(ctx, graphics::BLACK);
|
108
|
130
|
|
109
|
131
|
for scene_item in self.scene_items.iter() {
|
110
|
|
- let sprite_batch_part = sprite_batch_part_from_sprite_info(&scene_item.sprite_info, self.i)
|
|
132
|
+ let sprite_batch_part = sprite_batch_part_from_sprite_info(&scene_item.sprite_info)
|
111
|
133
|
.dest(scene_item.position.clone());
|
112
|
134
|
self.scene_items_sprite_batch.add(sprite_batch_part);
|
113
|
135
|
}
|
|
@@ -115,10 +137,10 @@ impl event::EventHandler for MainState {
|
115
|
137
|
ctx,
|
116
|
138
|
&self.scene_items_sprite_batch,
|
117
|
139
|
graphics::DrawParam::new().dest(na::Point2::new(0.0, 0.0)),
|
118
|
|
- );
|
|
140
|
+ )?;
|
119
|
141
|
|
120
|
142
|
self.scene_items_sprite_batch.clear();
|
121
|
|
- graphics::present(ctx);
|
|
143
|
+ graphics::present(ctx)?;
|
122
|
144
|
|
123
|
145
|
println!("FPS: {}", ggez::timer::fps(ctx));
|
124
|
146
|
Ok(())
|