PDA

Просмотр полной версии : Знакомство с Flash 9 и ActionScript 3.0 на примере создания аркадной игры


MerlinTwi
04.08.2006, 15:52
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
Скачал я исходник.
Не компилируется.
В 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
Пошли придирки не по существу...
Прям всё, если класс в нижнем регистре, то ты полный ламер, и т.п. :)
Нет, я нисколько не придираюсь, но раз уж мы пишем на AS3, то давайте писать правильно. Ведь ещё в AS2 необходимо писать имена с прописной буквы, а тут…

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

etc
05.10.2006, 16:10
чувствуется наследие 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
маленькое замечание:
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
Вы не правы, в вашем варианте вероятность генерации первого и последнего фрейма ниже, чем остальных. Проверьте сами:

А, да. Я почему то подумал что 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
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
страничка перестала быть доступной - что делать ? Т_Т

_voland
17.05.2007, 22:00
Верните сабж, плиз

VovkaMorkovka
21.05.2007, 12:30
Угу, хоца почитать, а нетути - верните пожалуйста, а еще можно здесь выложить как зеркало :-)

civhimik
23.05.2007, 01:36
Выложил статью с исходником
http://wu-tang.***********/2100580

DRAGOnoid
24.05.2007, 09:14
Выложил статью с исходником
http://wu-tang.***********/2100580

СПАСИБО ОГРОМНЕЩЕЕЕ!!! Ты просто не представляешь как ты всех нас спас! :yahoo: Умничка - уважаю!!!! :victory:

Poputchik
14.06.2007, 17:09
Загрузчик из примера ругается:
1061: Call to a possibly undefined method play through a reference with static type flash.display:DisplayObjectContainer.

чем бороть подскажите?

Poputchik
14.06.2007, 18:36
Загрузчик из примера ругается:
1061: Call to a possibly undefined method play through a reference with static type flash.display:DisplayObjectContainer.

чем бороть подскажите?
убил. отключением ресктриктов.

etc
14.06.2007, 20:15
Убивать нужно баг, а не компилятор.

MerlinTwi
14.06.2007, 21:10
Это точно :)
Но вообще подобные баги вполне естественны для новичка, т.к. по умолчанию Strict mode отключен, то я даже не догадывался какие ошибки делаю, при написании этой игры...

Poputchik
15.06.2007, 12:41
У меня как раз по умолчанию все включено.

etc
15.06.2007, 13:36
В девятке Preview был отключен.

~~~
19.06.2007, 13:14
Вот, написал статью про AS3.0 выложил здесь (http://www.timezero.ru/storm/page1.html)
В статье описывается процесс создания этой игры (http://www.timezero.ru/storm/) с нуля, прямо от установки Flash на компьютер. :) Надеюсь будет интересно и полезно.

UNDERCONSTRUCTION
This page under construction. Try again later.

etc
19.06.2007, 14:08
Давно уж висит.

http://etcs.ru/files/AsteroidStormHtml.rar
http://etcs.ru/files/AsteroidStormSourceCode.rar
Забирайте.

~~~
19.06.2007, 14:40
Спасибо! :)

sunic
29.06.2007, 11:27
Вот, написал статью про AS3.0 выложил здесь (http://www.timezero.ru/storm/page1.html)
В статье описывается процесс создания этой игры (http://www.timezero.ru/storm/) с нуля, прямо от установки Flash на компьютер. :) Надеюсь будет интересно и полезно.
Сори за тупость а где статья то там только игра осталась [URL="http://www.timezero.ru/storm/page1.html"]

etc
29.06.2007, 12:41
А посмотреть через пост выше?

Molecula
15.08.2007, 06:15
"АККАУНТ ЗАБЛОКИРОВАН" - за что так?
Хотя файл можно скопировать (до 09 ) с ИФолдера, но геморно немного.

krolser
08.10.2007, 20:25
Большое спасибо автору. Именно эта статья помогла мне в изучении основ AS3 и зарядила волонтерством. Вот и решил поделиться с остальными своим опытом. Т.к. я еще не профессионал, то просьба сильно не пинать, а указывать на ошибки по существу.

А вот и файлик.
17883

DRAGOnoid
08.10.2007, 21:16
молодчинка! хороший поступок! Я пока не читал только пробежался глазами - но подход не плохой. думаю народ оценет =) Лично мне понра.

Snut
31.10.2007, 19:31
у меня flash cs3 и ни в какую не хочет работать прелоадер... ругается при компиляции на

1061: Call to a possibly undefined method play through a reference with static type flash.display:DisplayObjectContainer.

Preloader.as:

package src{
import flash.display.MovieClip;
import flash.events.*;
import flash.text.TextField;

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

etc
31.10.2007, 19:46
Ну правильно, parent есть DisplayObjectContainer, нужно привести к типу MovieClip.

Snut
31.10.2007, 19:50
__etc, как же я его приведу? ( простите за глупый вопрос...

etc
31.10.2007, 20:03
(parent as MovieClip)

Snut
31.10.2007, 23:26
__etc, *глаза на лоб* пошел читать доки...

у мука в eas3 это есть?

etc
31.10.2007, 23:31
Понятия не имею, у меня нет Мука.
Должно быть, это же основы.

2morrowMan
01.11.2007, 11:25
Snut, тебе в скрипте надо написать так:

(parent as MovieClip).play();

а если по правильному то:

if (parent is MovieClip)
{
(parent as MovieClip).play();
}

Snut
01.11.2007, 23:03
2morrowMan, спасибо.

SSergeyS
14.11.2007, 19:02
Было:

parent.play();
результат:
1061: Call to a possibly undefined method play through a reference with static type flash.display:DisplayObjectContainer.
Сделал так:

if (parent is MovieClip)
{
parent is MovieClip.play();
}
результат:
1061: Call to a possibly undefined method play through a reference with static type Class.
переписал вот-так:

if (parent is MovieClip)
{
MovieClip(parent).play();
}
Работает.
Почему?
А статья - супер! Меня Очень выручила!:victory:

BlooDHounD
15.11.2007, 11:55
мдя ....
if (parent is MovieClip) {
( parent as MovieClip ).play();
}

SSergeyS
15.11.2007, 17:33
мдя ....
немогу не согласиться :confused:
спасибо.

shoosh
11.01.2008, 20:48
Тоже хачу поблагодарить за статью.

Ilyes
16.01.2008, 12:44
Начал разбираться с Flex во Flex Builder 2, нашел эту статью, результат понравился, а вот сделать во Flex Builder не получилось. Это пример для Flash CS3, да?

DRAGOnoid
16.01.2008, 12:54
ага, для FLEX есть свой раздел форума
http://www.flasher.ru/forum/forumdisplay.php?f=84

etc
16.01.2008, 13:13
Начал разбираться с Flex во Flex Builder 2, нашел эту статью, результат понравился, а вот сделать во Flex Builder не получилось. Это пример для Flash CS3, да?
Скорее для 9 Alpha Preview.

DRAGOnoid
16.01.2008, 15:45
эээ чё то теперь я не догоняю Оо
а в чём разница 9 Alpha Preview от Flash CS3 ? Оо
поидее наоборот Flash CS3 => доделанный 9 Alpha Preview + нормальный HELP

etc
16.01.2008, 16:19
Тогда ещё не было CS3, а в Preview по дефолту отключен strict.
Поэтому код из статьи так просто не запустится в CS3.

Ilyes
16.01.2008, 17:39
Блин, что же мне сделать чтоб этот пример запустить на моем Flex Builder?
На флексе нет ни одного компонента - наследника MovieClip, блин.
Просто я на ни на флеше ни на флексе пока не нашел примеров лучше. Может кинете в меня ссылкой с примерами? На адобе че-то стремные все примеры. Я имею в виду игрушку типа этой.

DRAGOnoid
16.01.2008, 22:05
похоже придётся тебе переписывать под флекс самому =(
я кстати так и не понял в чём фишка флекса - даже не открывал его ниразу. Лучше бы разрабатывал свои продукты во флеше, он как тоболее распространён.

TioN
08.02.2008, 18:10
MerlinTwi - спасиб за труд, хорошо написал и действительно понятно людям у которых первый язык программинга ас 1)

_Silent_
11.02.2008, 02:14
Когда изучал строение игрушки, после переноса фона и планеты в клип sky начала упорно выскакивать ошибка:

5001: The name of package 'main' does not reflect the location of this file. Please change the package definition's name inside this file, or move the file. D:\Joomla\система проектирования\main\basic_object.as

Долго бился, никак не мог понять в чём дело, потом обнаружил - В Actionscript 3.0 settings в classpath я как-то добавил путь до папки со своими классами (по моему classpath для этого и предназначен), вот из-за этого ошибка и вылезала.

A.E.M.
24.02.2008, 15:17
Всем здрасти!

Вот код из примера про даблклик, пробую на flash cs3, выдает ошибку...
Никак не могу понять почему.... заранее спасибо за ответ и извините за тупой вопрос (:

ошибка:

1026: Constructor functions must be instance methosods

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;
}
}
}

etc
24.02.2008, 16:20
A.E.M., а где вы этот код пишете?

Kuruki
24.02.2008, 22:39
Файлы, ссылки на которые находятся в 1 сообщении этой темы, что-то не загружаются.
Forbidden
You don't have permission to access /files/AsteroidStormSourceCode.rar on this server.

etc
24.02.2008, 22:41
Это временно, скоро открою, ждите.

A.E.M.
25.02.2008, 01:27
__etc, во внешнем фйле "myButton.as" , который находится в папке main в том же каталоге что и исходник. В document class пишу "main.myButton"

etc
25.02.2008, 02:04
Тогда выкладывайте исходник. Код верный, не считая неправильного названия класса.

A.E.M.
25.02.2008, 11:32
Вот выкладываю файлы, возможно в Linkage что то не то..., но все равно не смог разобраться чо не так..

etc
25.02.2008, 13:22
Не называйте архивы по-русски, пожалуйста. У меня вместо нормального названия папки получается туча кракозябр.

Ваша ошибка в том, что вы назвали класс «myButton», а не «MyButton», как полагается называть классы (с прописной, горбатой нотацией). В результате кнопка с именем myButton, лежащая на сцене (внутри экземпляра вашего класс myButton) начала конфликтовать с конструктором. Да и потом, зачем вы привязали класс кнопки ко всему документу, а не только к кнопке, в нем лежащем?

Более того, даже если вы прицепите класс к myButton, двойной клик все-равно не будет работать. Потому что вы кликаете не по myButton, а вложенной в ней bar blue.

В вашем случае класс должен быть привязан к myButton, внутри myButton bar blue должна иметь имя innerButton. Document class пустой. Код класса MyButton выглядит так:

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

public class MyButton extends MovieClip {

public var innerButton:SimpleButton;

public function MyButton() {
super();
this.innerButton.doubleClickEnabled = true;
this.innerButton.addEventListener(MouseEvent.DOUBLE_CLICK, this.doubleClickHandler);
}

private function doubleClickHandler(event:MouseEvent):void {
super.visible = false;
}
}
}

Ах да, ещё надо отключить «Automatically declare stage instances» в Publish Settings > Flash > ActionScript 3.0 (Settings). Причем делать это нужно всегда при создании нового проекта. И в классах объявлять публичные свойства-ссылки (см. public var innerButton:SimpleButton) вручную.

A.E.M.
25.02.2008, 22:04
Извините за русское название, больше не повторица.
Огромное Вам спасибо!!!! Я вот уже часа два мучаюсь так у меня ничо и не получаеццо (: Понимаю что будет наглостью с моей стороны просить Вас выложить Ваш исходник работающий, чтоб мне легче было разобраться, но этим Вы бы мне очень облегчали мучения (: Я не настаиваю, в принципе надеюсь что разберусь...

Еще раз огромное спасибо!

etc
25.02.2008, 22:19
Да пожалуйста.

A.E.M.
26.02.2008, 00:08
Спасибо огромное!

CEBEP
28.02.2008, 01:35
игра понавиалсь )))

Alex Lexcuk
04.04.2008, 21:49
Очень нравится, очень... это описание процесса и ссылки. Супер. Mega GOOD.

BlackValmont
06.04.2008, 20:04
Я так понимаю что данная статься для юзеров CS3 бесполезна ибо половина кода неработает....

etc
06.04.2008, 20:26
А вы заставьте работать, это дополнительная сложность.
В CS3 это работает.

CEBEP
07.04.2008, 01:52
Потверждаю, все вполне работоспсобно!

8bit
04.05.2008, 18:42
Непонимаю почему в примерах автора код приведенный ниже работает, а у меня нет.

Call to a possibly undefined method startDrag through a reference with static type flash.display:DisplayObjectContainer.

Покапавшись в теме, узнал что надо приводить к типу MovieClip(parent as MovieClip)
код скомпеллировался, но пределы перетаскивания остались не изменились, тоже самое наблюдается и без .parent Да и опятьже почему у меня надо приводить, а у автора и так все нормально


package main {
import flash.display.MovieClip;
import flash.events.*;
import flash.geom.Rectangle;

public class background extends MovieClip {

public function background() {
parent.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
stage.addEventListener(Event.MOUSE_LEAVE, handleMouseLeave);
}

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);
parent.startDrag(false, dragRect);
}
function handleMouseUp(event:Event):void {
parent.stopDrag();
}

function handleMouseLeave(event:Event):void {
parent.stopDrag();
}

}
}

etc
04.05.2008, 19:16
Что-то мне подсказывает, что с пределами перетаскивания вы явно перемудрили в вычислениях.

8bit
05.05.2008, 00:49
public function background() {
parent.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
stage.addEventListener(Event.MOUSE_LEAVE, handleMouseLeave);
}

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

function handleMouseLeave(event:Event):void {
stopDrag();
}


На практике такие вычисления больше всего подошли] странные расхождения с автором, в его примере все отлично работает с теми вычислениями которые постом выше. Разъясните пожалуста в использование parent, stage. Как понимаю stage это корень, рут, а parent это родитель. Где то они требуется, гдето нет, мне остается только гадать, или вот непонятно

parent.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
stage.addEventListener(Event.MOUSE_LEAVE,

первое parent, остальные stage в чём разница почему именно так?

etc
05.05.2008, 01:06
Потому что MOUSE_UP может произойти вне перетягиваемого объекта, а MOUSE_LEAVE вообще только stage слать может.

Kuruki
12.05.2008, 23:00
Автор данной статьи пишет: "На примере созданной игры при большом игровом поле 800x440 и большом количестве одновременно отображаемых и обрабатываемых объектов (более 200), Flash показывает приличную производительность, что было нереально в предыдущих версиях."
У меня вопрос: а сколько (объектов) было реально в предыдущей версии (т.е. на AS 2.0)?
В своей игре я использую ту же систему проверок на столкновения (по секторам). У меня 30 неподвижных объектов (которые 1 раз регятся в общих секторах и все; стены короче) и 10 - 15 подвижных (по событию enterFrame они движутся и проверяют столкновения между собой и со стенами). Только у меня не одна функция-менеджер, а все объекты сами регистрируются и двигаются. При данной статистике флэш тормозит. cacheAsBitmap совершенно не помогает.
Это нормально для AS 2?
Спасибо

etc
12.05.2008, 23:05
Скорость рендера на AS3 не сильно быстрее AS2. А вот вычисления — да.

Kuruki
13.05.2008, 00:25
А можно в данном случае считать, что AS 3 считает в 10 раз быстрее AS 2 (опуская мои стены), если учесть, что коды максимально близки?
Если нет, то хотелось бы услышать, во сколько максимальное число раз он может считать быстрее.

etc
13.05.2008, 00:36
Я не знаю, какой у вас там код. В среднем, AS3 быстрее на порядок.

Alex Lexcuk
13.05.2008, 16:00
Несравнить как быстрее во много-много-много раз.

CEBEP
14.05.2008, 12:20
weakReference:Boolean
В случае true, за что отвечает этот параметр?

Simply put,
weakly referenced listeners aren’t supervised by the garbage
collector and, therefore, don’t have to be manually marked for
removal. If only weak references to an object remain after you
have finished using it, then the object is eligible for collection.

Не очень понял, что имеется ввиду :(

Яски
14.05.2008, 16:08
если не указать этот параметр, например для Array, сборщик мусора не сможет уничтожить из памяти переменную, которая находится в Array, пока ее не удалят и из Array.

Dampire
18.05.2008, 22:18
Просто мега статья, мне оч оч понравилось, все понятно, доступно...
Но у меня одна проблема, когда я все прочел и начал все это делать от руки чтобы выехать что да как работает, появился глюк в прелоадере... Значит в примере с игрой все работает нормально, но если я скопирую класс к себе во флешку, скопирую из библиотеки прелоадер, то все летит в тар тарары... Не компилится, ему не нравится parent.startDrag()
Даже если я свой рукописный класс preloader, который, у меня во флешке не работает, поставлю на место класса preloader в примере игры, то он не на что не жалуется...
Я ничего не пойму...
Help please...

MerlinTwi
19.05.2008, 13:07
parent - это DisplayObjectContainer
а метод startDrag объявлен в Sprite. Поэтому нужно делать приведение типа:
(parent as Sprite).startDrag()
В игрушке работает, т.к. в настройках была убрана галочка строгой проверки типов.

Danss
17.06.2008, 19:55
Вот собираюсь почитать вашу статейку, я правда до конца не понял будет ли все работать в CS3 ?

etc
18.06.2008, 00:56
Вот собираюсь почитать вашу статейку, я правда до конца не понял будет ли все работать в CS3 ?

А вы прочитайте до конца всю тему, тогда будет понятно.

N1ka
18.06.2008, 16:51
Здравствуйте.
До сих пор пока справлялся со всякими непонятками в CS3 вместе со Strict mode, статья хорошая, конечно мне нюбу еще многое непонятно, но на то и создаются такие статьи, что вскорее надеюсь нюбом называтся не буду.

Так вот, застрял я на 3й странице ХТМЛ, где идет речь о столкновениях. Делал как написано, но тут:
TypeError: Error #1010: A term is undefined and has no properties.
at main::sky/Update()
Долго игрался, не мог понять в чем проблема, эксперементировал и по частях новый код добавлял чтоб увидеть на каком этапе ошибка. Оказалось что на delete all_sectors[s][obj.name];
Сравнивал с оригиналом, все будто нормально. Пробовал через дебаг, и мне деюаг тоже указал 62 строку. Вот весь код в моем sky:
package main {
import flash.display.MovieClip;
import flash.events.*;
import main.*;
dynamic public class sky extends MovieClip {
var MIN_DROP:Number, MAX_DROP:Number; // пределы количества вбрасываемых астероидов
var all_moving:Array; // здесь все движущиеся объекты
// Объявляем переменную для хранения секторов
var all_sectors:Object; // сектора со ссылками на объекты в них
public function sky() {
all_moving = new Array();
// в конструкторе инициализируем
all_sectors = new Object();
// сколько астероидов вбрасывается
// это не константы, т.к. со временем количество астероидов должно увеличиваться
MIN_DROP=5; MAX_DROP=10;
addEventListener(Event.ENTER_FRAME, Update);
// тестовый вброс
DropSeveralAsteroids();
}
public function DropSeveralAsteroids():void {
var x1:Number, y1:Number; // точка вброса
var x2:Number, y2:Number; // куда двигаться
var cnt:Number; // количество вбрасываемых встероидов
var new_asteroid:moving_object; // объект астероида
var s:String;
x1=0; y1=0; // пока так, для теста, из левого верхнего угла
x2=this.earth.x; y2=this.earth.y; // двигаться к земле
// выбираем рандомное количество
cnt = MIN_DROP + Math.floor((MAX_DROP-MIN_DROP)*Math.random());
while (cnt--){
new_asteroid = new moving_object(); // создаем новый астероид
addChild(new_asteroid); // добавляем его на наш мувиклип
all_moving.push(new_asteroid); // запоминаем в массиве
new_asteroid.drop(x1,y1,x2,y2); // бросаем
// В функции вброса новых астероидов
// Просим пересчитать в какие сектора попал объект
new_asteroid.CalcSectors();
// добавим в эти сектора ссылку на объект
for each (s in new_asteroid.sectors){
if (!all_sectors[s]){ // такого сектора еще не было, создадим
all_sectors[s] = new Object();
}
all_sectors[s][new_asteroid.name] = new_asteroid;
}
}
}
public function Update(e : Event):void {
var s:String, obj2:basic_object;
// Проходим по всему массиву созданных объектов
// и заставляем каждого сдвинуться в своем направлении
for each (var obj:basic_object in all_moving){
// перед тем, как сдвинуться удалим запись об этом объекте из секторов
for (s in obj.sectors){
delete all_sectors[s][obj.name];
}
// смещаемся
obj.move();
// Просим пересчитать в какие сектора попал объект
obj.CalcSectors();
// Проверяем столкновения со всеми объектами, которые есть в новых секторах
for (s in obj.sectors){
if (all_sectors[s]){ // такой сектор есть
for each (obj2 in all_sectors[s]) { // проверяем на столкновение
if (obj.CheckCollision(obj2)){ // столкнулись
// делаем отскок
resolve(obj, obj2);
}
}
} else { // нет такого сектора
all_sectors[s] = new Object(); // теперь будет
}
// регистрируемся в этом секторе
all_sectors[s][obj.name]=obj;
}
}
}
function resolve(ball1:basic_object, ball2:basic_object):void {
var b1Velocity:Vector = ball1.Velocity;
var b2Velocity:Vector = ball2.Velocity;
var b1Mass:Number = ball1.getMassa();
var b2Mass:Number = ball2.getMassa();
var lineOfSight:Vector = new Vector(ball1.x-ball2.x, ball1.y-ball2.y);
var v1Prime:Vector = b1Velocity.vectorProjectionOnto(lineOfSight);
var v2Prime:Vector = b2Velocity.vectorProjectionOnto(lineOfSight);
var v1Prime2:Vector = new Vector();
v1Prime2.copyVector(v2Prime);
v1Prime2.mulScalar(2*b2Mass);
v1Prime2.addVector(v1Prime.getMulScalar(b1Mass - b2Mass));
v1Prime2.mulScalar(1.0/(b1Mass + b2Mass));
var v2Prime2:Vector = new Vector();
v2Prime2.copyVector(v1Prime);
v2Prime2.mulScalar(2*b1Mass);
v2Prime2.subVector(v2Prime.getMulScalar(b1Mass - b2Mass));
v2Prime2.mulScalar(1.0/(b1Mass + b2Mass));
v1Prime2.subVector(v1Prime);
v2Prime2.subVector(v2Prime);
b1Velocity.addVector(v1Prime2);
b2Velocity.addVector(v2Prime2);
}
// Отодвигает объект 1 от объекта 2, чтобы они не пересекались
function PullBalls(ball1:basic_object, ball2:basic_object, add_random:Number=0):void {
var v:Vector = new Vector(ball1.x-ball2.x, ball1.y-ball2.y);
var distance:Number = Math.max(0.1, v.magnitude());
var min_distance:Number = ball1.radius + ball2.radius;
if (distance > min_distance) return; // не пересекаются
v.mulScalar((0.1+add_random+min_distance-distance)/distance);
ball1.x += v.x;
ball1.y += v.y;
if (add_random>0){ // добавить небольшой рандом в положение ball1
ball1.Velocity.addVector(v.getUnitVector());
ball1.x += (Math.random()-0.5)*add_random;
ball1.y += (Math.random()-0.5)*add_random;
}
}
}
}


Вобщем старался сам как мог найти ответ на свой вопрос, но в итоге оказалось что без сторонней помощи не обойдусь. Если не трудно, помогите пожалуйста разобраться в чем дело. Ну и просьба более доходчиво обьяснить, ибо я еще нюб. Спасибо.

MerlinTwi
19.06.2008, 10:58
У вас проблема в 40-ой строке:

// добавим в эти сектора ссылку на объект
for each (s in new_asteroid.sectors){
if (!all_sectors[s]){ // такого сектора еще не было, создадим
all_sectors[s] = new Object();
}
all_sectors[s][new_asteroid.name] = new_asteroid;
}

asteroid.sectors - это Object вида:
[0_0] = true
[0_1] = true
...
Т.е. в качестве имени номер сектора, а в качестве значения всегда true.
Если перебирать циклом

for (s in new_asteroid.sectors) ...

то переменная "s" будет принимать значения: "0_0", "0_1" ...
Если же циклом for each, то вы пройдетесь по значениям, а не по именам:

for each (s in new_asteroid.sectors) ...

переменная "s" будет принимать значения: "true", "true" ...

В итоге, при создании все астероиды попали в сектор "true", и когда пытаетесь его корректно удалить (цикл for) из сектора "0_0", его нет, там null, о чем и сообщает Flash.
Ошибка довольно хитрая, понять в чем дело можно лишь, запустив в debug mode и внимательно посмотрев на значения переменных участвующих в строке с ошибкой: "s", "obj.sectors", "all_sectors", "all_sectors[s]"

Faster_
24.06.2008, 16:39
Привет всем!
А дайте пожалуйсто ссылочку на эту статейку и если возможно то уже исправленую и дополненую? :)
Заранее благодарен! ;)

etc
24.06.2008, 18:32
Статью никто не переписывал.

Faster_
24.06.2008, 20:01
А исходники?

etc
24.06.2008, 20:08
Аналогично. Может кто-то и делал, но не видел.

Faster_
24.06.2008, 20:10
Ладно, спасибо за ответ, буду ковырять, что есть :)

Faster_
25.06.2008, 01:06
Охх... вот и я дошёл до ошибок :(

Вот весь код пока:
package main {
import flash.display.MovieClip;
import flash.events.*;

dynamic public class preloader extends MovieClip {
public function preloader() {
addEventListener(Event.ENTER_FRAME, Update);
}
public function Update(e : Event):void {
this.txt.text = "Please wait...";
}
}
}

Ошибка
TypeError: Error #1010: A term is undefined and has no properties.
at main::preloader/Update()

Дебагер тыкает на 11 строку :(
Не пойму в чем дело...

Вот исходник, если что http://narod.ru/disk/1101705000/game.rar.html

etc
25.06.2008, 01:16
А давайте вы как-нибудь прочитаете всю эту тему и исправите ошибки сами, вы же сами хотите учить AS3, так ведь?

Faster_
25.06.2008, 01:23
Хм )) я первым делом её и прочитал )) На пост выше вроде такая же ошибка, но в другом случае :(

MerlinTwi
30.06.2008, 13:40
Вы поставили класс main.preloader как главный класс документа. На основной сцене нет поля txt, о чем и говорит флеш. Текстовое поле txt есть у мувиклипа preloader, наверное ему и стоит сопоставить класс main.preloader?
Т.е. очистить поле Document class, а в свойствах мувиклипа preloader поставить галочку Export for ActionScript и в поле Class прописать main.preloader

Faster_
30.06.2008, 16:04
Спасибо большое, но с этим я уже разобрался)) щас об другое головой бьюсь :)

other.one
20.07.2008, 15:00
ау. самый дельный урок который я встречал. РЕСПЕКТ. я просто счастлив

vvk80
20.08.2008, 13:12
классная игра... математика- это сила... пример супер!!! спасибо большое!

peaknik
03.09.2008, 16:22
Большое спасибо автору. Именно эта статья помогла мне в изучении основ AS3 и зарядила волонтерством. Вот и решил поделиться с остальными своим опытом. Т.к. я еще не профессионал, то просьба сильно не пинать, а указывать на ошибки по существу.

А вот и файлик.
17883

Обнаружил вот такую интересную вещь:
Если флеш разместить в html-коде с указанием размеров, например, в два раза меньше реального размера, то при уменьшении зума, возникает ситуация, приведенная на скриншотах.

Кто-нибудь может объяснить как от этого эффекта избавиться? :confused:

(картинки размещены в "выкрученном" до минимума зуме, при запуске картинки идентичны)

_Smirnoff
03.09.2008, 17:02
stage.scaleMode = StageScaleMode.NO_SCALE;

fox kids
14.09.2008, 00:40
Attemping to launch and connect to Player using URL D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf
[SWF] D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf - 518 bytes after decompression

Что означает и как с этим бороться?
Это происходит при Debug Movie Ctrl+Shift+Enter
Что я делаю не так?

etc
14.09.2008, 01:47
Attemping to launch and connect to Player using URL D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf
[SWF] D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf - 518 bytes after decompression

Что означает и как с этим бороться?
Это происходит при Debug Movie Ctrl+Shift+Enter
Что я делаю не так?

А что вас смущает?

fox kids
14.09.2008, 01:57
Я думал что буду любоваться текстом "Хэлло Уорлд", ноя любовался только этим текстом(((Attemping to launch and connect to Player using URL D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf
[SWF] D:\САЙТЫ\Флеш Работа\Обучающая статья\main\test1.swf - 518 bytes after decompression

Pylinsky
16.10.2008, 02:55
ну вот :)
после того как установил цс4, появилась срочная необходимость понять ас3...

AlexsWulf
19.10.2008, 21:45
Мучаюсь уже несколько дней.
обьясните как всетаки избавиться от ошибки
1119: Access of possibly undefined property osnov through a reference with static type flash.display:DisplayObject.
Не убивая компилятор?

etc
20.10.2008, 02:05
Избавиться просто — изучить ActionScript.
К сожалению, сейчас данный пример на основе игры плохо подходит для изучения AS3.

AlexsWulf
20.10.2008, 10:29
Я понимаю что нужно изучить ActionScript. Как раз этим и занимаюсь на примере этой игры пишу простенький морской бой. Упёрся в эту ошибку при расстановке кораблей на поле. Подскажите хоть в какую сторону копать или что почитать связанное с этой проблемой? Или можно не связанное а вообще для изучения ActionScript.

2morrowMan
20.10.2008, 12:24
Где-то идет обращение к неизвестной переменной osnov

DRAGOnoid
20.10.2008, 15:11
Мучаюсь уже несколько дней.
обьясните как всетаки избавиться от ошибки
1119: Access of possibly undefined property osnov through a reference with static type flash.display:DisplayObject.
Не убивая компилятор?

хоть бы часть кода показал или исходник выложил чтобы телепатией не заниматься

AlexsWulf
20.10.2008, 15:48
Вот что пишет:
**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'ы

Это было на второй странице данной ветки. Ошибка абсолютно таже только у меня не sky а osnov.
С ней и бьюсь.
Свой код смогу выложить только как доберусь до дома. И наверно стоит это делать уже в отдельной теме.

DeLZeX
20.10.2008, 16:28
В 10м Flash добавили класс-контейнер Vector и теперь Vector из статьи конфликтует с ним. import main.Vector; как в Java не помогает((( Что можно сделать, кроме переименовывания класса?

DeLZeX
20.10.2008, 18:22
function resolve(ball1:basic_object, ball2:basic_object):void
{
var b1Velocity:Vectro=ball1.Velocity;
var b2Velocity:Vectro=ball2.Velocity;

У класса basic_object нет поля Velocity:wacko: И все компилируется, и работает.
Почему компилятор позволяет такое?
*
Блин, это dynamic class придумают же такое)))

Remizorrr
23.10.2008, 12:04
Статья классная. впринципе есть и попроще варианты в интернете. для начинающих flasher-ов. 4ре части по созданию простой игры
http://siliren.ru/content/view/34/1/
http://siliren.ru/content/view/44/1/
http://siliren.ru/content/view/45/1/
http://siliren.ru/content/view/52/1/

LegendMAN
25.10.2008, 09:27
Remizorrr, по всей видимости не туда запостил, в твоем примере не AS3 ;)

DRAGOnoid
25.10.2008, 14:39
а примерчики всёравно хорошие ;) спасибо

terbooter
10.11.2008, 12:29
А вот интересно, если я игруху сделаю на базе этого туториала никто не обидется?
Могу денег сколько-то заплатить =)

etc
10.11.2008, 12:36
Ну прям с тем же кодом я бы не стал.

terbooter
10.11.2008, 22:01
Почему?

etc
10.11.2008, 22:47
Потому что этот код, мягко говоря, не соответствует современному AS3.

terbooter
11.11.2008, 08:43
Это не проблема, я все равно все перепишу по-своему =)
Главное чтобы было с чего начать.

root.Unknown
27.12.2008, 07:11
В общем есть проблема с прелоадером... Прочитав всю тему с 1-й до этой страници я выправил несколько ошибок, но все таки некоторые остались, я использую Flash CS3, 9-ка...
Опишу все как есть и сколько ошибок и каких выбевает на этом не легком пути к истине...

Значит в fl файле 3-и кадра, 1-й кадр прелоадер, 2-й кадр кнопка Start, 3-й кадр сцена с игрой...

Расположил на первом кадре MovieClip под названием "preloader" в котором текстовое поле с id: txt, ну и стоит Dynamic Text, и MovieClip под названием "progressbar" с Instanse of: progressbar
В MovieClip-е с названием "preloader" поставил в Linkage... галочку Export for AS, прописал класс: main.preloader, это внешний файл лежащий в папке main с названием preloader.as
На первом кадре в главной сцене(root), во фрейме написал stop();

Код на внешний файл preloader.as

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.gotoAndStop(percent+1);
// Если полностью загрузились, то переходим на второй кадр
if (bytesLoaded==bytesTotal || bytesTotal==0){
removeEventListener(Event.ENTER_FRAME, Update);
if (parent is MovieClip) {
MovieClip(parent).play();
}
}
}
}
}

Всё прально вроде бы, но при компиляции выскакивает ошибка:
preloader.as Line 1 1046: Type was not found or was not a complite-time constant: TextField.

Причем здесь TextField, я же написал dynamic public class preloader extends MovieClip { и выбрал для текстового поля Dynamic text, указал в нем ID: txt )))))

В общем думал справлюсь сам, но после 4 часов над исправлением ошибок одна за другой замучался, тут я уже пришел в тупик, что оно от меня хочет?
Подскажите пожалуйста, уже нету сил с ним боротся, код по прочтению всей темы я так понял писался для FL v. 8... Повторюсь, у меня 9-ка...

Добавлено через 5 часов 18 минут
Разобрался сам, опять моя ошибка...
Забыл написать import flash.text.TextField; Хотя в примере игры, в файле preloader.as автора этой строки нету )))))

Хотя у меня еще возник один вопрос, при компеляции файла, в Flash CS3 компилирую Ctrl+Enter, в окне Player-а в меня View > Simulate Download показывается что файл грузится... но в самом флег окне загрузка прелоадера, то есть отображения мувиклипа самого показывается только тогда, когда % дошел до 80 и только после 80, прелоадер отображается и эта полоска загрузки добегает четверь всей длины, у меня вопрос, почему эта полоска загрузки не с 0% начинает отображаться?

MerlinTwi
28.12.2008, 23:53
А какой вес первого кадра? Может там все классы игры и сидят, потому-то и грузится он долго, т.к. большой?
"Export classes in frame" стоит 2 ?

root.Unknown
29.12.2008, 05:33
хм... а где его ставить или посмотреть вообще?
Если на любом MovieClip-е нажать правой кнопкой мыши и выбрать Linkage..., то там можно выбрать только
Class: name
BaseClass: flash.Display.MoiveClip

Linage: Export for ActionScript (стоит галочка)
Export for runtime sharing
Export in first Frame (стоит галочка)

а где прописать "Export classes in frame" "2" не знаю... :

musat
29.12.2008, 11:38
root.Unknown
Publish Settings -> Flash -> (ActionScript 3.0) Settings -> Export classes in frame

THJVHFGRE
03.01.2009, 00:42
Люди, допоможите, плиз!!!
Я второй день пытаюсь разобраться с классами - полная беда, то ли я чегой

Добавлено через 1 минуту
Люди, допоможите, плиз!!!
Я второй день пытаюсь разобраться с классами - полная беда, то ли я чегой - то не въезжаю, то ли фиг его знает... Короче, пытаюсь повторить начальныйурок с классами из статьи,

Добавлено через 3 минуты
Люди, допоможите, плиз!!!
Я второй день пытаюсь разобраться с классами - полная беда, то ли я чегой - то не въезжаю, то ли фиг его знает... Короче, пытаюсь повторить начальный урок с классами из статьи, а он, зараза, пишет, что невозможно определить класс... Я поставил 3 флеш. Дошел до того, что тупо копировал текст, - результат тот же. Может, кто поможет чайнику...

Stephen Wings
09.01.2009, 20:35
Уважаемый THJVHFGRE, на ваш пост никто не сможет ответить, так как он небуквально гласит: "Расскажите мне вкратце про Action Script, чтобы я все понял и мог программировать на нем".

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

Итак, у меня идентичная проблема, что и уже озвучивалась в этой теме. Постом позже на нее создатель этого замечательного туториала ответил. Вот эти сообщения:
здесь (http://www.flasher.ru/forum/showpost.php?p=746393&postcount=111).
здесь (http://www.flasher.ru/forum/showpost.php?p=746270&postcount=112)..

но каюсь, я перечитывал ответ автора и переделывал код десятки раз, но, что называется, "не просек". Я не вижу в сообщении №112 конкретного ответа: "как изменить код, чтобы он работал?"

Прошу ответить для тех, кто в танке. Неважно, насколько глуп вопрос. Хочу разобраться. :)

MerlinTwi
12.01.2009, 07:24
Я не вижу в сообщении №112 конкретного ответа: "как изменить код, чтобы он работал?"
заменить
for each (s in new_asteroid.sectors){
на
for (s in new_asteroid.sectors){

THJVHFGRE
14.01.2009, 23:04
Понял, прошу прощения...Попытаюсь разобраться, в чем фишки...

ZlobaZl
17.01.2009, 22:58
Вот возникло несколько проблем когда разбирался с примером.

пишу код для движения за мышкой
package main{
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.Event;

dynamic public class GameAs3Class_Robots_World extends MovieClip {;
public function GameAs3Class_Robots_World() {
addEventListener(Event.ENTER_FRAME, Move_camera);
}
public function Move_camera(e : Event):void {
this.x=mouseX;
this.y=mouseY;
}
}
}
import flash.display.DisplayObject;
1) Если создать в основном файле мувиклип с индификатором
"main.GameAs3Class_Robots_World" Ипросмотреть как работает данный файл, то получается картина того как мелькает наш мувиклип (притом мелькает похоже както странно, то ли запоминает предыдущее местоположение и летает то к нынешнему то к предыдущему, толи складывает координаты и мелькает, в общем не так как надо).
Что изменить как исправить проблемму?
2) "addEventListener(Event.ENTER_FRAME, Move_camera);"
Это как понятно добавление события в код. синтаксис как я понял таков:
"ДобавитьСобытие(Событие.Врубания_Кадра, Производить_действие_события_в_такойто_функции)" Тогда вопрос фраза "addEventListener" будет для всех событий одинакова?
И где найти другие события кроме "Event.ENTER_FRAME"
3) Начто писать это: "(e : Event)" ? К чему переменная эта нужна?
4) Для чего нужно писать "import flash.display.DisplayObject;", как я понял чтобы работал блок this.x=mouseX; (тоесть чтобы когд понял что нам надо координаты брать) Но дело в том что и не писав этот импорт flash не выдает ошибки. Почему?

etc
17.01.2009, 23:11
1) Вы используете mouseX и mouseY относительно самого клипа, а т. к. при каждом рендере кадра клип смещает свою позицию и положение курсора мыши относительного него изменяется, соответственно мы видим хаотичное движение. Как вариант, можно использовать super.stage.mouseX, super.stage.mouseY.

2) Эта строка означает, что вы подписываете на событие (как на газету) какой-либо метод-обработчик вашего класса. Если переносить в реальность, то, грубо говоря, в вашем коде вы подписываете газету с названием Event.ENTER_FRAME (в константе содержится строковое значение 'enterFrame', т. е. это «ежекадровая» газета) на почтовый ящик (метод Move_camera), который и будет получать экземпляры этой газеты (те самые «e», указанные в обработчике Move_camera).

4) Потому что класс DisplayObject в вашем коде нигде не используется. Это абстрактный класс, экземпляры которого создать нельзя, но можно создавать наследников, вроде класса Sprite. В классе DisplayObject описаны базовые свойства визуальных объектов во Flash, такие как x, y, width, height и др.

ZlobaZl
17.01.2009, 23:58
1) Вы используете mouseX и mouseY относительно самого клипа, а т. к. при каждом рендере кадра клип смещает свою позицию и положение курсора мыши относительного него изменяется, соответственно мы видим хаотичное движение. Как вариант, можно использовать super.stage.mouseX, super.stage.mouseY.

2) Эта строка означает, что вы подписываете на событие (как на газету) какой-либо метод-обработчик вашего класса. Если переносить в реальность, то, грубо говоря, в вашем коде вы подписываете газету с названием Event.ENTER_FRAME (в константе содержится строковое значение 'enterFrame', т. е. это «ежекадровая» газета) на почтовый ящик (метод Move_camera), который и будет получать экземпляры этой газеты (те самые «e», указанные в обработчике Move_camera).

4) Потому что класс DisplayObject в вашем коде нигде не используется. Это абстрактный класс, экземпляры которого создать нельзя, но можно создавать наследников, вроде класса Sprite. В классе DisplayObject описаны базовые свойства визуальных объектов во Flash, такие как x, y, width, height и др.

1) А т что в "Миграции с АС2 на АС3" написанно что _xmouse --> mouseX в расчет не брать? И как теперь пользоваться "super.stage.mouseX" В тупую писать вместо "mouseX"? Надо ли какиенибуть Классы потипу "DisplayObject"
2) Тоесть и получается если разбирать "addEventListener(Event.ENTER_FRAME, Move_camera);"" по частям: "addEventListener"- вызов события; "(Event.ENTER_FRAME, Move_camera)" - Вызов события с такими характеристиками где: "Event.ENTER_FRAME"-Характеристики самого вызова (притом ENTER_FRAME можно заменить на чтонибуть друго (что потребуется)), а "Move_camera" адрес вызывания.
3)"который и будет получать экземпляры этой газеты (те самые «e», указанные в обработчике Move_camera)." А какие экзэмпляры имеются у ЭнтерФрэйма??? Или это пишется по стандарту (в энтер фрэйме просто ничем он вызван ен может быть), а в других случаях нужно вызывать? Это случаем например не та "дэльта", или както так, что АС2 Требовалась при обработке события использования ролика мышки (ана нам помогало определить куда ролик крутим)??
4) А можно поподробнее что за наследники "вроде класса Sprite"?

зы и еще вопросик))
Как пользоваться тогда "Мигратором" (назовем его так))))

Разберем строчку:
"_ymouse Свойство [только для чтения] flash.display.DisplayObject.mouseY Перемещено в класс DisplayObject, изменено имя на mouseY, удалено исходное подчеркивание из имени."

Как я раньше понимал что мы смотрим для АС2 код находим его это "_ymouse" далее смотри на "flash.display.DisplayObject.mouseY" Логично что это строчка неможет быть оператором, поэтому по логике "mouseY"-это оператор, а "flash.display.DisplayObject" это класс который нада импортировать. Правильно я понял? Или не так получается? Тогда почему "flash.display.DisplayObject."- абстракционный клас? И что надо сделать чтобы Его использовать???

etc
18.01.2009, 00:10
1) Нет, _xmouse/_ymouse в AS2 тоже брались бы относительно клипа;
2) Нет. addEventListener — метод добавления нового слушателя, а не вызов. Вызов, а точнее отправка — это dispatchEvent.
3) Какие-какие? Экземпляры типа Event, содержат в себе как минимум ссылку на отправителя и тип. Это и есть само событие, его параметры. Т. е. когда происходит событие, вызывается подписанный на это событие обработчик и в него передаётся экземпляр этого события (e:Event), у этого экземляра есть различные свойства, как минимум тип события и ссылка на отправителя. В случае подписки на скролл мыши, будет ещё и та самая дельта;
4) О наследниках DisplayObject можно узнать в хелпе.

mouseY — это свойство, а не оператор. В AS2 аналогом было свойство _ymouse у MovieClip-ов. Импорт класса DisplayObject для использования свойства mouseY в его наследниках не требуется.

ZlobaZl
18.01.2009, 00:29
1) А точно в АС2 мы же отходили от _root-а да и писали в кадре, а тут та у нас рут это имя мувиклипа. Такчто понятно это)
2) А по поводу характеристик (тоесть константы ENTER_FRAME) это правда? И где их брать эти другие "константы"???
3) Как я понял e это переменная со свойствами, дак как тогда эти свойства нам вызвать? Например координаты "х" и "у" у мувиклипа мы находим путем "name_move.x" и "name_move.у" а как тут быть?

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

etc
18.01.2009, 00:45
1) В AS2 в кадрах тоже не писали, всё в классах;
2) У класса Event есть ещё куча констант;
3) e.type, e.target, например;

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

ZlobaZl
18.01.2009, 00:49
1) Это я про себя говорю)))
2) Дак а брать где их? http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/ -от сюда? Дак тут я невижу ЭнтерФрэйма никакого.
3) Почему "например"? или там их тьма свойств? Откуда тогда достать синтаксис вызова свойств?

etc
18.01.2009, 01:09
2) Лучше искать нужно :)
3) Там же, в хелпе. Читайте. Вам повезло — на русском.

ZlobaZl
18.01.2009, 01:21
2) Нау..чите(чи)


Вот и получилась Убывающая последовательность из вопросов)

Добавлено через 8 минут
А вот всетаки в догонку пара вопросиков)

1) В АС2 писали имя переменных и мувиклипов как _root["blabla"+i+"_bla_"+j]. Как данное творение реализовать на flash? илиже только через массивы???
2) Какой истенный синтаксис создания мувиклипа на сцене и присваивание ему какогото имени??

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

etc
18.01.2009, 01:37
2) Нау..чите(чи)
http://www.picamatic.com/show/2009/01/18/12/25/1774980_bigthumb.png (http://www.picamatic.com/show/2009/01/18/12/25/1774980_1108x1578.png)

В АС2 писали имя переменных и мувиклипов как _root["blabla"+i+"_bla_"+j]. Как данное творение реализовать на flash? илиже только через массивы???

По ссылкам или getChildByName.

2) Какой истенный синтаксис создания мувиклипа на сцене и присваивание ему какогото имени??
var sp:Sprite = new Sprite();
sp.name = 'mySprite';
super.addChild(sp);
var mySprite:Sprite = super.getChildByName('mySprite') as Sprite;
trace(mySprite, mySprite.name);

Токо ненадо плс, посылать на хэлп)) я уже долго разбираюсь просто уже каша какаято в мозгах получилась, незнаю что из этого что надо выцеплять.
А придётся, я не вечный.

ZlobaZl
18.01.2009, 01:52
1) КАРТИНКА Дак откуда понятьчто данное делает???

2) По ссылкам или getChildByName. Не я не про то кажись. Чето типа this.per[i] так можно писать??? или это и означает что нада создать массив per

3)"super" это ненче нам привычный рут так обозначается?)))
А как код будет выгледеть если нам надо созать 10 мувиклипов?

зы.
"ENTER_FRAME Константа "
"Примечание. Это событие не имеет фазы захвата и фазы пузырей, поэтому отправляется непосредственно целевому элементу независимо от того, находится он в списке отображения или нет."

Боже мой что за пузыри???)))

Добавлено через 2 минуты
Кстате из файла по этой теме:
// При выходе мышки за пределы флешки, делать тоже самое, что и при отпускании кнопки
stage.addEventListener(Event.MOUSE_LEAVE, handleMouseUp);
что тут тогда "stage." означает?

etc
18.01.2009, 02:04
1) Дак откуда понятьчто данное делает???
По имени константы можно найти кучу классов, которые событие с такой константой высылают.

2) Не я не про то кажись. Чето типа this.per[i] так можно писать??? или это и означает что нада создать массив per
Нет, нельзя.

3)"super" это ненче нам привычный рут так обозначается?)))
Нет, super точно такой же super, как и в AS2. Это обращение к супер-классу, либо его свойствам/методам, либо выполнение конструктора.

А как код будет выгледеть если нам надо созать 10 мувиклипов?
Рано или поздно вы его сами напишите. Мне — лень.

Боже мой что за пузыри???)))
Не забивайте голову, вам до этого ещё далеко.

что тут тогда "stage." означает?
Когда разберетесь с моделью дисплей-объектов в AS3, этот вопрос отпадёт сам собой.

Т. к. обычно в подобных дискуссиях количество вопросов возврастает в геометрической прогрессии, я рекомендую вам всё же читать и понимать хелп и искать ответы здесь на форуме самостоятельно, потому как лично я писать километровые посты не хочу и лень.

ZlobaZl
18.01.2009, 02:13
Ну лана небуду пока тревожить)))

Добавлено через 22 часа 27 минут
Вот ещё вопросик.

Иду по коду предложенной игры и сотавляю свой.

package main{
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.Event;
import main.*;

dynamic public class GameAs3Class_Robots_World extends MovieClip {;
public var all_moving:Array;
public function GameAs3Class_Robots_World() {
all_moving = new Array();
addEventListener(Event.ENTER_FRAME, Update);
}
public function DropSeveralAsteroids():void {
var cnt, i, Type1, Type2, Type3 :Number;
var new_BFR:GameAs3Class_Robots_Soldat;

cnt=10;
for (i=1; i<=cnt; i++) {
Type1=Math.floor(Math.random()*2)+1;
Type2=Math.floor(Math.random()*3)+1;
Type3=Math.floor(Math.random()*2)+1;
new_BFR = new GameAs3Class_Robots_Soldat();
addChild(new_BFR);
all_moving.push(new_BFR);
new_BFR.drop(1)
}
}
public function Update(e : Event):void {
DropSeveralAsteroids()
this.x=super.stage.mouseX-300;
this.y=super.stage.mouseY-300;

for each (var obj:GameAs3Class_Robots_Soldat in all_moving) {
obj.move()
}
}
}
}
Это мой основной класс.

package main{
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.events.Event;
import main.*;

dynamic public class GameAs3Class_Robots_Soldat extends MovieClip{;

public function GameAs3Class_Robots_Soldat() {
}
public function move():void {
x += 10;
y += 10;

}
public function drop(Type1:Number):void {
if(Type1==1){
x=20;
y=300;
}
if(Type1==2){
x=300;
y=20;
}
}
}
}

это мой второй класс.


Моеё целью должно быть чтобы в классе "GameAs3Class_Robots_World" вызывались 2 функции move() и drop(Type1:Number). Но при их вызове вылезает данная ошибка:
TypeError: Error #1006: drop is not a function.
at main::GameAs3Class_Robots_World/DropSeveralAsteroids()
at main::GameAs3Class_Robots_World/Update()

Что помойму означает что нет данной функции в DropSeveralAsteroids() нет и в Update(). Хотя в примере именно так все реализованно. Для функции мува таже самая ошибка.




2) Второй вопрос.
Когда нам надо писать что "GameAs3Class_Robots_World extends MovieClip", а когда" GameAs3Class_Robots_World extends GameAs3Class_Robots_World_02" Как я понял это и есть наследование (вопрос "3)" Это наследование или что???) либо от мувиклипов на сцене либо от кода, потипу продолжения чтоли? или если я непонял что это такое то можете (кто нибудь) объяснить что да как?

4) Как я еще понял мы записываем all_moving = new Array(); поочередно не просто какую то переменную, а целый "блок данных" включающий себя направление на выполнение каких либо функций а потом просто перебирай все по очереди в результате чего "блок данных" у нас начинает выполняться для каждого объекта (вопрос "5)" это бред как я понял либо это реально так?). В результате чего нам ненада индексировать никакие объекты по 100 раз. Вот возникает вопрос (все ещё четвертый) а чето я непонял как колизия (столкновение) проверяется исходя из двух объектов??? Как надо вызывать их???


зы не в тему "Добавлено через 22 часа 27 минут" порадовало)

MerlinTwi
19.01.2009, 02:48
1. В коде все верно. Ошибка "drop is not a function" скорее всего из-за того, что в библиотеке есть мувиклип с Class: GameAs3Class_Robots_Soldat, и создается экземпляр именно этого мувиклипа, который не имеет никакого отношения к написанному вами классу main.GameAs3Class_Robots_Soldat
Укажите в свойствах мувиклипа Class: main.GameAs3Class_Robots_Soldat и все заработает.
На будущее, когда ручками пишите имя класса, связанного с мувиклипом, нажимайте на зеленую галочку справа от поля ввода, Flash сообщит вам связанно ли указанное имя с существующим классом, или же будет создан новый.

2. да, это наследование. Лучше, конечно про наследование почитать умные книжки, но я попробую на пальцах :)
Что писать после extends зависит от того, какие свойства должны быть у вашего класса изначально (от родителя).
Если классу не нужно ничего, например, он просто хранит "x" координату, то и наследоваться не надо:

class MyClass1 {
public var x:Number;
}

Если надо еще один класс, который хранит две координаты "x" и "y" можно аналогично создать класс и прописать в нем две координаты, а можно унаследоваться от уже имеющегося:

class MyClass2 extends MyClass1 {
public var y:Number;
}

Новый класс MyClass2 имеет два числа "y" - прописанное в нем, и "x" - полученное от родителя MyClass1. Т.е. по сути класс MyClass2 расширяет функционал класса MyClass1.
Когда вы пишете "GameAs3Class_Robots_World extends MovieClip", то создаете свой новый класс, который наследует все свойства мувиклипа: может содержать в себе рисунок, несколько кадров, анимацию и целую кучу других полезных свойств: http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/display/MovieClip.html Т.е. как бы говорите: "ок, я беру за основу мувиклип и добавлю туда кое что свое", в вашем случае это функция для перемещения function move() и функция для установки начальных координат function drop

4. all_moving - это массив. В каждой ячейке массива можно хранить что-то. (благодаря заботам разработчиков Flash, массивы нетипиризированные, т.е. за счет некоторого снижения производительности можно в любой ячейке хранить все что угодно!)
Вы в этот массив сохраняете ссылки на созданные экзепляры классов GameAs3Class_Robots_Soldat. Вас ведь не смущает код:

var new_BFR:GameAs3Class_Robots_Soldat;
new_BFR = new GameAs3Class_Robots_Soldat();
new_BFR.drop(1);

В переменную new_BFR вы записываете ссылку на созданный (new) экземпляр класса солдат. Точно так же и в массиве хранятся такие же ссылки, только их там много. Вот этот код будет аналогичен вышеописанному:

var ar:Array = new Array();
ar[0] = new GameAs3Class_Robots_Soldat();
ar[0].drop(1);



P.S. Все вышеописанное имеет мало отношения к AS3, а больше к основам программирования. Советую вам сначала почитать книги по программированию вообще.

ZlobaZl
19.01.2009, 04:09
2) Отлично. Получается что мы разными классами описываем разные свойства разных объектов, а потом как в конструкторе собираем мир из свойств. На примере игры ты взял сначало описал поведение в целом объектов (столкновение, а также вывод жизней) в классе basic_object, затем наши "кругляшки" делятся на движемое и недвижемое имущество (двигаются астеройды, не двигается земля) но всеже они такие базовые объекты изза чего ты создал 2 класса moveing_object and static_object. ну и т.д. в итоге потом после уноследования нада "скрепить" базик со статиком и базик с мувингом. Но тогда как реализовать уноследование сразу от 2х классов???
4) хм тоесть реально реализовать потипу так:

for each (var obj:GameAs3Class_Robots_Soldat in all_moving) {
for each (var obj2:GameAs3Class_Robots_Soldat in all_moving) {
obj.stolknovenie(obj2)
}
}


...
class .. GameAs3Class_Robots_Soldat ..

...
stolknovenie(var obj2:GameAs3Class_Robots_Soldat ){
if(obj!=obj2 && stolknovenie_ne_izbejno){
blabla
}
}

тут я прокручиваю 2 массива и функцией в которую вносится второй объект, проверя нет ли столкновения с этим объектом.
дак вот интересно реально так будет работать? Или в каких местах нада чуть подправить (например "obj!=obj2" корректно?)?


зы и в догонку.
all_moving.push(new_BFR) - означает дописывание в конец массива? или в любую пустую???

Добавлено через 22 часа 55 минут
Дак что скажете?

MerlinTwi
21.01.2009, 13:23
> 2. Но тогда как реализовать уноследование сразу от 2х классов???
Во флеше - никак. И мне, к примеру, ни разу не потребовалось. Если очень надо, то посмотрите метод Proxy, но это уже дебри, лучше подумать еще и отказаться от множественного наследования :)

4. Можно и так. Только получается избыточно. Если было проверено столкновение obj1 с obj2 зачем еще делать проверку столкновения obj2 с obj1 ?

> all_moving.push(new_BFR) - означает дописывание в конец массива?
в конец

ZlobaZl
21.01.2009, 22:09
Спасибо за ответы)

ZlobaZl
05.02.2009, 07:01
Подскажите как реализовать такое:

Надо создать 10 мувиклипо каждый со своим типом. Тип выбирается в момент создании в самом главном классе. Нужно чтобы значение этого типа вносилось с характеристики объекта как тажа координата х (икс) а далее в классе по этому объекту выбиралось бы (из условия о типе) какую функцию запустить для обработки.

Мне это надо из за того что появление мобов и героя происходит в разное время, хотя наследование идет от одного и тогоже класса. Следовательно когда я создаю героя или моба (зы моб это компьютерный игрок (он же бот)) мне нужно указать что герой это тип 1, а моб это тип 2 и т.д.

заранее спасибо;)

Денис00
04.03.2009, 20:32
Я немного чайник, объясните, плз.
Вот установил я Flash CS4. Почитал уроки. Пытаюсь сделать всё по ним - и не въезжаю, скрипт в отдельном файле должен быть или в том же, где сцена? Если в отдельном, то просто ничего не происходит, если в этом, тоже самое, но плеер ещё и ругается на первую строку.
P.S. ActionScript я немного знаю, до этого во Flex-е пытался делать разные вещи, кое-что получалось. Так что мне нужно разобраться, как здесь хотя бы выполнить trace ("Hello world!"), а дальше я сам разберусь.

etc
04.03.2009, 22:23
Классы всегда во внешних файлах.

Денис00
04.03.2009, 23:31
Объясните тупому - есть папка flash, в ней - ролик. Где должен лежать файл скрипта и как и где прописать к нему путь? Как я понял, это прописывается в свойстве class в основном мувике, но что-то ни черта не получается. Папки через точку, да?
P.S. Всё, разобрался. :)

myLove
17.03.2009, 03:42
Блин! А ведь не все в россии сволочи! Хоть кто-то не пожалел времени и сил и написал всё красиво и подробно...
Спасибо большое!!!

RidingTheFlash
22.05.2009, 15:40
Спасибо. Понравились модельки, можно ли их использовать, или какие-то наводки по созданию похожих может есть?

MerlinTwi
23.05.2009, 17:52
Использовать можно.
А наводки... берешь знакомого 3D-шника, ставишь ему пиво... :)

togoa
24.05.2009, 20:28
Грустно это всё... стоит Adobe Flash CS4, данный туториал не работает. То есть уже вот тут (class Preloader):

this.txt.text="Загрузка... "+s;
this.progress.gotoAndStop(percent+1);
// Если полностью загрузились, то переходим на второй кадр
if (bytesLoaded==bytesTotal || bytesTotal==0)
{
removeEventListener(Event.ENTER_FRAME, Update);
parent.play();
}
всё для меня закончилось.
progress.gotoAndStop -> ошибка, для начала просто убираем, не найдя вменяемой инфы в инете, только какие-то ужасы...
parent.play(); -> ошибка, делаем (parent as MovieClip).play();, как кто-то тут подсказывал...
(parent as MovieClip).play(); - валится на рантайме...

короче жизнь дерьмо:) То ли сильно изменили AS3 за это время, то ли я со своими 4 годами ООП уже в маразм впал(((

etc
24.05.2009, 21:54
togoa, в коде статьи много чего не работает в режиме strict. ООП тут непричем.

togoa
25.05.2009, 00:17
Ах, режим стрикт...))) Дело видимо в том, что я с AS вообще дела никогда не имел, занимался С++, потом С#, сейчас ASP.NET, самое близкое что было - javascript и совсем немного java. Поэтому для меня многое может не доходить, я даже и не спорю, что я тут нуб полный:) Просто расстроился, найдя исходники и клёвое описание, вроде на нужном языке и ни разу не компилируется((

Отбросив лирику, так что за режим и как с ним бороться?

MerlinTwi
25.05.2009, 09:08
File->Publish Settings->Flash->ActionScript 3.0 Settings->Strict mode галочку снять...
но только на время изучения статьи, свои проекты писать обязательно в "Strict mode"!

togoa
27.05.2009, 02:23
Глянул, что это... нет уж, лучше код поправить, нинада снисхождений:)

npou
28.05.2009, 12:14
Добрый день.
Почитал статью, начал разбираться и непонял вот эту часть
"Еще один нюанс, наши астероиды вращаются вокруг своей оси, и после добавления полоски жизни, она тоже будет вращаться. Поэтому сам астероид и его картинку нужно разнести в разные мувиклипы и поворачивать только вложенную картинку (bg)."
Копался в коде, но так и не понял что это значит.
Еще в библиотеке есть турель и есть турель_bg, на турель_bg нету скрипта, но если удалить ее из библиотеки, то в игре нету этой турели.

Вроде бы вопросы схожи и мне непонятно про это bg. Если можно простенький примерчик или объяснение про эти bg.
Спасибо.

twix1124
12.06.2009, 22:00
Респект тебе, автор =) Только вчера скачала flash, 2я страница html - "полёт нормальный" =)

Так объяснит кто-нить, как это фиксить? "parent.play();"
Не нашёл как отлючить стриикт мод (даж не знаю что это) в русской версии... Можно ли без отключения? А то после загрзки начинает мигать "второй фрейм куда кладем большую картинку, чтобы протестировать процесс отображения загрузки"...

З.ы. нигде не мог найти пример создания игры

Raimund
25.07.2009, 01:07
объясните мне чайнику.
почему s выделено плюсами trace("s="+s+", ar="+ar);?
function CheckArguments2(s:String, ... ar):void {
trace("s="+s+", ar="+ar);
}
CheckArguments2("test", 1,7,"check"); // s=test, ar=1,7,check

SergFD
02.08.2009, 13:18
все работает, пускай автор не обижается но мне кажется что этоу игру написал не он
1) Start- почему не на руском да и прочие еденицы в игре на английскоком в том числе.
2) Код без коментов -- это настараживает
Но всеравно спасибо автору темы за исходники.

BlooDHounD
02.08.2009, 14:37
SergFD, оставьте свои кажется при себе. а то часто креститься придётся.

buskaMuza
06.08.2009, 13:11
Маленькое отступление. Мне стало интересно, почему при добавлении числа к строке “строка”+Number, его не нужно преобразовывать в строку toString() ? Написал маленькую проверку:

var s:String="1";
var num:Number=4;
s+=num;
num+=s;
trace("s="+s+", num="+num); // s=14, num=414

Ни каких ошибок компилятор не выдал. Это что же получается, все как раньше? Переменная num по пути из Number стала String и в результате получили “414” вместо ожидаемых “18” или хотя бы ошибки компиляции?! Нафига тогда вообще типы переменных нужны? Что-то я не понял


Это нормально как раз :) Пусть есть 2 переменные разных типов: число и строка. Вы производите с ними какое-то совместное действие. При этом есть 3 варианта:
- выдать ошибку, что типы не соответствуют;
- преобразовать строку в число и выполнить действие как с числами;
- преобразовать число в строку и выполнить с ними операцию как со строками.

Почему Вы считаете, что третий вариант хуже второго? :) Если уж так следить за типами, то выбирать третий вариант. Но в подобной ситуации, думаю, достаточно выбрасть стандартный способ - третий.

А вообще - спасибо за детальное описание создания игры. Сейчас как-то задумала поизучать флеш (а вдруг игру какую-то захочется сделать :) ) и почитать будет полезно. И так поняла, что хорошо, что сейчас начала изучать - когда уже появился AS3 и не надо задумываться о том, как было раньше.

Пока что пробую сделать карточную игру типа "Башенки" :) Застоорилась на событии клацанья по карте - не знаю пока что как это делается по-человечески.... чтоб нигде потом ничего не потерялось и все правильно работало.
Но пока что флеш вместе с AS почти полностью меня захватил и увлек! :)

SergFD
13.08.2009, 14:58
все работает, пускай автор не обижается но мне кажется что этоу игру написал не он
1) Start- почему не на руском да и прочие еденицы в игре на английскоком в том числе.
2) Код без коментов -- это настараживает
Но всеравно спасибо автору темы за исходники.
Был не прав - извеняюсь прерд автором.:drinks:

veisss
01.09.2009, 12:19
действительно классная статья. сам с нее начал AS3 учить, вот во что у меня превратилась сие творение Robocity (http://geoflasher.host56.com/projects/robots/)

VladiT
30.09.2009, 23:53
Автор, ты реально крут:) у знакомого взял этот пример, начал ковыряться и вот только сейчас нашел этот форум. До этого никогда не работал с флешем, а тут решил попробывать, делал все на AFlash CS4, 10-й Player. После биллион ошибок, вроде все стало работать(хотя есть кое какие глюки дошел до посл. стр). Вот только мне почемуто показалось, что игру я делал быстрее чем учил флеш, хотя вникал и переписывал все в ручную, вплоть до комментариев. Сейчас вот проблемы с этой моделью дисплей-объектов AS3.0 ни как вникнуть немогу, что где куда... не вижу общей картины связаности, также так как там не указан Document class, без понятия как порядок загрузки мувиков... чувствую сейчас отправят в гугл :)

Насчет примера, так как код старый, незнаю реально ли на нем нормально научиться... повторюсь до этого с флешем не связывался, начил ровно с AFlash CS4 и AS3.0.

petrikov
04.10.2009, 03:04
Я тоже начал с cs4, порыскав в интернете на предмет обучающих материалов, наткнулся на сей пример. Сперва на несущественные вещи (на мой взгляд) забивал, но потом пришел к выводу, что я в принципе не понимаю, что делаю)). В итоге начал заново и все по порядку.
Ближе к делу.
// Нажатие кнопки мыши по нашему мувику
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);
}

при клике мышкой на фоне фон улетает в сторону. Внимание - вопрос. Как осуществляется расчет координат на сцене? мувик с фоном нужно помещать центром в левый верхний угол scene? Ответы на самые тупые вопросы искать тяжелее всего...

TonKhaO
18.10.2009, 14:07
прям вопрос по первому пункту, хеллооу ворлд почему не получаетися посмотрите скриншот, все сделал как там написано и нифига в аутпуте нету
[откоцано за разнос страницы форума]

Anate
09.11.2009, 23:15
Я тоже вначале застрял. Практически ничего не понимаю. Есть уроки по ActionScript 3.0 для совсем чайников?

mykolka
25.11.2009, 19:13
очень понравился урок (да и сама игра). сижу вот разбираюсь. автору большое спасибо!

пока не смог отловить утечку памяти: через несколько минут игры начинаются жуткие тормоза (загрузка процессора под 100%). юзаю флеш цс4. деструкторы вроде везде стоят. мож сборщик мусора в флеше плохо работает?

mysBer
02.12.2009, 00:27
Подскажите пожалуйста, в чём ошибка:

TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.
at src::moving_object()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at src::sky()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at game_fla::MainTimeline()
TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.
at src::moving_object()
at src::sky()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at game_fla::MainTimeline()

bzzt
03.12.2009, 23:46
Подскажите пожалуйста, в чём ошибка:

TypeError: Error #1007: Попытка реализации в объекте, который не является конструктором.
at src::moving_object()
at flash.display::Sprite/constructChildren()
...


У тебя мувик, полагаю, компилируется для 10-го флешплеера. Поставь в настройках 9-ку, мне помогло. Сам код затыкается в moving_object(), при Velocity = new Vector().

mysBer
04.12.2009, 01:28
bzzt, спасибо огромное! Помогло!

DVHERO
17.12.2009, 14:37
Здравствуйте. Вот повезло найти этот форум. Начать разбиратся в этой игре что и как по туториалу. Все шло хорошо, но сейчас возникла проблема с астероидами, они не двигаются..., делал все как написано в туторе, просматривал исходник, вроде все также, но мой пример почему то не работает,подозреваю что косяки в moving_object и sky,больше негде)
vector тоже использую из туториала

moving_object.as

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;
}
}
}

sky.as

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();
}
}
}


что я делаю не так

CrazyFlasher
17.12.2009, 14:43
код не читабелен...читайте про конвенции оформления кода.

http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions

DVHERO
17.12.2009, 15:03
sky.as

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

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

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

в moving_object.as

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
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
С точки зрения грамотного ООП программирования на AS3, эта статья полная лажа. Яркий пример того, как не надо писать на AS3 :) Ее не стоит рекомендовать желающим изучить AS3... но она может быть полезна тем, кто переходит с AS1,2 на AS3...а что (кроме Мука) можно почитать, чтобы грамотно писать на AS3?

ageent
17.02.2010, 13:19
огромное спасибо

cpu
14.03.2010, 17:38
Решил делать сам по тексту, не смотря в исходники(зато ошибки компиляции отлавливаю, все делаю в строгом режиме:bb:). Мозг уже сломал наверно.
У меня непонимание места с секторами, и проверкой на столкновение.
А именно delete all_sectors[s][obj.name]; и 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.

Короче 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.

Дебугер вроде на эту строчку указывает:
this.progressbar.gotoAndStop(percent+1);

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

dex157
16.04.2010, 09:57
Так же хотел поблагодарить MerlinTwi за прекрасную статью..) спустя 4 года, многие, и я в том числе, находим в ней много полезного..)
Мне вот очень интересно, как бы вы сейчас сделали обращения из объекта пушки(любой) к цели, 4 года назад работала конструкция
parent.all_sectors, как лучше сейчас это реализовывать, через главный класс(в случае игры sky)..? или как то через эвенты..?

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

Dark_Omen
26.04.2010, 16:46
Делаю прелоадер, получаю такую ошибку:
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
Начал чтение этого восхетительного мануала, признаюсь что очень доволен понятным языком Автора "MerlinTwi" мои благодарности. Правдо, как выше описанно, есть недочёты, но их покрывает год выпуска этого мануала. Ценная инфа. Ещё раз спасибо.

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

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

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

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

N1kk_
30.09.2010, 16:40
Милый мануал)

Но у меня проблема. В общем, ошибка такая
TypeError: Error #1010: Термин не определен и не имеет свойств.
at main::Preloader/Update()
Код класса прелоадера
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 = "Загрузка...";
}
}
}
выскакивает ошибка видимо в строчке
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..." ругается. "Термин не определен и не имеет свойств"

код:

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();
}
}

}
}

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

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. код:
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 именно с этого туториала.
И так затянуло, что решил доделать игру до победного.

Более подробно про процесс создания написано тут (http://krolser.wordpress.com/2010/12/21/planet-defense-1-0-release/).

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

Это не рекламная мессага. Это благодарность за труд проделанный MerlinTwi.
Но если вам не лень, то можно и проголосовать 5/5 на
newgrounds.com (http://www.newgrounds.com/portal/view/556968)
kongregate.com (http://www.kongregate.com/games/twotowersgames/planet-defense)

goldlider
20.11.2011, 22:05
Не могли бы помочь разобраться с переменной dragRect. Вот отрывок из класса background.
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
P.S. Спустя почти год, я вижу, что в ней очень много грубых ошибок и все можно было бы сделать проще и "правильней". Но тем не менее, считаю, что статья полезна тем, кто переходит с AS2 на AS3.

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

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

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

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

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

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