【问题标题】:objects follow the same class对象属于同一类
【发布时间】:2014-06-12 13:54:54
【问题描述】:

我有一个问题,我正在做一个更大的项目,我做了一个小项目来测试这个问题。

问题是: 我制作了一个生成敌人的按钮。当敌人击中 allyCopy 时,它会朝相反的方向弹回。但问题是,当一个敌人击中测试对象时,每个敌人实例都会反弹回来。

我的代码:

我的主要课程:

package  {

import flash.display.*;
import flash.ui.*;
import flash.events.*;

public class MainClass extends MovieClip {
    public var speed:int = 3;
    public static var enemyArray:Array = [];
    public var randNumber:Number = 0;
    public static var allyCopy1 = new allyCopy();
    public function MainClass() {
        stage.addEventListener(Event.ENTER_FRAME, update);
        spawnButton1.addEventListener(MouseEvent.CLICK, spawnEnemy);
        allyCopy1.addEventListener(MouseEvent.MOUSE_DOWN, dragOn, true);
        allyCopy1.addEventListener(MouseEvent.MOUSE_UP, dragOff, true);
        addChild(allyCopy1);
            allyCopy1.x = 60,25;
            allyCopy1.y = 208,05;

    }
    public function update(e:Event)
    {
        /*for (var i:Number = 0; i < enemyArray.length; i++)
        {
            enemyArray[i].x -= speed;
        }*/
    }
    public function dragOn (e:MouseEvent)
    {
        allyCopy1.startDrag();
        trace("drag");
    }
    public function dragOff (e:MouseEvent)
    {
        allyCopy1.stopDrag();
    }
    public function spawnEnemy(e:MouseEvent)
    {
        randNumber = Math.random();
        trace(randNumber);
        var enemy1 = new enemy ();
        addChild(enemy1);
        enemyArray.push(enemy1);
        if (randNumber <= .5)
        {
            enemy1.x = 526.25;
            enemy1.y =  68.05;
        } else
        {
            enemy1.x = 526.25;
            enemy1.y = 200.05;
        }
    }
}

}

敌人类:

package  {

import flash.display.*;
import flash.events.*;


public class enemy extends MovieClip {
    public static var hp:int = 100;
    public static var speed = 3;

    public function enemy() {
        addEventListener(MouseEvent.CLICK, killEnemy);
        addEventListener(Event.ENTER_FRAME, update);



    }
    public function update (e:Event) {
        x -= speed;
        if ( x <= 0)
        {

            MainClass.enemyArray.pop();
            trace(MainClass.enemyArray);

        }
        if(MainClass.allyCopy1.hitTestObject(this))
           {
               speed = -3;
           }
    }
    public function killEnemy (e:MouseEvent)
    {
        this.parent.removeChild(this);
        trace(MainClass.enemyArray);
        MainClass.enemyArray.pop();
    }
}

}

【问题讨论】:

    标签: arrays actionscript-3 hittest


    【解决方案1】:

    问题在于speed静态 变量。这意味着它不是对每个敌人都是独立的,而是对所有实例都是通用的(shared)。所以如果你改变它,它会在任何地方改变..

    不要经常使用静态变量 - 这是非常糟糕的做法。生命也会发生同样的事情 - 如果你减少一个敌人的生命,它会减少所有敌人(该类的所有实例)的生命。

    【讨论】:

    • 感谢您的回复!它完成了这项工作。有没有其他方法可以从另一个类更改变量,而不影响所有实例,但只影响 hitTest 中的一个?
    • 好吧,只要变量不是静态的,它就会改变它在这个特定实例中的值。
    • 但是说我想通过另一个类生成敌人的槽。那么它需要是静态的吗?否则我根本无法访问该变量。
    • 尽量避免静态。您需要将对象传递给其他类才能使用它们的 public 方法/变量。如果你愿意,你可以通过整个数组,或者单个敌人 - 没关系。
    • 好的!非常感谢,我刚开始使用 AS3,所以所有这些信息都非常有用:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多