首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有数组、循环和if语句的hitTestObject

带有数组、循环和if语句的hitTestObject
EN

Stack Overflow用户
提问于 2017-04-24 16:25:29
回答 2查看 36关注 0票数 0

我让奴才跟着香蕉跑,它被箭头键控制着。我也有一个生活条,我跟踪它的基础上,如果仆从掉香蕉。我现在遇到的问题是,当一根香蕉(从阵列上)落在地上时,我的生命棒就会完全下降。我希望它能使逐渐降低,随着每根香蕉落地而逐渐降低。我试过使用分派事件,但它不起作用。

这就是我在主程序中所做的:

代码语言:javascript
复制
 import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;

var leftKey:Boolean;
var rightKey:Boolean;
var upKey:Boolean;
var downKey:Boolean;
var jump:Boolean = false;
var xvelocity:int = 9;
var yvelocity:int = 3;
var gravity:Number = 7;

stage.addEventListener(Event.ENTER_FRAME, changeVelocity);
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeyUp);
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeyDown);

  function changeVelocity(evt:Event){
        moveMinion();
        yvelocity += gravity;
    }

    function moveMinion(){

        if (leftKey == true){
           sideMinion.x -= xvelocity;
            sideMinion.left();

        }
        if (rightKey == true){
            sideMinion.x += xvelocity;
            sideMinion.right();
        }
    }

    function checkKeyDown(e:KeyboardEvent){
        if (e.keyCode == Keyboard.LEFT){
            leftKey = true;
        }
        else if (e.keyCode == Keyboard.RIGHT){
            rightKey = true;
        }

    }

    function checkKeyUp(e:KeyboardEvent){
        if (e.keyCode == Keyboard.LEFT){
            leftKey = false;
        }
        else if (e.keyCode == Keyboard.RIGHT){
            rightKey = false;
            }
    }

    btnStart.addEventListener(MouseEvent.CLICK, makeItFall);

    function makeItFall(e:MouseEvent){
    var numBananas = 6;
    var theBananas: Array = new Array();
    theBananas = [];
    for (var i = 0; i < numBananas; i++) {
    var aBanana: banana = new banana();
    theBananas.push(aBanana);
    btnStart.visible=false;
    aBanana.y=100;
    theBananas[i].setSpot(Math.random()*450,Math.random()*200);
    theBananas[i].setSpeed((Math.random()), 1);
    stage.addChild(aBanana);

}   

var health: Number= 100;
var healthPercent: Number= 1;
var lives:Event= new Event("lifeDrops")

addEventListener(Event.ENTER_FRAME, pickUpBananas);

function pickUpBananas(event:Event){

    for (var i:int = theBananas.length-1; i>-1; i--){

            if (sideMinion.hitTestObject(theBananas[i])){
                stage.removeChild(theBananas[i]);
                theBananas.splice(i,1);

        }

            if (info.hitTestObject(theBananas[i])){
            dispatchEvent(lives);   
            health=health-10;
            healthPercent=health/100;
            trace(healthPercent);
            life.scaleX= healthPercent;
            text.text=String(health);


        }

        if (health<0){
            gotoAndStop(5);
        }
    }
}   
    }

stop();

在香蕉课上:

代码语言:javascript
复制
    package {
    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.events.Event;

    public class banana extends MovieClip {

        var velX: Number = 0;
        var velY: Number = 0;
        var falling: Boolean = false;
        var gravity: Number = 2;

        public function banana() {
            var timing: Timer = new Timer(25, 0);
            timing.addEventListener(TimerEvent.TIMER, moveMe);
            timing.start();

        }

         private function moveMe(event: TimerEvent)
    {
        x += velX;
        y += velY;

        if (falling) velY += gravity;

       /* trace("[BANANA] position:", x, y, "speed:", velX, velY);*/
    }


        public function setSpeed(dx,dy) {
            velX = dx;
            velY = dy;
        }

            public function setSpot(atX,atY){
            this.x=atX;
            this.y=atY;
        }


        public function makeItFall (){
            falling=true;
        }


    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-25 16:50:18

您只是没有使用以下方法从数组中删除香蕉。它需要从数组中删除,否则它将继续检查香蕉是否击中了info,它将是这样的。

代码语言:javascript
复制
theBananas.removeAt(i); //works with most recent flash players and Adobe air 

代码语言:javascript
复制
theBananas.splice(1,i); // works with all players and Adobe air versions

这两种方法都做同样的事情,但是removeAt更快,更容易输入。

当然,您将把这段代码与块的其余部分放在info.hitTest中,例如,它可以直接放在text.text=String(health);下面

我也会继续和theBananas[i].parent.removeChild(theBananas[i];一起把香蕉从舞台上移走。当然,这需要在从数组中删除它之前完成。

希望这能有所帮助。

编辑:@Cadin的回答完全正确。如何让香蕉停止触发hitTest取决于您希望它的外观和工作方式。我的回答只是一种方法。

票数 1
EN

Stack Overflow用户

发布于 2017-04-24 21:37:31

您的pickUpBananas函数运行每一个帧,检查每个香蕉是否触地。因此,如果香蕉撞上了,它会降低该框架上的健康,并降低每一个后续帧的,直到它不再触及地面。

你需要做一些事情来防止同样的香蕉在随后的框架上反复消耗健康。

具体的解决方案将取决于您希望您的游戏的工作方式。你可以立即重置它的位置,使它不再接触地面,但你可能希望它坐在地上(或者至少在消失之前就会褪色)。在这种情况下,您可能会在香蕉上设置一个标志,表示它已经被计数,因此不会再被计数。如果你再丢下那根香蕉,记得清除那个旗子。

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

https://stackoverflow.com/questions/43593282

复制
相关文章

相似问题

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