简而言之:
object["string_name"] = value
有关更详尽的解释,请继续阅读...
您需要为每个项目提供明确的名称,但您希望在不知道它们可能是什么的情况下动态定义这些项目。您可以通过多种方式存储它,但基本的 Array 或 Object 应该可以正常工作。
看起来您正在创建一个影片剪辑来代表播放器。作为一个类,播放器类的实例化本身可能就是那个movieclip,但请注意,MovieClip 带有很多时间线包袱,可能会减慢您的速度。要获得更简洁/轻量级的播放器类,请扩展 Sprite 并编写自己的属性/方法。
例如,让我们想象一下 Silver Key 对象的样子:
item:Object = {
"name":"Silver Key",
"count":1,
"weight":3,
"icon":"silver_key.jpg"
}
在一个对象中,我们可以将 name 属性定义为我们想要的任何类型的项目,以及描述该项目的其他相关属性。现在,我们需要做的就是在播放器类本身中保留一个已保存项目的列表。
玩家等级
package {
public dynamic class Player extends Sprite {
import flash.events.*;
import flash.display.*;
public var inventory:Object = {};
public function Player() {
addEventListener(Event.ENTER_FRAME, tick);
}
public function tick(e:Event):void {
// ENTER_FRAME stuff
}
public function loot(item:Object) {
if (inventory.hasOwnProperty(item.name)) {
inventory.item.count++
trace("You now have " + inventory.item.count + " " + item.name + "'s!");
} else {
inventory[item.name] = item;
trace("You have picked up a " + item.name)
}
}
public function drop(item:Object) {
if (inventory.hasOwnProperty(item.name)) {
inventory.item.count--
if (inventory.item.count == 0) {
trace("You no longer have " + item.name);
delete(inventory[item.name]);
} else {
trace("You now have one less " + item.name + ".");
}
}
}
}
}
示例实现
var player:Player = new Player();
player.loot(item);
// traces "You picked up a Silver Key"
player.drop(item);
// traces "You no longer have Silver Key"
这是一种简单的方法,说实话,您可能希望使用自己的项目和库存类别以及数据清理/检查来扩展它以防止库存损坏。
更新: “很有可能,您将创建每个项目的原型。”
这是一个可能的样子。
package {
public class ItemDefinition extends Object {
public var name:String = "Unnamed Item";
public var count:int = 1;
public var weight:int = 0;
public var icon:String = "unnamed.jpg";
public function ItemDefinition(Properties:Object) {
// By passing in an object, we can define only the properties we want to change.
for (var Name:String in Properties) {
// Only property names that match will overwrite the defaults.
if (this.hasOwnProperty(Name)) {
this[Name] = Properties[Name]
}
}
}
}
}
很酷的是,我们可以定义任意数量的属性,并且可以以任意顺序定义,而不必担心添加一个可能会在以后搞砸我们的虚假值。此外,如果我们想为定义项目的内容添加新属性,只需将其作为公共变量添加到顶部即可。
接下来,我们可能会使用新的 ItemDefinition 对象在文档顶部定义一次所有项目。
var itemDefinitions:Object = {
'Silver Key':new Item({name:"Silver Key", icon:"silver_key.jpg", weight:3}),
'Gold Key':new Item({weight:10, name:"Gold Key", icon:"gold_key.jpg"}),
'Iron Key':new Item({icon:"iron_key.jpg", weight:2, name:"Iron Key"})
}
function populateItems(itemName:String, count:int = 20) {
if (itemDefinitions.hasOwnProperty(itemName)) {
for (var i:int = 0; i < count; i++) {
var item:MovieClip = new MovieClip();
item.x = randomNumber(0, this.loaderInfo.width);
item.y = randomNumber(0, this.loaderInfo.height);
item["itemDefinition"] = itemName;
}
} else {
trace(itemName + " is an invalid item.");
}
}
function randomNumber(low:Number=0, high:Number=1):Number {
/* Returns a random number between the low and high values given. */
return Math.floor(Math.random() * (1+high-low)) + low;
}
如您所见,我添加了几个辅助函数来(随机)在屏幕上吐出那些额外的项目。显然,我们需要一个 addChild 和图像加载,但这确实是您应该实现的。
最后,我们将修改我们的战利品调用以传递 itemDefinition...
player.loot(itemDefinitions[item.itemDefinition]);
removeChild(item);
世界的可能性。你可能会做出更强大的东西来满足你的游戏需求,所以这只是你可以做到的一种方式。