如何重新排列库存中的项目

时间:2014-01-02 08:43:21

标签: actionscript-3

我在AS3中创建游戏。 玩家可以抓取物品并将其添加到他的库存中。 一切正常,但是当玩家使用位于线路中间的物品时,我遇到了一个错误。 它没有好好重新安排.. (如果我不是很清楚,这是一段视频:http://ul.to/z7su5dqm或此处https://drive.google.com/file/d/0B5-MjJcEPm3lTTlDV09MYWxMOFE/edit?usp=sharing

我已经有了将项目添加到广告资源的代码:

public function addInvItem(itemName:String):void{
            var itemRef:Object = getDefinitionByName(itemName.toLowerCase()+"Inv");
            var addedItem:MovieClip = new itemRef;
            addedItem.displayName = itemName;
            if (playerItems.length < 8){ // This is for the top row of up to 4 items
                addedItem.y = 520;
                addedItem.x = 60 + (playerItems.length) * 100;
            }
            if (isUnique(addedItem)){
                this.addChild(addedItem);
                playerItems.push(addedItem); 
                allItems.push(addedItem); 
                addedItem.buttonMode = true;
                addedItem.invItem = true;
                addedItem.addEventListener(MouseEvent.CLICK, useItem, false, 0, true);
                puzzle = Engine.puzzle;
                puzzle.gotItem(addedItem.displayName);
            }

所以第一项是在x= 60 and y = 520.

添加

然后我有了这段代码来删除和重新排列项目:

public function removeInvItem(itemName:String):void{
            removedItem = itemName;
            var itemNum:int;
            for (var i in playerItems){
                if (playerItems[i].displayName == itemName){
                    playerItems[i].visible = false;
                    itemNum = i;
                } else {
                    playerItems[i].visible = true;
                }
            }
            playerItems = playerItems.filter(checkForItem);

            // Rearrange the rest of the items
            for (i in playerItems){
                if (i >= itemNum){
                        playerItems[i].x -= 100;


                    }
                }

        }

你看到推送我的第一件物品的错误在哪里? (我想它来自playerItems[i].x -= 100)。 我必须找到一种方法来告诉代码第一项不能少于x = 60但另一项必须在每次使用时移动x= -100 ......

知道我该怎么做吗?

非常感谢,

1 个答案:

答案 0 :(得分:1)

您认为playerItems[i].x -= 100;是导致问题的地方是正确的。您正在减去当前的x位置,而不检查是否存在您的库存图标资产。

你可以这样做:

public function removeInvItem(itemName:String):void{
    removedItem = itemName;
    var itemNum:int;
    for (var i in playerItems){
        if (playerItems[i].displayName == itemName){
            playerItems[i].visible = false;
            itemNum = i;
        } else {
            playerItems[i].visible = true;
        }
    }
    adjustInventory( itemNum );
}

public function adjustInventory( itemNum:int ):void {
    var i:int;
    for ( i=itemNum; i < playerItems.length; i++ ) {
        //you can replace 60 with inventoryIcon.x + inventoryIcon.width instead
        playerItems[i].x -= playerItems[i].x - 100 >= 60 ? 100 : playerItems[i].x - 60;
    }
}

这会在您执行此操作之前评估您要移动的距离,并且仅移动必要的库存项目。我没有测试过这段代码,但这应该会让你走上正确的道路。