Форум 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)

MerlinTwi 04.08.2006 15:52

Знакомство с Flash 9 и ActionScript 3.0 на примере создания аркадной игры
 
Hаписал статью про AS3.0 в ней описывается процесс создания аркадной игры с нуля, прямо от установки Flash на компьютер. :) Надеюсь будет интересно и полезно.
Скачать можно здесь:
http://etcs.ru/files/AsteroidStormHtml.rar
http://etcs.ru/files/AsteroidStormSourceCode.rar

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

artcraft 04.08.2006 23:33

болшая статья, однако :~)
будет время почитаю

Alexei16 16.08.2006 12:07

Действительно, интересно и полезно. Спасибо!

alec-c4 17.08.2006 11:23

респект :)

laaq 17.08.2006 23:34

Дядько - от души душевно в душу :)... Есть предложения по работе :) пиши стучи :)

DOG-Paul 22.08.2006 10:22

Блин! Респект чувак...
Всё боялся подойти к 3.0 а тут чё-то затянуло =))
Только пока нет flash 9... =(

civhimik 01.09.2006 00:41

Скачал я исходник.
Не компилируется.
В Document class пусто

Что туда надо прописать?

etc 01.09.2006 13:57

MerlinTwi, спасибо.

motor4ik 01.09.2006 14:07

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

MerlinTwi 01.09.2006 14:20

Цитата:

Сообщение от civhimik
Скачал я исходник.
Не компилируется.
В Document class пусто
Что туда надо прописать?

Не надо ничего туда прописывать. Document class это свой класс который будет root. В игре я root не подменял, выполняются мувики расположенные на timeline.
Если не компилируется, то должен сообщать об ошибках... какие ошибки выдает?
У вас Flash 9 Public Alpha?

FlexBuilder 01.09.2006 15:12

если закрыть глаза на некоторые нарушения хорошего стиля программирования, статья написана очень неплохо. Побольше бы таких материалов в сети...
Респект.

civhimik 01.09.2006 16:09

Вот что пишет:
Код:

**Error** D:\www\www1\as3manual\AsteroidStormSourceCode3\main\GameOver.as : Line 15, Column 54 : [Compiler] Error #1119: Access of possibly undefined property panel through a reference with static type flash.display:DisplayObject.
                        this.score_label.text = "Score: "+Math.floor(root.panel.score);
**Error** D:\www\www1\as3manual\AsteroidStormSourceCode3\main\GameOver.as : Line 33, Column 9 : [Compiler] Error #1119: Access of possibly undefined property sky through a reference with static type flash.display:DisplayObject.
                        root.sky.bg.handleMouseLeave();
**Error** D:\www\www1\as3manual\AsteroidStormSourceCode3\main\GameOver.as : Line 39, Column 10 : [Compiler] Error #1119: Access of possibly undefined property sky through a reference with static type flash.display:DisplayObject.
                                root.sky.Done();        // � sky �������� �������� ���� ��������
**Error** D:\www\www1\as3manual\AsteroidStormSourceCode3\main\GameOver.as : Line 40, Column 10 : [Compiler] Error #1061: Call to a possibly undefined method gotoAndStop through a reference with static type flash.display:DisplayObject.
                                root.gotoAndStop(2);        // ��������� �� ������ ���� ������

Ну и дальше ReferenceError'ы

MerlinTwi 01.09.2006 17:33

civhimik, ой, как интересно :)
Настройки флеша (Ctrl-U), категория ActionScript кнопка ActionScript 3.0 Settings, убрать галочку Strict Mode. Тогда откомпилируется.
Похоже, в коде не все правильно по мнению Flash Strict Mode :) Позже разберусь что не так, поправлю и перезалью.
Спасибо за наводку, я про этот Strict Mode и не знал даже.

civhimik 01.09.2006 18:54

Да, всё заработало, спасибо.
Буду изучать.

netstuff 08.09.2006 15:31

дык for each и раньше был :rolleyes:

Nirth 08.09.2006 15:37

for each появился в третей версии

netstuff 08.09.2006 16:06

мда. попутал.

Код:

for(var attribute in element.attributes)
а делал тоже самое :eek:

Nirth 08.09.2006 18:16

разница есть и делают они разные вещи, for in дает нам имена свойст, а for each in дает нам сами свойства
Код:

package {
        import flash.display.Sprite;
        import flash.display.DisplayObject;

        public class ForEachForIn extends Sprite
        {
                public var data:Object = {
                                                                        a:new Sprite(),
                                                                        b:new Sprite(),
                                                                        c:null,
                                                                        d:"hello world"};
               
                public function ForEachForIn()
                {
                        forEachExample();
                        forInExample();
                }
               
                private function forEachExample():void
                {
                        trace("for each example:");
                        for each( var item:* in data)
                        {
                                trace(item);
                        }
                }
               
                private function forInExample():void
                {
                        trace("for in example");
                        for ( var prop:String in data)
                        {
                                trace(prop);
                        }
                }
        }
}

выводит

Цитата:

for each example:
[object Sprite]
null
hello world
[object Sprite]

for in example:
b
c
d
a

netstuff 08.09.2006 18:36

понял. спасиб =)

dynamix 05.10.2006 14:30

Игруха реально затягивает, идея супер и реализация на 5+ =) респект!

etc 05.10.2006 15:29

MerlinTwi, статья замечательная, но есть одно но — почему классы имеют имена в нижнем регистре, да ещё с подчёркиванием?

miramax 05.10.2006 15:45

Пошли придирки не по существу...
Прям всё, если класс в нижнем регистре, то ты полный ламер, и т.п. :)

etc 05.10.2006 16:03

Цитата:

Сообщение от miramax
Пошли придирки не по существу...
Прям всё, если класс в нижнем регистре, то ты полный ламер, и т.п. :)

Нет, я нисколько не придираюсь, но раз уж мы пишем на AS3, то давайте писать правильно. Ведь ещё в AS2 необходимо писать имена с прописной буквы, а тут…

MerlinTwi 05.10.2006 16:04

Цитата:

Сообщение от __etc
MerlinTwi, статья замечательная, но есть одно но — почему классы имеют имена в нижнем регистре, да ещё с подчёркиванием?

Виноват. На момент написания я еще не знал о стандартах написания классов, функций и переменных... ознакомился только после строгого предупреждения от Nirth :)
А вообще там много ляпов, т.к. это первая работа на AS3, например, постоянная привязка к root и хранение ссылок на другие классы, вместо нормальной реализации своих событий и т.п., чувствуется наследие AS2. Будет посвободней время надо переписать красиво.
Хотя с другой стороны, она тем и хороша, что понятна логика для человека, который постоянно работал с AS2 и решил попробовать AS3. Я сейчас, чуть ли не каждый день корректирую базовые классы, происходит постепенная перестройка логики программирования под нормальный ООП, после его извращенной реализации в AS2.

etc 05.10.2006 16:10

Цитата:

Сообщение от MerlinTwi
чувствуется наследие AS2.

Скорее AS1 =)
В AS2 можно писать вполне нормально, событийная модель (EventDispatcher) без привязок и прочая… Просто нужно захотеть.
Я легко могу все свои (ну практически все) AS2 классы переписать (скорее просто удалить реализации того, что есть в AS3) на AS3 без серьёзных переделок.

Впрочем, это нисколько не снижает полезность статьи. Ещё раз спасибо.

Nirth 05.10.2006 22:11

Надеюсь автор не против критики =)


Замечания

Цитата:

(почему бы ему самому не искать в дефолтных imports?).
При написании скрипта в кадрах, прямо в Flash 9, классы из пакетов flash.* импортированны по умолчанию, НО когда ты кодишь свой класс, не о каком дефолте и речи быть не может, потому что ты можешь иметь свой собственный класс - Sprite, EventDispatcher, Loader.

Цитата:

Если необходимо внутри мувика что-то нарисовать (прямоугольник и т.п.) необходимо подключить класс
Код:

import flash.display.Graphics;

Не слышал о таком, в флексе класс

Код:

package
{
import flash.display.Shape
public class Circle extends Shape
{

public function Circle()
{
super();

graphics.beginFill(0xff6600);
graphics.drawCircle(50,50,50);
graphics.endFill();
}

}

}

Отлично компилируется.

Цитата:

Забываем про
Код:

mc.onPress=function() {
    бла-бла-бла
}

Теперь все построено на событиях. Для того чтобы отловить клик мышки по объекту необходимо добавить свою функцию, как реагирующую на событие "click":
Код:

addEventListener("click", mouseDownHandler);
...
function mouseDownHandler(){
}


Ну раньше вообщето все тоже было построенно на событиях =) просто в данной системе используется более близкая реализация Delegating Event Model.

Цитата:

package main {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;

public class myButton extends MovieClip {
public function myButton() {
doubleClickEnabled=true;
addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);
}
private function onDblClick(evt:MouseEvent):void {
trace("onDblClick");
visible=false;
}
}
} Во-первых, надо подключить классы Event и MouseEvent.
Подключение класса Event в данном случае совершенно не нужно.

Так же насчет констант, в первом примере вы использовали значение "click", во втором константу MouseEvent.DOUBLE_CLICK, в флэше я бы использовал значения, потому что их быстрее набить, в флексе я бы использовал константы, так как из за автокомплита, набить там легче.

Мне кажется вам стоило пояснить, что в первом примере можно было использовать константу, а во втором значение, а то могут возникнуть конфузы у новичков.

Цитата:

С проверкой bytesTotal на ноль функция Update принимает следующий вид:
У классов не бывает функций и переменных, у них есть методы и свойства.
функции могут быть в пакетах, переменные могут быть в методах и функциях (локальные).

Это не просто название, переменная и функция ни к чему не привязанны, в то время как методы и переменные зависят так или иначе от своего класса.

Цитата:

Код:

// Нажатие кнопки мыши по нашему мувику
function handleMouseDown(event:Event):void {
    startDrag();
}
// Отпустили кнопку мыши
function handleMouseUp(event:Event):void {
    stopDrag();
}


Стоит использовать private или protected, они работают быстрее чем internal (который поставится по умолчанию)

Цитата:

Код:

public function ShowInfo(e:Event=undefined) :void {

Не знаю почему компилятор не выдал ошибки, но в флексе за такое компилятор по рукам бъет, Event не может быть undefined он может быть null, скорее всего компилятор Flash 9 автоматически перегоняет undefined в null.

Цитата:

Код:

// Генерит событие "нужно обновить статистику"
public function doUpdateStatistic() {
    dispatchEvent(new Event("UPDATE_STATISTIC"));
}


Насчет создания событий, имена событий пишутся по стандартам переменных, тоесть имя называлось бы updateStatistics, а уже в классе события(я бы расширил Event по такому случаю) пишут
Код:

public static const UPDATE_STATISTICS:String = "updateStatistics";

Теперь о хорошем

Статья сильно понравилась, идет дотошное объяснение что где и когда, я как человек никогда в жизни не делавший подобын игр (делал логические), узнал много нового. Правда есть опасение, что после выхода Flash 9 статью придется переделывать, насколько я понимаю его перепаивают по полной программе.

Но всеже мне кажется что новенькому читать эту статью опасно, из-за некоторых замечаний которые я указал выше.

Насчет стилизации кода, она нифига не соответствует конвенциям АС, но при этом у нее есть своя, правда я не понял какая :away:

Вобщем гратс!

MerlinTwi 06.10.2006 12:35

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

motor4ik 06.10.2006 14:28

ждем с нетерпением...

Merlin а Вы Мука вторую книгу читали? просто по поводу имен классов итд...ООП в AS 2.0 у него очень хоРошо изложено

MerlinTwi 07.10.2006 14:49

Нет, не читал.

Nirth 07.10.2006 21:10

Цитата:

Вы Мука вторую книгу
по твоему моторчик до EAS2.0 у мука была только одна книга=)?

motor4ik 08.10.2006 13:17

нет, 2 по-моему, просто в EAS2.0 про ООП , классы хорошо изложено

Nirth 08.10.2006 18:39

Просто ты написал "вторая книга", а у него их больше =)

andr64 11.10.2006 15:18

маленькое замечание:

просто бросилось в глаза строка
num = Math.floor(Math.random()*totalFrames)+1
наверное правильние будет так
num = Math.round(Math.random()*(totalFrames-1))+1

а вообще статься хорошая. :)

MerlinTwi 11.10.2006 16:05

Цитата:

Сообщение от andr64
маленькое замечание:
num = Math.floor(Math.random()*totalFrames)+1
наверное правильние будет так
num = Math.round(Math.random()*(totalFrames-1))+1

Вы не правы, в вашем варианте вероятность генерации первого и последнего фрейма ниже, чем остальных. Проверьте сами:
Код:

var _totalFrames:int = 10;
var hash:Array = new Array();
var i:int, num:int;
// Первый вариант
// Обнуляем массив
for (i=1; i<=_totalFrames; i++) hash[i]=0;
// Собираем статистику
for (i=0; i<1000000; i++) {
        num = Math.floor(Math.random()*_totalFrames)+1;
        hash[num]++;
}
// Результат
trace("Result 1:");
for (i=1; i<=_totalFrames; i++) {
        trace(i+" = "+Math.round(hash[i]/1000000*100)+"%");
}

// Второй вариант
// Обнуляем массив
for (i=1; i<=_totalFrames; i++) hash[i]=0;
// Собираем статистику
for (i=0; i<1000000; i++) {
        num = Math.round(Math.random()*(_totalFrames-1))+1;
        hash[num]++;
}
// Результат
trace("Result 2:");
for (i=1; i<=_totalFrames; i++) {
        trace(i+" = "+Math.round(hash[i]/1000000*100)+"%");
}


motor4ik 11.10.2006 16:35

интересно было бы почитать упоминающуюся статью про 21 оптимаьлный кадр

andr64 11.10.2006 17:05

Цитата:

Сообщение от MerlinTwi
Вы не правы, в вашем варианте вероятность генерации первого и последнего фрейма ниже, чем остальных. Проверьте сами:

А, да. Я почему то подумал что random возвращает 0<=n<=1, а на самом деле 0<=n<1. :away: бывает =)

Aleksey123 08.11.2006 15:40

А как скомпилировать??

Ошибки:
main\comet.as : Line 6, Column 37 : [Compiler] Error #1017: The definition of base class basic_object was not found.

ReferenceError: Error #1065: Variable preloader is not defined.

ReferenceError: Error #1065: Variable background is not defined.

И т.д. Как исправить? Пока что на экране мигают два кадра.

Agro 28.01.2007 14:06

MerlinTwi, почему в классе 'main.background' ты использовал stage.addEventListener(Event.MOUSE_LEAVE, handleMouseUp), а не stage.addEventListener(Event.MOUSE_OUT, handleMouseUp)?

MerlinTwi 31.01.2007 00:25

Цитата:

Сообщение от Agro
MerlinTwi, почему в классе 'main.background' ты использовал stage.addEventListener(Event.MOUSE_LEAVE, handleMouseUp), а не stage.addEventListener(Event.MOUSE_OUT, handleMouseUp)?

Наверное потому, что событие MouseEvent.MOUSE_OUT для Stage не работает... а Event.MOUSE_LEAVE оповещает об уходе мышки за пределы сцены.
Если ты о том, как отловить уход мышки при нажатой кнопке, то можно слушать MouseEvent.MOUSE_MOVE и проверять координаты мышки, ушла она за края сцены или нет, но это стало работать не так давно, с какой-то версией flash плеера.

DRAGOnoid 13.05.2007 12:18

страничка перестала быть доступной - что делать ? Т_Т


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

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