?

Log in

Abraham Simpson

fsi in ru_girlscouts

Полезные советы - Интерфейс пользователя

Начать хотелось бы с того, что большинство так называемых «игр», представленных на RuMAGS, как бы это помягче выразиться, не блистают удобством. И качеством, но качество тут — это в первую очередь удобство игрока. Давать «советы» буду без особого разбора, авось разберётесь.

Реакции на действия


Этот совет самый простой, но в то же время наиболее трудоёмкий в выполнении. Суть примерно такова: на каждое возможное действие игрока игра должна как-то реагировать (за исключением, возможно, кликов по «пустому» пространству). Хотя бы простым текстовым сообщением. Игрок должен видеть, что его клики не уходят в Великое Ничто, а как-то обрабатываются - в конце концов, вся игра сводится к кликанию разными действиями по разным местам, и если у игрока нет мотивации кликать, он этого делать и не будет. В любом более-менее приличном квесте так и сделано.

Тут вы, возможно, спросите: да неужели же ж каждому hotspot'у, object'у, character'у и так далее придётся по четыре скрипта навешивать! (Я имею в виду стандартный шаблон «под Space Quest», в котором есть 4 разных действия: Look, Interact, Talk to и Use Inventory. В вашей игре их может быть сколько угодно, хоть в стотыщ раз больше, хоть вообще одно.) Ну да, в идеале так оно и должно быть. И не просто по четыре сообщения — для UseInv желательно бы проверять, какой именно предмет инвентаря был использован и соответствующим образом реагировать (пример: в идеале реакции игры при попытке использовать на хотспоте «Канарейка» предмета «Молоток» и предмета «Дихлофос» должны быть разными, даже если по сюжету канарейку убивать нельзя и вся реакция должна заключаться в текстовом «атата»).

Функция unhandled_event



«Дело говоришь, но в моём эпическом супермегаквесте по двадцать хотспотов в семидесяти четырёх комнатах и пятьсот шестьдесят три персонажа! Мне же до конца жизни это всё прописывать придётся!»

По правде говоря, есть и более простой (хотя, возможно, неочевидный) способ сделать реакции вообще на всё (правда, достаточно однообразные, но хоть какие-то) — функция unhandled_event(int what, int type). Эта функция вызывается, когда происходит «непредусмотренное событие» (unhandled event), то есть такое, реакция на которое не задана в явном виде. Знающие английский могут уже углубляться в AGS'овский Help, остальные читают дальше.

В AGS 2.x (поскольку почему-то у нас ей в основном пользуются) эта функция обитает в Global Script и создаётся посредством меню Script—unhandled_event. В два её аргумента передаются данные об объекте и типе совершённого «непредусмотренного» действия. Она не слишком удобна (одинаковые типы действия задаются РАЗНЫМИ значениями переменной type для разных what, и передаёт только некоторые типы действий), но лучше неё только собственный обработчик on_mouse_click писать, а это таки сложнее.

Итак, what задаёт тип объекта, на который был совершён мышеклик. Это может быть:

  1. Hotspot — активная часть комнаты

  2. Object — объект

  3. Character — персонаж

  4. Nothing — отсутствие под курсором чего бы то ни было

  5. Inventory item — предмет инвентаря


Дальше, соответственно, достаточно проверить type и написать реакцию.

Пример функции для ленивых:

function unhandled_event(int what, int type) {
  if(what == 1) { // hotspot
    if(type == 1) { // look
      player.Say("Не вижу ничего необычного.");
    }
    else if(type == 2) { // interact
      player.Say("Что мне сделать?");
    }
    else if(type == 3) { // use inventory
      player.Say("Использовать прямо здесь?");
    }
    else if(type == 4) { // talk to
      player.Say("Да лучше с собой разговаривать!");
    }
    else { // что-то не то
      Display("Что-то не то.");
    }
  }
  else if(what == 2) { // object
    if(type == 0) { // look
      player.Say("Не вижу ничего необычного.");
    }
    else if(type == 1) { // interact
      player.Say("Что мне сделать?");
    }
    else if(type == 2) { // use inventory
      player.Say("Использовать прямо здесь?");
    }
    else if(type == 3) { // talk to
      player.Say("Да лучше с собой разговаривать!");
    }
    else { // что-то не то
      Display("Что-то не то.");
    }
  }
  else if(what == 3) { // character
    if(type == 0) { // look
      player.Say("Человек какой-то.");
    }
    else if(type == 1) { // interact
      player.Say("Меня учили не трогать незнакомцев.");
    }
    else if(type == 2) { // use inventory
      player.Say("Отдать нахаляву?");
    }
    else if(type == 3) { // talk to
      player.Say("Не буду разговаривать.");
    }
    else { // что-то не то
      Display("Что-то не то.");
    }
  }
  else if(what == 4) { // nothing
    player.Say("Не вижу ничего интересного.");
  }
  else if(what == 5) { // inventory item
    if(type == 0) { // look
      Display("Какая-то штуковина.");
    }
    else if(type == 1) { // interact
      Display("Ты пощупал штуковину.");
    }
    else if(type == 2) { // talk to
      Display("Не отвечает.");
    }
    else if(type == 3) { // use inv
      Display("Ничего не произошло");
    }
    else if(type == 4) { // все остальные режимы
      Display("Что-что, простите?");
    }
    else { // что-то не то
      Display("Что-то не то.");
    }
  }
  else { // что-то не то
    Display("Что-то не то.");
  }
}


Comments

blue cup

December 2009

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
Powered by LiveJournal.com