Рейтинг - 5.0 (2)

Всем доброго дня! На связи SanKing и это мой второй урок скриптинга. На этот раз мы с вами рассмотрим опкод, возвращающий силу движения мыши и всё, что с этим опкодом можно сделать.

Собственно, сам опкод:

0A4A: store_joystick_X_offset_to 1@ Y_offset_to 2@
Здесь:
1@ - смещение по оси X, то есть влево-вправо.
2@ - смещение по оси Y, то есть вперёд-назад.

Перейдём к наглядному примеру. Я написал мини-игру с использованием опкода 0A4A, смысл которой заключается в том, что нужно очень быстро дёргать мышкой вверх-вниз. Давайте разберём код скрипта!

{$CLEO}
0000:

while true
 if
 Key.Pressed(90) //Z
 then
 $POLOSA = 40 // задаём начальное значение статус-текста
 04F7: status_text $POLOSA type 1 line 1 GXT 'DUMMY' // создаём статус-текст

 while true // бесконечный цикл
 0A4A: store_joystick_X_offset_to 1@ Y_offset_to 2@ // получаем смещение мыши
 if or // проверяем, как сильно двинулась мышь вперёд или назад
 2@ > 1050000000
 -1050000000 > 2@
 then // если достаточно сильно, то полоса увеличивается на десять единиц
 $POLOSA += 10
 end
 $POLOSA -= 5 // но сразу же уменьшается на пять, так что за одну итерацию полоска может увеличиться только на 10-5=5 единиц
 if // если полоска достигла нуля
 1 > $POLOSA
 then // тогда флаг принимает значение 1 (провал) и осуществляется выход из цикла
 0@ = 1
 break
 end
 if // а если же она заполнилась полностью
 $POLOSA > 99
 then // то флаг становится равным 2, то есть успех, и игра выходит из цикла
 0@ = 2
 break
 end 
 wait 250
 end
 
 0151: remove_status_text $POLOSA // убираем статус-текст
 if // если задание провалено 
 0@ == 1
 then
 00BA: show_text_styled GXT "M_FAIL" time 2500 style 1 // показываем текст "Миссия провалена"
 wait 2500
 end
 if // если же выполнено
 0@ == 2
 then
 0394: play_music 2 // играет музыка завершения миссии
 wait 2500
 end
 end
wait 0
end

Отмечу несколько моментов. При проверке значения переменной 2@ можно использовать и другие числа. Например: 1000000000 (миллиард). Удивительно, но это число считается минимальным сдвигом мыши в GTA SA! Если вставить в код его, то выиграть не составит никакого труда. 1100000000 - с этим значением игра станет ОЧЕНЬ сложной, я лично не мог пройти ни разу. В своём примере я использовал среднее значение ( 1050000000 ). Так играть тоже сложно, но пройти вполне реально.

Также нужно запомнить, что хэндл статус-текста может быть только глобальной переменной.

Осталось навести косметические правки, а именно добавить больше текста и анимацию. Зелёным отмечены новые строки:

{$CLEO}
0000:
054C: use_GXT_table 'SMOKE1'
Animation.Load("BOMBER")

while true
 if
 Key.Pressed(90) //Z
 then
 $POLOSA = 40
 04F7: status_text $POLOSA type 1 line 1 GXT 'DUMMY'
 0605: actor $PLAYER_ACTOR perform_animation "BOM_PLANT_LOOP" IFP "BOMBER" framedelta 4.0 loop 1 lockX 0 lockY 0 lockF 0 time -1
 
 while true
 0A4A: store_joystick_X_offset_to 1@ Y_offset_to 2@
 if or
 2@ > 1050000000
 -1050000000 > 2@
 then
 $POLOSA += 10
 end
 $POLOSA -= 5
 if
 1 > $POLOSA
 then
 0@ = 1
 break
 end
 if
 $POLOSA > 99
 then
 0@ = 2
 break
 end 
 wait 250
 end
 
 0151: remove_status_text $POLOSA
 0605: actor $PLAYER_ACTOR perform_animation "BOM_PLANT_CROUCH_OUT" IFP "BOMBER" framedelta 4.0 loop 0 lockX 0 lockY 0 lockF 0 time -1
 if
 0@ == 1
 then
 00BA: show_text_styled GXT "M_FAIL" time 2500 style 1
 00BC: show_text_highpriority GXT 'SMO1_FC' time 2500 flag 1 // реплика Фредди из миссии OG Loc
 wait 2500
 end
 if
 0@ == 2
 then
 00BC: show_text_highpriority GXT 'DNC_020' time 2500 flag 1 // похвала в танцах
 0394: play_music 2
 wait 2500
 end
 end
wait 0
end 

На этом всё, желаю удачи в скриптинге, цените GTA San Andreas!


Теги: мышь, joystick offset

SINGER   (19.05.15 22:49)
Неплохо. Думаю, ребятам которые занимаются скриптингом всерьез урок будет полезен.
Кстати, можно я использую его в сборке уроков по скриптингу для GTA SA. Использовать свои уроки мне разрешил wmysterio, вот и у тебя разрешения спрашиваю.

SanKing   (20.05.15 19:50)
SINGER, можно. Используй на здоровье.

0
wmysterio   (20.05.15 22:13)
Странно, что такие огромные числа на выходе получаются из опкода. По всей логике, там должен тип FLOAT возвращаться.

Спасибо за урок!!!

SanKing   (21.05.15 09:47)
Там как раз float, я проверял. Но здесь проверка на больше-меньше, так что используем тип integer.

BoPoH   (25.05.15 19:24)
Опкод возвращает данные типа float, а не integer. Зачем сравнивать float как integer - непонятно. Так делать нельзя. Советую исправить.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
А вы проходили GTA San Andreas на 100% без читов и скриптов?
Всего ответов: 6
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio, DK22Pac, eglive
Рекомендую
Реклама