0

嘿伙计们,我正在为一个班级项目编写一些代码,出于某种原因,我在课堂上得到的演示代码的工作方式不同。这些错误没有造成任何错误,因为我可以得到一些帮助调试我知道它可能迟缓了。提前非常感谢。

function BuildGrid()
{
//begin with a BeginVertical() call so that controls
//are stacked vertically
GUILayout.BeginVertical();
GUILayout.FlexibleSpace();

//begin loopping for the rows
for(var i=0; i<rows; i++)
{
    //call BeginHorizontal() so that controls are stacked
    //horizontally
    GUILayout.BeginHorizontal();
    GUILayout.FlexibleSpace();

    //begin looping for the columns
    for(var j=0; j<cols; j++)
    {
        //getting the card object that resides 
        //at this location in the array
        var card:Object = aGrid[i][j];

        //the definition for the backside (visible part for the card
        var img : String;

        //check if the card is face up, if so, show the robot part
        //if not show the wrench
        if(card.ifFaceUp)
        {
            img = card.img;
        }
        else
        {
            img = "wrench";

        }

        //create a button using a picture instead of
        //text.  Getting the picture from the Resources
        if(GUILayout.Button(Resources.Load(img),
            GUILayout.Width(cardW)))
            {
                flipCardFaceUp(card);
                //print to the debug the name of the picture
                Debug.Log(card.img);
            }
    }
    GUILayout.FlexibleSpace();
    GUILayout.EndHorizontal();
}
GUILayout.FlexibleSpace();
GUILayout.EndVertical();
}//end buildGrid

定义 ifFaceUP 和 img 的类

class Card extends System.Object
{
//is the card face up
var ifFaceUp:boolean = false;

//has the card been matched
var ifMatched:boolean = false;

//image for the card
var img: String;

//constructor
function Card(img : String)
{
    this.img = img;

}
}

错误: http: //puu.sh/2clHw

4

1 回答 1

0

查看您通过电子邮件发送的脚本,我可以看到 aGrid 包含 Card 类型的对象。在 ECMA JavaScript 中,没有什么是强类型的。ECMA 是在浏览器中运行的 JS。您的 JS 是当浏览器请求某个页面或用作桌面应用程序(不确定它是什么类型的应用程序)时在服务器上运行的 .net 代码。尽管它被称为 JavaScript,它只是意味着语法看起来像 JavaScript,但由于它是 .net 代码,它与 JavaScript (ECMA) 完全不同。

使用 ECMA JS 可以做的一件事是:

var notStronglyTyped=22; // is int
notStronglyTyped = "hello";// changed to string
notStronglyTyped.subString();// can call subString now because it's a method of string

这在 .net 中不起作用,因为 .net 是强类型的(并且基于类,但这不是手头的问题)。因此,声明变量时的 int :

var i:int=0;// the :int gives a syntax error in ECMA JS since it doesn't exist.

强类型意味着在执行函数或访问与该类型相关的属性之前,需要将变量声明或转换为某种类型。substring 是 String 的一种方法,但我不能在 int 上调用它:

var i:int=0;
i.subString();//won't work in .net unless you cast it to another type.

((String)i).subString();//might work but I don't know the exact syntax for .net JS.

简而言之; 从 aGrid 中检索卡片时,我建议将它们声明为 Card,因为稍后将其声明为 Object 时不需要键入 cast。数组 aGrid 无论如何都包含 Card 类型的对象,因此您不应在此处收到警告或错误:

    card = new Card("robot" + (i+1) + "Missing" + theMissingPart);
    //instance card is of type Card
    aCards.Add(card);//aCards contains items of type Card
                ....
    aGrid[i][j] = aCards[somNum];
//aGrid is filled with items from aCards which in turn contains items of type Card

在您的代码中的某个时刻,您会执行以下操作:

    var card:Object = aGrid[i][j];

我不知道为什么因为 aGrid 包含 Card 类型(一切都是 Object 类型,因为一切都继承自 Object)。那么为什么不将变量 card 声明为 Card 的实例呢?

    var card:Card = aGrid[i][j];

那应该可以解决您的问题。我无法在此处运行代码,因为我还没有设置 .net 开发环境,但我确信可以解决它。

你可以在谷歌上查找关于类型转换的文章(维基百科),你可以想象当你用混合类型填充数组或列表时带来的头痛。这是泛型可以伸出援助之手的地方,但现在开始这样做可能还为时过早,因为它会让你的头脑爆炸:-)

于 2013-03-05T05:07:42.607 回答