首页 > 解决方案 > AS3 Flash 中的类型强制

问题描述

我正在用 Flash 中的 AS3 制作一个简单的跳线游戏,此时一切正常,但我得到了这个注释:

错误 #1034:类型强制失败:无法将 2 转换为 flash.display.Scene。在 scratch_theGame_kat_fla::MainTimeline/startkeyPressed()

我知道当这个注释出现时一定有一种不正确的实例类型,但是当我在我的代码中搜索以找到肇事者时,我意识到它必须提到的“2”是这样的:

function startkeyPressed(event:KeyboardEvent):void
{
    if (event.keyCode,Keyboard.ENTER)
    {
        trace("new player");
        startGame = true;
        gotoAndPlay(( 1, Scene (2)));
    }
};

这部分代码是它从场景 1 到场景 2(实际游戏开始的地方)(按下 ENTER 时)的原因。有谁知道我应该改变什么?

标签: actionscript-3actionscriptflash-cs5type-coercion

解决方案


就 AS3 逻辑而言,这条线完全没有意义:

gotoAndPlay(( 1, Scene (2)));

如果您查看官方gotoAndPlay(...)帮助的“示例”部分,此方法有两种可能的用途:

  1. 您传递一个“框架”参数:它要么是基于 1 的int框架索引,要么是所需框架的字符串标签。
  2. 两个参数,其中第二个参数是作为主时间线一部分的Scene的字符串名称,第一个参数再次是所述Scene内的帧索引或帧标签。

现在让我们破译你那里有什么。您作为gotoAndPlay(...)参数传递。感到不同:

// Your version: one argument grouped with additional brackets.
gotoAndPlay(( 1, Scene (2)));

// Alternate version: no additional brackets, two arguments.
gotoAndPlay(1, Scene (2));

那么,您可能会问什么是场景(2)表达式?它称为typecasting,您可以在其中执行以下操作:

  1. 明确说明你正在使用的东西的确切类,因为有些时候编译器并不确切知道,比如Event.target对象的确切类是什么。有一个很好的例子,很好解释:AS3: cast or "as"?
  2. 您希望将数据从一种类型显式转换为另一种类型(所述类型强制),主要用于intNumberString类型之间。

让我们来看看:

function onEvent(e:Event):void
{
    // Explicit typecasting.
    MovieClip(e.target).nextFrame();

    // Explicit typecasting through "as" operator.
    var aFrame:int = (e.target as MovieClip).currentFrame;

    // Explicit type conversion.
    trace("The current frame is", String(aFrame));

因此,您试图说服 Flash Player 整数值2在某种程度上是一个Scene对象,但它不可能,因此Flash Player抛出异常,因为它不了解您想要它做什么。

您要实现的目标的正确表示法(将播放头移动到第二个Scene)可能是:

gotoAndPlay(1, "Scene2");

Scene2 ”参数是一个字符串文字,应该代表您的第二个场景的确切名称,我不知道它是什么,但它可能应该默认命名为“ Scene2 ”或“ Scene 2 ”。


推荐阅读