首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3游戏库存系统结构

AS3游戏库存系统结构
EN

Stack Overflow用户
提问于 2013-07-22 22:40:44
回答 1查看 2.1K关注 0票数 0

我现在并不是OOP和as3方面的专家。我正在制作一个库存系统来处理这些事情:

*当玩家遇到一个“物品”时,它会得到它并发送到库存数组,等等……

下面是Player类的构造函数

正如您所看到的,我手动编写了item的实例名称:"silver_key“

代码语言:javascript
复制
public function Player(player:MovieClip,loot:MovieClip,place:MovieClip)
    {
        // constructor code
        _player = player;
        silver_key = loot;//the item

        _inventory = new InventorySystem(place);//InventorySystem Class

        _player.addEventListener(Event.ENTER_FRAME,on_enter_frame);

        addEventListener(EventDemo.EVENT_DEFAULT,onEvent);//custom event listener

    }

以下是与其相关的函数:

代码语言:javascript
复制
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
    }

现在我的问题是,我如何才能在不手动编写实例名称的情况下创建许多项。谢谢。

附言:如果你仍然不能理解,请评论。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-23 03:16:15

简单地说:

object["string_name"] = value

要获得更全面的解释,请继续阅读...

您需要每个项目的显式名称,但您希望动态定义这些项目,而不知道它可能是什么。你可以通过多种方式存储它,但基本的Array或Object应该可以很好地工作。

看起来你正在创建一个电影剪辑来代表播放器。作为一个类,player类的实例化本身可能就是那个电影剪辑,但要注意,MovieClips携带了大量的时间线行李,可能会减慢您的速度。要获得更简洁/轻量级的player类,可以扩展Sprite并编写自己的属性/方法。

例如,假设Silver Key对象是这样的:

代码语言:javascript
复制
item:Object = {
    "name":"Silver Key",
    "count":1,
    "weight":3,
    "icon":"silver_key.jpg"
}

在一个对象中,我们可以将name属性定义为任何我们想要项类型,以及描述该项的其他相关属性。现在,我们需要做的就是在player类中保存一个已保存项的列表。

Player类

代码语言:javascript
复制
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 + ".");
                }
            }
        }
    }
}

示例实现

代码语言:javascript
复制
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类来扩展它,以及数据清理/检查,以防止损坏的库存。

更新:“很可能,您将为每个项目创建一个原型。”

这就是一个人可能的样子。

代码语言:javascript
复制
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]
                }
            }
        }
    }
}

这一点很酷,因为我们可以按任何顺序定义任意数量的属性,而不用担心添加一个假值,这可能会在以后搞砸我们。此外,如果我们想要在定义项的内容中添加新属性,只需将其作为public var添加到顶部即可。

接下来,我们可以使用一个新的ItemDefinition对象在文档的顶部定义一次所有项。

代码语言:javascript
复制
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...

代码语言:javascript
复制
player.loot(itemDefinitions[item.itemDefinition]);
removeChild(item);

可能性的世界。你可能会做一些更健壮的东西来满足你的游戏需求,所以这只是你可能做到的一种方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17790427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档