2013-04-24 96 views
0

好吧,让我首先说这是我的第一个AS3项目。我对Java很好,所以OOP和继承对我来说并不陌生。 我真的花了几个小时坐在这里,思考为什么我的代码不能像我想要的那样工作。 我要开始炮塔试图射击子弹。然而,尽管x和y坐标仍在变化,但子弹并未被吸引到屏幕上。 创建子弹/子弹的方法称为OnMouseClick。 这里是我的代码:AS3:即使添加子对象也不会显示

public class Main extends Sprite 
{ 
    public var projectileArr : Array = new Array(); //array which the projectile objects are stored 
    public var projCount : Number = 0; //projectile counter 

    public var curX:Number; //mouse coords 
    public var curY:Number; 



    private var tri1:Sprite = new Sprite(); 
    private var tri1Height:Number = 50; 

    private var rect1:Sprite = new Sprite(); 

    private var rect1W:Number = 2; 
    private var rect1H:Number = 10; 

    private var angle:Number = 0; 
    private var acceleration:Number = 0; 


    public var triSpeedX:Number = 0; 
    public var triSpeedY:Number = 0; 

    public var turretAngle:Number ; 

    //keyboard booleans 
    private var leftDown:Boolean = false, rightDown:Boolean = false, upDown:Boolean = false, downDown:Boolean = false; 

    public function Main():void 
    { 
     if (stage) 
      init(); 
     else 
      addEventListener(Event.ADDED_TO_STAGE, init); 
    } 

    private function init(e:Event = null):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     // entry point 

     //draw triangle 
     addChild(tri1); 

     tri1.graphics.lineStyle(1, 0xff00ff00); 
     tri1.graphics.beginFill(0xff0000); 
     tri1.graphics.moveTo(0, -tri1Height/2) 
     tri1.graphics.lineTo(tri1Height/3, +tri1Height/2); 
     tri1.graphics.lineTo(-tri1Height/3, +tri1Height/2); 
     tri1.graphics.endFill(); 

     tri1.x = 400; 
     tri1.y = 300; 

     //draw turret 
     addChild(rect1); 

     rect1.graphics.beginFill(0xFFFFFF); 
     rect1.graphics.moveTo(rect1W/2, -rect1H); 
     rect1.graphics.lineTo(rect1W/2, 0); 
     rect1.graphics.lineTo(-rect1W/2, 0); 
     rect1.graphics.lineTo(-rect1W/2, -rect1H); 
     rect1.graphics.endFill(); 

     rect1.x = tri1.x; 
     rect1.y = tri1.y; 

     stage.addEventListener(KeyboardEvent.KEY_UP, onUp); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown); 

     stage.addEventListener(Event.ENTER_FRAME, Run); 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, getMouseCoord); 
     stage.addEventListener(MouseEvent.MOUSE_DOWN, OnMouseClick); 
    } 

      //creation of projectile on click 
    public function OnMouseClick (e:MouseEvent):void 
    { 
     projectileArr[projCount] = new Projectile (rect1.x, rect1.y, turretAngle); //create a new projectile object 
     addChild(projectileArr [projCount]); //... then it doesn't display 
     projCount++; 
     trace ("BAM"); 


    } 
    public function getMouseCoord(e:MouseEvent):void 
    { 

     curX = mouseX; 
     curY = mouseY; 

    } 

    public function onUp(e:KeyboardEvent):void 
    { 

     if (e.keyCode == Keyboard.LEFT) 
      leftDown = false; 
     else if (e.keyCode == Keyboard.RIGHT) 
      rightDown = false; 

     if (e.keyCode == Keyboard.UP) 
      upDown = false; 
     else if (e.keyCode == Keyboard.DOWN) 
      downDown = false; 

    } 

    public function onDown(e:KeyboardEvent):void 
    { 
     if (e.keyCode == Keyboard.LEFT) 
      leftDown = true; 
     else if (e.keyCode == Keyboard.RIGHT) 
      rightDown = true; 

     if (e.keyCode == Keyboard.UP) 
      upDown = true; 
     else if (e.keyCode == Keyboard.DOWN) 
      downDown = true; 
    } 

    public function addProjToScreen (projectile:Projectile) : void 
    { 
     addChild(projectile); 
    } 
    private function Run(e:Event):void 
    { 
     acceleration = 0; //resets acceleration back to 0 to limit speed 
     if (leftDown) 
     { 
      angle -= 5; 
     } 
     else if (rightDown) 
     { 
      angle += 5; 
     } 

     if (upDown) 
     { 
      acceleration += 3; 
     } 
     else if (downDown) 
     { 
      acceleration -= 3; 
     } 

     triSpeedX += acceleration * Math.cos(angle * Math.PI/180); 
     triSpeedY += acceleration * Math.sin(angle * Math.PI/180); 

     tri1.x += triSpeedX; 
     tri1.y += triSpeedY; 

     //borders 
     if (tri1.x < 0) 
     { 

      triSpeedX *= -.5; 
      tri1.x = 0 ; 
     } 

     if (tri1.x > 800) 
     { 
      tri1.x = 800; 
      triSpeedX *= -.5; 
     } 

     if (tri1.y < 0) 
     { 

      triSpeedY *= -.5; 
      tri1.y = 0 ; 
     } 
     if (tri1.y > 600) 
     { 
      triSpeedY *= -.5; 
      tri1.y = 600; 
     } 

     //friction 
     triSpeedX *= 0.95 
     triSpeedY *= 0.95 


     rect1.x = tri1.x; 
     rect1.y = tri1.y; 


     var xCurDist:Number = curX - rect1.x; 
     var yCurDist:Number = curY - rect1.y; 

     turretAngle = Math.atan(yCurDist/xCurDist) * 180/Math.PI ; 

     if (xCurDist < 0 ) 
     { 
      turretAngle += 180; 
     } 
     if (xCurDist > 0 && yCurDist < 0) 
     { 
      turretAngle += 360; 
     } 

     rect1.rotation= turretAngle + 90; // + 90 to account for the sprite originally pointing up, which is 270 degrees ccw 

     tri1.rotation = angle + 90; 

     for (var i:int = 0 ; i < projCount ; i ++) 
     { 
      projectileArr [i].move(); 
     } 

    } 

} 

和弹丸类:

public class Projectile extends MovieClip 
{ 

    private var projectile : Sprite = new Sprite(); 

    private var speed: int = 10; 
    private var angle :Number; 

    private var xIncr: Number; 
    private var yIncr: Number; 

    public function Projectile(x:Number, y:Number, angle:Number) 
    { 
     this.x = x; 
     this.y = y; 

     this.angle = angle; 

     projectile.graphics.beginFill (0xFF0000); 
     projectile.graphics.drawCircle (x, y, 4); 
     projectile.graphics.endFill() ; 
     xIncr = speed * Math.cos (angle); // angle needs to be converted to radians 
     yIncr = speed * Math.sin (angle); 
    } 

    public function move() :void 
    { 
     trace (this.x + " " + this.y); 

     this.x += xIncr; 
     this.y += yIncr;   

    } 
    } 

我只是不知道我失踪...我调用addChild我所有的新创建的对象的, 还需要做什么?

回答

2

你不在你的构造函数中添加精灵弹丸到子弹的显示列表中。

addChild(projectile); 

此外,你正在加倍你的弹丸类中的x和y坐标。通过将projectile.graphics.drawCircle (x, y, 4);更改为projectile.graphics.drawCircle (0, 0, 4);

+0

谢谢!这样微不足道的错误... – Symmetry 2013-04-24 03:51:16

+0

等待,为什么addChild(射弹)给我:调用一个可能未定义的方法addChild 当我删除MovieClip继承并将我自己的x和y变量添加到抛射类时? – Symmetry 2013-04-24 04:10:49

+0

,因为addChild继承自DisplayObjectContainer,它是MovieClass的子类。 ref:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html 重要的是要注意,MovieClip继承了Sprite,所以不必拥有自己的Sprite实例可以直接绘制到MovieClip对象本身。 – Montycarlo 2013-04-24 04:22:36

相关问题