【问题标题】:Collectibles with different score values不同分值的收藏品
【发布时间】:2015-05-14 19:18:52
【问题描述】:

我有一系列随机生成的收藏品。当它们与玩家发生碰撞时,它们会从舞台上移除,并且分数会增加一个 scoreValue。我希望数组中的每个收藏品都有不同的 scoreValue,但我无法得到它。以下是我最新的与此相关的所有代码。

public class Main_EnemySpawnTest_3 extends MovieClip
{
    // variables
    var player:Player = new Player;
    var collectables:Array = [Collectable1, Collectable2, Collectable3];
    var collectablesRandomNumber:int = Math.random() * (collectables.length);
    var collectable = new collectables[collectablesRandomNumber];
    var score:uint = 0;

    // constructor function
    public function Main_EnemySpawnTest_3():void
    {
        // listeners
        addEventListener(Event.ENTER_FRAME, checkEveryFrame);
        spawnCollectablesButton.addEventListener(MouseEvent.CLICK, spawnCollectablesClick);
    }

    // enter frame, check every frame
    public function checkEveryFrame(event:Event):void
    {
        // score
        messageDisplay.text = String (score);
    }

    // hit test
    function hitTest (event:Event):void
    {
        // hit test with collectables
        if (collectable.hitTestObject (player) == true)
        {
            var scoreValue:uint;

            if (stage.contains (collectable))
            {
                if (collectables[0])
                {
                    scoreValue = 100;
                }
                else if (collectables[1])
                {
                    scoreValue = 300;
                }
                else if (collectables[2])
                {
                    scoreValue = 700;
                }
                removeChild (collectable);
                score = score + scoreValue;
            }
        }
    }
}

目前,可通过单击按钮生成收藏品。如果有帮助,代码如下。

// collectable spawn button
function spawnCollectablesClick (event:MouseEvent):void
{
    var oldCollectable = collectable;
    if (stage.contains (oldCollectable))
    {
        removeChild (oldCollectable);
    }       
var collectablePositionRandomNumber:int = Math.random() * 3; 
    var collectablePositionX:int = stage.width - (collectable.width * -0.5);
    collectable = new collectables[Math.floor(Math.random() * collectables.length)];
    collectable.x = collectablePositionX;
    globalSpeed = 5;
    if (collectablePositionRandomNumber == 0)
    {
        collectable.y = topPosition;
    }
    else if (collectablePositionRandomNumber == 1)
    {
        collectable.y = centerPosition;
    }
    else if (collectablePositionRandomNumber == 2)
    {
        collectable.y = bottomPosition;
    }
    addChild (collectable);
    trace (collectable);
}

【问题讨论】:

  • 您如何创建/实例化您的收藏品?让我猜猜,你的分数总是上升100?当您执行if(collectables[0]) 时,它只是在寻找一个真实的价值。因此,只要collectables[0] 的结果不是空/假/未定义/负数,它就会评估为真。由于您在collectables[0] 中有可能是一个对象,因此条件将始终为真。
  • 目前,我正在自己编写此代码,点击按钮即可生成收藏品。最终,它将是一个计时器、基于图块的数组或其他东西。我会把代码放在原帖中
  • Collectable1、2 和 3 来自 collectables 数组。每个都是它自己的收藏品(现在,不同颜色和形状的硬币)。当他们与玩家发生碰撞时,我需要他们奖励不同的得分值。现在代码运行,但它总是只奖励 100 分。我需要每次硬币碰撞都给出正确的点值,所以 Collectable1 为 100,Collectable2 为 300,Collectable3 为 700。

标签: arrays actionscript-3 hittest


【解决方案1】:

问题来自if (collectables[0]):只要collectables[0] 不是false/null/0/NaNundefined,就会返回true。所以你总是要加 100,else ifs 总是会被跳过。

你可以在spawnCollectablesClick创建收藏品时给它自己的分值:

collectable.scoreValue = ...

然后用它来增加分数

function hitTest (event:Event):void
{
    // hit test with collectables
    if (collectable.hitTestObject (player) == true)
    {
        score = score + collectable.scoreValue;
        removeChild (collectable);
    }
}

附带说明,如果 Collectible1Collectible2Collectible3 都是不同的类,那么你就违背了类的目的。如果 3 个事物具有相同的行为但事物的值不同,则它们都可以是具有不同成员变量值的同一类的实例。

【讨论】:

  • 我只编程了几个月,所以我不确定如何按照您的建议进行操作。我已经完全按照您之前的方式编写了代码,但这并不能解决问题。另外,我只使用一个类。我在多个课程上都没有运气,即使我可以让它们工作,它们也只是一个巨大的麻烦,并且使编码变得更加困难和混乱,而不是更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多