Skip to content

Commit b3633e8

Browse files
committed
Move tunel's decorations to Tunel, update README
1 parent 8f16317 commit b3633e8

File tree

4 files changed

+89
-79
lines changed

4 files changed

+89
-79
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This game was written with hope to be a good example of game development in Rust
1010

1111
Download binary (64-bit Windows and Linux) here: https://github.com/juchiast/boxcrash/releases
1212

13-
This code should be compiled with the latest stable version of Rust (1.15.1 as of this writing).
13+
This code should be compiled with the latest stable version of Rust (1.16.0 as of this writing).
1414

1515
Almost all game's constants are configurable via `resources/config.json`.
1616
You should edit the screen size details to match your monitor.
@@ -38,7 +38,7 @@ This seem to be a piston\_window's bug.
3838
- Write an article about the writing of this code.
3939
- Fix some known bugs.
4040
- Test game on more machines.
41-
- Write a GUI to configure and restart game.
41+
- ~~Write a GUI to configure and restart game~~ (Done).
4242
- Draw more details of box and the road.
4343
- Add crashing animations.
4444
- Add some sounds.

src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ mod bot;
1616
mod game;
1717
mod ui;
1818

19+
type Rendered = Vec<([cgmath::Vector2<f64>; 2], color::Color)>;
20+
1921
// Pixel present a point in the window and window's size
2022
#[derive(Clone, Serialize, Deserialize)]
2123
pub struct Pixel {

src/tunel.rs

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use cgmath::{Vector2, Vector3};
1+
use cgmath::{Vector2, Vector3, vec3};
22
use color::*;
33
use camera::Camera;
44

@@ -8,13 +8,23 @@ pub struct Tunel {
88
pub size: Vector3<f64>,
99
// Color to draw tunel
1010
pub color: Color,
11+
// Road's dividers
12+
pub divider: Vector2<f64>,
13+
pub divider_state: f64,
14+
// Tunel's decorations
15+
pub decor_distance: f64,
16+
pub decor_state: f64,
1117
}
1218

1319
impl Tunel {
14-
pub fn new(size: [f64; 3]) -> Tunel {
20+
pub fn new(config: &::game::GameConfig) -> Tunel {
1521
Tunel {
16-
size: size.into(),
22+
size: config.tunel_size.into(),
1723
color: BLUE,
24+
divider: config.divider_size.into(),
25+
divider_state: config.divider_size[1],
26+
decor_distance: config.decor_distance,
27+
decor_state: config.decor_distance,
1828
}
1929
}
2030

@@ -25,6 +35,66 @@ impl Tunel {
2535
((0., self.size.y, 0.), (0., self.size.y, self.size.z)),
2636
((self.size.x, self.size.y, 0.), (self.size.x, self.size.y, self.size.z)),
2737
].into_iter().map(|(a, b)| camera.render_line(&a.into(), &b.into()))
28-
.filter_map(|x| x.map(|x| (x, self.color))).collect()
38+
.filter_map(|x| x.map(|x| (x, self.color)))
39+
.chain(self.divider_render(camera))
40+
.chain(self.decor_render(camera))
41+
.collect()
2942
}
43+
44+
pub fn update(&mut self, dt: f64, speed: f64) {
45+
self.divider_state -= dt*speed;
46+
if self.divider_state < 0. {
47+
self.divider_state += 2.*self.divider.y;
48+
}
49+
self.decor_state -= dt*speed;
50+
if self.decor_state < 0. {
51+
self.decor_state += self.decor_distance;
52+
}
53+
}
54+
55+
fn divider_render(&self, camera: &Camera) -> ::Rendered {
56+
let mut points = [vec3(self.size.x/2., 0., self.divider_state); 4];
57+
points[2].z -= self.divider.y; points[3].z -= self.divider.y;
58+
points[0].x -= self.divider.x/2.; points[3].x -= self.divider.x/2.;
59+
points[1].x += self.divider.x/2.; points[2].x += self.divider.x/2.;
60+
61+
let mut ret = Vec::new();
62+
{
63+
let mut r = |p: &[Vector3<f64>; 4]| {
64+
let iter = p.iter().zip(p.iter().cycle().skip(1))
65+
.map(|(x, y)| camera.render_line(x, y))
66+
.filter_map(|x| x.map(|x| (x, self.color)));
67+
ret.append(&mut iter.collect());
68+
};
69+
while points[0].z <= self.size.z {
70+
r(&points);
71+
for p in &mut points {
72+
p.z += 2.*self.divider.y;
73+
}
74+
}
75+
r(&points);
76+
}
77+
ret
78+
}
79+
fn decor_render(&self, camera: &Camera) -> ::Rendered {
80+
let mut data = [
81+
vec3(0., 0., self.decor_state),
82+
vec3(0., self.size.y, self.decor_state),
83+
vec3(self.size.x, self.size.y, self.decor_state),
84+
vec3(self.size.x, 0., self.decor_state),
85+
];
86+
let mut ret = Vec::new();
87+
while data[0].z <= self.size.z {
88+
for (x, y) in data.iter().zip(data.iter().skip(1)) {
89+
if let Some(rendered) = camera.render_line(x, y) {
90+
ret.push((rendered, self.color));
91+
}
92+
}
93+
for x in &mut data {
94+
x.z += self.decor_distance;
95+
}
96+
}
97+
ret
98+
}
99+
30100
}

src/world.rs

Lines changed: 11 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use tunel::Tunel;
22
use car::*;
33
use color::*;
4-
use cgmath::{Vector2, Vector3, vec3};
4+
use cgmath::{Vector3, vec3};
55
use cgmath::prelude::*;
66
use game::GameConfig;
77
use camera::Camera;
@@ -11,64 +11,9 @@ pub struct World {
1111
pub tunel: Tunel,
1212
pub player: BoxCar,
1313
pub bots: Vec<Bot>,
14-
pub divider: Vector2<f64>,
15-
pub decor_distance: f64,
16-
pub divider_state: f64,
17-
pub decor_state: f64,
1814
pub bullets: Vec<[Vector3<f64>; 3]>,
1915
}
20-
type Rendered = Vec<([Vector2<f64>; 2], Color)>;
2116
impl World {
22-
fn divider_render(&self, camera: &Camera) -> Rendered {
23-
let mut points = [vec3(self.tunel.size.x/2., 0., self.divider_state); 4];
24-
points[2].z -= self.divider.y; points[3].z -= self.divider.y;
25-
points[0].x -= self.divider.x/2.; points[3].x -= self.divider.x/2.;
26-
points[1].x += self.divider.x/2.; points[2].x += self.divider.x/2.;
27-
28-
let mut ret = Vec::new();
29-
{
30-
let mut r = |p: &[Vector3<f64>; 4]| {
31-
let iter = p.iter().zip(p.iter().cycle().skip(1))
32-
.map(|(x, y)| camera.render_line(x, y))
33-
.filter_map(|x| x.map(|x| (x, self.tunel.color)));
34-
ret.append(&mut iter.collect());
35-
};
36-
while points[0].z <= self.tunel.size.z {
37-
r(&points);
38-
for p in &mut points {
39-
p.z += 2.*self.divider.y;
40-
}
41-
}
42-
r(&points);
43-
}
44-
ret
45-
}
46-
fn decor_render(&self, camera: &Camera) -> Rendered {
47-
let mut data = [
48-
vec3(0., 0., self.decor_state),
49-
vec3(0., self.tunel.size.y, self.decor_state),
50-
vec3(self.tunel.size.x, self.tunel.size.y, self.decor_state),
51-
vec3(self.tunel.size.x, 0., self.decor_state),
52-
];
53-
let mut ret = Vec::new();
54-
while data[0].z <= self.tunel.size.z {
55-
for (x, y) in data.iter().zip(data.iter().skip(1)) {
56-
if let Some(rendered) = camera.render_line(x, y) {
57-
ret.push((rendered, self.tunel.color));
58-
}
59-
}
60-
for x in &mut data {
61-
x.z += self.decor_distance;
62-
}
63-
}
64-
ret
65-
}
66-
fn bullets_render(&self, camera: &Camera) -> Rendered {
67-
self.bullets.iter().filter_map(|x| {
68-
camera.render_line(&x[0], &(x[0]+x[1])).map(|x| (x, self.player.color))
69-
}).collect()
70-
}
71-
7217
pub fn new(config: &GameConfig) -> World {
7318
let player = BoxCar {
7419
size: config.player_size.into(),
@@ -84,38 +29,25 @@ impl World {
8429
};
8530

8631
World {
87-
tunel: Tunel::new(config.tunel_size),
32+
tunel: Tunel::new(&config),
8833
player: player,
8934
bots: Vec::new(),
90-
divider: config.divider_size.into(),
91-
divider_state: config.divider_size[1],
92-
decor_distance: config.decor_distance,
93-
decor_state: config.decor_distance,
9435
bullets: Vec::new(),
9536
}
9637
}
9738

98-
pub fn render(&self, camera: &Camera) -> Rendered {
39+
pub fn render(&self, camera: &Camera) -> ::Rendered {
9940
Vec::new().into_iter()
10041
.chain(self.tunel.render(camera))
101-
.chain(self.divider_render(camera))
102-
.chain(self.decor_render(camera))
10342
.chain(self.player.render(camera))
10443
.chain(self.bots.iter().flat_map(|x| x.render(camera)))
10544
.chain(self.bullets_render(camera))
10645
.collect()
10746
}
10847
pub fn update(&mut self, dt: f64, game_speed: f64) {
109-
self.player.update_jump(dt);
11048
let speed = game_speed + self.player.speed;
111-
self.divider_state -= dt*speed;
112-
if self.divider_state < 0. {
113-
self.divider_state += 2.*self.divider.y;
114-
}
115-
self.decor_state -= dt*speed;
116-
if self.decor_state < 0. {
117-
self.decor_state += self.decor_distance;
118-
}
49+
self.player.update_jump(dt);
50+
self.tunel.update(dt, speed);
11951
for x in &mut self.bots {
12052
x.drive(dt);
12153
x.forward(dt, speed);
@@ -168,4 +100,10 @@ impl World {
168100
direction,
169101
]);
170102
}
103+
104+
fn bullets_render(&self, camera: &Camera) -> ::Rendered {
105+
self.bullets.iter().filter_map(|x| {
106+
camera.render_line(&x[0], &(x[0]+x[1])).map(|x| (x, self.player.color))
107+
}).collect()
108+
}
171109
}

0 commit comments

Comments
 (0)