【问题标题】:Why will my two scenes not work with each other?为什么我的两个场景不能相互配合?
【发布时间】:2014-05-03 02:20:53
【问题描述】:

我一直在尝试在 Flash 中创建一个游戏,如果你按下某个数字和字母的组合,它会弹出一个额外的菜单。这部分我一直有问题。每当我对此进行测试时,它都会调出场景并在它们之间快速切换。如果有人可以帮助解决这个问题,我会很高兴。尚未包含返回第一个场景的选项。

我的代码:

package {

import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class DocumentMain extends MovieClip {

    public var _konamiCodeHandler:Number = 0;

    public var _bounces:TextField;
    public var _highscore:TextField;
    public var _gravityText:TextField;
    public var _ball:Ball;
    public var _resume:Resume;
    public var _cheatMenu:CheatMenu;

    private var _vx:Number;
    private var _vy:Number;

    public const GRAVITY:Number = 2;
    public const BOUNCE_FACTOR:Number = 0.8;
    public const HIT_FORCE:Number = 20;

    public function DocumentMain():void {
        _vx = 10;
        _vy = 0;

        stop();

        _cheatMenu = new CheatMenu;
        _cheatMenu.visible = false;

        _ball.buttonMode = true;

        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
        addEventListener(KeyboardEvent.KEY_DOWN, onKeyPressed);
    }

    private function enterFrameHandler(e:Event):void {

        // gravitate ball
        _vy += GRAVITY;

        // move ball
        _ball.x += _vx;
        _ball.y += _vy;

        // check stage boundaries
        checkBoundaryCollision();
    }

    private function mouseDownHandler(e:MouseEvent):void {
        // hit ball on click
        if (e.target == _ball) {
            hit(e.target.mouseX, e.target.mouseY);
        }
        if (e.target == _cheatMenu) {
            gotoAndStop(1, "Scene 2");
        }

    }

    private function onKeyPressed(e:KeyboardEvent):void {
        if (e.keyCode == Keyboard.UP && _konamiCodeHandler == 0) {
            _konamiCodeHandler = 1;
        } else if (e.keyCode == Keyboard.UP && _konamiCodeHandler == 1) {
            _konamiCodeHandler = 2;
        } else if (e.keyCode == Keyboard.DOWN && _konamiCodeHandler == 2) {
            _konamiCodeHandler = 3;
        } else if (e.keyCode == Keyboard.DOWN && _konamiCodeHandler == 3) {
            _konamiCodeHandler = 4;
        } else if (e.keyCode == Keyboard.LEFT && _konamiCodeHandler == 4) {
            _konamiCodeHandler = 5;
        } else if (e.keyCode == Keyboard.RIGHT && _konamiCodeHandler == 5) {
            _konamiCodeHandler = 6;
        } else if (e.keyCode == Keyboard.LEFT && _konamiCodeHandler == 6) {
            _konamiCodeHandler = 7;
        } else if (e.keyCode == Keyboard.RIGHT && _konamiCodeHandler == 7) {
            _konamiCodeHandler = 8;
        } else if (e.keyCode == Keyboard.B && _konamiCodeHandler == 8) {
            _konamiCodeHandler = 9;
        } else if (e.keyCode == Keyboard.A && _konamiCodeHandler == 9) {
            _cheatMenu.visible = true;
            _cheatMenu.buttonMode = true;
            _konamiCodeHandler = 0;
        } else {
            _konamiCodeHandler = 0;
        }
    }

    private function checkBoundaryCollision():void {
        var left:Number;
        var right:Number;
        var top:Number;
        var bottom:Number;

        left = _ball.x - (_ball.width / 2);
        right = _ball.x + (_ball.width / 2);
        top = _ball.y - (_ball.height / 2);
        bottom = _ball.y + (_ball.height / 2);

        if (left < 0 && _vx < 0) {
            _ball.x = (_ball.width / 2);
            _vx *= -BOUNCE_FACTOR;
        } else if (right > stage.stageWidth && _vx > 0) {
            _ball.x = stage.stageWidth - (_ball.width / 2);
            _vx *= -BOUNCE_FACTOR;
        }

        if (top < 0 && _vy < 0) {
            _ball.y = (_ball.height / 2);
            _vy *= -1;
        } else if (bottom > stage.stageHeight && _vy > 0) {
            _ball.y = stage.stageHeight - (_ball.height / 2);
            _vy *= -BOUNCE_FACTOR;

            if (Number(_bounces.text) > Number(_highscore.text)) {
                _highscore.text = _bounces.text
            }
            _bounces.text = "0";

        }

    }

    private function hit(hitX:Number, hitY:Number):void {
        // increment bounces
        _bounces.text = String(Number(_bounces.text) + 1);

        // adjust vertical velocity of ball
        if (_vy > 0) {
            _vy *= -BOUNCE_FACTOR / 2;
        }
        _vy -= HIT_FORCE;

        // adjust horizontal velocity of ball
        if (_vx * hitX > 0) {
            _vx *= -BOUNCE_FACTOR;
        }
        _vx -= (2 * hitX / _ball.width) * HIT_FORCE;
    }
}

}

这是我得到的错误:

TypeError:错误 #1034:类型强制失败:无法将 flash.display::MovieClip@7fffe980281 转换为 CheatMenu。 在 flash.display::Sprite/constructChildren() 在 flash.display::Sprite() 在 flash.display::MovieClip() 在 DocumentMain()

【问题讨论】:

    标签: flash


    【解决方案1】:

    几个明显的问题:gotoAndStop(0, "Scene 2"); 似乎是错误的,因为没有第 0 帧。你的意思是:gotoAndStop(1, "Scene 2");

    您还可以删除变量_cheatMenu,但您从未实例化“_cheatMenu”或将其添加到显示列表中。我认为这就是您的 Error#1034 所说的。

    您应该在构造方法中添加cheatMenu = new CheatMenu;,然后像这样初始化它:cheatMenu.visible = false 假设您希望它在开始时不可见。

    帧(场景?)之间的快速切换听起来像是某处缺少stop(); 语句。

    这可能无法解决你所有的问题,但它应该可以帮助你朝着目标前进。

    【讨论】:

    • 我已经添加了你说我应该做的事情,但同样的事情仍然发生。我应该把 stop(); 放在哪里?
    • 现在让我们看看你的代码。你在哪里添加 cheatMenu 到显示列表?
    • 我仍然看不到您将 _cheatMenu 添加到显示列表的位置。你怎么能点击不在舞台上的东西?你在关注这个吗?
    • 我使用闪存添加对象,它适用于我制作的其他对象。如果我需要做其他事情,那么我不知道它到底是什么。
    • 如果您“使用 Flash 添加对象”,那么您为什么要尝试在代码中添加它?在您已经在 Flash 中展示的代码中声明一个对象是没有意义的。在处理更复杂的编译器错误之前,您可能必须回到起点并了解 Flash 的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 2010-10-19
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多