0

私はボールをカノンから発射させようとしていますが、これは問題ありませんが、カノンを描画されたカノンからカノンのイメージに変更したいと考えています。しかし、これを行うと、ステージをクリックしてボールを撃つと次のエラーが発生しますが、描画されたバージョンではボールが計画どおりに撃たれます。

TypeError: エラー #1009: null オブジェクト参照のプロパティまたはメソッドにアクセスできません。code2/createNewBullet() で code2/mouseClickHandler() で

これは機能するコードです:

private function init():void {

        drawBoard = new MovieClip;
        drawBoard.graphics.beginFill(0xFFFFFF, 0); // white transparant
        drawBoard.graphics.drawRect(0, 0, gameWidth, gameHeight);
        drawBoard.graphics.endFill();
        addChild(drawBoard);
        // create canon
        canon = new MovieClip;
        canon = new MovieClip;
        canon.graphics.beginFill(0x000000);
        canon.graphics.drawRect(0, -10, 50, 20);
        canon.graphics.endFill();
        canon.rotation = -45;
        canon.x = 25;
        canon.y = gameHeight;
        addChild(canon);

これは、大砲に描かれた長方形の代わりに画像を使用するために私がやろうとしていることです ((画像は正常に読み込まれますが、エラーが発生します))

private function init():void {
        // create drawboard (the important movieclip, that holds all visible elements)
        drawBoard = new MovieClip;
        drawBoard.graphics.beginFill(0xFFFFFF, 0); // white transparant
        drawBoard.graphics.drawRect(0, 0, gameWidth, gameHeight);
        drawBoard.graphics.endFill();
        addChild(drawBoard);

        var canon:Loader = new Loader();
        var fileRequest:URLRequest = new URLRequest("cannon1.png");
        canon.load(fileRequest);
        canon.rotation = -45;
        canon.x = 25;
        canon.y = gameHeight;
        addChild(canon);


    }

必要に応じて、これは完全なコードです。

package {

// Copyright 2010-2011 - Seinia.com
// Find more crazy good AS3.0 tutorials and games on Seinia.com!

// imports
// --------------------------------------------------------------------------------------
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.*;
import flash.net.URLRequest;
import flash.display.Loader;
import flash.display.Sprite;

// Game class (MovieClip extension)
// --------------------------------------------------------------------------------------
public class code2 extends MovieClip {

    // game properties
    // --------------------------------------------------------------------------------------
    var drawBoard:MovieClip;
    var background:MovieClip;
    var gameWidth:int = 600;
    var gameHeight:int = 300;
    var gravity:Number = .4;
    var bullets:Array;
    var canon:MovieClip;

    // constructor
    // --------------------------------------------------------------------------------------
    public function code2():void {
        this.focusRect = false;
        this.init();
        addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
        addEventListener(MouseEvent.CLICK, mouseClickHandler, false, 0, true);
        bullets = new Array();
    }

    // init the game
    // --------------------------------------------------------------------------------------
    private function init():void {
        // create drawboard (the important movieclip, that holds all visible elements)
        drawBoard = new MovieClip;
        drawBoard.graphics.beginFill(0xFFFFFF, 0); // white transparant
        drawBoard.graphics.drawRect(0, 0, gameWidth, gameHeight);
        drawBoard.graphics.endFill();
        addChild(drawBoard);

        var canon:Loader = new Loader();
        var fileRequest:URLRequest = new URLRequest("cannon1.png");
        canon.load(fileRequest);
        canon.rotation = -45;
        canon.x = 25;
        canon.y = gameHeight;
        addChild(canon);


    }

    // mouse click handler
    // --------------------------------------------------------------------------------------
    private function mouseClickHandler(event:MouseEvent):void {
        createNewBullet();
    }

    // function to create a new bullet
    // --------------------------------------------------------------------------------------
    private function createNewBullet():void {
        // init and draw bullet
        var bullet:MovieClip = new MovieClip;
        bullet.graphics.beginFill(0xff0000);
        bullet.graphics.drawCircle(0, 0, 10);
        bullet.graphics.endFill();
        // define bullet start point and speed
        var cos:Number = Math.cos(canon.rotation * Math.PI / 180);
        var sin:Number = Math.sin(canon.rotation * Math.PI / 180);
        var speed:Number = 8;
        bullet.x = canon.x + cos * canon.width;
        bullet.y = canon.y + sin * canon.width;
        bullet.vx = cos * speed;
        bullet.vy = sin * speed;
        bullets.push(bullet);
        addChild(bullet);
    }

    // enter frame handler
    // --------------------------------------------------------------------------------------
    private function enterFrameHandler(event:Event):void {
        for (var i = 0; i < bullets.length; i++ ) {
            // gravity
            bullets[i].vy += gravity;
            // move bullet
            bullets[i].x += bullets[i].vx;
            bullets[i].y += bullets[i].vy;
            // remove star from stage?
            if (bullets[i].y >= gameHeight) {
                removeChild(bullets[i]);
                bullets.splice(i, 1);
            }
        }
    }
}

}

4

2 に答える 2

1

canoncreateNewBullet()メソッドにはスコープがありません。

canonクラスメンバー変数として宣言する必要があります。

現在、 canon はinit()メソッドのローカル変数です。

コメンターが指摘したように、宣言で canon を Loader タイプに変更する必要があります。

于 2013-04-17T19:40:18.523 に答える
1

問題はそれです

var canon:MovieClip;

プライベート変数として定義され、すべてのクラス メソッド内で使用できます。

var canon:Loader = new Loader();

init 関数で定義したものは、この関数スコープでのみ使用できます。関数の終了後、関数スコープで定義されたすべての変数は破棄されます。また、1 番目と 2 番目の変数は 2 つの異なる変数であることに注意してください。

問題を解決するには、ローダーにクラス変数を作成し、init 関数中にローダーを作成して値を割り当てる必要があります。このようにして、このクラスのすべての関数で利用できるようになります。

package {

// Copyright 2010-2011 - Seinia.com
// Find more crazy good AS3.0 tutorials and games on Seinia.com!

// imports
// --------------------------------------------------------------------------------------
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.*;
import flash.net.URLRequest;
import flash.display.Loader;
import flash.display.Sprite;

// Game class (MovieClip extension)
// ------------------------------------------------------------------------------------    --
public class code2 extends MovieClip {

    // game properties
    // --------------------------------------------------------------------------------    ------
    var drawBoard:MovieClip;
        var background:MovieClip;
    var gameWidth:int = 600;
    var gameHeight:int = 300;
    var gravity:Number = .4;
    var bullets:Array;
    var canon:Loader;

    // constructor
    // --------------------------------------------------------------------------------    ------
    public function code2():void {
        this.focusRect = false;
        this.init();
        addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
        addEventListener(MouseEvent.CLICK, mouseClickHandler, false, 0, true);
        bullets = new Array();
    }

    // init the game
    // --------------------------------------------------------------------------------    ------
    private function init():void {
        // create drawboard (the important movieclip, that holds all visible elements)
        drawBoard = new MovieClip;
        drawBoard.graphics.beginFill(0xFFFFFF, 0); // white transparant
        drawBoard.graphics.drawRect(0, 0, gameWidth, gameHeight);
        drawBoard.graphics.endFill();
        addChild(drawBoard);

        canon = new Loader();
        var fileRequest:URLRequest = new URLRequest("cannon1.png");
        canon.load(fileRequest);
        canon.rotation = -45;
        canon.x = 25;
        canon.y = gameHeight;
        addChild(canon);


    }

    // mouse click handler
    // --------------------------------------------------------------------------------    ------
    private function mouseClickHandler(event:MouseEvent):void {
        createNewBullet();
    }

    // function to create a new bullet
    // --------------------------------------------------------------------------------    ------
    private function createNewBullet():void {
        // init and draw bullet
        var bullet:MovieClip = new MovieClip;
        bullet.graphics.beginFill(0xff0000);
        bullet.graphics.drawCircle(0, 0, 10);
        bullet.graphics.endFill();
        // define bullet start point and speed
        var cos:Number = Math.cos(canon.rotation * Math.PI / 180);
        var sin:Number = Math.sin(canon.rotation * Math.PI / 180);
        var speed:Number = 8;
        bullet.x = canon.x + cos * canon.width;
        bullet.y = canon.y + sin * canon.width;
        bullet.vx = cos * speed;
        bullet.vy = sin * speed;
        bullets.push(bullet);
        addChild(bullet);
    }

    // enter frame handler
    // --------------------------------------------------------------------------------    ------
    private function enterFrameHandler(event:Event):void {
        for (var i = 0; i < bullets.length; i++ ) {
            // gravity
                bullets[i].vy += gravity;
            // move bullet
            bullets[i].x += bullets[i].vx;
            bullets[i].y += bullets[i].vy;
            // remove star from stage?
            if (bullets[i].y >= gameHeight) {
                removeChild(bullets[i]);
                bullets.splice(i, 1);
            }
        }
    }
}

}

于 2013-04-17T19:43:20.690 に答える