shape1
shape2
shape3
shape4
shape7
shape8

Автоматоны в Pawn


JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
Автоматоны в Pawn


В Pawn есть, так сказать система "состояний". Которая позволяет объявить несколько копий функций для использования в разных условиях.

Пример


Допустим нам нужно сохранить разные данные, например дома и игроков.

  • Обычная реализация
/* gamemode */

#include <a_samp>

enum
{
sdPlayers,
sdHouses,
};

/* Или:

#define sdPlayers 0
#define sdHouses 1

*/

public PublicName1() //какой-то паблик, который должен будет вызваться для сохранения данных
{
//сохраняем данные
SaveData(sdPlayers);
SaveData(sdHouses);
return 1;
}

public PublicName2() //какой-то паблик, который должен будет вызваться для обновления данных
{
//обновляем данные, например иконки и пикапы домов
UpdateData(sdPlayers);
UpdateData(sdHouses);
return 1;
}

stock SaveData(type)
{
switch(type)
{
case sdPlayers:
{
//сохраняем игроков
}
case sdHouses:
{
//сохраняем дома
}
}
return 1;
}

stock UpdateData(type)
{
switch(type)
{
case sdPlayers:
{
//обновляем данные
}
case sdHouses:
{
//обновляем данные
}
}
return 1;
}

  • Реализация через автоматоны
Код:
/* gamemode */

#include <a_samp>

public PublicName1() //какой-то паблик, который должен будет вызваться для сохранения игроков
{
	state SDType:players;
	SaveData();
	return 1;
}

public PublicName2() //какой-то паблик, который должен будет вызваться для сохранения и обновления данных домов
{
	state SDType:houses;
	SaveData();
	UpdateData();
	return 1;
}

stock SaveData() <SDType:players>
{
	//сохраняем игроков
	return 1;
}

stock SaveData() <SDType:houses>
{
	//сохраняем дома
	return 1;
}

stock UpdateData() <SDType:players>
{
	//обновляем игроков
	return 1;
}

stock UpdateData() <SDType:houses>
{
	//обновляем дома
	return 1;
}
Согласитесь, вторая конструкция выглядит более приятней, ведь так?

  • rep_up.png
     Если понадобится добавить в список что нибудь ещё? - Код без автоматонов превратится в огромный switch!
  • rep_up.png
     Если вы захотите перенести код сохранения данных домов в файл housedata.inc? - Вам придётся создавать доп. функцию и заносить её туда.
  • rep_up.png
     Конструкция выполненная с помощью автоматонов работает немного быстрей, чем большой switch.

Теория

  • state
Метод state устанавливает для определённого типа состояние.

Например устанавливаем для data состояние houses:

state data:houses;

Для условий с автоматонами есть сокращённое написание кода:

state (gettime() > 30000000) data:houses;
//или
state (var == 0 || var > 200) data:houses;

Выше код, тоже самое что и:

if(gettime() > 30000000)
{
state data:houses;
}
//или
if(var == 0 || var > 200)
{
state data:houses;
}

  • entry
Для автоматонов зарезервирована функция entry(), которая вызывается при установке состояния.

main()
{
printf("Hello");
state EntryTest:helloworld;
printf("World!");
}

entry() <EntryTest:helloworld>
{
printf(",");
}

Результатом будет:

Hello

,

World!
Функции


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

Или с несколькими:
stock echo(msg[]) <exType:eek:ne,exType:two>
{
print(msg);
}

^^^ Данная функция будет вызвана при состоянии one и two. ^^^

Или с любым другим состоянием:

stock echo(msg[]) <>
{
print(msg);
}

^^^ Данная функция будет вызвана если не было вызвано ни одной функции со своим состоянием ^^^

Автор: ziggi

Источник: Автоматоны Pawn

 
Последнее редактирование модератором:
A

Amfy

Гость
Гость
Только вчера про них читал.

Забыл указать автора, по-моему автор ziggi

 

JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
, точно, забыл. Не против если я укажу ссылку на его статью?