【问题标题】:AS3 How to call an existing function?AS3 如何调用已有函数?
【发布时间】:2016-08-30 15:51:02
【问题描述】:

我试图从不同的地方调用一个函数。到目前为止没有任何运气。 这是基本功能。当我按下按钮时,它会做一些事情:

button.addEventListener(MouseEvent.CLICK, myFunction1);
function myFunction1(event:MouseEvent):void 
{
   ///dosomeThing1
}

我有多个按钮(myFunction2..3...4...等)

但是当我得到一个特定的随机数时,我希望完全相同(myfunction1..2 等)发生。 例如,如果随机数 = 1 >>> 执行 myfunction1 如果随机数 = 2 >>> 执行 myfunction2

所以我尝试了这个: (此代码位于时间轴框架的顶部)

function randomRange(minNum:Number, maxNum:Number):Number 
{
return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
}
var myrandomNumber = (randomRange(1, 6))
trace(myrandomNumber); //A number between 1 and 6
if (myrandomNumber == 1) {
    myFunction1(null); // i tried this (null) stuff
}
if (myrandomNumber == 2) {
    myFunction2();   // i tried also with just braces
}

等等

随机数生成没问题,但是当我想调用函数时总是出错(如果我给出一个简单的 >> smthng.gotoAndStop(x) 命令(而不是函数)就可以了)

整个代码都在时间线框架中(没有单独的文件)

if 语句不在任何函数内部,正如您在此处看到的那样,它是一种“onLoad”的东西

如果我单击按钮,该功能将起作用,所以我猜这不是问题,只是不知道如何从其他地方调用相同的功能?!? :-)

有人有什么想法吗? 真的很感激!

请留下例子! (这里是新手程序员!:-)

谢谢 本

更新:

在尼尔斯的建议(谢谢)之后,我尝试了这个:

function randomRange(minNum:Number, maxNum:Number):Number 
{
return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
}
var myrandom = (randomRange(1, 6))
trace(myrandom); //A number between 10 and 20
if (myrandom == 1) {

wbtungsten():void{
color2.redOffset   = 70;
color2.greenOffset = 0;
color2.blueOffset  = -100;
szin_wb_cam.szin_wb.transform.colorTransform = color2;
}
}
if (myrandom == 2) {
 // another something
}

下面几行:

nav_mc.navtungsten.addEventListener(MouseEvent.CLICK, wbtungsten1);
private function wbtungsten1(e:MouseEvent)
{
wbtungsten();
}

在这种情况下,我会收到以下错误: 场景 1,图层“AS3”,第 2 帧,第 23 行 1084:语法错误:分号前需要右括号。 场景 1,图层“AS3”,第 2 帧,第 21 行 1078:标签必须是简单的标识符。场景 1,图层“AS3”,第 2 帧,第 22 行 1084:语法错误:在点之前需要冒号。

【问题讨论】:

  • 您遇到什么错误? if 语句在哪里?在函数内部?这一切都在时间线中还是不同的 .as 文件中?请使用此信息更新您的问题,而不是回复此评论。
  • 由于用不同的命令替换函数有效,问题可能不在于您发布的任何内容,而在于函数本身。你能发布一个这些函数的例子吗?
  • 好的,谢谢!!!我更新了问题:-)
  • edit您的问题并附上您收到的错误消息。
  • 好的,一切都更新了!

标签: function actionscript-3 flash


【解决方案1】:

(1)
关于:“如果我单击按钮,该功能将起作用”,但不知何故,您无法使用myFunction1(null); 或仅使用myFunction1(); 调用它。这告诉我你的函数看起来像这样

function myFunction1(event:MouseEvent):void

因为它与鼠标点击相关联,所以它只能通过被注意到的“点击”事件来运行。为了能够在不考虑点击直接调用(例如:myFunction1();)的情况下运行函数,然后定义为...

function myFunction1(event:Event = null):void

(2)
我没有测试你的代码,但我猜这部分会导致问题。

if (myrandom == 1) {

wbtungsten():void{
color2.redOffset   = 70;
color2.greenOffset = 0;
color2.blueOffset  = -100;
szin_wb_cam.szin_wb.transform.colorTransform = color2;
}

尤其是这一行wbtungsten():void{ ...您到底想用它实现什么?在If 语句中创建一个新函数?停止这样做,它不起作用,如您所见。

可能的修复:如下所示应该可以。

if (myrandom == 1) 
{
    color2.redOffset   = 70;
    color2.greenOffset = 0;
    color2.blueOffset  = -100;
    szin_wb_cam.szin_wb.transform.colorTransform = color2;

    wbtungsten(); //call the function called "wbtungsten"
}

(3)
关于这句话:

"...但是当我得到一个特定的随机数时,我希望完全相同(myfunction1..2 等)发生。例如,如果随机数 = 1 >>> 如果随机数 = 2 则执行 myfunction1 >>> 执行 myfunction2"

我对这些myfunction1wbtungsten1wbtungsten(); 等之间的链接有点困惑。如果你想要实现的是每个随机数都会影响color2 的红色、绿色和蓝调偏移那么你应该做如下的事情:

if (myrandom == 1) 
{
    change_Color(70, 0, -100);
}   

if (myrandom == 2) 
{
    change_Color(10, 25, 5); //some other numbers for testing
}   

function change_Color(redNum:Number, greenNum:Number, blueNum:Number) : void
{
    color2.redOffset   = redNum;
    color2.greenOffset = greenNum;
    color2.blueOffset  = blueNum;

    szin_wb_cam.szin_wb.transform.colorTransform = color2;
}

上面发生的情况是,您从每个随机数调用相同的函数,但您为函数提供了不同的参数(设置)以使用。也许上面的函数change_Color 实现了您的 wbtungsten():void{ 试图实现的功能,但我不能确定。

...

编辑: 关于“现在是非常简单的代码......我不明白为什么它不起作用”

问题在于代码的结构。请记住,Flash Player 会逐行向下处理代码,除非您让它“跳转”到后面的行。您有 if 直接跳转到函数的语句。由于该函数引用了一个不存在的变量,因此您将得到一个空值。我可以看到你声明了var color2:ColorTransform = new ColorTransform();,但“跳转”跳过了它,所以color2.redOffset = 70; 对编译器没有任何意义。

解决方案
将此行(如下所示)放在任何 Iffunction 内容之前。在您的 FLA 中,它成为非常顶部/第一行代码(现在其他所有内容都知道您所说的 color2 的意思,不再有 null 问题)...

var color2:ColorTransform = new ColorTransform();

在调整这些变量或转到使用这些变量的函数的任何其他代码之前,首先声明所有变量。这样,您可以强制编译器在进一步使用之前阅读(并理解)它们。

最佳的代码结构应该是:

1) imports - 任何 Imports 首先在代码顶部声明
2) 变量 - 声明你的变量。 (如果您稍后想到一个新的,只需向后滚动以添加它)
3) 主代码 - 涉及变量和函数的指令代码...
4) functions - 主代码将在需要时引用或跳转到此处,然后返回到 (3)..

处的 主代码 中执行下一个已知指令行

【讨论】:

  • VC.One 谢谢!我尝试了解决方案一...我收到此错误:TypeError:错误#1009:无法访问空对象引用的属性或方法。在 functioncall_fla::MainTimeline/wbtungsten() 在 functioncall_fla::MainTimeline/frame1()
  • 我想解决方案 2 和 3 可以工作,但解决方案一是如此简单和优雅......我不明白为什么它不起作用......我做了一个简化版本并上传到这里:
  • 有人可以看看吗!?谢谢!现在是非常简单的代码......我不明白为什么它不起作用
  • @BenthePhoto,新编辑中的附加信息能解决您的问题吗?
  • 好的,经过快速测试,它看起来可以正常工作了!! :-) 你的回答很有帮助!我把测试代码放回“大文件”,回家后看看它做了什么!!!
【解决方案2】:

这是因为您的函数正在等待一个事件。

改为这样做:

myFunction1():void{
    //do stuff
}

addEventListener(MouseEvent.CLICK,doSomethingHelper);

private function doSomethingHelper(e:MouseEvent){
    myFunction1();
}

更新

我在您更新的代码中看到您正在 if 块内创建一个函数。这使得您的其余代码无法访问它。不要那样做。这是你的 wbtungsten 函数。在别处创建它,然后在 if 块中调用它,例如 wbtungsten();

【讨论】:

  • 好的,试过了!我收到下面列出的几条错误消息.....(如果我不尝试使用此功能,我不会收到任何错误...)?!?!场景 1,图层“AS3”,第 2 帧,第 21 行 1078:标签必须是简单的标识符。场景 1,图层“AS3”,第 2 帧,第 22 行 1084:语法错误:在点之前需要冒号。我收到几个错误。场景 1,层 'AS3',第 2 帧,第 23 行 1084:语法错误:分号前需要右括号。
  • 第 23 行是什么?
  • 再次,请在您的问题底部(不在评论中)发布您现在拥有的导致错误的代码。你说你累了。行。给我看看。我会试着看看有什么问题。我只需要在上下文中查看它。澄清一下,您的所有代码都在第 2 帧中?通常人们有一个称为“代码”的特定层,所有代码都在第 1 帧,而不是第 2 帧
  • 第 1 帧是预加载,其他一切都在第 2 帧。是的,具体图层名称为 as3。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多