Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=101)
-   -   Знакомство с Flash 9 и ActionScript 3.0 на примере создания аркадной игры (http://www.flasher.ru/forum/showthread.php?t=83431)

CrazyFlasher 17.12.2009 14:43

код не читабелен...читайте про конвенции оформления кода.

http://opensource.adobe.com/wiki/dis...ng+Conventions

DVHERO 17.12.2009 15:03

sky.as
Код AS3:

package main 
{
    import flash.display.MovieClip;
    import flash.events.*;
    import main.*;
 
    dynamic public class sky extends MovieClip
    {
 
      var new_asteroid:moving_object;
 
      public function sky()
      {
          addEventListener(Event.ENTER_FRAME, Update);
          dropAsteroid();
      }
 
      public function dropAsteroid():void
      {
        new_asteroid = new moving_object();
        addChild(new_asteroid);
        new_asteroid.drop(200,300, 500,500);
      }
 
      public function Update(e : Event):void
      {
        new_asteroid.move();               
      }
 
    }
}


moving_object.as
Код AS3:

package main 
{
    import flash.display.MovieClip;
    import main.*;
 
    dynamic public class moving_object extends basic_object
    {   
    const DROP_RADIUS:Number = 200;    // разброс при вбрасывании
    const MIN_SPEED:Number = 1;  // раброс начальной скорости
    const MAX_SPEED:Number = 10;
    public var Velocity:Vector; // вектор движения
 
        public function moving_object()
        {
                var num:Number;
                num = Math.floor(Math.random()*totalFrames)+1;
                gotoAndStop(num); // и переходим на него
                Velocity = new Vector(); // создаем вектор
                // вычислим наш радиус, основываясь на размере картинки
                radius = Math.floor((width+height)/4);   
        }
 
                // Вбросить объект рядом с указанной точкой x1:y1 и двигаться к x2:y2
        public function drop(x1:Number,y1:Number, x2:Number,y2:Number):void
        {
              // координата вброса
              x = x1 + (Math.random()-0.5)*DROP_RADIUS;
              y = y1 + (Math.random()-0.5)*DROP_RADIUS;
              // направление
              Velocity.setMembers(x2-x, y2-y);
              // скорость
              var spd:Number = MIN_SPEED + (MAX_SPEED-MIN_SPEED)*Math.random();
              // приведем длину вектора к выбранной скорости
              Velocity.mulScalar( spd / Velocity.magnitude() );
        }
 
        // Переместиться
        public function move():void
        {
                      x += Velocity.x;
                    y += Velocity.y;
        }
    }
}

переделал....
Так будет правильно?

MerlinTwi 22.12.2009 13:14

Судя по коду все верно, но раз не работает, то последовательно ищите ошибку. Добавляйте trace в коде, чтобы убедиться, что все нужные функции вызываются и параметры верные.
Добавьте в sky.as
Код AS3:

      public function Update(e : Event):void 
      {
trace("new_asteroid=", new_asteroid); // убедиться, что new_asteroid проинициализирован
        new_asteroid.move();               
      }

в moving_object.as
Код AS3:

        public function move():void
        {
                      x += Velocity.x;
                    y += Velocity.y;
trace(this, "x:y=", x, y, "Velocity=", Velocity); // убедиться, что функция вызывается и координаты меняются
        }


waror 28.12.2009 16:40

ненавжу adobe ппц неужели неьзя сделать норм скачку? все какую то парашу с меня требует. я зарегался .а дальше черт с кастылем махает урод


а так спасибо за статью :D

zikoriy 10.01.2010 11:16

классно) спасибо, обязательно прочту) а ты по ас1 и 2 ничего не писал?)

McSun 13.01.2010 23:29

Цитата:

Сообщение от MerlinTwi (Сообщение 575687)
Nirth, спасибо за столь подробный разбор статьи. Все замечания учту в версии 2.0

Версия 2.0 увидела свет? :)

застрял на классе background
сначала ругалось на parent.startDrag() и parent.stopDrag() - Call to a possibly undefined method startDrag through a reference with static type flash.display:DisplayObjectContainer

как учили старшие товарищи обыграл так: (parent as MovieClip).startDrag(...

но дальше - хуже, еще ругается на строки if (root.panel.dragged_mc) и root.panel.handleMouseUp(); - Access of possibly undefined property panel through a reference with static type flash.display:DisplayObject
есть стойкое ощущение, что содержимое fla-файла не вполне соответствует его описанию :)
че делать то?

MerlinTwi 14.01.2010 09:48

> ругается "Access of possibly undefined property"
правильно ругается. Свойство parent имеет тип DisplayObject у которого нет методов типа startDrag или свойств dragged_mc и т.п. С точки зрения компилятора такой код неверен. Можно это обходить приведением типов (как вы правильно писали parent as MovieClip), а можно попросить компилятор закрыть глаза на эту вопиющую безграмотность (Publish Settings -> Action script .. Settings -> снять галочку Strict Mode), и все скомпилируется и заработает и даже без ошибок, поскольку в качестве parent там MovieClip, у которого есть все требуемые методы и свойства.

> Версия 2.0 увидела свет?
нет. С точки зрения грамотного ООП программирования на AS3, эта статья полная лажа. Яркий пример того, как не надо писать на AS3 :) Ее не стоит рекомендовать желающим изучить AS3... но она может быть полезна тем, кто переходит с AS1,2 на AS3, поскольку после AS1,2 еще остается процедурное мышление и навязчивое желание вызывать не свои методы напрямую, типа parent.startDrag

McSun 14.01.2010 20:32

Цитата:

Сообщение от MerlinTwi (Сообщение 878974)
С точки зрения грамотного ООП программирования на AS3, эта статья полная лажа. Яркий пример того, как не надо писать на AS3 :) Ее не стоит рекомендовать желающим изучить AS3... но она может быть полезна тем, кто переходит с AS1,2 на AS3...

а что (кроме Мука) можно почитать, чтобы грамотно писать на AS3?

ageent 17.02.2010 13:19

огромное спасибо

cpu 14.03.2010 17:38

Решил делать сам по тексту, не смотря в исходники(зато ошибки компиляции отлавливаю, все делаю в строгом режиме:bb:). Мозг уже сломал наверно.
У меня непонимание места с секторами, и проверкой на столкновение.
А именно
Код AS3:

delete all_sectors[s][obj.name];

и
Код AS3:

all_sectors[s][obj.name]=obj;

.

Представляю так:
all_sectors[1][name 1]
all_sectors[1][name 2]
all_sectors[1][name 3]

если проверять на существование all_sectors[1], то даст true.
Если удалить все
all_sectors[1][name 1]
all_sectors[1][name 2]
all_sectors[1][name 3]

то при проверка на существование all_sectors[1], даст false.

Короче
Код AS3:

delete all_sectors[s][obj.name];

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

MerlinTwi 17.03.2010 13:58

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

1. удалить себя из сектора где были
2. переместиться
3. проверить столкновения/скорректировать новые координаты
4. записаться в новый сектор

elcard 02.04.2010 16:09

Я тоже нуб. Проявляю потуги разобраться по статье, но застрял в начале на прелоадере. Flash CS4. Компилируется, но переход на второй кадр не осуществляется с ошибкой
Цитата:

TypeError: Error #1010: Термин не определен и не имеет свойств.
at main::preloader/Update()
Мои FLA и SWF если не лень будет глянуть http://narod.ru/disk/19123802000/3.7z.html.

Дебугер вроде на эту строчку указывает:
Код AS3:

this.progressbar.gotoAndStop(percent+1);

UPD: Разобрался... мувик забыл назвать progressbar. Блин, а столько времени тупил сидел :(

dex157 16.04.2010 09:57

Так же хотел поблагодарить MerlinTwi за прекрасную статью..) спустя 4 года, многие, и я в том числе, находим в ней много полезного..)
Мне вот очень интересно, как бы вы сейчас сделали обращения из объекта пушки(любой) к цели, 4 года назад работала конструкция
Код AS1/AS2:

parent.all_sectors

, как лучше сейчас это реализовывать, через главный класс(в случае игры sky)..? или как то через эвенты..?

MerlinTwi 19.04.2010 14:54

Главный класс, он же глобальный диспатчер игровых событий, он же централизованное хранилище ссылок на все объекты, хорошо себя зарекомендовал.

Dark_Omen 26.04.2010 16:46

Вложений: 1
Делаю прелоадер, получаю такую ошибку:
1061: Call to a possibly undefined method gotoAndStop through a reference with static type flash.display:DisplayObjectContainer.
parent.gotoAndStop(1); //1 - это уже я сам пробовал.. даже без 1 ругается:(
Прошу сильно не пинать - первый раз с as3 работаю..

BlooDHounD 26.04.2010 16:59

перечитайте весь топик. ответ здесь уже дан.

Dark_Omen 26.04.2010 17:14

ага. .нашел, спасибо за подсказку)

Ramm 02.05.2010 04:42

В статье говорилось
Цитата:

В мувике астероида убрана галочка «Export in first frame», т.е. мувик не грузится в первом кадре флешки, а будет загружаться в том кадре, в котором он поставлен на TimeLine. Я забыл добавить мувик астероида на TimeLine и соответственно он так и не был загружен вообще.
Есть ли возможность загрузить(ну чтоб его было видно) мувик из библиотеки, не помещенный на таймлайн?

MerlinTwi 06.05.2010 14:13

Флеш не включает в результирующий(swf) файл те классы, на которые нет явных ссылок с timeline или главного скрипта (Docement class). Когда вы ставите галочку "Export in first frame" ссылка на этот класс автоматически прописывается в первом кадре флешки. Если эта галочка не стоит, то обязанность дать явную ссылку на класс в нужном месте ложится на наши плечи. В примере был реализован самый простой вариант, положить мувик на timeline во втором кадре (вне пределов видимости).
Другой вариант: положить пустой мувик на timeline во втором кадре, прописать ему класс (например Container) в котором перечислить (дать явные ссылки) на все классы, которые нужно включить в нашу флешку.
Например:
Код:

package {
        import flash.display.Sprite;

        public class Container extends Sprite {
                // перечисляем классы которые нужно включить в swf
                sky;
                comet;
                laser;
                //...
        }

}

Если внутри одного класса есть ссылки на другой, например в sky создаются кометы:
Код:

var new_comet:comet = new comet();
то можно сюда не прописывать comet.

Ramm 08.05.2010 02:20

Спасибо, запомним

stweet 19.07.2010 17:37

Знакомство с Flash 9 и ActionScript 3.0 на примере создания аркадной игры.
 
Начал чтение этого восхетительного мануала, признаюсь что очень доволен понятным языком Автора "MerlinTwi" мои благодарности. Правдо, как выше описанно, есть недочёты, но их покрывает год выпуска этого мануала. Ценная инфа. Ещё раз спасибо.

solovyovserhiy 20.07.2010 08:55

А где этот мануал положен для прочтения? :-)

etc 20.07.2010 11:07

Цитата:

Сообщение от solovyovserhiy (Сообщение 923523)
А где этот мануал положен для прочтения? :-)

На первой странице, как ни странно.

gait 25.07.2010 15:48

"Не изобретая велосипед, берем готовый класс Vector из примера Macromedia, про рыбок Boids." а где этот пример найти можно? скачал Programming_ActionScript3.0_samples.zip и Flash_ActionScript3.0_samples.zip, но не нашел там примера про рыбок

shaman4d 16.08.2010 15:23

Замечательно, спасибо.

Heavy 25.08.2010 13:50

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

JustLeo 28.09.2010 00:23

Спасибо за мануал!
Но, ребят, помогите со следующим:
"Игровое поле должно быть довольно большим, по нему можно перемещаться «таская» мышкой. В качестве фона на гугле найдем большую картинку звездного неба. Создаем новый MovieClip с именем background и вставляем в него картинку (размер картинки 2000x2000)." Что значит создаем новый MovieClip c именем background и вставляем в него картинку? AS я вроде более-менее понял по книжке Колина Мука, а тут прям непонятно. %)

Psycho Tiger 28.09.2010 11:33

Код AS3:

var background:MovieClip=new MovieClip();
background.name="background"; //это если имелось ввиду имя как имя, а не имя переменной
background.addChild(picture)


N1kk_ 30.09.2010 16:40

Милый мануал)

Но у меня проблема. В общем, ошибка такая
Цитата:

TypeError: Error #1010: Термин не определен и не имеет свойств.
at main::Preloader/Update()
Код класса прелоадера
Код AS3:

package main
{
        import flash.display.MovieClip;
        import flash.events.*;
 
 
        dynamic public class Preloader extends MovieClip
        {
                public function Preloader(): void
                {
                        addEventListener(Event.ENTER_FRAME, Update);
                }
 
                private function Update(e: Event): void
                {
                        this.txt.text = "Загрузка...";
                }
        }
}

выскакивает ошибка видимо в строчке
Код AS3:

this.txt.text = "Загрузка...";

Сделал все как описано в мануале, не пойму в чем проблема.... Помогите пожалуйста:)
Вот ссылка на исходник:
http://*********/29749189

etc 30.09.2010 16:54

N1kk, почитайте хотя бы несколько страниц этой темы.

Jackson 02.10.2010 03:39

Чет я не могу понять, что надо делать:
Цитата:

Делаем мувик preloader который состоит из текстового поля (txt) и прогрессбара (progress - мувик состоящий из 100 кадров, будем позиционировать кадр в зависимости от того, сколько процентов флешки загрузилось). Мувиклипу прелоадера прописываем класс main.preloader
Подскажите, что, где нажать...

Psycho Tiger,где этот код писать надо?И как потом в этот мувик картинку вставить?Разве это делается не на сцене Flash?

Psycho Tiger 02.10.2010 20:09

Ну ээ... где хочется создать - там и пишется. Я статью читал несколько лет назад, да и то мельком. Вставлять картинку addChild. На сцену Flash (Вы про Flash IDE?) по сути добавлять что-либо вообще не рекомендуется, для программистов. Гораздо более гибкий вариант добавлять это программно. Хотя бы потому что если с Вашим кодом потом кто-то будет работать, кто компилирует без Flash IDE - ему это будет не так болезненно.

Vansimar 07.10.2010 22:18

здоровская статья)спасибо!

kluv666 11.11.2010 13:25

Всем привет, перечитал всю тему, юзаю CS5 и возникла проблема (выше она уже была) но т.к. люди которые давали ответы юзали не CS5 они мне не помогли,

при присвоении:
this.txt.text = "Loading..." ругается. "Термин не определен и не имеет свойств"

код:

Код AS3:

package main {
        import flash.display.MovieClip;
        import flash.events.*;
 
        dynamic public class Preloader extends MovieClip {
 
                public function Preloader() {
                        // Нужно периодически вызывать функцию Update, которая будет обновлять процент загрузки
                        // Используем старый-добрый onEnterFrame с учетом событий AS3
                        addEventListener(Event.ENTER_FRAME, Update);
                }
 
                public function Update(e : Event):void {
 
                        var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;
                        var bytesTotal:Number = stage.loaderInfo.bytesTotal;
                        var s:String = "";
                        var percent:Number = 0;
                        if (bytesTotal>0){
                                percent = Math.floor(bytesLoaded/bytesTotal*100);
                                s = percent+"% ("+
                                Math.round(bytesLoaded/1024)+"kb / "+
                                Math.round(bytesTotal/1024)+"kb)";
                        }
                        this.txt.text="Loading... "+s;
                        this.progressbar_mc.gotoAndStop(percent+1);
                        // Если полностью загрузились, то переходим на второй кадр
                        if (bytesLoaded==bytesTotal || bytesTotal==0){
                                removeEventListener(Event.ENTER_FRAME, Update);
                                (parent as MovieClip).play();
                        }
                }
 
        }
}

далле сделал :

Код AS3:

public function Update(e : Event):void {
    trace(">>> " + txt);
    trace(">>> " + stage);
    var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;
    var bytesTotal:Number = stage.loaderInfo.bytesTotal;
 
    // output:
    // >>> [object TextField]
    // >>> null

получается stage не видит? тогда пчму ругается на txt?

динамический текст txt есть, все сделано по мануалу, никаких различий с оригинальным исходником нет, оригинальный исходник прекрасно работает без ошибок (


всем спасибо, все заработало, я м.....к ) небыл прописан класс для мувика preloader_mc )

Добавлено через 8 часов 10 минут
и так новая проблема с перемещением background,

1. создал новый мувик, прописал ему класс background, добавил в него картинку 2000 на 2000.

2. код:
Код AS3:

package main {
 
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.geom.Rectangle;
 
 
        public class Background extends MovieClip {
 
 
                public function Background() {
                        addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
                        addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
                        stage.addEventListener(Event.MOUSE_LEAVE,handleMouseUp);
                }
 
                function handleMouseDown(event:Event):void{
                        var dx:Number = width-stage.stageWidth;
                        var dy:Number = height-stage.stageHeight;
//                        trace(dx);
//                        trace(dy);
                        var dragRect:Rectangle = new Rectangle(-dx,-dy,dx,dy);
                        startDrag(false, dragRect);
                }
 
                function handleMouseUp(event:Event):void{
                        stopDrag();
                }
        }
 
}

при клике в плеере картинка пчмуто заскакивает влево на половину и при трассировке dx и dy пишет 1190 и 1599, и когда начинаю перемещать картинка перемещается но она на 25% в области плеера всего остальное черный бекграунд, кароч глюк какойта, пчму так может быть?

krolser 22.12.2010 15:24

Всем привет. Начал изучать AS3 именно с этого туториала.
И так затянуло, что решил доделать игру до победного.

Более подробно про процесс создания написано тут.

Заранее предвидя обвинения в плагиате, скажу лишь одно. Я получил согласие MerlinTwii. Кроме того, я еще не слабо переписал код. Оригинального осталось 5-10%. Была также устранена очень большая утечка памяти. Пришлось посидеть с профайлером, чтобы найти в чём беда. Если в кратце, то после удаления BasicObjec со Sky он оставался в памяти. Что именно я исправил, я уже не помню. Но могу сказать спасибо за такую красивую ошибку. Сам бы я точно не стал бы разбираться с профайлером. А так жизнь заставила.

Это не рекламная мессага. Это благодарность за труд проделанный MerlinTwi.
Но если вам не лень, то можно и проголосовать 5/5 на
newgrounds.com
kongregate.com

goldlider 20.11.2011 22:05

Не могли бы помочь разобраться с переменной dragRect. Вот отрывок из класса background.
Код AS3:

function handleMouseDown(event:Event):void { 
    var dx:Number = width-stage.stageWidth;
    var dy:Number = height-stage.stageHeight;
    var dragRect:Rectangle = new Rectangle(-dx,-dy, dx,dy);
    startDrag(false, dragRect);
}

К примеру у меня фон размером 2500x1700. Размер флешки 640x480. Переменная dragRect(-1860, -1220, 1860, 1220) задает координату верхнего левого угла, ширину и высоту прямоугольника. А что означают эти цифры? Это то на сколько мы можем передвинуть флешку за одно перетаскивание?

Psycho Tiger 20.11.2011 22:54

Нет. Это квадрат, в котором разрешено перетаскивание. Нельзя утащить за этот квадрат, проще говоря.

Observer 24.10.2012 12:41

Друзья, можете подсказать. Как сделана игровая панель, чтобы она всегда была сверху, над всем игровым миром, как бы мы не перемещали карту. Мне нужно сделать точь в точь. Буду очень благодарен, если чем-нибудь поможите

b_ear 04.02.2013 17:59

Цитата:

Сообщение от MerlinTwi (Сообщение 558924)
P.S. Спустя почти год, я вижу, что в ней очень много грубых ошибок и все можно было бы сделать проще и "правильней". Но тем не менее, считаю, что статья полезна тем, кто переходит с AS2 на AS3.

А можете подсказать что именно можно было бы исправить/улучшить в вашем варианте?
Взял этот пример за основу своего пилотного проекта http://vk.com/strateg3000 , мне интересны любые подробности. Если будет удобнее, то на почту b_ear@mail.ru

Заранее спасибо!

PS: в моем варианте кнопка "Защитить планету" аналогична "Start game" вашего проекта

Добавлено через 16 часов 28 минут
Цитата:

Сообщение от Observer (Сообщение 1101087)
Друзья, можете подсказать. Как сделана игровая панель, чтобы она всегда была сверху, над всем игровым миром, как бы мы не перемещали карту. Мне нужно сделать точь в точь. Буду очень благодарен, если чем-нибудь поможите

она просто лежит сверху и все. правой кнопкой мыши нажимаешь на объекте - там будет меню, в нем выбери Упорядочить - Поместить на передний план

под ней лежит мувик игрового поля, отдельным объектом


Часовой пояс GMT +4, время: 00:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.