Pawn вики для начинающих

Описание: Основы скриптинга
Модератор: SJplayer

Sprite M
Автор темы, Ст. сержант
Ст. сержант
Аватара
Sprite M
Автор темы, Ст. сержант
Ст. сержант
Сообщения: 83
Зарегистрирован: 5 июня 2013
С нами: 10 лет 9 месяцев

#1 Sprite » 2 июня 2014, 20:33

Изображение


Автор: Doctor_Yoxansen

Как многим уже известно что в pawn сушествует три типа переменных
это целочисленные значения Integer например :

Код: Выделить всё

new int;// создали переменную целочисленного типа  c  именем int
int = 1;//присвоили переменной значение 1  


О операторах присвоения поговорим далее в ходе урока. Второй тип это так называемый Float (т.е) дробный он же вещественный, записывается вот так :

Код: Выделить всё

new Float : flt;//создали переменную вещественного типа с именем flt
flt = 0.123;//присвоили вешественное значение  


Третий тип это так называемые Булевые переменные которые принимают значения только true или false (1 или 0 ) записываются следующим образом :

Код: Выделить всё

new bool:byl;//создали переменную булевого типа  


Переменная может принимать лишь два значения (true = 1 , false = 0) , как оказалось в оптимизации она не помогает. Ну вот теперь мы закончили на мой взгляд с самой скучной частью урока. Далее продолжим с массивами. Тут хотелось бы начать со строк, строки это одномерные массивы с текстовой или символьной информацией. Пример использования строк следующий:

Код: Выделить всё

New string[256]//конечно название может быть любое другое  . 256 – размер , имеет смысл использовать строки с меньшим разером
format(string, sizeof(string), "Имя: %s ,ид: %d.",PlayerName(playerid),playerid);
SendAdminMessage(COLOR_RED, string, 1);//выводим , все что в нашей строке  


Важно знать:

Для форматирования используются следующие заполнители:
%b – двоичная система счисления
%c – один символ
%d – целое число
%f – дробное число
%i – целое число
%s – строка
%x – шестнадцатеричная система счисления
%% – знак %

В основном в pawn вы будите сталкиваться с двух мерными массивами, они похожи на матрицы в высшей математике. И вот вам пример где 3 это число строк , а 2 это число столбцов, важно помнить что нумерация массива начинаеться с 0

Код: Выделить всё

new massiveng[3][2] = {
{
15,19},
{
1720,16},
{
23,18}
}; 


Пример массива в вещественными значениями:

Код: Выделить всё

new Float:aRandomCarListSpawns[3][3] = {
{-
1666.6607,1237.8749,6.8201},
{-
1651.8741,1223.3059,6.8160},
{-
1641.7529,1213.1877,6.8159}
}; 


Вот вам пример рандомного заполнения массива , через цикл:

Код: Выделить всё

#define MAX 100
new test[MAX];
for(new 
0MAX;++)//про циклы будет в следуюшей части урока
{
test[i] = random(200);


sizeof - возращает количество ячеек в массиве , тоесть его размерность , для дальнейшей работы с ним

Код: Выделить всё

sizeof(Massive//используется в циклах 


Так же стоит рассказать о различных арифметических операторах. Есть специальные операторы, для работы с целыми числами, рассмотрим основные:

Код: Выделить всё

new x=5,y=8;
+= y// присвоим переменной x значение x + y
// эту строку можно было записать и так: x = x + y;
// существуют аналогичные операторы например: -=,+=,*= и др.
// результат программы будет 13
// существуют оператор: -- Оператор Декрмиента
// ++ оператор инкримента x++; равносильно x = x+1;
//Декриментом аналогично 


Так же есть функции для более сложных операций.
floatsqroot – возрашает квадратный корень из числа

Код: Выделить всё

(пример использования floatsqroot(25);//вернет квадратный корень из числа 25  т.е 5) 


floatpower – возращает число возведенное в степень

Код: Выделить всё



(пример использованияfloatpower(5,2)//25 , где 2 число которое возводим в степень , а 2 экспонента т.е в какую степень мы возводим ) 


floattan – Вычисляет тангенс данного вещественного числа

Код: Выделить всё

(пример использования printf("The tangent from 30° is %f"floattan30.0способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees


floatsin - Вычисляет синус данного вещественного числа

Код: Выделить всё

(пример использования printf("The sine from 30° is %f"floatsin30.0способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees


floatcos - Вычисляет косинус данного вещественного числа

Код: Выделить всё

пример использования printf("The cosine from 30° is %f"floatcos30.0способ) );//сушествует два способа
1)Радианах (radian)
2)Градусах(degrees


float – (внимание не путать с типом переменных Float) Эта функция конвертирует целое число в вещественное.

Код: Выделить всё

(пример использования : new Float:fVar float(122);//переконвертировали 122 в вешественный тип) 


floatround - Округляет вещественное число указанным методом.

Код: Выделить всё

Пример использования :floatround(3.3,метод


Методы
1)floatround_round - Округляет до ближайшего целого значения , если 0.5 то округляет в большую сторону
2)floatround_floor - В любом случае округлит в меньшую сторону
3)floatround_ceil - В любом случае округлит в большую сторону
4)floatround_tozero – Округляет в меньшую сторону при положительных значениях и в большую сторону при отрицательных значениях. Пожалуй на этом хватит. Теперь функции для работы со строками , на мой взгляд очень интересные:

format- Format позволяет Вам использовать переменные в строке; так же как и в printf(), но эта функция возвращает полученную строку для дальнейшего использования .

Код: Выделить всё

ew string[256]
format(stringsizeof(string), "Имя: %s ,ид: %d.",PlayerName(playerid),playerid);
SendAdminMessage(COLOR_REDstring1); 


strcat- Эта функция конкатенирует две строки в назначенную по ссылке строку. Говоря простым языком она склеивает две строки.
dest[] - Назначенная строка для конкатенирования.
const source[] - Исходная строка.
maxlength=sizeof dest - Максимальная длина строки-назначения.
Возвращает Длинну новой полученной строки-назначения.

Код: Выделить всё

(Пример использования: new destination[256]; strcat(destination"Привет,кто ты?"sizeof(destination));) 


strfind - Используем эту функцию для поиска подстроки в строке
const string[] - Строка, в которой будет производиться поиск (haystack).
const sub[] - Искомая строка (needle).
ignorecase=false - Игнорировать заглавные буквы, если true.
pos=0 - Смещение для начала поиска.
Возвращает Вхождение подстроки, -1 - если не найдено.

Код: Выделить всё

(пример использованияИсполненный Danger1979
if(strfind(name"_"true) == -|| strfind(name"danger"true) != -|| strfind(name"hidden"true) != -1)//ищем нижнее подчеркивание 


strcmp - Сравнивает две строки друг с другом, с такими опциями, как игнорирование заглавных букв или максимальная длина. Очень часто используется в OnPlayerCommandText.
const string1[] - Первая сравниваемая строка.
const string2[] - Строка, которую вы хотите сравнить с string1.
ignorecase=false - Игнорировать заглавные буквы, если true.
length=cellmax - Максимальное число проверяемых ячеек.
Возвращает 0 - если строки равны между собой.

Код: Выделить всё

Пример использования : if(strcmp(cmdtext"/me"true) == 0){) 


strlen - Функция может быть использована для проверки длины указанной строки. т.е возрашает длинну строки в целых числах
const string[] - Строка, длину которой вы хотите знать.

Код: Выделить всё

(пример использования: new stringdlin strlen(""Это строка для проверки");


Думаю теперь можно перейти далее, а именно к операторам сравнения. В языке Pawn операторы выражения сходны с языком C++

Код: Выделить всё

&& – И

|| – ИЛИ

– НЕ

Оператор 
if/else:

if 
– при дословном переводе означает ‘если’

else – иначе

Для сравнения используются следующие знаки
:



– больше

– меньше

>= – больше либо равно

<= – меньше либо равно

== – равно

!= – не равно


Думаю что в особо пояснение они не нуждаются но все же пару примеров:

Код: Выделить всё

new x=10,y=20;
if(
&& y  // дословно: если x больше 9 и меньше y , то выполняем тело условия
{
    print(
"Успех =)");
}
else
{
Print(
“не успех =();


С обычным оператором ветвления if мы разбрались , теперь идем далее else if

Код: Выделить всё

new l=random(10);//задали рандом до 10
if(== 1)//сравнили
    
print("Ура, один");
else if(
== || == 3)//второе сравнение
    
print("Ура, два или три");
else if(
>= && <= 9)
    print(
"Ура, от четырех до девяти включительно");
else
    print(
"Ура, нуль"); 


Думаю тут все понятно , теперь более интересные функции а именно Switch case
Case позволяет нам проверять переменную на ее значение , и выполнять условие

Код: Выделить всё

new random(15);присваиваем рандомное значение от 0 до 15
switch(x)
{
    case 
0: print("x равно 0");
    case 
1,2: print("x равно 1 или 2");
    case 
3..5: print("x в диапазоне от 3 до 5");
    case 
4..8,196: print("x в диапазоне от 4 до 8 или 196");
    default: 
// любое значение, не вошедшее в верхние, в данном случае это 9-15
    
{
        
printf("x равен %d",x);
    }


Вот код на деле рабочий из мой системы ПВО , а именно переменная lox отвечает за то сколько я раз нажал на кнопку Y

Код: Выделить всё

switch(lox)
   {
        case 
1:
        {
        
SetPlayerCameraPos(playerid191.6631,1922.4348,273.5554);
        
PlaySoundForPlayer(playerid1056);
        }
        case 
2:
        {
        
SetPlayerCameraPos(playerid191.6631,1922.4348,260.5554);
        
PlaySoundForPlayer(playerid1056);
        }
        case 
3:
        {
        
SetPlayerCameraPos(playerid191.6631,1922.4348,240.5554);
        
PlaySoundForPlayer(playerid1056);
        }
        case 
4:
        {
         
SetPlayerCameraPos(playerid191.6631,1922.4348,220.5554);
         
PlaySoundForPlayer(playerid1056);
         }
         case 
5:
         {
         
SetPlayerCameraPos(playerid191.6631,1922.4348,200.5554);
         
PlaySoundForPlayer(playerid1056);
         }
         case 
6:
         {
         
SetPlayerCameraPos(playerid191.6631,1922.4348,180.5554);
         
PlaySoundForPlayer(playerid1056);

         }
         case 
7:
         {
         
SetPlayerCameraPos(playerid191.6631,1922.4348,160.5554);
         
PlaySoundForPlayer(playerid1056);


          }
    case 
8:
    {
         
SetPlayerCameraPos(playerid191.6631,1922.4348,273.5554);
         
PlaySoundForPlayer(playerid1056);
         
lox =0;
    }


  } 


и для тех кто фанат оптимизации , case выполняется быстрее чем if. Ну что идем дальше , а именно идем в циклы. Начнем пожалуй с цикла While и do while, расшифровать его можно примерно таким образом - пока выполняется условие, я выполняю цикл. Различия между while и do/while лишь в том, что do/while гарантированно выполнится один раз.

Код: Выделить всё

new x=random(10);
while(
!= random(10)) // пока x не равен random(10) повторяй
{
    print(
"x != random(10)");


Код: Выделить всё

new x;
do 
// делай
{
    print(
"x != random(10)");
}
while (
!= random(10)); // пока x не равен random(10) 


Оператор for:
for имеет вид:
for(действия, которые выполнятся 1 раз ; условие при котором выполняется цикл (выполняется после каждой интерации) ; какие действия будут произведены после завершения интерации)
Интерация это – один шаг цикла

Код: Выделить всё

new x;
for(
x=0;x<5;x++)// выполнится 5 раз(от 0 до 4),
// после каждой интерации к x прибавляет 2
{
    
printf("x = %d",x);


Код: Выделить всё

for(new x=5;x<=8;+= 2)// выполнится 2 раза(5 потом 7)
// после каждой интерации к x прибавляет 2
{
    
printf("x = %d",x);


Если не задавать условие выполнения, то цикл будет бесконечным

Код: Выделить всё

for(new x=5; ;x++)
{
    
printf("x = %d",x);


Циклы можно прервать оператором break; или пропустить интерацию, с помощью continue;

Код: Выделить всё

for(new x=0;x<10;x++)
{
    if(
== 5) continue;
    if(
== 8) break;
    
printf("%d",x);
    
// результат: 0,1,2,3,4,6,7


А теперь как бонус , остались только PVar’ы и у них есть два плюса , это то что их можно использовать например в Фильрескриптах создовая сами пвары в моде, и второй плюс после выхода игрока они автоматом удаляються.
Ну а теперь так сказать мат часть

Код: Выделить всё

SetPVarInt(playerid,pvar[],int);//создает и редактирует PVar со значением целого числа

SetPVarFloat(playerid,pvar[],float);//создает и редактирует PVar с вещественным типом

SetPVarString(playerid,pvar[],string[]);//создает и редактирует PVar со строковым типом

DeletePVar(playerid,pvar[]);//удаление Pvar



Вот пример

SetPVarInt
(playerid,"TestInt",1);//создаем PVar со значением целого числа и присваиваем ему значение 1

SetPVarFloat(playerid,"TestFloat",6.1);//создаем PVar со значением дробного числа и присваиваем ему значение 6.1

SetPVarString(playerid,"TestString","Hello World!");//создаем PVar с строковым типом и записываем в него текст Hello World!
 


Теперь перейдем к функциям получения значения PVar'a.

Код: Выделить всё

GetPVarInt(playerid,pvar[]);//возвращает значение PVar'a pvar[]

GetPVarFloat(playerid,pvar[]);//возвращает значение PVar'a pvar[]

GetPVarString(playerid,pvar[],output[],symbols);//здесь немного сложнее, записывает значение PVar'a pvar[] в переменную со строковым типом output[] (так как по некоторым причинам функции в pawn не должны возвращать строки), symbols - это сколько символов вы хотели бы записать в переменную output. [color=#BF0000]не возврашет русские букы [/color]
 


Ну а теперь возможное использование

Код: Выделить всё

/*Если значение PVar'a TestInt равно 2, выводим в консоль его значение(т.е 2)*/
new testint GetPVarInt(playerid,"TestInt");//для удобства создаем переменную
if(testint == 2) print(testint);//делаем проверку

/*Тоже самое только с Float*/
new Float:testfloat GetPVarFloat(playerid,"TestFloat");//для удобства создаем переменную
if(testfloat == 6.1) print(testfloat);//делаем проверку

/*А теперь немного сложнее, делаем операцию с String значением, как вы помните мы присвоили PVar'у TestString значение: Hello World!*/
new output[64];//делаем переменную в которую будет записано значением PVar'а
GetPVarString(playerid,"TestString",output,sizeof(output));//геттим значение PVar'а
if(strcmp(output,"Hello World!",true,13)) printf(output);//если находим в output Hello World! выводим в консоль output 


Вернуться в «Основы скриптинга»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 3 гостя