Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Привязать иерархию своих классов к символам из библиотеки для вывода на stage. (http://www.flasher.ru/forum/showthread.php?t=140090)

Alexk553 20.05.2010 03:21

Привязать иерархию своих классов к символам из библиотеки для вывода на stage.
 
Добрый день!
Столкнулся с такой проблемой.
Итак, делаю игру Rogue-like RPG (разновидлность пошаговой РПГ с полем в виде клеток, где на каждой клетке дискретно размещены элементы, например, пустой пол, кусок стены, игрок, монстр, и.т.д, несколько кусков стены в ряд формирует стену, к примеру), где, в простейшем виде есть базовый класс - Entity: всё, что имеет графичесое представление, будь то стена, пол, или монстр.

Мне кажется логичной такая идея(в простейшем виде): от Entity наследуется несколько классов: стена, пол, актёр. От актёра, в свою очередь наследуется класс игрока и монстра. От монстра наследуется целая иерархия их разновидностей до 9-го колена, т.к. у каждого семейства монстров могут быть свои дополнительные методы: типа кинуть камень, или убежать за угол и.т.п.

Вопрос вот в чём. Я наследую базовый класс всех отображаемых предметов (так как они анимированы) от movieclip. В библиотеке во Flash CS5 я строю иерархию графических элементов: стены, пол, игрок, монстры, и.т.д с помощю системы каталогов (например, каталог Goblin имеет разновидности гоблинов(symbol): пещерный, лесной, зелёный, злой, и.т.д. :)). Насколько я правильно понимаю, если в свойствах символа не указать "Export for ActionScript", то через as файлы нельзя будет отображать экземпляры символов на stage(поправьте, если я неправ). Допустим я указываю импортировать в AS. по умолчанию создаваемый класс наследуется от Movieclip. ДОпустим, я хочу работать с классом Wall. Свой базовый класс Entity я наследовал от того же Movieclip. От него я наследую, например, класс Wall. Когда я пишу в коде, который был создан после активизации галочки "export for AS", вместо "extends movieclip" "extends Entity" я получаю сообщение об ошибке. Хтя, казалось бы, при наследовании от класса, который наследуется от Movieclip, у него должны быть все те же методы и свойства, что и у movieclip.

Как мне поступить, чтобы я мог воспользоваться полиморфизмом в иерархии своих классов, а именно, методом Display() для любого объекта подкласса базового класса Entity, который позволяет отобразить монстра, стену, и.т.п. на stage, не говоря об отображении их различных состояний: убитый монстр, раненый монстр, целый монстр, и.т.п? У базового класса предполагается как минимум свойства координат в игровом пространстве, которые наследуются по всей иерархии.

bars80080 20.05.2010 12:01

Цитата:

вместо "extends movieclip" "extends Entity"
а
Код AS3:

import Entity;

в заголовке пакета с Wall ставили?

Alexk553 20.05.2010 20:11

Пробовал и так и сяк. делал так:
Создаю новый проект.
в нём в корне создаю новый файл test.fla
в этом файлк создаю в библиотеке символ CWall (рисую что-то, экспортирую как символ, не экспортирую)

В корне проекта создаю файл Main.as :
Код AS3:

package
{import flash.display.MovieClip;
 import Entity.Cwall;
 public class Main extends MovieClip
  {
  public function Main()
    {
    trace("OK!");
    var JWall:CWall = new CWall();
    //    JWall.Dr();
    // addChild(JWall);
    }
  }
}

в проекте создаю папку Entity
в ней создаю файл CEntity.as:

Код AS3:

package Entity 
{public class CEntity
  {protected var Xx,Yy : int;
  public function CEntity()
    {Xx=100;Yy=100;
    }
  }
}

в этой же папке создаю файл CWall
Код AS3:

package Entity 
{import Entity;
 public class Cwall extends CEntity
  {public function Cwall()
    {Xx=200;Yy=200;
    this.x=Xx;this.y=Yy;
    }
    public function Dr()
    {this.x=Xx;this.y=Yy;
      addChild(this)
    }
  }
}

при компиляции E:\Flash\Test\Main.as, Line 12 1046: Type was not found or was not a compile-time constant: CWall.

захожу в библиотеку, пытаюсь назначить класс для символа Cwall. При этом Adobe Flash создаёт новый файл, так как не находит описание класса, которое написано уже в Entity\Cwall.as

как решить проблему?

КорДум 20.05.2010 20:21

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

Добавлено через 5 минут
Хотя, я неправильно понял ваш вопрос. Так вот, что делаем: классы-поведения мы делаем иерархически, как вы и делаете. А вот в каждом классе-поведении создавать нужно экземпляр класса-пустышки-мувиклипа и с ним работать. Логика ясна?

Alexk553 20.05.2010 20:31

Иными словами воспользоваться композицией? Меня тоже посещала эта мысль. То есть композиция вместо наследования. и тогда в библиотеке может быть произвольная иерархия классов..

КорДум 20.05.2010 20:33

Конечно. Это же проще - все внимание на коде и в коде.

Alexk553 20.05.2010 20:36

Но я не знаю, как это реализовать. Когда я привязываю новый символ в библиотеке, создаётся новый файл с пустым шаблоном по типу:
Код AS3:
Код AS3:

package CEntity {
 
        import flash.display.MovieClip;
 
 
        public class CWall extends MovieClip {
 
 
                public function CWall() {
                        // constructor code
                }
        }
 
}

А что делать дальше? Выходит, сколько символов в библиотеке, столько будетт этих шаблонных файлов?

КорДум 20.05.2010 20:38

Да, столько и будет. Они нужны только для того, чтобы написать в классе-поведении что-то типа:
Код AS3:

private var clip:CWall = new CWall();


Alexk553 20.05.2010 20:39

В общем вопрос, как это всё организовать, чтобы потом не запутаться, т.к. предполагаю наличие нескольких сотен таких вот символов в иерархии.

КорДум 20.05.2010 20:43

Называйте классы-пустышки понятными именами. RightWall, LeftWall и прочее. Можно использовать суффиксы или постфиксы: Monster_GreenOgr, Monster_RedOgr. Ну и раскидывать в библиотеке по папкам. Это уже чисто для удобства. Дело вкуса. А можно потом экспортировать в swc-библиотеку и использовать в другой игре.


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

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