Всем доброго дня! На связи 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:
[color=green]054C: use_GXT_table 'SMOKE1'
Animation.Load("BOMBER")[/color]

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
  [color=green]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[/color]
  if
  0@ == 1
  then
  00BA: show_text_styled GXT "M_FAIL" time 2500 style 1
  [color=green]00BC: show_text_highpriority GXT 'SMO1_FC' time 2500 flag 1 // реплика Фредди из миссии OG Loc[/color]
  wait 2500
  end
  if
  0@ == 2
  then
  [color=green]00BC: show_text_highpriority GXT 'DNC_020' time 2500 flag 1 // похвала в танцах[/color]
  0394: play_music 2
  wait 2500
  end
  end
wait 0
end


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

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 V?
Всего ответов: 51
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

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

Сегодня нас посетили:
wmysterio
Реклама