Активный
- Тема Автор
- #1
Include файлы позволяют организовать код и использовать готовые библиотеки. Разберем работу с ними.
Базовый синтаксис
Разница между < > и " ":
- < > - поиск в стандартных директориях компилятора
- " " - поиск в текущей директории, затем в стандартных
Стандартные include файлы
Популярные сторонние библиотеки
Создание собственного include файла
Условная компиляция
Pragma директивы
Пример организации проекта
Структура файлов:
Важные моменты:
- Используйте защиту от повторного включения (#if defined)
- Организуйте код логически по файлам
- Проверяйте зависимости между файлами
- Используйте stock для функций в include файлах
Правильная организация кода упрощает разработку и поддержку!
Базовый синтаксис
Код:
#include <filename>
#include "filename"
Разница между < > и " ":
- < > - поиск в стандартных директориях компилятора
- " " - поиск в текущей директории, затем в стандартных
Стандартные include файлы
Код:
#include <a_samp> // основной файл SA-MP
#include <a_npc> // для NPC режимов
#include <core> // базовые функции
#include <float> // функции для Float
#include <string> // строковые функции
#include <file> // работа с файлами
#include <time> // работа со временем
#include <datagram> // UDP пакеты
#include <fixes> // исправления багов
Популярные сторонние библиотеки
Код:
#include <zcmd> // система команд
#include <sscanf2> // парсинг параметров
#include <YSI\y_ini> // работа с INI файлами
#include <YSI\y_timers> // улучшенные таймеры
#include <streamer> // стример объектов
#include <foreach> // циклы по игрокам
Создание собственного include файла
Код:
// myfunctions.inc
#if defined _myfunctions_included
#endinput
#endif
#define _myfunctions_included
// Функции
stock GetPlayerDistance(playerid1, playerid2)
{
new Float:x1, Float:y1, Float:z1;
new Float:x2, Float:y2, Float:z2;
GetPlayerPos(playerid1, x1, y1, z1);
GetPlayerPos(playerid2, x2, y2, z2);
return floatround(floatsqroot(
floatpower(x1-x2, 2) +
floatpower(y1-y2, 2) +
floatpower(z1-z2, 2)
));
}
stock SendMessageToAdmins(color, const message[])
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerAdmin(i))
{
SendClientMessage(i, color, message);
}
}
}
// Использование:
// #include "myfunctions"
// GetPlayerDistance(playerid1, playerid2);
Условная компиляция
Код:
#if defined USE_MYSQL
// код для MySQL
#include <mysql>
#else
// код для файлов
#include <file>
#endif
// Определение констант
#define MAX_PLAYERS 100
#define SERVER_NAME "My Server"
// Проверка версии
#if !defined _samp_included
#error "Требуется a_samp.inc"
#endif
Pragma директивы
Код:
#pragma tabsize 4 // размер табуляции
#pragma ctrlchar '$' // символ управления
#pragma dynamic 65536 // размер стека
#pragma compress 1 // сжатие AMX файла
Пример организации проекта
Код:
// gamemode.pwn
#include <a_samp>
#include <zcmd>
#include <sscanf2>
// Собственные файлы
#include "defines"
#include "enums"
#include "variables"
#include "functions"
#include "callbacks"
#include "commands"
main()
{
print("Сервер загружен");
}
public OnGameModeInit()
{
// инициализация
return 1;
}
Структура файлов:
Код:
// defines.inc
#define MAX_PLAYERS 100
#define DIALOG_LOGIN 1
#define COLOR_WHITE 0xFFFFFFFF
// enums.inc
enum PlayerInfo
{
pName[MAX_PLAYER_NAME],
pLevel,
pMoney
}
// variables.inc
new PlayerData[MAX_PLAYERS][PlayerInfo];
// functions.inc
stock LoadPlayerData(playerid) { }
stock SavePlayerData(playerid) { }
// callbacks.inc
public OnPlayerConnect(playerid) { return 1; }
public OnPlayerDisconnect(playerid, reason) { return 1; }
// commands.inc
CMD:help(playerid, params[]) { return 1; }
Важные моменты:
- Используйте защиту от повторного включения (#if defined)
- Организуйте код логически по файлам
- Проверяйте зависимости между файлами
- Используйте stock для функций в include файлах
Правильная организация кода упрощает разработку и поддержку!