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

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.

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

Сообщение Agiliter » 09 апр 2014, 12:54

День добрый! Хочу реализовать два-три перестреливающихся между собой корабля (или самолета). Пробовал реализовать фабричный метод. Однако, удалось это лишь частично.
Итак, есть класс Корабль
  1. package  
  2. {
  3.     import flash.display.Sprite;
  4.  
  5.     public class Ship extends Sprite
  6.     {
  7.         public var ballCreator:BallCreator;     // создатель снарядов 
  8.         public var weaponsArray:Array;      // доступные снаряды
  9.        
  10.         public function Ship() { }
  11.        
  12.         // Абстрактный метод (должен быть замещен в подклассе)
  13.         public function drawShip():void {} 
  14.        
  15.         internal function setLoc(xLoc:int, yLoc:int):void
  16.          {
  17.             this.x = xLoc;
  18.             this.y = yLoc;
  19.          }     
  20.        
  21.         public function initWeapons(ar:Array):void
  22.          {
  23.             weaponsArray = ar;
  24.              // реализуем создатель снарядов         
  25.             ballCreator = new BallCreator();
  26.         }   
  27.      }
  28.  }

Есть фабрика кораблей
  1. package  
  2. {
  3.     import flash.display.Stage;
  4.  
  5.      public class ShipCreator
  6.     {      
  7.         public function ShipCreator() {}
  8.        
  9.          public function addShip(shipType:String, target:Stage, xLoc:int, yLoc:int, ar:Array):Ship
  10.         {
  11.              var ship:Ship = this.createShip(shipType);
  12.              ship.drawShip(); // рисуем корабль
  13.              ship.setLoc(xLoc, yLoc); // устанавливаем координаты x и у
  14.             target.addChild(ship); // добавляем спрайт на сцену   
  15.              ship.initWeapons(ar);// инициализируем вооружение
  16.             return ship;
  17.          }
  18.        
  19.          private function createShip(shipType:String):Ship
  20.         {
  21.              switch(shipType)
  22.             {
  23.                 case "Su34":
  24.                     return new Su34();
  25.                     break;
  26.                 case "F15":
  27.                     //return new F15();
  28.                     break;
  29.                 case "Mig24":
  30.                      //return new F15();
  31.                     break;
  32.                    
  33.                 default:
  34.                      throw new Error("Invalid kind of ship specified");
  35.                      trace("Invalid kind of ship specified");
  36.                     return null;
  37.             }          
  38.             return null;
  39.          }     
  40.     }
  41. }

Каждый конкретный вид кораблей (самолетов) вынесен в отдельный класс
  1. package  
  2. {
  3.     import flash.display.*;
  4.     import flash.events.*;
  5.     import flash.net.*;
  6.  
  7.     public class Su34 extends Ship  
  8.     {
  9.         private var ship_URL:String = 'FlashDevelop/ShipProject_1/image/ships/Su34 .png';
  10.          private var ship:Loader = new Loader();       
  11.          private var shipBM:Bitmap;
  12.        
  13.         public function Su34(){}
  14.        
  15.          public override function drawShip():void
  16.         {
  17.             ship.load(new URLRequest(ship_URL));
  18.             ship.contentLoaderInfo.addEventListener(Event.COMPLETE, ldr_complete);
  19.             ship.addEventListener(IOErrorEvent.IO_ERROR, BAD_TEST);
  20.          }     
  21.        
  22.         function ldr_complete(evt:Event):void
  23.         {          
  24.             var bmp:Bitmap = ship.content as Bitmap; /         
  25.             shipBM = new Bitmap(bmp.bitmapData);           
  26.             addChild(shipBM);
  27.          }
  28. //----------------------------------------------------------------------------------------- 
  29.         private function BAD_TEST(e:IOErrorEvent):void
  30.         {
  31.             trace("File not found! Ошибка:" + e);
  32.         }
  33.     }
  34. }


В мейне
  1.  public class Main extends Sprite
  2.     {
  3.         var ship1:Ship;
  4.         var ship2:Ship;
  5.        
  6.         public function Main()
  7.         {
  8.             // реализуем создатель кораблей
  9.             var shipFactory:ShipCreator = new ShipCreator();
  10.             // массивы оружия, не более 5 штук на корабль
  11.              var weaponsArray1:Array = ["Cannon", "Cannon", "Laser", "Laser", "Laser"];
  12.             var weaponsArray2:Array = ["Cannon", "Cannon", "Cannon", "Cannon", "Laser"];           
  13.             // ставим корабли                 
  14.             ship1 = shipFactory.addShip("Su34", this.stage, 200 , 200,weaponsArray2);
  15.             ship2 = shipFactory.addShip("Su34", this.stage, 600, 200, weaponsArray1);          
  16.         }      
  17.     }

Корабли выводятся отлично. Теперь задача заставить их стрелять друг в друга.
Как я думаю, нужно реализовать что-то вроде ship1.fire(ship2); Список орудий (5 на каждый), установленных на корабле передается при создании корабля с помощью массива. А вот дальше как. Я пробовал создать фабрику снарядов типа
  1. package  
  2. {
  3.     import flash.display.Stage;
  4.      
  5.     // создатель снарядов 
  6.     public class BallCreator
  7.     {      
  8.         public function BallCreator() { }
  9.        
  10.         public function addBall(ballType:String, target:Stage, xLoc:int, yLoc:int, ar:Array):void//:Ball
  11.         {
  12.             var ball:Ball = this.createBall(ballType);
  13.             trace("Firing " + ball.toString());
  14.             ball.drawBall(); // рисуем снаряд
  15.             ball.setLoc(xLoc, yLoc); // устанавливаем координаты x и у
  16.             target.addChild(ball); // добавляем спрайт на сцену   
  17.             // заставляем снаряд двигаться, добавляя обработчик события enterframe
  18.             ball.release();
  19.         }
  20.        
  21.         public function createBall(ballType:String,color:int = 0x000000):Ball
  22.         {
  23.             switch(ballType)
  24.             {
  25.                 case "Cannon":
  26.                     return new CannonBall();
  27.                     break;
  28.            
  29.                 case "Laser":
  30.                     return new LaserBall();
  31.                     break;             
  32.                    
  33.                 default:
  34.                     throw new Error("Invalid kind of ball specified");
  35.                     trace("Invalid kind of ball specified");
  36.                     return null;
  37.             }      
  38.             return null;
  39.         }          
  40.     }
  41. }

Сам класс снарядов
  1. package  
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.  
  6.     public class Ball extends Sprite
  7.     {
  8.         public var enemy:Ship;
  9.         internal var xSpeed:Number; // содержит скорость снаряда
  10.         internal var ySpeed:Number;
  11.         internal var zSpeed:Number;
  12.        
  13.         public function Ball(ship:Ship, speed:Number)
  14.         {
  15.             enemy = ship;
  16.             xSpeed = (this.x - ship.x) / speed;
  17.             ySpeed = (this.y - ship.y) / speed;
  18.             xSpeed = (this.z - ship.z) / speed;
  19.         }
  20.        
  21.         // Абстрактный метод (должен быть замещен в подклассе)
  22.         internal function drawBall():void {}
  23.        
  24.         internal function release():void
  25.         {
  26.             // Подключить функцию doMoveBall на событие ENTER_FRAME
  27.             this.addEventListener(Event.ENTER_FRAME, this.doMoveBall);
  28.         }
  29.        
  30.         internal function setLoc(xLoc:int, yLoc:int):void
  31.         {
  32.             this.x = xLoc;
  33.             this.y = yLoc;
  34.         }
  35.        
  36.         // обновить спрайт снаряда
  37.         internal function doMoveBall(e:Event):void
  38.         {
  39.             // переместить снаряд
  40.             this.x += xSpeed;
  41.             this.y += ySpeed;
  42.             this.z += zSpeed;
  43.             // убрать снаряд, если он вышел за границы сцены
  44.             if(this.hitTestPoint(enemy.x,enemy.y))// || (this.y < 0) || (this.y > this.stage.stageHeight) || (this.x < 0) || (this.x > this.stage.stageWidth))
  45.             {
  46.                 //убрать обработчик события
  47.                 //this.removeEventListener(Event.ENTER_FRAME,this.doMoveBall);
  48.                 this.stage.removeChild(this); // убрать спрайт со сцены
  49.             }
  50.         }      
  51.     }
  52.  
  53. }

Конкретный представитель
  1. package  
  2. {
  3.     public class CannonBall extends Ball
  4.     {      
  5.         public function CannonBall(){}     
  6.        
  7.         override internal function drawBall():void
  8.         {
  9.             graphics.lineStyle(3, 0x000033); // синий
  10.             graphics.drawCircle(0, 0, 5);
  11.         }
  12.     }
  13. }

Но что-то запутался что от кого происходит и кто за что должен отвечать. Пробовал чертить схемы, но опять таки не преуспел. Может, изначальная логика не верна?
С уважением,
М.Ф.
Agiliter

 
Автор темы
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46
Благодарил (а): 29 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



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

Сообщение alexandr_ratush » 09 апр 2014, 14:49

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

За это сообщение автора alexandr_ratush поблагодарил:
Agiliter
Аватара пользователя
alexandr_ratush

 
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47
Откуда: Ukraine
Благодарил (а): 2 раз.
Поблагодарили: 25 раз.


Вернуться в Программирование на Flash



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron