Рейтинг - 5.0 (3)

Всем прива! Этот урок будет содержать в себе 2 темы. Одна тема общая как для программирования в c#, так и для скриптинга GTA 4 - это списки. Мы узнаем как создавать списки и рассмотрим некоторые примеры. Во второй части урока Вы узнаете как создать 2 скрипта для GTA 4 в одном файле.

Списки очень похожи на массивы. Они могут содержать данные только одного типа данных, могут обращаться к элементам по индексу, но главное их отличие - динамическое изменение. если массивы имеют фиксированную длину, то списки более универсальны - длина может быть любой. Как уже было сказано, списки могут обращаться к данным по индексу: записывать и читать, но это возможно только в том случаи, если элемент был записан ранее. Шаблоном для объявления списка можно считать этот вариант:
List<int> MyList = new List<int>();
Мы указываем класс List, который будет содержать значения типа int, указанных в треугольных скобках. Имя списка пусть будет MyList. Далее мы пользуемся конструктором, чтобы создать объект класса.

Так как списки динамичны, то и добавлять/удалять элементы можно также динамически. Чтобы добавить элемент нужно воспользоваться командой:
MyList.Add( 5 );
Внутри скобок мы указываем сущность, что будет добавлена в список. Тип этой сущности должен соответствовать типу самого списка. В данном случаи было добавлено число типа int.

Чтобы удалить из списка элемент, нужно воспользоваться командой:
MyList.Remove( 5 );
Важно! Нужно указывать элемент, а не индекс! Чтобы удалить элемент по-индексу, нужно воспользоваться командой:
MyList.RemoveAt( 0 );
0 - это индекс существующего элемента. Таким образом из списка будет удалена пятёрка. Удалять также можно по диапазону. Для этого воспользуемся командой:
MyList.RemoveRange( 0, 1 );
Здесь:
0 - указываем начальную позицию(индекс);
1 - количество элементов от индекса, которых нужно удалить из списка.

Чтобы удалить все элементы списка, достаточно выполнить процедуру очистки:
MyList.Clear();
Чтобы проверить количество всех элементов достаточно воспользоваться командой:
int a = MyList.Count;
В переменную а будет записано количество элементов в списке

Вставлять элементы можно также в указанную позицию:
MyList.Insert( 6, 15 );
Здесь:
6 - индекс в списке, куда нужно вставить элемент;
15 - сам элемент.

Важно! Индекс всегда обязательно должен существовать. Иными словами на 6 позиции в списке уже должен существовать элемент. Исключением является индекс 0 - элементы будут помещаться в начало списка.

Также есть возможность конвертировать список в массив. Для этого можно воспользоваться процедурой:
int[] IntList = MyList.ToArray();
Тип массива и тип списка должны совпадать. дальше с массивом можно делать всё что угодно.

Хотел бы рассказать об одной полезной возможности, которая есть во многих стандартный классах коллекций: поиск элемента в коллекции. Чтобы найти первый элемент вхождения нужно применить команду:
int q = MyList.IndexOf( 30 );
Здесь:
30 - это элемент, который нужно найти в списке.
q - в эту переменную будет возвращён ИНДЕКС первого вхождения. Если элемент не был найден, то в переменную будет возвращено число -1.

Для поиска последнего вхождения элемента в список(последний индекс) нужно пользоваться:
int q = MyList.LastIndexOf( 30 );
Для примера давайте создадим класс Car, который будет содержать одно свойство - скорость, пользователь будет вводить скорость для нового Car, которые будут помещены с список. После выполнения этих действий пользователю предложат найти Car, у которых будет скорость, введенная пользователем а также их количество:
Код
using System;
using System.Collections.Generic;

namespace Consol {
    class Program {
        static void Main() {
            List<Car> CarList = new List<Car>();

            Console.WriteLine( "Привет, введите скорость для 10 автомобилей\n");
            for(int i = 0; i < 10; i++) {
                Console.Write("Введите скорость для автомобиля {0}: ", i);
                CarList.Add( new Car( int.Parse( Console.ReadLine() ) ) );
            }

            Console.Write( "\nКакую скорость нужно искать? ");
            int UserSpeed = int.Parse( Console.ReadLine() );

            int CountAuto = 0, tempIndex;

            Console.Write( "\nНомера транспорта с указанной скоростью:" );
            foreach ( Car temp in CarList ) {
                if ( temp.Speed == UserSpeed ) {
                    tempIndex = CarList.IndexOf( temp );
                    Console.Write( " {0}", ( tempIndex > -1 ) ? tempIndex.ToString() : "" );
                    CountAuto++;
                }
            }

            Console.WriteLine(";\n\nКоличество транспорта с указанной скоростью: {0}", CountAuto);
            Console.ReadKey();
        }
    }

    public class Car {
        public int Speed { get; set; }

        public Car( int Speed ) {
            this.Speed = Speed;
        }
    }
}
Тест программы:

Я специально взял список объектов класса, чтобы Вам было легче понять саму работу программы, потому что если взять объекты типа int, то возникнет сплошная путаница, как было со мной при изучении списков. Надеюсь вы сможете понять этот пример, так как списки встречаются и в скриптинге GTA 4.

Важно! Для работами со списками(коллекциями) необходимо подключить библиотеку:
using System.Collections.Generic;

Вторая часть урока будет ближе к СкриптХуку и здесь я объясню как сделать два скрипта в одном файле. Как известно скрипт будет считаться скриптом только в том случаи, если класс наследуется от Script. Из этого можно сделать вывод, что следующий код будет запускать сразу 2 скрипта:
namespace TestScript {
    public class Demo1 : Script {
        public Demo1() {
        }   
    }

    public class Demo2 : Script {
        public Demo2() {
        }
    }
}
Из этого можно провести аналогию, что namespace - это главный поток :MAIN из Sanny Builder, а Demo1 и Demo2 - созданные им потоки. Следовательно код выше можно сравнить с этим:
:MAIN
thread 'MAIN'
wait 0
// ...
// ...
// ...
create_thread @Demo1
create_thread @Demo2
end_thread

:Demo1
thread 'Demo1'
wait 0
end_thread

:Demo2
thread 'Demo2'
wait 0
end_thread
Для полного сравнения напишем код для c# и Sanny Builder:
c# Sanny Builder
namespace TestScript {

public class Demo1 : Script {

public Demo1() {
Wait( 2000 );
Player.Character.Money += 10000;
Game.DisplayText("Money gived");
}   
}

public class Demo2 : Script {

public Demo2() {
Wait( 5000 );
Player.Character.Weapons.Uzi.Ammo = 500;
Game.DisplayText( "Ammo gived" );
}
}

}
:MAIN
thread 'MAIN'
wait 0
// ...
create_thread @Demo1
create_thread @Demo2
end_thread

:Demo1
thread 'Demo1'
wait 2000
Player.Money(0) += 10000
0ACE: show_formatted_text_box "Money gived"
end_thread

:Demo2
thread 'Demo2'
wait 5000
01B2: give_actor $PLAYER_ACTOR weapon 28 ammo 500
0ACE: show_formatted_text_box "Ammo gived"
end_thread

Внимание! С этого момента уроки по c# разбиваются на 2 русла. Первой будет идти непосредственно по СкриптХуку, второе - по программировании в c#, которое я буду вести параллельно с остальными.

С Вами был wmysterio, пока!

Теги: Списки в c#. Запуск нескольких скри
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Какая GTA Вам понравилась больше всего?
Всего ответов: 9
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
Рекомендую
Реклама