В этой статье я расскажу как делать так что бы определённая машина могла летать. Хочу предупредить, что эта моя первая статья. Конечто, я думаю, что вы уже разбираетесь в VCMB.
Итак, начнём.
Как обычно, создадим поток:
...
004F: create_thread JJflycar
Вот. Теперь будем писать код потока.
Сначала проверим существует ли игрок и водит ли он машину "my_car" (котороя надо создать где-нибудь, я думаю вы знаете как).
Если все так, то ждём 250 мс и переходим далее. Вот код этого лейбла:
...
:flycar
0001: wait 0 ms
00D6: if 0
0256: player $PLAYER_CHAR defined
004D: jump_if_false JJflycar
00D6: if 0
00DC: player $PLAYER_CHAR driving $my_car
004D: jump_if_false JJflycar11
0001: wait 250 ms
...
Так, теперь создадим лейбл, который будет по нажатию на кнопку 9 или 6 (как на вертолёте) будет поднимать машину вверх. Вот код леёбла, с комментариями.
...
:flycar6
00D6: if 1
00E1: key_pressed 0 3 ;; проверяем нажата ли кнопка 9 или 6
004D: jump_if_false JJflycar7
00AA: store_car $my_car position_to $cx $cy $cz ;; запоминаем координаты машины "my_car"
02E3: $s = car $my_car speed ;; запоминаем скорось машины
0174: $zcar = car $my_car z_angle ;; запоминаем угол поворота по оси Z
00AB: put_car $my_car at $cx $cy $cz ;; ставим координаты машины на место (это надо что бы машина не падала вниз), кстати координата по Z увеличилась
0175: set_car $my_car z_angle_to $zcar ;; ставим угол поворота по оси
000C: $cz -= 1 ;; уменьшаем координату по Z на 1
0437: scatter_particle 27 .5 at $cx $cy $cz 0 0 .0000005 ;; создаём систему частиц
0437: scatter_particle 12 .5 at $cx $cy $cz 0 0 .0000005 ;; ещё одну, что бы пореалистичней и по красивее было
0011: $s *= 1.2 ;; умножаем скорось машины на 1.2, что бы быстрее
0009: $s += 1.0 ;; и прибывляем 1.0
04BA: set_car $my_car speed_instantly $s ;; устанавливаем новую скорось машине
...
Вот так. Пол дела сделано. Теперь наша машина по нажатию на кнопку 9 или 6 будет взлетать вверх и немного вперёд.
Теперь надо сделать так, что бы этой машиной можно было управлять (влево, вправо, только вперёд и стоять).
Вот опять код лейбла с комментариями.
...
:flycar7
00D6: if 1
00E1: key_pressed 0 10 ;; проверяем нажата ли кнопка поворота влево
004D: jump_if_false JJflycar8
00D6: if 0
00DC: player $PLAYER_CHAR driving $my_car ;; проверяем водит ли игрок машину "my_car"
004D: jump_if_false JJflycar11
00D6: if 0
01F3: car $my_car airborne ;; проверяем в воздухе ли машина "my_car"
004D: jump_if_false JJflycar11
02E3: $s = car $my_car speed ;; запоминаем скорость
0174: $zcar = car $my_car z_angle ;; запоминаем угол поворота по оси Z
0009: $zcar += 3.5 ;; прибавляем к углу поворота по оси Z 3.5, то есть поворачиваем влево
0175: set_car $my_car z_angle_to $zcar ;; устанавливаем новый поворот по оси Z
0011: $s *= 1.2 ;; ускоряем машину
0009: $s += 0.6 ;; но уже не так сильно как при взлёте
04BA: set_car $my_car speed_instantly $s ;; применяем скорость
В этом лейбле всё тоже самое, только для поворота вправо, поэтому я не буду писать пояснения.
А этот лейбл для того что бы по начатию на пробел (ручной тормоз) машина остонавливалась зависая в воздухе.
:flycar9
00D6: if 1
00E1: key_pressed 0 6 ;; проверяем нажат ли пробел
004D: jump_if_false JJflycar10
00D6: if 0
00DC: player $PLAYER_CHAR driving $my_car ;; водит ли игрок нашу машину
004D: jump_if_false JJflycar11
00D6: if 0
01F3: car $my_car airborne ;; в воздухе ли эта машина
004D: jump_if_false JJflycar11
02E3: $s = car $my_car speed ;; запоминаем скорость
0174: $zcar = car $my_car z_angle ;; угол поворота
0175: set_car $my_car z_angle_to $zcar ;; возвращаем этот же угол поворота
04BA: set_car $my_car speed_instantly $s ;; возвращаем эту же скорость
Таким образом, ничего не изменяя наша машина быстро уменьшит скорость, а потом и зависнет в воздухе.
Вот теперь уже почти всё сделано. Надо тока сделать что бы машина вперёд летела и всё.
:flycar10
00D6: if 1
00E1: key_pressed 0 16 ;; проверяем нажата ли кнопка "газ" (стрелка вперёд).
004D: jump_if_false JJflycar11
00D6: if 0
00DC: player $PLAYER_CHAR driving $my_car ;; водит ли игрок нашу машину
004D: jump_if_false JJflycar11
00D6: if 0
01F3: car $my_car airborne ;; в воздухе ли она
004D: jump_if_false JJflycar11
02E3: $s = car $my_car speed ;; запоминаем скорость
0174: $zcar = car $my_car z_angle ;; запоминаем угол поворота
0175: set_car $my_car z_angle_to $zcar ;; возвращаем такой же угол поворота
0011: $s *= 1.2 ;; увеличиваем скорость
0009: $s += 1.0 ;; чтобы быстрее лететь
04BA: set_car $my_car speed_instantly $s ;; возващаем скорость
:flycar11
0002: jump JJflycar ;; возвращаемся назад