【问题标题】:Cannot access function in Static Method / stackoverflow errors - Haxe无法访问静态方法中的函数/stackoverflow 错误 - Haxe
【发布时间】:2017-06-29 00:21:13
【问题描述】:

首先,这里有一点背景故事。我正在使用 Game Engine Stencyl(界面可以与 Scratch 进行比较)来教授基本的游戏开发。不幸的是,由于这是一个相当小的团队,我仍然缺少一些有用的内置功能,因此我决定为它创建自己的扩展。我熟悉 C#、Java 和 UnityScript,但这些扩展必须用 Haxe 编写。我已经尝试了几天在他们的 API 页面上找到我的答案,但这超出了我的经验水平。

第一个问题是我只是尝试使用几个地图函数,但这些方法都是静态的。每次我尝试在第 16 行使用像 mapCount() 这样的函数时,它都会给我一个错误提示:Cannot access controls in static function。到目前为止,我已经设法弄清楚这是因为我无法从静态方法调用非静态函数,但我不知道如何解决这个问题(将来可能还会出现更多类似的问题)。

第二个问题是,当我取消注释第 14 行并注释掉第 16 行时,游戏可以正常编译,但会因 stackoverflow 错误而崩溃。这个函数的参数是:createRecycledActor(actorType, x, y, layerPosition)

这是我脚本的当前状态,目前没有做太多工作,但我正在逐步学习这种新语言。如果您需要更多信息,请告诉我!

Ps,第 15 行中的跟踪功能可以正常工作。

import com.stencyl.behavior.Script;
import com.stencyl.behavior.Script.*;
import com.stencyl.utils.Utils;

import com.stencyl.models.Actor;
import com.stencyl.models.actor.ActorType;

class MobileGameKit
{
    public var controls:Map<String,Actor> = new Map();

    public static function CreateThumbstick(mActorType:ActorType, mLocation:Int, mDirectionLock:Int)
    {
        //createRecycledActor(mActorType, 0, 0, Script.FRONT);
        trace("created thumbstick at position: "+mLocation+" with directionlock: "+mDirectionLock);
        trace("items in control map: " + Utils.mapCount(controls));
    }
}

【问题讨论】:

    标签: haxe stencyl


    【解决方案1】:

    因为controls 是一个成员变量。即每个类实例都有自己的controls。 而静态函数是类级别的函数。即每个类(在所有实例中)只有一个函数副本。

    因此,在静态函数中,您无法访问成员变量,因为它无法知道从哪个实例中查找该成员。

    要解决您的问题,请将controls 设为static var,或将成员控件作为参数传递给您的静态函数。

    顺便说一句,该语言多年来一直被正式命名为 Haxe(而不是 haXe)。

    【讨论】:

    • 这完全有道理!我以前从未使用过静态变量,据我所知,这些变量一旦作为静态变量启动就无法更改值。这就是阻止我试图使它们成为静态的原因。你能解释一下我在这里误解了什么吗?至于 Stackoverflow 错误,我刚刚发现了这个问题。我使用该函数创建的演员附加了相同的脚本,因此每次生成该关节演员时,此代码都会一遍又一遍地运行。完全是我的坏!
    • 静态和非静态(成员)变量都可以更改。假设 controls 现在是一个静态变量,只需在函数中说 controls = new Map() 即可将其值更改为新映射(如果您不在类中,则为 MobileGameKit.controls = new Map()
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多