14.10.2018 в 02:05 (5032 Просмотров)
Как поклоннику "Эквилибриума" и боевых сцена в "матрице" (хотя сам фильм не люблю) всегда хотелось добавить динамичности и гибкости в перестрелки в своей АБС.
[spoiler=например]- ты отступаешь от монстра, но во время погони тебе не надо постоянно оборачиваться чтоб отстреливаться от него. Ты ведь можешь идти спиной вперед как всякий нормальный человек
- еще одна нелепость мукерского управления - герой не может просто повернуться - ему приходится сделать туда шаг (если конечно нет стены)
- прочная дверь рикошетит в героя,но тот резко прыгает в сторону,уклонившись от пули
- с оружием в руке герой стреляет вперед, а потом мгновенно - назад. из того же пистолета, не глядя
- с пистолетами в двух руках герой убивает двух врагов впереди, а потом расставив руки в сторону, уничтожает всех по бокам от себя
- с калашом наперевес герой отстреливает противников. внезапно на него нападает чувак сзади, но наш герой фигачит его штык-ножом, не особо отвлекаясь на стрельбу и не меняя оружие
- против танка и пеших сражаться гораздо легче если у тебя оружие с подствольным гранатометом
- и т.д.[/spoiler]
Поэтому многое пытаюсь сделать именно для маневренности героя и динамичности боев
[size=6]Фиксация направления[/size]
Наверное самое легкое что можно придумать, так как такая возможность есть в самом мукере, а значит просто привяжем это к кнопке.
[code]
if (Input.isTriggered('capslock')) {
$gamePlayer._directionFix = !$gamePlayer._directionFix;
}[/code]
[size=6]Блокирование движения[/size]
Задача капельку сложнее. Тут нам надо самим добавить свойство, которое позволяет героя поворачиваться не двигаясь. Назовем его isBlockMove
[code]if (Input.isTriggered('v')) {
$gamePlayer.isBlockMove = !$gamePlayer.isBlockMove;
}[/code]
Ну а теперь в стандартной функции moveStraight делаем проверку включено ли это свойство.
1) если нет - позволяем ему (this) идти в заданном напарвлении (d)
Game_Character.prototype.moveStraight.call(this, d)
2) если же свойство есть - разрешаем ему только повернуться
this.setDirection(d)
[code]var YuryolMoveStraight = Game_Player.prototype.moveStraight;
Game_Player.prototype.moveStraight= function(d) {
YuryolMoveStraight.call(this);
($gamePlayer.isBlockMove) ? this.setDirection(d) : Game_Character.prototype.moveStraight.call(this, d);
};[/code]
[size=6]Отход назад[/size]
Нам надо чтоб герой при нажатии на кнопку резко отсупил допустим на 2 клетки назад. Эта задачка еще сложнее.
1) в основном из-за вымученной функции moveEvent из этого поста: [url=http://rpgmaker.ru/forum/fakultet-skriptov/62061-peremennye-prostye-skripty-funktsii-rpg-maker-mv?start=40#105728]тык[/url]
2) Здесь нам понадобится немного иная блокировка - блокируем вообще все движения героя. Для этого создадим новое свойство block и функции для его включения/выключения:
[code]
Game_Player.prototype.disableBlock = function() {
this.block = false;
};
Game_Player.prototype.enableBlock = function() {
this.block = true;
};[/code]
3) Лезем в функцию Game_Player.prototype.canMove и добавляем в условие проверку включен ли наш "блок")
[code] if ($gameMap.isEventRunning() || $gameMessage.isBusy() || $gamePlayer.block) {
return false;
}[/code]
4) Конечно же ускорение должно делать героя быстрее. поэтому прибавляем герою скорость на две единицы
[code]$gamePlayer._moveSpeed = $gamePlayer._moveSpeed+2;[/code]
5) Итого сама функция ускорения,где
n - количество шагов,на которые пробежит герой
13 - код для ROUTE_MOVE_BACKWARD, т.е. для движения героя назад
[code] Scene_Map.prototype.boost = function(n) {
$gamePlayer.enableBlock();
$gamePlayer._moveSpeed = $gamePlayer._moveSpeed+2;
$gameMap.moveEvent(0, 13, n);
};[/code]
6) Не забываем отключить блокировку движения. Добавляем в moveEvent следующую строчку. Она добавляет в маршрут героя скрипт (код 45) для отключения блока - parameters: ["$gamePlayer.disableBlock();"]
[code]route.list[amount] = {code: 45, parameters: ["$gamePlayer.disableBlock();"], indent: null};[/code]
[size=6]Альтернативное оружие[/size]
Об этом завтра, спать хочу :(