НОВЫЕ ИГРЫЛУЧШИЕ ИГРЫФОРУМ 292 Всего сообщений: 305037
+  Форум FlashPlayer.ru
|-+  Форум по flash играм
| |-+  Академия flash программирования (Модераторы: Lexei, Vetal1992)
| | |-+  Уроки по ActionScript.

Автор Тема: Уроки по ActionScript.  (Прочитано 65087 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Re: Уроки по ActionScript.
« Ответ #60 : 20 Августа 2011, 21:14:19 »
Урок 6. Классы и объекты

Теперь предстоит освоить пару сложных тем. Вообще советую почитывать литературу, так как данные уроки представляют сокращенный вариант основных важных моментов, и поэтому они не претендуют на полность описания. Классы и объекты рассматриваются вместе, по той причине, что объекты создаются из классов. А классы в свою очередь описывают объекты. В этом уроке мы познакомимся с классами и объектами. Если говорить упрощенно, то объекты являются набором переменных и функций. А в классах хранится описание этих переменных и функций.

Давайте разберем начальные знания, которые нам будут необходимы для написания классов.
Написание класса.

Классы пишутся в отдельных текстовых файлах, которые имеют расширение *.as  Имя файла при этом должно совпадать с именем нашего класса. То есть файл имеет название:

имяКласса.as

Мы можем создать его внутри adobe flash из меню file-->new, и сохранить в нужную папку.

Итак, давайте немного подготовимся:
1) Создадим папку под наш проект. В нее мы сохраним наш проект, то есть исходник *.fla.
2) Создадим  внутри нее папку script, в которую будем сохранять наши классы(файлы .as).
3) Создайте новый ActionScript 3.0 проект и сохраните в нашу папку для проекта.
4) Давайте создадим маленький мирок, в нем будет жить наш главный герой. Для них мы сначала создадим класс Living (проживающие). Итак создаем файл Living.as и сохраняем его в нашу папку script.

Синтакиси создания класса довольно таки объемный, но давайте его рассмотрим по такому шаблону:
package путь{
   //подключаемые классы
   
   доступ class имяКласса {
      //Внутри этого блока описываются переменные и функции.
      
         //Переменные
      доступ var имяПеременной = значение;
      
         //Конструктор
      доступ function имяКласса(){
         
      }
         
         //Функции
      доступ function имяФункции(){
         
      }
      
   }//Конец класса
}//Конец пакета

Итак, разбираем:
1) package путь - пакет служит для структурирования классов. В значении путь указывается путь до папки со скриптом(относительный или полный). Наш скрипт класса находится в папке script.
2) подключаемые классы - для того, что бы использовать другие классы в текущем, надо их подключать. Поскольку мы с ними не знакомы, оставляем до лучших времен.
3) доступ - как вы заметили перед классом, функцией и переменной появились странные подписи. Доступ может принимать четыре значения и отвечает за то, откуда мы может обращатся к данным переменным, а откуда не можем:
public, internal, protected, private.

public - доступ к переменным и функциям объекта может быть осуществлен как внешними командами по отношению к пакету, в котором метод создан, так и внутренними.
internal - доступен только для внутренних команд пакета, в котором он описан.
protected - может быть доступен только для кода класса, содержащего описание этого метода, или для кода потомков этого класса(о наследовании чуть позже).
private - может быть доступен только для кода класса.
То есть запомним: public - везде доступен, internal - внутри одного пакета, private(protected) - только для класса.

4) class имяКласса - создает наш класс, внутри блока кода которого описываются переменные и функции. Не забудьте, что имя класса должно совпадать с названием файла. Указывать доступ обязательно.
5) Описываем переменные и функции, их написание не изменилось. За исключением только указания доступа, если не указан, то по умолчанию ставится internal. Обратите внимание функцию-конструктор, это функция, которая выполнится сразу, как только мы создадим объект и имеет имя класса.

Давайте заполним наш каркас класса, по умолчанию пока оставим доступ public:
Код: (Living.as) [Выделить]
package script {
//Подключаемые классы

//Создаем класс
public class Living {
//Переменные

//Конструктор
public function Living() {

}
//Функции

}
}


Классы и объекты обычно представляют поведение каких-нибудь существующих объектов или явлений. Давайте и мы немного оживим наш класс, в рамках компьютерной игры, и дадим нашим созданиям краткое описание. Что должно быть у наших созданий к примеру?
Справочные данные: Имя и тип(человек или монстр) для начала.
Физические данные: Уровень, количество жизней, скорость.
Поведение: Они могут ходить, регенерировать здоровье.

Если подумать, то первые два списка можно представить как переменные со значением, а вот для третьего понадобятся функции.
Ну что же, давайте заполним наш каркас:
Код: (Living.as) [Выделить]
package script {
//Подключаемые классы

//Создаем класс
public class Living {
//Переменные
public var names; //Имя
public var type; //Тип

public var level; //Уровень
public var health; //Здоровье
public var speed; //Скорость

//Конструктор
public function Living() {
trace("object create");
}

//Функции
public function walk(){
trace("Ходим");
//функция ходьбы
}

public function regenerate(){
//функция регенерации
}

}
}

Готово. Теперь, прежде чем двинутся дальше, из этого класса надо научится делать объекты.

Синтаксис создания объектов выглядит следующим образом:
var имяПеременной = new имяКласса;

new имяКласса создает объект, но к нему нужно потом как-то обращатся, поэтому его сразу помещают в переменную. Но перед тем, как использовать наш класс, мы должны подключить его к нашему проекту с помощью слова import.

Думаю у вас разбор следующего кода не вызовет сложностей:
Код: (Проект) [Выделить]
import script.Living; //Если написать script.*, то будут подключены все классы из папки script

var live = new Living;

trace(live.health);
live.walk();

Путь

В отличие от функций переменные в объекте живут долго, и к ним так же нужно как-то обращатся. Если вы хорошо знакомы с операционными системами, то помните, что там тоже есть пути до файлов и папки разделяются косыми чертами. К примеру:
C:\Games\Fable 3\Fable3.exe

Так вот тут тоже самое, только вместо косых черточек используются точки между именами. И несколько ключевых слов:
stage - самый высший объект, за ним идет root.
root - это имя по умолчанию нашей главной временной шкалы.
this - указывает на текущий объект, в котором написан данный код.
parent - указывает на объект выше.

Я думаю вы еще не раз вернетесь к этому уроку, что бы перечетать его, если что-то забыли или надо уточнить. Пока оставим наш класс и перейдем к созданию нашего главного героя. А заодно разучим наследование.
« Последнее редактирование: 20 Августа 2011, 22:53:57 от Elentarion »

Re: Уроки по ActionScript.
« Ответ #61 : 20 Августа 2011, 22:53:09 »
Урок 7. Наследование. Стандартная библиотека классов.

Наследование

Классы во флеше могут наследовать переменные и функции других классов. Делается это с помощью слова extends:
class дочернийКласс extends родительскийКласс {

}

Давайте рассмотрим это на примере, и создадим класс для героя(Hero) из нашего класса живности(Living). Помните, что для использования какого-то класса, его нужно импортировать сначала.
Код: (Hero.as) [Выделить]
package script {
//подключенные классы
import script.Living;

public class Hero extends Living{
//Переменные

//Конструктор
public function Hero() {

}

//функции
}
}

Теперь мы можем создать объект из него и посмотреть его работоспособность.
import script.*;

var heroes = new Hero;

trace(heroes.health);
heroes.walk();


Как видим, все функции и переменные из нашего класса Living перекочевали и в класс Hero.
В предыдущих уроках мы многое изучили, но для того, что бы написать что-нибудь стоящее, нам нужно познакомится еще с двумя вещами:
1) Стандартная библиотека классов, которая содержит весь основной функциона флеша.
2) Обработчики событий, позволяющие ловить действия пользователя.

Стандартная библиотека классов.
Итак, первые сложности. В стандартной библиотеке сразу разобратся очень сложно, так как там содержится около 300 классов, большинство которых наследует друг друга. Понимание придет постепенно со временем, поэтому ничего страшного если поначалу вы напрочь в ней запутаетесь. =)

Для упрощения разбора существует справка и примеры. Вообще привыкайте обращатся к разнообразным источникам информации, программисты без них не обходятся, так как всего не упомнишь.
1. Итак справка, в справке есть примеры кода:
Онлайн: http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/index.html?filter_flash=cs5&filter_flashplayer=10.2&filter_air=2.6#top
Оффлайн можно найти в инете: http://easyflash.ifolder.ru/17695205

Заметьте, что классы делятся по пакетам, что упрощает поиск нужных. В ней переменные называются свойствами, а функции методами(запомните, так правильней, но я упростил для обучения).

2. Что бы разобратся с наследование и какой класс куда относится, компания adobe выпустила большие постеры(о. Нам понадобится всего один, тот который по флешу. Скачать можно тут:
http://www.flashblog.ru/flash-useful/flash-flex-air-actionscript-3-posters/

Итак, для нашего класса Hero и Living понадобится класс MovieClip, который содержит графическую оболочку и временную диаграмму.
Изменим класс Living, дав ему наследование от MovieClip. Класс Hero будет наследовать класс Living и заодно вместе с ним класс MovieClip. Получается такая иерархия классов, от верхнего к нижнему.
Код: (Living.as) [Выделить]
package script {
//Подключаемые классы
import flash.display.MovieClip;

//Создаем класс
public class Living extends MovieClip{
//Переменные
public var names;
public var type;

public var level;
public var health;
public var speed;

//Конструктор
public function Living() {

}

//Функции
public function walk(){

}

public function regenerate(){

}
}
}

Теперь проверим. У нашего класса Hero должны появится еще свойства и методы от MovieClip; Например положение по оси "х" и "у"(cмотрим в справке MovieClip).
import script.*;

var heroes = new Hero;

trace(heroes.x);
trace(heroes.y);

Если мы получим результат 0 и 0, то все правильно.

Рисуем героя.
Теперь нам надо бы нарисовать героя. Давайте воспользуемся средствами флеша для рисования. Можете сами нарисовать, или взять готовую картинку.
После того, как герой нарисован, сделайте следующее:
1) Выделите вашего героя и нажмите на нем правой кнопкой, найдите опцию "convert to symbol".
2) В поле Name(имя) введите Hero. Хотя можно и любой на ваше усмотрение.
3) Раскройте продвинутые опции и выставьте галочку напротив "Export for ActionScript".
4) В поле Class выставьте название для класса как Hero. (это будет названием нового класса)
5) В поле Base Class укажите наш созданный класс script.Hero. (это от какого класса наследование, теперь наш образ Hero унаследован от script.Hero)

Теперь нам надо создать нашего героя из класса Hero.
Кстати, теперь у нас есть два класса  Hero, один мы создали только что(вписав в поле Class название), другой в предыдущем уроке(в отдельном файле). Еще один плюс пакетов в том, что мы может это делать, и для обращения к прошлому классу надо использовать конструкцию script.Hero.

Кстати, мало создать объект "героя", его еще надо добавить в список отображения. Делается это с помощью функции addChild(объектОтображения). Удаляется с помощью removeChild();
Код: (Проект) [Выделить]
var heroes = new Hero;

heroes.x = 100; //Выставим его от края
heroes.y = 100;

addChild(heroes);

Примечание: Во флеше левый верхний угол считается по умолчанию точкой координат 0,0
Вот мы и увидела нашего героя и познакомились с еще одним способом добавления классов в проект.

Re: Уроки по ActionScript.
« Ответ #62 : 21 Августа 2011, 00:04:46 »
Урок 8. Обработчики событий.

Перед тем как двигаться дальше удалите код из проекта, если он у вас остался. Иначе могут быть ошибки.
То есть тут должно быть пусто:
Код: (Проект) [Выделить]



Класс проекта
Немного отойдем от темы.
Еще один способ использования классов, это создать класс проекта. Создайте новый класс StartGame.as:
Код: (StartGame.as) [Выделить]
package script {
//подключенные классы
import flash.display.*;

public class StartGame extends Sprite{
//Переменные

//Конструктор
public function StartGame() {
trace("Game is start");
}
}
}
Теперь в нашем проекте, во вкладке свойств(properties) есьт поле class. Впишем в него наш класс как script.StartGame.
Теперь при запуске проекта будет выполнятся сразу код нашего класса.

Обработчики
Обработчики событий позволяют нам обрабатывать действия пользователей, реагировать на нажатие мыши, клавиш и многое другое. Все обработчики событий собраны в пакете классов flash.events
Для того, что бы использовать их, надо добавить тот или иной обработчик с помощью функции addEventListener(событие, функция), а для того, что бы убрать функция removeEventListener. (эти функции прописаны в классе EventDispatcher и  от него наследуются многие другие).

Если событие наступит, то выполнится функция, в которую передастся один параметр(содержащий данные).

Итак, давайте научим нашего героя ходить. Класс для обработки событий клавиатуры будет KeyboardEvent, желательно открыть справку и почитать, как он используется. Там написано, что для нормального его использования, нам надо добавить обработчик к объекту stage. Так же у него есть лишь два метода, это KEY_DOWN  и KEY_UP.

Пример 1. Обработчик клавиатуры.
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные

//Конструктор
public function StartGame() {

stage.addEventListener(KeyboardEvent.KEY_DOWN,key_down);
stage.addEventListener(KeyboardEvent.KEY_UP,key_up);
}
//функции
public function key_down(keys:KeyboardEvent){ //Передаваемый параметр как вы помните из урока функций мы может назвать так, как нам угодно.
trace("Клавиша нажата");
}

public function key_up(keys:KeyboardEvent){
trace("клавиша отпущена");
}
}
}

Запускаем наш код и проверяем работоспособность.
Но нам нужно узнать какая клавиша именно нажата, как раз передаваемый параметр хранит эту информацию как код клавиши. Давайте запомним коды для клавиш W, A, S, D. Заодно давайте перенесем наш код по созданию героя из проекта в наш класс.
Код: (StartGame.as) [Выделить]
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные
var heroes = new Hero;

//Конструктор
public function StartGame() {
heroes.x = 225;
heroes.y = 200;
addChild(heroes);

stage.addEventListener(KeyboardEvent.KEY_DOWN,key_down);
stage.addEventListener(KeyboardEvent.KEY_UP,key_up);
}
//функции
public function key_down(keys:KeyboardEvent){
trace(keys.keyCode);
}

public function key_up(keys:KeyboardEvent){
trace(keys.keyCode);
}
}
}

Теперь мы можем узнать, какой каждой клавише соответствует свой код и мы его можем получить. Теперь довольно таки легко заставить нашего героя ходить(сами догадаетесь как?).

Код: (StartGame.as) [Выделить]
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные
var heroes = new Hero;

//Конструктор
public function StartGame() {
heroes.x = 225;
heroes.y = 200;
addChild(heroes);

stage.addEventListener(KeyboardEvent.KEY_DOWN,key_down);
stage.addEventListener(KeyboardEvent.KEY_UP,key_up);
}
//функции
public function key_down(keys:KeyboardEvent){

if(keys.keyCode==83){
heroes.y += 2;  //fps стоит на 70
}
if(keys.keyCode==87){
heroes.y -= 2;
}
if(keys.keyCode==65){
heroes.x -= 2;
}
if(keys.keyCode==68){
heroes.x += 2;
}
}

public function key_up(keys:KeyboardEvent){

}
}
}


Теперь наш герой умеет ходить. Но делает он это не совсем хорошо, например он не может ходить по диагонали. Для того, что бы научить его это делать, мы познакомимся еще с одним обработчиком. Event.ENTER_FRAME вызывается каждый раз при смене кадра(fps) во флеше. А нажатие и отпускание клавиш будем хранить в переменных.

Код: (StartGame.as) [Выделить]
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные
var heroes = new Hero;

var key_W = 0;
var key_A = 0;
var key_S = 0;
var key_D = 0;
//Конструктор
public function StartGame() {
heroes.x = 225;
heroes.y = 200;
addChild(heroes);

stage.addEventListener(KeyboardEvent.KEY_DOWN,key_down);
stage.addEventListener(KeyboardEvent.KEY_UP,key_up);
this.addEventListener(Event.ENTER_FRAME,redrawing);
}
//функции
public function key_down(keys:KeyboardEvent){
if(keys.keyCode==83){
key_S = 1;  //fps стоит на 70
}
if(keys.keyCode==87){
key_W = 1;
}
if(keys.keyCode==65){
key_A = 1;
}
if(keys.keyCode==68){
key_D = 1;
}
}

public function key_up(keys:KeyboardEvent){
if(keys.keyCode==83){
key_S = 0; 
}
if(keys.keyCode==87){
key_W = 0;
}
if(keys.keyCode==65){
key_A = 0;
}
if(keys.keyCode==68){
key_D = 0;
}
}

public function redrawing(e:Event){
moveHero();
}

public function moveHero(){
if(key_S==1){
heroes.y += 2;  //fps стоит на 70
}
if(key_W==1){
heroes.y -= 2;
}
if(key_A==1){
heroes.x -= 2;
}
if(key_D==1){
heroes.x += 2;
}
}
}
}

Вот теперь все впорядке. Давайте научим нашего героя смотреть на курсор. Делается это математически с помощью тангенса(зная тангенс угла, мы можем узнать сам угол). Если вы непомните математику, то придется поверить на слово и добавить в функцию moveHero такую строку:
heroes.rotation = (Math.atan2(root.mouseY-heroes.y,root.mouseX-heroes.x)*180)/Math.PI-90;

Дальше познакомимся с событиями мыши, нажатие и отпускание. MouseEvent.MOUSE_DOWN и MouseEvent.MOUSE_UP.
« Последнее редактирование: 04 Января 2012, 06:12:46 от Elentarion »

Re: Уроки по ActionScript.
« Ответ #63 : 21 Августа 2011, 01:39:48 »
Урок 9. Дописываем проект.

Мы с вами уже знаем довольно многое, что бы написать свою игру. Давайте доделаем каркас этой, раз уж начали. А заодно познакомимся еще с некоторыми особенностями. Урок содержит минимум комментариев, попробуйте сами разобратся в коде.

Научим героя стрелять. Нарисуем во флеше пулю и сделаем ее символом MovieClip с название class как Bullet;

Поскольку объем кода становится все больше, я буду сокращать. Итак, создаем при нажатие нашу пулю и присваиваем ей  начальные значения.
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные
var heroes = new Hero;
var bulletArray = new Array; //создаем массив под пули
var zombieArray = new Array; //Создаем массив под зомби
var i,j,k; //для циклов

.... код не показан и не изменился ...

public function mouse_down(e:MouseEvent){
var a = new Bullet;  //Создаем экземпляр пули при нажатие
a.x = heroes.x;      //Начальные координаты совпадают с героем
a.y = heroes.y;
a.speed_x = (root.mouseX-heroes.x)/(Math.sqrt(Math.pow(root.mouseX-heroes.x,2)+Math.pow(root.mouseY-heroes.y,2)));   
//Это скорость, вычисляется направление по подобию треугольников.
a.speed_y = (root.mouseY-heroes.y)/(Math.sqrt(Math.pow(root.mouseX-heroes.x,2)+Math.pow(root.mouseY-heroes.y,2)));

bulletArray.push(a);  //Заносим пулю в массив
addChild(a);             //и отображаем
}

...код не показан и не изменился ...


Теперь заставим наши пули двигатся. А заодно удалим, если она вылетела за экран. Для того, что бы удалить объект, нужно уничтожить все ссылки на него и обработчики, если они есть.
public function moveHero(){
heroes.rotation = Math.atan2(root.mouseY-heroes.y,root.mouseX-heroes.x)*180/Math.PI-90;
if(key_S==1){
heroes.y += 2;  //fps стоит на 70
}
if(key_W==1){
heroes.y -= 2;
}
if(key_A==1){
heroes.x -= 2;
}
if(key_D==1){
heroes.x += 2;
}

//Движение пули
for(i=0;i<bulletArray.length;i++){
bulletArray[i].x += bulletArray[i].speed_x*3.5;
bulletArray[i].y += bulletArray[i].speed_y*3.5;

if(bulletArray[i].x>550 || bulletArray[i].x<0 || bulletArray[i].y>400 || bulletArray[i].y<0){ 
//Если пуля улетела за экран, удаляем ее.
removeChild(bulletArray[i]);
bulletArray.splice(i,1);
}
}
trace(bulletArray.length); //проверяем количество существующих пуль
}


Теперь для полного счастья нехватает только самих зомби. Давайте напишем для них свой класс Zombie. Создаем наш макетик для класса, а заодно решим некоторые вопросы:
1. Для зомби желательно устанавливать разную сложность. Давайте создадим отдельную функцию для этого.
2. Зомби должны будут ходить, поэтому нам тоже придется написать эту функцию.

Код: (Zombie.as) [Выделить]
package script{
import script.Living;
import flash.events.*;

public class Zombie extends Living{

public function Zombie() {

}

public function setLevel(){
//для установки сложности
this.addEventListener(Event.ENTER_FRAME,walking);
}

public function walking(e:Event){
//Учим зомби ходить
}
}
}

Итак, давайте считать скорость ходьбы зомби исходя из уровня, по какой-нибудь формуле. Например speed = 1+lvl*0.1;. Так же в качестве цели установим нашего героя, для этого ссылку на него тоже передадим. И пускай зомби нападает с двух сторон.
Код: (Zombie.as) [Выделить]
package script{
import script.Living;
import flash.events.*;

public class Zombie extends Living{
var target;

public function Zombie() {

}

public function setLevel(lvl:Number,tgt:Object){
speed = 1+lvl*0.1;
target = tgt;

//Устанавливаем точки появления зомби
var where = Math.random();
if (where>0.5) {
this.x = Math.random()*100+550;
} else {
this.x = -Math.random()*100;
}
this.y = Math.random()*400;

this.addEventListener(Event.ENTER_FRAME,walking);
}

public function walking(e:Event){
//Устанавливаем движение зомби на игрока
if(this.x>target.x){
this.x -= speed;
}else{
this.x += speed;
}

if(this.y>target.y){
this.y -= speed;
}else{
this.y += speed;
}
}
}
}

Теперь надо прикрепить наших зомби к игре. Итак рисуем наших зомби как MovieClip и устанавливаем ему наш класс как Zombie.
Возращаемся к нашему коду проекта, и пишем их появление. Давайте еще создадим счетчик, который будет создавать зомби через определенное количество времени. Итак:
Код: (StartGame.as) [Выделить]
package script {
//подключенные классы
import flash.display.*;
import flash.events.*;

public class StartGame extends Sprite{
//Переменные
var heroes = new Hero;
var bulletArray = new Array;
var zombieArray = new Array;
var i,j,k; //для циклов

var timer = 0;  //наш таймер

var key_W = 0;
var key_A = 0;
var key_S = 0;
var key_D = 0;

...код без изменений ...

public function redrawing(e:Event){
moveHero();
timer++;
if(timer==70){ //Создаем нашего зомби
timer = 0; //Обнуляем счетчик
var a = new Zombie;
a.setLevel(1,heroes);
zombieArray.push(a);
addChild(a);
}
}

... код без изменений ...

for(i=0;i<bulletArray.length;i++){
bulletArray[i].x += bulletArray[i].speed_x*3.5;
bulletArray[i].y += bulletArray[i].speed_y*3.5;

if(bulletArray[i].x>550 || bulletArray[i].x<0 || bulletArray[i].y>400 || bulletArray[i].y<0){
removeChild(bulletArray[i]);
bulletArray.splice(i,1);
break;    // см. пояснение #1
}

//Проверка столкновения пули с зомби
for(j=0;j<zombieArray.length;j++){
if(zombieArray[j].hitTestObject(bulletArray[i])){
zombieArray[j].removeEventListener(Event.ENTER_FRAME,zombieArray[j].walking);  //см. пояснение #2
removeChild(bulletArray[i]);
removeChild(zombieArray[j]);
zombieArray.splice(j,1);
bulletArray.splice(i,1);
break;
}
}
}

... далее без изменений ...

Немного пояснений к коду:
#1 Pавершаем функцию сразу, не доходя до конца.
#2 Для того, что бы удалить объект, нужно удалить все обработчики и ссылки. Что мы и делаем.

Ну что же, наш каркас игры готов. Конечно он далек от идеала, поскольку был рожден спонтанно и без планирования, а просто в качестве показательного урока. Но теперь вы знаете, что можете сделать свою игру, прикрепить к врагам жизни, ознакомится с текстовыми полями и прочим. Пример прикреплен к уроку.



« Последнее редактирование: 04 Января 2012, 06:14:17 от Elentarion »

Re: Уроки по ActionScript.
« Ответ #64 : 21 Августа 2011, 03:21:43 »
Урок 10. Всего понемногу.
К вышесказаному стоит сказать еще пару дополнений.

статические типы
Существуют так называемые статические переменные и методы. Их отличие в том, что они относятся непосредственно к классу, а не к объекту.
Код: (newMath.as) [Выделить]
package script {

public class newMath {
public static var count = 0;

public function GetAndSet() {

}

public static function myMath(a,b){
count++;
return a*b;
}
}
}

Код: (Проект) [Выделить]
import script.GetAndSet;

trace(GetAndSet.count);
trace(GetAndSet.myMath(10,10));

Заметьте, что нам не пришлось создавать объект класса. А мы использовали обращение непосредственно к классу. Так например можно динамически изменять класс во время работы программы.

override функции. super
Иногда необходимо наследовать класс, но некоторые функции нам не нужны в изначальном виде. Существует способ их переписать для нового класса с помощью override.
Код: (MoveClass_01.as) [Выделить]
package script {

public class MoveClass_01 {
public var _x = 0;
public var _y = 0;

public function MoveClass_01() {
startPosition(100,100);
}

public function startPosition(on_x, on_y){
trace("reposition");
_x = on_x;
_y = on_y;
}
}
}

Если мы сделаем наследование без переписывания функции, то получим изменение значений _x и _y. При переписывание этого не происходит.
Код: (MoveClass_02.as) [Выделить]
package script {
import script.MoveClass_01;

public class MoveClass_02 extends MoveClass_01{

public function MoveClass_02() {
// constructor code
}

override public function startPosition(on_x, on_y){
trace("no reposition");
}
}
}

Код: (Проект) [Выделить]
import script.MoveClass_02;

var a = new MoveClass_02;
trace(a._x);
trace(a._y);

Метод super же наоборот позволяет использовать функции родительского класса.
Код: (MoveClass_02.as) [Выделить]
package script {
import script.MoveClass_01;

public class MoveClass_02 extends MoveClass_01{

public function MoveClass_02() {
// constructor code
}

override public function startPosition(on_x, on_y){
trace("no reposition");
super.startPosition(100,100);
}
}
}

set и get методы
Методы описанные с помощью get и set работают аналогично переменным, но и имеют тело.
get методы используют для получения какой-либо информации. Порой важно, что бы переменные нельзя было изменить извне.
set методы используются для изменения же каких-либо значений.
Код: (GetAndSet.as) [Выделить]
package script {
import flash.display.*;

public class GetAndSet extends MovieClip {
private var _firstName = "Andrey";
private var _secondName = "Yemelyanof";

public function GetAndSet() {

}

public function get firstName(){
return _firstName;
}

public function set newFirstName(newName){
_firstName = newName;
}

}
}

Заметьте, что _firstName и _secondName являются закрытыми для кода извне. Например если мы напишем trace(obj._firstName); то не получим значения. А так же никак не изменим.
Код: (Проект) [Выделить]
import script.GetAndSet;

var a = new GetAndSet;
a.newFirstName = "Ivan";
trace(a.firstName);
Заметьте, что работа с этими функциями идет как с переменными. (вместо a.firstName(), мы используем a.firstName, а во втором случае присваивание)

принципы ООП
Наверное многие слышали такое загадочное слово, как ООП. Но в уроках оно ни разу не произносилось.
Так вот, ООП это программирование с помощью классов и объектов. Но есть еще и несколько правил, которые необходимо соблюдать для полной отдачи такого подхода программирования и избежания многих ошибок и проблемм. Вот наиболее важные из них:

Инкапсуляция.
Инкапсуляция заключается в объединение методов и данных в классе, в сокрытием их реализации. То есть к примеру нам не важно знать что за код внутри Math.random и как он работает, достаточно знать просто его описание, не засоряя голову лишним. Код программы нужно писать из отдельных частей, как можно больше независимых друг от друга.

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

Полиморфизм.
Использование объектов, без знания их типа и внутренней структуры.

Последнее задание
Вот в принципе и все, что нужно для начала. Конечно это только малая часть, мы даже не разобрали нормально встроенные классы(кнопки, текстовые поля, дата и т.д.). Но придется это уже учить самим, в конце концов по флеш программированию уроков, примеров и объяснений просто куча. А разобраться в них вы теперь можете.
 
Для тех, кто хочет проверить свои силы, вот вам задание:
Есть такая книга "Action Script for fun and Games", там есть примеры игр, но они написаны под  вторую версию языка. Скачайте эту книгу и переделайте примеры из книги под третью версию.

Список рекомендуемой к прочтению литературы:
Колин Мук. ActionScript 3.0 - основная книга для изучения.

Если кто хочет подтянуть математику и физику для создания игр:
Джоб Макар. Секреты разработки игр в Macromedia Flash MX

Ну и кто умеет читать по английски:
Emanuele Feronato - Flash Game Development by Example + Code - 2011
ActionScript.3.0 Game Programming University
« Последнее редактирование: 21 Августа 2011, 03:28:09 от Elentarion »

Оффлайн DEAN90 Мужской

Re: Уроки по ActionScript.
« Ответ #65 : 13 Апреля 2012, 02:42:46 »
Спасибо, отличный материал :)

Re: Уроки по ActionScript.
« Ответ #66 : 16 Ноября 2016, 11:51:45 »
Самая ценная информация на форуме. Правда ничего не получается у меня, но читаю с удовольствием!

+  Форум FlashPlayer.ru
|-+  Форум по flash играм
| |-+  Академия flash программирования (Модераторы: Lexei, Vetal1992)
| | |-+  Уроки по ActionScript.