Фабрика. Корабли и снаряды

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Фабрика. Корабли и снаряды

Сообщение Agiliter »

День добрый! Хочу реализовать два-три перестреливающихся между собой корабля (или самолета). Пробовал реализовать фабричный метод. Однако, удалось это лишь частично.
Итак, есть класс Корабль

Код: Выделить всё

package  {    import flash.display.Sprite;     public class Ship extends Sprite     {        public var ballCreator:BallCreator;     // создатель снарядов          public var weaponsArray:Array;      // доступные снаряды                public function Ship() { }                // Абстрактный метод (должен быть замещен в подклассе)        public function drawShip():void {}                  internal function setLoc(xLoc:int, yLoc:int):void         {            this.x = xLoc;            this.y = yLoc;         }                      public function initWeapons(ar:Array):void          {            weaponsArray = ar;             // реализуем создатель снарядов                      ballCreator = new BallCreator();        }        } }
Есть фабрика кораблей

Код: Выделить всё

package  {    import flash.display.Stage;      public class ShipCreator     {               public function ShipCreator() {}                 public function addShip(shipType:String, target:Stage, xLoc:int, yLoc:int, ar:Array):Ship        {             var ship:Ship = this.createShip(shipType);             ship.drawShip(); // рисуем корабль             ship.setLoc(xLoc, yLoc); // устанавливаем координаты x и у            target.addChild(ship); // добавляем спрайт на сцену                ship.initWeapons(ar);// инициализируем вооружение            return ship;         }                 private function createShip(shipType:String):Ship        {             switch(shipType)            {                case "Su34":                    return new Su34();                    break;                case "F15":                    //return new F15();                    break;                case "Mig24":                     //return new F15();                    break;                                    default:                     throw new Error("Invalid kind of ship specified");                     trace("Invalid kind of ship specified");                    return null;            }                       return null;         }          }}
Каждый конкретный вид кораблей (самолетов) вынесен в отдельный класс

Код: Выделить всё

package  {    import flash.display.*;    import flash.events.*;    import flash.net.*;     public class Su34 extends Ship      {        private var ship_URL:String = 'FlashDevelop/ShipProject_1/image/ships/Su34 .png';         private var ship:Loader = new Loader();                 private var shipBM:Bitmap;                public function Su34(){}                 public override function drawShip():void        {            ship.load(new URLRequest(ship_URL));            ship.contentLoaderInfo.addEventListener(Event.COMPLETE, ldr_complete);            ship.addEventListener(IOErrorEvent.IO_ERROR, BAD_TEST);         }                      function ldr_complete(evt:Event):void         {                       var bmp:Bitmap = ship.content as Bitmap; /                      shipBM = new Bitmap(bmp.bitmapData);                        addChild(shipBM);         }//-----------------------------------------------------------------------------------------         private function BAD_TEST(e:IOErrorEvent):void        {            trace("File not found! Ошибка:" + e);        }    }}
В мейне

Код: Выделить всё

  public class Main extends Sprite     {        var ship1:Ship;        var ship2:Ship;                public function Main()         {            // реализуем создатель кораблей            var shipFactory:ShipCreator = new ShipCreator();            // массивы оружия, не более 5 штук на корабль             var weaponsArray1:Array = ["Cannon", "Cannon", "Laser", "Laser", "Laser"];            var weaponsArray2:Array = ["Cannon", "Cannon", "Cannon", "Cannon", "Laser"];                        // ставим корабли                              ship1 = shipFactory.addShip("Su34", this.stage, 200 , 200,weaponsArray2);            ship2 = shipFactory.addShip("Su34", this.stage, 600, 200, weaponsArray1);                   }           }
Корабли выводятся отлично. Теперь задача заставить их стрелять друг в друга.
Как я думаю, нужно реализовать что-то вроде ship1.fire(ship2); Список орудий (5 на каждый), установленных на корабле передается при создании корабля с помощью массива. А вот дальше как. Я пробовал создать фабрику снарядов типа

Код: Выделить всё

package  {    import flash.display.Stage;         // создатель снарядов      public class BallCreator     {               public function BallCreator() { }                public function addBall(ballType:String, target:Stage, xLoc:int, yLoc:int, ar:Array):void//:Ball        {            var ball:Ball = this.createBall(ballType);            trace("Firing " + ball.toString());            ball.drawBall(); // рисуем снаряд            ball.setLoc(xLoc, yLoc); // устанавливаем координаты x и у            target.addChild(ball); // добавляем спрайт на сцену               // заставляем снаряд двигаться, добавляя обработчик события enterframe            ball.release();        }                public function createBall(ballType:String,color:int = 0x000000):Ball        {            switch(ballType)            {                case "Cannon":                    return new CannonBall();                    break;                            case "Laser":                    return new LaserBall();                    break;                                                  default:                    throw new Error("Invalid kind of ball specified");                    trace("Invalid kind of ball specified");                    return null;            }                   return null;        }               }}
Сам класс снарядов

Код: Выделить всё

package  {    import flash.display.Sprite;    import flash.events.Event;     public class Ball extends Sprite     {        public var enemy:Ship;        internal var xSpeed:Number; // содержит скорость снаряда        internal var ySpeed:Number;        internal var zSpeed:Number;                public function Ball(ship:Ship, speed:Number)        {            enemy = ship;            xSpeed = (this.x - ship.x) / speed;            ySpeed = (this.y - ship.y) / speed;            xSpeed = (this.z - ship.z) / speed;        }                // Абстрактный метод (должен быть замещен в подклассе)        internal function drawBall():void {}                internal function release():void        {            // Подключить функцию doMoveBall на событие ENTER_FRAME            this.addEventListener(Event.ENTER_FRAME, this.doMoveBall);        }                internal function setLoc(xLoc:int, yLoc:int):void        {            this.x = xLoc;            this.y = yLoc;        }                // обновить спрайт снаряда        internal function doMoveBall(e:Event):void        {            // переместить снаряд            this.x += xSpeed;            this.y += ySpeed;            this.z += zSpeed;            // убрать снаряд, если он вышел за границы сцены            if(this.hitTestPoint(enemy.x,enemy.y))// || (this.y < 0) || (this.y > this.stage.stageHeight) || (this.x < 0) || (this.x > this.stage.stageWidth))            {                //убрать обработчик события                //this.removeEventListener(Event.ENTER_FRAME,this.doMoveBall);                this.stage.removeChild(this); // убрать спрайт со сцены            }        }           } }
Конкретный представитель

Код: Выделить всё

package  {    public class CannonBall extends Ball    {               public function CannonBall(){}                      override internal function drawBall():void        {            graphics.lineStyle(3, 0x000033); // синий            graphics.drawCircle(0, 0, 5);        }    }}
Но что-то запутался что от кого происходит и кто за что должен отвечать. Пробовал чертить схемы, но опять таки не преуспел. Может, изначальная логика не верна?
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Фабрика. Корабли и снаряды

Сообщение alexandr_ratush »

Если хотите, то киньте мне в личку исходник вашего проекта в архиве. Я посмотрю, может что и получиться вам подсказать.
Ответить