1
+ class Obstaculos {
2
+ constructor ( x , y , alto , ancho , velocidad , tipo ) {
3
+ this . x = x ;
4
+ this . y = y ;
5
+ this . alto = alto ;
6
+ this . ancho = ancho ;
7
+ this . velocidad = velocidad ;
8
+ this . tipo = tipo ;
9
+ }
10
+
11
+ // Dibujar los obstáculos en el canvas
12
+ dibujar ( ) {
13
+ switch ( this . tipo ) {
14
+ case "tronco" :
15
+ ctx . drawImage (
16
+ TRONCO ,
17
+ this . x ,
18
+ this . y ,
19
+ this . ancho ,
20
+ this . alto
21
+ ) ;
22
+ break ;
23
+ case "vehiculo" :
24
+ if ( this . velocidad > 0 ) {
25
+ // Imagen de coche moviéndose hacia la derecha con sprites aleatorios
26
+ ctx . drawImage (
27
+ VEHICULO ,
28
+ this . imagenesCochesDerecha [ this . randomizador ] [ 0 ] ,
29
+ this . imagenesCochesDerecha [ this . randomizador ] [ 1 ] ,
30
+ 161 ,
31
+ 64 ,
32
+ this . x ,
33
+ this . y ,
34
+ this . ancho ,
35
+ this . alto
36
+ ) ;
37
+ } else {
38
+ // Imagen de coche moviéndose hacia la izquierda con sprites aleatorios
39
+ ctx . drawImage (
40
+ VEHICULO ,
41
+ this . imagenesCochesIzquierda [ this . randomizador ] [ 0 ] ,
42
+ this . imagenesCochesIzquierda [ this . randomizador ] [ 1 ] ,
43
+ 161 ,
44
+ 64 ,
45
+ this . x ,
46
+ this . y ,
47
+ this . ancho ,
48
+ this . alto
49
+ ) ;
50
+ }
51
+ break ;
52
+ }
53
+ }
54
+
55
+ // Actualizar la posición del obstáculo
56
+ actualizar ( ) {
57
+ this . x += this . velocidad * velocidadJuego ;
58
+ // Si se mueve hacia la derecha y sale del canvas, reiniciamos su posición
59
+ if ( this . velocidad > 0 ) {
60
+ if ( this . x > LIMITECOCHEDERECHA + this . ancho ) {
61
+ this . x = LIMITECOCHEIZQUIERDA ; // Reaparece en el lado opuesto
62
+ this . randomizador = Math . floor ( Math . random ( ) * 3 ) ; // Cambia el sprite del coche
63
+ }
64
+ } else {
65
+ // En el caso que se mueva a la izquierda, hacemos lo mismo que si fuera a la derecha
66
+ if ( this . x < LIMITECOCHEIZQUIERDA - this . ancho ) {
67
+ this . x = LIMITECOCHEDERECHA ;
68
+ this . randomizador = Math . floor ( Math . random ( ) * 3 ) ;
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ // Función para inciar los obstaculos del juego
75
+ function iniciarObstaculos ( ) {
76
+ // Primera fila de coches
77
+ for ( let i = 0 ; i < 2 ; i ++ ) {
78
+ let x = i * 350 ;
79
+ arrayCoches . push ( new Obstaculos ( x , 285 , 50 , 100 , 1 , "vehiculo" ) ) ;
80
+ }
81
+ // Segunda fila de coches
82
+ for ( let i = 0 ; i < 2 ; i ++ ) {
83
+ let x = i * 300 ;
84
+ arrayCoches . push ( new Obstaculos ( x , 230 , 50 , 100 , - 2 , "vehiculo" ) ) ;
85
+ }
86
+ // Tercera fila de coches
87
+ for ( let i = 0 ; i < 2 ; i ++ ) {
88
+ let x = i * 400 ;
89
+ arrayCoches . push ( new Obstaculos ( x , 175 , 50 , 100 , 2 , "vehiculo" ) ) ;
90
+ }
91
+ //Cuarta fila de troncos
92
+ for ( let i = 0 ; i < 2 ; i ++ ) {
93
+ let x = i * 450 ;
94
+ arrayTroncos . push ( new Obstaculos ( x , 120 , 50 , 100 , - 1.5 , "tronco" ) ) ;
95
+ }
96
+ // Quita fila de troncos
97
+ for ( let i = 0 ; i < 6 ; i ++ ) {
98
+ let x = i * 150 ;
99
+ arrayTroncos . push ( new Obstaculos ( x , 60 , 60 , 60 , 0.7 , "tronco" ) ) ;
100
+ }
101
+ }
102
+ iniciarObstaculos ( ) ; // Creamos los obstaculos
103
+
104
+ // Manejar el movimiento y la lógica de los obstáculos
105
+ function manejadorDeObstaculos ( ) {
106
+ // Actualizamos la posición de los coches y cambiamos los sprites de los coches en caso necesario
107
+ for ( let i = 0 ; i < arrayCoches . length ; i ++ ) {
108
+ arrayCoches [ i ] . actualizar ( ) ;
109
+ arrayCoches [ i ] . dibujar ( ) ;
110
+ }
111
+
112
+ // Actualizamos la posición de los troncos
113
+ for ( let i = 0 ; i < arrayTroncos . length ; i ++ ) {
114
+ arrayTroncos [ i ] . actualizar ( ) ;
115
+ arrayTroncos [ i ] . dibujar ( ) ;
116
+ }
117
+
118
+ // Comprobación de la colisión con los coches
119
+ for ( let i = 0 ; i < arrayCoches . length ; i ++ ) {
120
+ if ( colision ( arrayCoches [ i ] ) ) { // Si existe alguna colisión con los coches muere directamente
121
+ muerte = true ; // Y cambia el estado
122
+ }
123
+ }
124
+
125
+ // Comprobación de la colisión con los troncos
126
+ if ( rana . y < 160 && rana . y > 40 ) { // Si se encuentra en esa posición (que es donde se encuentra el agua y los troncos) la rana
127
+ asalvo = false ;
128
+ // Comprobamos todos los troncos del array y miramos si ha colisionado con alguno
129
+ for ( let i = 0 ; i < arrayTroncos . length ; i ++ ) {
130
+ if ( colision ( arrayTroncos [ i ] ) ) { // Si colisiona con un tronco
131
+ rana . y = arrayTroncos [ i ] . y ; // Actualiza la posición de la rana con la del tronco que ha golpeado
132
+ rana . x += arrayTroncos [ i ] . velocidad * velocidadJuego ; // Y con ello también su velocidad
133
+ asalvo = true ; // Y ahora se encuentra a salvo
134
+ break ;
135
+ }
136
+ }
137
+
138
+ // Si ha pasado por esa posición y no ha habido ninguna colisión con algun tronco significa que ha tocado agua
139
+ if ( ! asalvo ) {
140
+ muerte = true ; // Cambia el estado de muerte a verdero
141
+ }
142
+ }
143
+ }
144
+
145
+ // Método que comprueba si ha habido alguna colisión entre los obstaculos y la rana
146
+ function colision ( obstaculo ) {
147
+ // margen que le añadimos a los objetos creados, para que la colisión sea mas cercana
148
+ const margenRana = 5 ;
149
+ const margenObstaculo = 5 ;
150
+
151
+ let rIzq = rana . x + margenRana ; // lado izquierdo de la rana
152
+ let rDer = rana . x + rana . tamañoX - margenRana ; // lado derecho de la rana
153
+ let rDown = rana . y + margenRana ; // Parte de abajo de la rana
154
+ let rUp = rana . y + rana . tamañoY - margenRana ; // Parte de arriba de la rana
155
+
156
+ let oIzq = Math . round ( obstaculo . x + margenObstaculo ) ; // Lado izquierdo del obstaculo
157
+ let oDer = Math . round ( obstaculo . x + obstaculo . ancho - margenObstaculo ) ; // Lado derecho del obstaculo
158
+ let oDown = Math . round ( obstaculo . y + margenObstaculo ) ; // Parte de abajo del obstaculo
159
+ let oUp = Math . round ( obstaculo . y + obstaculo . alto - margenObstaculo ) ; // Parte de arriba del obstaculo
160
+
161
+ // Lado derecho de rDer es mayor que el lado izquierdo de oIzq.
162
+ // Lado izquierdo de rIzq es menor que el lado derecho de oDer.
163
+ // Lado superior de rUp es mayor que el lado inferior de oDown.
164
+ // Lado inferior de rDown es menor que lado superior de oUp.
165
+
166
+ // Si se cumplen las condiciones descritas arriba hay colisión
167
+ return (
168
+ rDer > oIzq &&
169
+ rIzq < oDer &&
170
+ rUp > oDown &&
171
+ rDown < oUp
172
+ ) ;
173
+ }
174
+
175
+ // Definimos los sprites de los coches según su dirección y definimos un numero random del 0 al 3
176
+ Obstaculos . prototype . imagenesCochesDerecha = [ [ 0 , 10 ] , [ 0 , 168 ] , [ 0 , 86 ] ] ;
177
+ Obstaculos . prototype . imagenesCochesIzquierda = [ [ 160 , 11 ] , [ 160 , 164 ] , [ 161 , 86 ] ] ;
178
+ Obstaculos . prototype . randomizador = Math . floor ( Math . random ( ) * 3 ) ; // Este número random será la posición del sprite que se ponga
0 commit comments