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

 



 
        
[CLEO] HUDFIX (0)
MyxaChannel 30.11.2016 18:03
GM Car для SAMP (1)
MyxaChannel 30.11.2016 18:00
 





Рекомендуем:
Добавить IP: 88.212.220.148:22003





Последние Файлы 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
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
Скачать GTA SAMP 0.3.7 - Кл... 20.07.2015
Страница 1 из 11
Модератор форума: Dima-kun 
Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [Урок] Автоматоны Pawn
[Урок] Автоматоны Pawn
ZiGGiДата: Пятница, 10.05.2013, 12:28 | Сообщение # 1
Мастер джэдай
Группа: Продвинутые
Сообщений: 2650
Награды: 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%
Статус:
Отличный урок.
Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [Урок] Автоматоны Pawn
Страница 1 из 11
Поиск:





 


 


 
Хостинг от uCoz SAMP-RUS.COM