|
@@ -17,8 +17,8 @@ const ANIMATE_EACH: u32 = 60; // execute animate code each 30 frames
|
17
|
17
|
const SPRITE_EACH: u32 = 10; // change sprite animation tile 30 frames
|
18
|
18
|
const MAX_FRAME_I: u32 = 4294967295; // max of frame_i used to calculate ticks
|
19
|
19
|
|
20
|
|
-const SPRITE_SHEET_WIDTH: f32 = 168.0;
|
21
|
|
-const SPRITE_SHEET_HEIGHT: f32 = 72.0;
|
|
20
|
+const SPRITE_SHEET_WIDTH: f32 = 800.0;
|
|
21
|
+const SPRITE_SHEET_HEIGHT: f32 = 600.0;
|
22
|
22
|
|
23
|
23
|
fn vec_from_angle(angle: f32) -> Vector2 {
|
24
|
24
|
let vx = angle.sin();
|
|
@@ -31,29 +31,19 @@ struct SpriteInfo {
|
31
|
31
|
relative_tile_width: f32,
|
32
|
32
|
relative_tile_height: f32,
|
33
|
33
|
tile_count: u16,
|
|
34
|
+ tile_width: f32,
|
|
35
|
+ tile_height: f32,
|
|
36
|
+ half_tile_width: f32,
|
|
37
|
+ half_tile_height: f32,
|
34
|
38
|
}
|
35
|
39
|
|
36
|
40
|
impl SpriteInfo {
|
37
|
|
- pub fn new(
|
38
|
|
- relative_start_y: f32,
|
39
|
|
- relative_tile_width: f32,
|
40
|
|
- relative_tile_height: f32,
|
41
|
|
- tile_count: u16,
|
42
|
|
- ) -> Self {
|
43
|
|
- Self {
|
44
|
|
- relative_start_y,
|
45
|
|
- relative_tile_width,
|
46
|
|
- relative_tile_height,
|
47
|
|
- tile_count,
|
48
|
|
- }
|
49
|
|
- }
|
50
|
|
-
|
51
|
41
|
// TODO: ask on rust community if this is performant, or how to make it static
|
52
|
42
|
pub fn from_type(type_: &SpriteType) -> Self {
|
53
|
43
|
let (start_y, tile_width, tile_height, tile_count) = match type_ {
|
54
|
|
- SpriteType::WalkingSoldier => (0.0, 24.0, 24.0, 7),
|
55
|
|
- SpriteType::JumpingSoldier => (24.0, 24.0, 24.0, 2),
|
56
|
|
- SpriteType::StandingSoldier => (48.0, 24.0, 24.0, 1),
|
|
44
|
+ SpriteType::WalkingSoldier => (12.0, 12.0, 12.0, 8),
|
|
45
|
+ SpriteType::CrawlingSoldier => (26.0, 26.0, 26.0, 8),
|
|
46
|
+ SpriteType::StandingSoldier => (0.0, 12.0, 12.0, 1),
|
57
|
47
|
};
|
58
|
48
|
|
59
|
49
|
Self {
|
|
@@ -61,6 +51,10 @@ impl SpriteInfo {
|
61
|
51
|
relative_tile_width: tile_width / SPRITE_SHEET_WIDTH,
|
62
|
52
|
relative_tile_height: tile_height / SPRITE_SHEET_HEIGHT,
|
63
|
53
|
tile_count,
|
|
54
|
+ tile_width,
|
|
55
|
+ tile_height,
|
|
56
|
+ half_tile_width: tile_width / 2.0,
|
|
57
|
+ half_tile_height: tile_height / 2.0,
|
64
|
58
|
}
|
65
|
59
|
}
|
66
|
60
|
|
|
@@ -76,14 +70,14 @@ impl SpriteInfo {
|
76
|
70
|
|
77
|
71
|
enum SpriteType {
|
78
|
72
|
WalkingSoldier,
|
79
|
|
- JumpingSoldier,
|
|
73
|
+ CrawlingSoldier,
|
80
|
74
|
StandingSoldier,
|
81
|
75
|
}
|
82
|
76
|
|
83
|
77
|
enum ItemBehavior {
|
84
|
78
|
Standing(u32), // since
|
85
|
|
- Jumping,
|
86
|
|
- Running(Vector2),
|
|
79
|
+ Crawling,
|
|
80
|
+ Walking(Vector2),
|
87
|
81
|
}
|
88
|
82
|
|
89
|
83
|
struct ItemState {
|
|
@@ -98,8 +92,8 @@ impl ItemState {
|
98
|
92
|
pub fn sprite_type(&self) -> SpriteType {
|
99
|
93
|
// Here some logical about state and current behavior to determine sprite type
|
100
|
94
|
match self.current_behavior {
|
101
|
|
- ItemBehavior::Jumping => SpriteType::JumpingSoldier,
|
102
|
|
- ItemBehavior::Running(_) => SpriteType::WalkingSoldier,
|
|
95
|
+ ItemBehavior::Crawling => SpriteType::CrawlingSoldier,
|
|
96
|
+ ItemBehavior::Walking(_) => SpriteType::WalkingSoldier,
|
103
|
97
|
ItemBehavior::Standing(_) => SpriteType::StandingSoldier,
|
104
|
98
|
}
|
105
|
99
|
}
|
|
@@ -134,6 +128,14 @@ impl SceneItem {
|
134
|
128
|
self.current_frame = 0;
|
135
|
129
|
}
|
136
|
130
|
}
|
|
131
|
+
|
|
132
|
+ pub fn position_with_tile_decal(&self) -> na::Point2<f32> {
|
|
133
|
+ let sprite_info = self.sprite_info();
|
|
134
|
+ na::Point2::new(
|
|
135
|
+ self.position.x - sprite_info.half_tile_width,
|
|
136
|
+ self.position.y - sprite_info.half_tile_height,
|
|
137
|
+ )
|
|
138
|
+ }
|
137
|
139
|
}
|
138
|
140
|
|
139
|
141
|
enum PhysicEvent {
|
|
@@ -153,16 +155,16 @@ struct MainState {
|
153
|
155
|
|
154
|
156
|
impl MainState {
|
155
|
157
|
fn new(ctx: &mut Context) -> GameResult<MainState> {
|
156
|
|
- let image = graphics::Image::new(ctx, "/test.png").unwrap();
|
|
158
|
+ let image = graphics::Image::new(ctx, "/sprite_sheet.png").unwrap();
|
157
|
159
|
let batch = graphics::spritebatch::SpriteBatch::new(image);
|
158
|
160
|
|
159
|
161
|
let mut scene_items = vec![];
|
160
|
162
|
for x in 0..1 {
|
161
|
163
|
for y in 0..4 {
|
162
|
164
|
let current_behavior = if y % 2 == 0 {
|
163
|
|
- ItemBehavior::Running(vec_from_angle(90.0))
|
|
165
|
+ ItemBehavior::Walking(vec_from_angle(90.0))
|
164
|
166
|
} else {
|
165
|
|
- ItemBehavior::Jumping
|
|
167
|
+ ItemBehavior::Crawling
|
166
|
168
|
};
|
167
|
169
|
|
168
|
170
|
scene_items.push(SceneItem::new(
|
|
@@ -186,7 +188,7 @@ impl MainState {
|
186
|
188
|
// Scene items movements
|
187
|
189
|
for scene_item in self.scene_items.iter_mut() {
|
188
|
190
|
match scene_item.state.current_behavior {
|
189
|
|
- ItemBehavior::Running(vector) => {
|
|
191
|
+ ItemBehavior::Walking(vector) => {
|
190
|
192
|
// TODO ici il faut calculer le déplacement réél (en fonction des ticks, etc ...)
|
191
|
193
|
scene_item.position.x += 1.0;
|
192
|
194
|
}
|
|
@@ -195,7 +197,7 @@ impl MainState {
|
195
|
197
|
}
|
196
|
198
|
|
197
|
199
|
// (FAKE) Drop a bomb to motivate stop move
|
198
|
|
- if self.frame_i % 300 == 0 && self.frame_i != 0 {
|
|
200
|
+ if self.frame_i % 600 == 0 && self.frame_i != 0 {
|
199
|
201
|
self.physics_events.push(PhysicEvent::Explosion);
|
200
|
202
|
}
|
201
|
203
|
}
|
|
@@ -225,16 +227,16 @@ impl MainState {
|
225
|
227
|
}
|
226
|
228
|
|
227
|
229
|
match scene_item.state.current_behavior {
|
228
|
|
- ItemBehavior::Jumping => {
|
229
|
|
- scene_item.state = ItemState::new(ItemBehavior::Running(vec_from_angle(90.0)));
|
|
230
|
+ ItemBehavior::Crawling => {
|
|
231
|
+ scene_item.state = ItemState::new(ItemBehavior::Walking(vec_from_angle(90.0)));
|
230
|
232
|
}
|
231
|
|
- ItemBehavior::Running(_) => {
|
232
|
|
- scene_item.state = ItemState::new(ItemBehavior::Jumping);
|
|
233
|
+ ItemBehavior::Walking(_) => {
|
|
234
|
+ scene_item.state = ItemState::new(ItemBehavior::Crawling);
|
233
|
235
|
}
|
234
|
236
|
ItemBehavior::Standing(since) => {
|
235
|
237
|
if self.frame_i - since >= 120 {
|
236
|
238
|
scene_item.state =
|
237
|
|
- ItemState::new(ItemBehavior::Running(vec_from_angle(90.0)));
|
|
239
|
+ ItemState::new(ItemBehavior::Walking(vec_from_angle(90.0)));
|
238
|
240
|
}
|
239
|
241
|
}
|
240
|
242
|
}
|
|
@@ -302,7 +304,7 @@ impl event::EventHandler for MainState {
|
302
|
304
|
scene_item
|
303
|
305
|
.sprite_info()
|
304
|
306
|
.as_draw_param(scene_item.current_frame as f32)
|
305
|
|
- .dest(scene_item.position.clone()),
|
|
307
|
+ .dest(scene_item.position_with_tile_decal()),
|
306
|
308
|
);
|
307
|
309
|
}
|
308
|
310
|
graphics::draw(
|