0

我不知道怎么问这个问题。

我有一个变量

public static var MaxDurabilityTestItem:Number = 3;

我有一个功能

    public static function setItemInSlot(Item:String, Slot:Number, MaxDurability:Number = 0)
    {
        UI_Taskbar_Inventory.InventoryItems[Slot] = Item;

        if(MaxDurability == 0)
        {
            trace("Before change " + UI_Taskbar_Inventory.InventoryDurability);
            UI_Taskbar_Inventory.InventoryDurability[Slot] = "MaxDurability" + Item;
            trace("After change " + UI_Taskbar_Inventory.InventoryDurability);
        }
        else
        {
            trace("not using default durability");
        }
    }

这个功能唯一让我头疼的部分是这一行

UI_Taskbar_Inventory.InventoryDurability[Slot] = "MaxDurability" + Item

它输出

更改前 0,0,0,0,0,0,0,0

更改后 0,MaxDurabilityTestItem,0,0,0,0,0,0

虽然我希望它输出

更改前 0,0,0,0,0,0,0,0

更改后 0,3,0,0,0,0,0,0

我知道这个问题,但是,我不知道如何解决它。 "MaxDurability" + Item生成一个名为的字符串MaxDurabilityTestItem,而不是引用我的变量MaxDurabilityTestItem

如何更改它以使其引用我的变量 MaxDurabilityTestItem,而不是它创建的这个字符串?

4

2 回答 2

2

我在这里要说的第一件事是,尽管下面描述的一切都很好,但使用这些技术可能表明项目架构存在一些深层问题。好吧...

ActionScript 3的美与丑在于,实际上任何事物都是其中的对象,您可以像这样处理任何实例。

任何类实例都是对象。您可以分别将任何DisplayObjectxy寻址为 ['x'] 和 ['y']。您可以以相同的方式处理方法:

function gotoAnd(frame:*, thenPlay:Boolean):void
{
    // Forms 'gotoAndPlay' or 'gotoAndStop' string.
    var methodName = 'gotoAnd' + (thenPlay? 'Play': 'Stop');

    // Gets method reference to either gotoAndPlay or to gotoAndStop.
    var methodItself:Function = this[methodName];

    // Calls method by the reference.
    methodItself(frame);

    // In one line:
    // this['gotoAnd' + (thenPlay? 'Play': 'Stop')](frame);
}

任何类也是一个对象。细微的区别在于,作为对象的类的成员是静态类方法和字段。例如:

import flash.system.System;

// Accepts "free" or "private" or "total" as an argument.
function getMemory(value:String = "total"):Number
{
    var propertyName:String;

    switch (value)
    {
        case "private":
            propertyName = "privateMemory";
            break;

        case "free":
            propertyName = "freeMemory";
            break;

        case "total":
            propertyName = "totalMemoryNumber";
            break;

        // Returns -1 for an invalid argument.
        default:
            return -1;
            break;
    }

    // Returns either System.privateMemory
    // or System.freeMemory or System.totalFreeMemory.
    return System[propertyName];
}

再说一次,静态类方法是作为对象的类的Function成员:

// Direct method access.
System.gc();

// Property-based method access.
System['gc']();

请记住, [] 访问仍然尊重privateinternalprotected命名空间,因此如果您无法访问 SomeObject.someMethod() 因为该方法被标记为private,您将无法通过 SomeObject['someMethod' 访问它] 任何一个。前者会给你一个编译时错误,后者会让你编译你的应用程序然后会让你处理运行时异常。

于 2017-10-18T05:36:25.377 回答
1

"MaxDurability" + Item制作一个名为 的字符串MaxDurabilityTestItem

"string"因为您使用引号自动定义了 a 。我只能假设Item也是带有 text 的字符串"TestItem"。因此,您只需+两个+字符串连接在一起。

(2)

...而不是指我的变量MaxDurabilityTestItem

尝试如下:

UI_Taskbar_Inventory.InventoryDurability[Slot] = MaxDurabilityTestItem; //now using your defined variable

编辑

以防万一您真的想使用字符串作为对变量本身的引用:

使用this[ "name of some var" ]... wherethis将针对当前类,并["name"]会在当前类中找到这样的指定变量。

尝试:

if(MaxDurability == 0)
{
    trace("Before change " + UI_Taskbar_Inventory.InventoryDurability);
    UI_Taskbar_Inventory.InventoryDurability[Slot] = this[ "MaxDurability" + Item ];
    trace("After change " + UI_Taskbar_Inventory.InventoryDurability);
}
else
{ trace("not using default durability"); }
于 2017-10-16T09:36:22.577 回答