04:40
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: Dima-kun  
[Урок] Автоматоны Pawn
ZiGGiДата: Пятница, 10.05.2013, 12:28 | Сообщение # 1
Мастер джэдай
Группа: Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
В языке Pawn есть механизм состояний(автоматон) — это такая система, которая позволяет определить несколько копий одной функции для использования в различных условиях. Я начну объяснять с примера, ибо так получится более наглядно, а ниже подробно опишу эту систему.

Пример
Допустим нам нужно сохранить данные игрока и данные гонок, а также сообщить об этом игрокам и гонщикам соответственно. При обычной реализации код выглядит грязновато:
Код

#include <a_samp>

forward data_Save(type);
forward message_Save(type);

enum {
          players,
          races
}

main() {
          data_Save(players);
          message_Save(players);
}

public data_Save(type)
{
          switch (type) {
              case players: {
                  // saving
              }
              case races: {
                  // saving
              }
          }
}
public message_Save(type)
{
          switch (type) {
              case players: {
                  // send message to player
              }
              case races: {
                  // send message to racers
              }
          }
}

А реализация с помощью автоматонов выглядит очень элегантно:
Код

#include <a_samp>

forward data_Save();

main() {
          state dataType:players;
          data_Save();
          message_Save();
}

public data_Save() <dataType:players>
{
          // saving
}

public data_Save() <dataType:races>
{
          // saving
}

public message_Save() <dataType:players>
{
          // send message to players
}

public message_Save() <dataType:races>
{
          // send message to racers
}


Плюсы этого метода
А если понадобится добавить в список выше что-нибудь ещё? Код без автоматонов превратиться в огромный switch! А если вы, например, захотите перенести код сохранения данных гонки в файл race/data.inc? Тогда вам придётся создавать дополнительную функцию и заносить её туда! Но с автоматонами это делается гораздо проще.
Ещё можно отметить то, что конструкция, выполненная с помощью автоматонов, работает немного быстрее, чем функция с большим switch.

Теория
state
Этим кодом мы устанавливаем для dataType состояние players
Код
state dataType:players;

Для проверок, связанных с автоматонами, есть сокращённое написание, например этот код:
Код
state (var == 1) dataType:races;

эквивалентен этому:
Код
if (var == 1) {
          state dataType:races;
}


entry()
Для автоматонов зарезервирована специальная функция entry(), которая вызывается при установке состояния. Пример:
Код
#include <a_samp>

main() {
          printf("Hello");
          state entryTest:message;
          printf("World!");
}

entry() <entryTest:message>
{
          printf("Test");
}

Результатом выполнения этого кода будет:
Код
Hello
Test
World


Функции
Вы можете объявлять функции с одним состоянием:
Код
stock echo(msg[]) <exType:one>
{
          print(msg);
}

С несколькими:
Код
stock echo(msg[]) <exType:one,exType:two>
{
          print(msg);
}

(эта функция будет вызвана при состоянии one или two).
И с любым другим состоянием:
Код
stock echo(msg[]) <>
{
          print(msg);
}

(эта функция будет вызвана если не было вызвано ни одной функции со своим состоянием).

Источник



Бложе
[indent]Мой блог
Уроки по Pawn
[/indent]

Open-GTO
[indent]Блог разработчиков
GitHub: https://github.com/Open-GTO/Open-GTO
Сборки мода с сервером тут
[/indent]


Сообщение отредактировал ZiGGi - Пятница, 10.05.2013, 15:53
Serg006Дата: Пятница, 10.05.2013, 17:01 | Сообщение # 2
Уверенный в себе
Группа: Продвинутые
Сообщений: 224
Награды: 3
Репутация: -87
Замечания: 60%
Статус:
Спасибо за урок.


[GM]Drift Server - 10%- будет в паблике.
[GM-RP] United Gaming RP 0.3x - Перевод мода ~ 52%
[MAP]Автомеханики возле ЛСПД (Смотрим)
MyxaChannelДата: Среда, 30.11.2016, 18:01 | Сообщение # 3
Новенький
Группа: Пользователи
Сообщений: 5
Награды: 0
Репутация: 0
Замечания: 0%
Статус:
Отличный урок.
  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua