Итак, есть класс Корабль
Код: Выделить всё
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); } }}