Просмотр полной версии : Мучительный переход с Flash Professional на FlashDevelop: Timeline
Здравствуйте!
Имея за плечами пару игр на GameMaker и Love2D, решил познакомиться с ActionScript3.0.
Немного почитав и поковырявшись в уроках, я начал пилить игру, используя Adobe Flash и Notepad++.
Когда же я решил перейти на FD, я столкнулся с проблемой отсутствия timeline. До сих пор структура игры представляла собой примерно следующее:
В timeline у меня были кадры "Loader", "Menu", "Level" и "GameOver". На каждый из кадров я поместил (drag'n'drop) экземпляр объекта соответствующего класса. Соответственно, все объекты, отображающиеся и взаимодействующие в пределах той или иной "комнаты", были "детьми" соответствующего основного контроллера.
Теперь же я столкнулся с необходимостью прописывать структуру этих самых "комнат" или "уровней" кодом. И не знаю, как лучше это сделать. В любом случае, думаю, что за всё происходящее на "уровне" должен быть ответственен соответствующий объект-контроллер, являющийся родителем всех элементов "уровня". Вопрос в том, куда его совать. У меня в голове было 2 варианта:
1. В классе Main создавать (помещать на сцену) экземпляр контроллера соответствующего уровня, а при "переходе" между уровнями удалять один и создавать другой.
2. Сразу добавить контроллеры уровней в кадры контроллера, являющегося MovieClip. А потом просто переходить между кадрами.
Пожалуйста, подскажите, верны ли мои рассуждения и как лучше реализовать систему перехода между уровнями?
P.S. Заранее прошу прощения за ваш возможный facepalm при прочтении моего вопроса. Я новичок.
P.S.S. Как, чёрт возьми, делать спойлер, чтобы спрятать длиннющее лирическое вступление?
Alex Lexcuk
18.10.2013, 12:08
Схема игрового меню подходящая под описание
http://www.emanueleferonato.com/2009/01/16/designing-the-structure-of-a-flash-game-as3-version-part-3/
Не, если у вас процесс завязан на графику - можете компилировать и рисовать свои уровни в FlashProfessional, а код править не в Notepad++, а во FlashDevelop.
Схема игрового меню подходящая под описание
http://www.emanueleferonato.com/2009/01/16/designing-the-structure-of-a-flash-game-as3-version-part-3/
Я уже решил, как буду делать: каждому уровню присвою свой класс, а при переходе с уровня на уровень буду удалять экземпляр класса текущего уровня и помещать на сцену нужный. Вобщем, по сути, как в предложенном примере. Пока такая система устраивает, посмотрим, что будет дальше, когда надо будет делать между уровнями переходы.
За ссылку спасибо, может, какие-то механизмы оттуда применю у себя.
Может, взять и научиться делать как надо?
caseyryan
18.10.2013, 20:12
Пока такая система устраивает, посмотрим, что будет дальше
Могу сразу сказать, что будет дальше. Утечки памяти, непонятные баги из-за того, что после удаления из дислпей листа экземпляры продолжают жить своей жизнью.
Перед тем, как заняться этим делом, советую сразу почитать литературу по работе с памятью в ас3. Точнее по правильной очистке ссылок на объекты и сборщик мусора. Иначе это все вылезет в такой гемор, что аж страшно подумать
Может, взять и научиться делать как надо?
Полностью с вами согласен. Так вы подскажите, как именно надо? Не подробно, хотя бы принцип. Пока что сделал наподобие того, как описано в предложенной схеме (http://www.emanueleferonato.com/2009...ersion-part-3/) (из кода убрал не относящиеся к делу детали):
Main.as:
package {
import... // тут всякий импорт
public class Main extends Sprite {
// КОМНАТЫ
private const TheMenu:Menu=new Menu();
private const TheLevel:Level=new Level();
private const TheGameOver:GameOver = new GameOver;
// СПИСОК КОМНАТ
private const _Rooms:Array = new Array(TheMenu, TheLevel, TheGameOver);
private var _curIn:uint = 0; // индекс текущей комнаты
private var _newIn:uint; // индекс комнаты-цели
// CONSTRUCTOR
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
// INIT
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
addChild(_Rooms[_curIn]); // добавляем на сцену комнату 'Меню' из массива
// добавляем в комнату слушателя перехода (собственное событие)
_Rooms[_curIn].addEventListener(MyEvent.TRANSITION,transition)
};
// ПЕРЕХОД
private function transition(e:MyEvent):void {
_newIn = e.tar; // индекс комнаты-цели, переданный через собственное событие
// удаляем слушателя перехода из текущей комнаты
_Rooms[_curIn].removeEventListener(MyEvent.TRANSITION, transition)
// уничтожаем все комнаты
while (numChildren > 0) { removeChildAt(0) };
System.gc(); // собираем мусор
// добавляем новую комнату в соответствии с переданным индексом
addChild(_Rooms[_newIn]);
// добавляем в новую комнату слушателя перехода
_Rooms[_newIn].addEventListener(MyEvent.TRANSITION, transition)
_curIn = _newIn; // делаем новую комнату текущей
};
};
};
Menu.as:
package Rooms {
import... // импорт
public class Menu extends Sprite {
private var _b:Btn; // кнопка (Btn - свой класс кнопки)
private var _tf:TF; // текст (TF - свой класс текстового поля)
// CONSTRUCTOR
public function Menu() {
// создание и удаление всего при добавлении и удалении со сцены
addEventListener(Event.ADDED_TO_STAGE, init);
addEventListener(Event.REMOVED_FROM_STAGE, cleanup);
};
//INIT
private function init(e:Event): void {
_tf = new TF('Menu'); // добавляем текст
addChild(_tf);
_b = new Btn() //добавляем кнопку
addChild(_b);
// добавляем кнопке слушателя нажатия
_b.addEventListener(MouseEvent.CLICK, bHit);
};
//CLEANUP
private function cleanup(e:Event): void{
// убираем слушателя кнопки
_b.removeEventListener(MouseEvent.CLICK, bHit);
};
// НАЖАЛИ КНОПКУ
private function bHit(m:MouseEvent):void {
// собственное событие, передаём индекс комнаты-цели (Menu-0, Level-1, GameOver-2)
dispatchEvent(new MyEvent(MyEvent.TRANSITION,1));
// удаляем слушателя нажатия
_b.removeEventListener(MouseEvent.CLICK, bHit);
// уничтожаем всех детей
while (numChildren > 0) { removeChildAt(0) };
};
};
};
Классы Level и GameOver сделаны так же, как и Menu.
Пожалуйста, подскажите, подходит ли вообще такой принцип?
Если нет, то я тогда пока вообще не представляю, как без кадров делать переходы.
А если сам принцип верен, то что можно/нужно добавить/исправить/убрать?
Перед тем, как заняться этим делом, советую сразу почитать литературу по работе с памятью в ас3. Точнее по правильной очистке ссылок на объекты и сборщик мусора. Иначе это все вылезет в такой гемор, что аж страшно подумать
В связи с отказом от Flash Professional литературу и различные уроки читаю постоянно., отводя этому значительно больше времени, нежели практике. Но полагаю (и в этом я не одинок), что последняя должна непременно подкреплять теорию, поэтому стараюсь пробовать всё, про что читаю. Про переходы решил спросить на форуме только после долгих того, как отчаялся разобраться сам. Игру за меня писать не надо:), мне бы только сам принцип переходов подсказать, а дальше я постараюсь смекнуть сам.
Akopalipsis
19.10.2013, 01:42
Посмотрите в этой теме (http://www.flasher.ru/forum/showthread.php?t=138349) две ссылки в первом сообщении. Там как раз про игры.
caseyryan
19.10.2013, 08:27
Не нужна новичку эта тема. Слишком все это сложно для восприятия неподготовленным человеком
a7s1h1,
Ну вот примерно как в схеме и надо. Старайтесь во флеш IDE делать только графику. Код, переходы по экранам и всю остальную логику работы игры нужно писать в классах.
В самом AS нет понятия "переход". Вы как программист, сами создаёте такое высоко-уровневое понятие в вашей игре. Вам предоставлены спрайты, массивы, переменные и все остальные базовые инструменты. Из них вы собираете и описываете "переходы", "проигрыши" и всё остальное.
Например, переход по экранам можно сделать, как в показанном вами примере. Где отдельный Sprite - представляет "один экран":
private const TheMenu:Menu=new Menu();
private const TheLevel:Level=new Level();
private const TheGameOver:GameOver = new GameOver;
Подключая один из спрайтов на экран addChild, removeChild - вы сымитируете тот самый "переход".
Внутри каждого класса: Menu, Level, GameOver - вы можете описать работу каждого экрана как вам надо. Представте, что это отдельные кадры, в которых вы пишете код.
Изначально так и делал, просто сомневался в целесообразности такого подхода, а теперь понял, что так нормально. В любом случае, уж лучше, наверное, чем через кадры:) Всем спасибо большое за советы!
a7s1h1,
Старайтесь во флеш IDE делать только графику. Код, переходы по экранам и всю остальную логику работы игры нужно писать в классах.
Да-да, я так и старался всегда. Вчера, наконец, окончательно перенёс всё в FD, чтобы спокойно работать с чистым кодом. Символы для классов продолжаю рисовать в Flash IDE, затем переношу их в swc в папку lib проекта. Чтобы "присвоить" символ классу, приходится делать следующее:
public class Archer extends s_Archer {,
где Archer - это класс с кодом (Archer.as), а s_Archer - символ из библиотеки.
Можно ещё через addChild(new s_Archer()), но тогда картинка не наследует свойства класса, т.е. например, не поворачивается к мыши и т.д., а через extends всё работает.
Подскажите, есть ли ещё лучшие способы "присвоения" классу картинки из swc? Или так пойдёт?
Старайтесь постепенно переносить весь код игры - только в FD. Написать код поворота картинки к мышке, вы можете в нём. В swc можно оставить самые базовые коды управления анимацией в символах, gotoAndPlay, stop.
Что-бы присвоить символ классу, можно использовать extends или addChild. Пока вы не видите разницы в этих способах, делайте так как вам удобнее. По немногу узнавайте, что такое extends и как оно работает, читайте про ооп. В ближайшем будущем, вам обязательно придёт понимание как лучше и удобнее у себя сделать.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.