因此,我最近发现了EaselJS(更常见的是CreateJS),并且我试图找到一种用它制作turbomedia(即this kind of thing)的方法。
目前,我正在研究可逆性。 Turbomedia通过一系列状态/框架来讲述其故事,其主要功能是可以随意在这些框架之间来回移动(通常是通过击键)。为了实现这种可逆性,我需要状态与先前的事件无关(即状态2必须从状态1或状态3到达都必须相同)。
直到最近,我还只是使用单个位图(这样每个状态都将对应一个现有文件),因此问题永远不会出现。但是,现在我希望具有将状态变为由多个图像组成的状态的能力(因为这样可以提供更大的灵活性)。因此,状态可以用数组["sky3", "ground2", "character5"]
描述,表示“此状态包含存储在sky3,ground2和character5中的图像”。
我遇到的问题是双重的。
首先,我需要具有比较数组内容的能力,以便每当当前状态更改时,都会将新状态与前一个状态进行比较,并根据需要交换图像(即,从["sky1", "kid1"]
更改为["sky2", "kid1"]
会从阶段,添加sky2,并保留kid1(因为这两个州都存在)。这是为了保留跨状态的动画时间,并尝试使过渡更轻巧(尽管我不确定是否需要这样做?)。
但是我不知道如何比较像这样的数组内容。
第二个问题可能要简单得多,但是我缺乏使用Javascript的经验,老实说,我不知道自己在做什么错。我无法定位我的州的内容。这是我的init():
stage = new createjs.Stage("testing");
currentstate = 1;
terra1 = new createjs.Bitmap("terra1.png");
terra2 = new createjs.Bitmap("terra2.png");
bullet1 = new createjs.Bitmap("bullet1.png");
bullet2 = new createjs.Bitmap("bullet2.png");
state1 = ["terra1"];
state2 = ["terra2", "bullet1"];
state3 = ["terra2", "bullet2"];
calcstate = "state" + currentstate;
// Call the first state (at least that's what I'm going for).
console.log(calcstate);
// This returns "state1". I want it to return ["terra1"] since that's the
//content of state1.
for (i = 0; i < calcstate.length; i++) {
stage.addChild(calcstate[i]);
// Currently useless since previous code doesn't work, but would be the
// function to "create the first stage".
};
stage.update();
是的,到目前为止,我几乎陷入了困境。有什么建议吗?
最佳答案
您没有正确引用实例。
您的calcState
将是一个字符串(例如“ state1”),而不是对变量state1
的引用。您可以使用方括号来引用它:
例:
this[calcState]
// OR, depending on your scope
window[calcState]
即使您正确地引用了状态数组,它们本身也只包含字符串,因此您将在舞台上添加“ terra1”,而不是实例
terra1
。您也可以在此处使用方括号访问,但是更好的方法是将实例实际添加到状态数组中:例:
state1 = [terra1];
state2 = [terra2, bullet1];
state3 = [terra2, bullet2];
我建议使用
console.log()
来输出值calcState
以及for循环中的calcstate[i]
,这应该使您更清楚地了解所看内容。一种更简单的处理方法是制作一个包含子元素的状态数组:
states = [
[terra1],
[terra2, bullet1],
[terra2, bullet2]
];
// Refer to your states. Note that calcState should be 0-2 and not 1-3
states[calcState][i];
希望能有所帮助。