Actionscript 3 AS3游戏库存系统结构
我现在不是OOP和as3方面的专家。我正在制作一个能够处理这些事情的库存系统:Actionscript 3 AS3游戏库存系统结构,actionscript-3,flash-cs5,Actionscript 3,Flash Cs5,我现在不是OOP和as3方面的专家。我正在制作一个能够处理这些事情的库存系统: *当玩家与一个“物品”碰撞时,它将获得它并发送到库存数组,等等 这是播放器类构造函数 正如您所看到的,我手动编写项的实例名称:“silver\u key” 这是与之相关的功能: private function on_enter_frame(e:Event):void if (_player.hitTestObject(silver_key))//check collision between player and
*当玩家与一个“物品”碰撞时,它将获得它并发送到库存数组,等等 这是播放器类构造函数
正如您所看到的,我手动编写项的实例名称:“silver\u key” 这是与之相关的功能:
private function on_enter_frame(e:Event):void
if (_player.hitTestObject(silver_key))//check collision between player and item
{
dispatchEvent(new EventDemo(EventDemo.EVENT_DEFAULT));
}
private function onEvent(e:EventDemo)
{
_inventory.getitem(_loot);//function use in InventorySystem for array.push
removeEventListener(EventDemo.EVENT_DEFAULT,onEvent);//removes the listener when the item was sent to array
}
现在我的问题是,我如何能够在不手动写入它们的实例名的情况下创建许多项。谢谢。附言:如果您仍然无法理解,请发表评论。简单地说:
object[“string\u name”]=value
要获得更全面的解释,请继续阅读
您需要每个项目的显式名称,但您希望在不知道项目可能是什么的情况下动态定义这些项目。可以通过多种方式存储,但基本数组或对象应该可以正常工作 看起来你在制作一个电影唇来代表玩家。作为一个类,player类的实例化本身可能就是movieclip,但是要注意movieclip携带了很多时间线包袱,这些包袱可能会使您的速度变慢。要获得更简洁/轻量级的player类,请扩展Sprite并编写自己的属性/方法 例如,让我们假设银钥匙对象是这样的:
item:Object = {
"name":"Silver Key",
"count":1,
"weight":3,
"icon":"silver_key.jpg"
}
在一个对象中,我们可以将name属性定义为我们希望该项类型为的任何类型,以及描述该项的其他相关属性。现在,我们需要做的就是在player类本身中保留一个保存项的列表
玩家等级
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"
这是一种简单的方法,老实说,您可能希望使用自己的item&inventory类以及数据清理/检查来扩展它,以防止损坏的库存
更新:“您很可能会创建每个项目的原型。” 下面是一个人的样子
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;
}
可能性的世界。你很可能会做出一些更健壮的东西来满足你的游戏需求,所以这只是你可能会做的一种方式。Hi Rick-仅仅根据一个描述来提出建议有点困难,你能提供一些简单的代码示例来说明你正在尝试做什么以及如何出错吗?太冗长了!!!张贴代码。你们好像要关门了。对不起,伙计们,我现在就编辑它。嗨!谢谢你。但我想澄清一些事情。想象20个不同的键(具有不同属性的对象)并放置在地图(或舞台)上它们各自的位置上。我要写/创建20个对象?像这个的20倍
item:Object={“name”:“Silver Key”,“count”:1,“weight”:3,“icon”:“Silver_Key.jpg”}
对不起,我离学习as3只有几周了,而且我在不同的时区,所以我明天会回复。谢谢。你很可能会为每一件物品创建一个原型。(见修订版)我现在又想起了。我将尝试在我的游戏中实现这一点。谢谢你所做的一切。
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;
}
player.loot(itemDefinitions[item.itemDefinition]);
removeChild(item);