1
1
use tunel:: Tunel ;
2
2
use car:: * ;
3
3
use color:: * ;
4
- use cgmath:: { Vector2 , Vector3 , vec3} ;
4
+ use cgmath:: { Vector3 , vec3} ;
5
5
use cgmath:: prelude:: * ;
6
6
use game:: GameConfig ;
7
7
use camera:: Camera ;
@@ -11,64 +11,9 @@ pub struct World {
11
11
pub tunel : Tunel ,
12
12
pub player : BoxCar ,
13
13
pub bots : Vec < Bot > ,
14
- pub divider : Vector2 < f64 > ,
15
- pub decor_distance : f64 ,
16
- pub divider_state : f64 ,
17
- pub decor_state : f64 ,
18
14
pub bullets : Vec < [ Vector3 < f64 > ; 3 ] > ,
19
15
}
20
- type Rendered = Vec < ( [ Vector2 < f64 > ; 2 ] , Color ) > ;
21
16
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
-
72
17
pub fn new ( config : & GameConfig ) -> World {
73
18
let player = BoxCar {
74
19
size : config. player_size . into ( ) ,
@@ -84,38 +29,25 @@ impl World {
84
29
} ;
85
30
86
31
World {
87
- tunel : Tunel :: new ( config. tunel_size ) ,
32
+ tunel : Tunel :: new ( & config) ,
88
33
player : player,
89
34
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 ,
94
35
bullets : Vec :: new ( ) ,
95
36
}
96
37
}
97
38
98
- pub fn render ( & self , camera : & Camera ) -> Rendered {
39
+ pub fn render ( & self , camera : & Camera ) -> :: Rendered {
99
40
Vec :: new ( ) . into_iter ( )
100
41
. chain ( self . tunel . render ( camera) )
101
- . chain ( self . divider_render ( camera) )
102
- . chain ( self . decor_render ( camera) )
103
42
. chain ( self . player . render ( camera) )
104
43
. chain ( self . bots . iter ( ) . flat_map ( |x| x. render ( camera) ) )
105
44
. chain ( self . bullets_render ( camera) )
106
45
. collect ( )
107
46
}
108
47
pub fn update ( & mut self , dt : f64 , game_speed : f64 ) {
109
- self . player . update_jump ( dt) ;
110
48
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) ;
119
51
for x in & mut self . bots {
120
52
x. drive ( dt) ;
121
53
x. forward ( dt, speed) ;
@@ -168,4 +100,10 @@ impl World {
168
100
direction,
169
101
] ) ;
170
102
}
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
+ }
171
109
}
0 commit comments