AS3 - 当孩子到达某个点时如何移除孩子,并重新添加孩子

时间:2014-05-09 13:24:50

标签: actionscript-3

首先,我想说我不是很擅长AS3,我完全是自学成才,所以我确信有很多事情我做得很糟糕,效率低下或者说不好如果有什么可以改进的话,我对这些问题的评论感到高兴。

另外,我已经用类完成了这个,但是我现在遇到了一个时间问题,并且已经决定让事情先工作并在以后正确地整理出类文件,我知道这也是非常糟糕的做法并且做得更多工作比不需要,但由于我对他们的使用不太自信,我宁愿完成工作。

所以对于我的问题,我正在创建一个平台游戏,到目前为止,我已经有了从平台到平台的运动和跳跃,我正在尝试添加游戏的滚动功能,我的方式我尝试这是通过移除一个孩子到达屏幕底部,然后将该孩子添加回一个随机位置。

在start函数中我有这个数组来添加孩子并随机化它的位置:

for(i=0;i<8;i++) { PlatformInstance[i] =new Platform(); PlatformInstance[i].y= Math.random()*900; PlatformInstance[i].x= Math.random() *1500; stage.addChild(PlatformInstance[i]); }

我的碰撞和滚动的代码如下所示:

for (i=0; i<8; i++) {
if (PlatformInstance[i].hitTestPoint (Smallclock_hero.x,Smallclock_hero.y+130,true)) {
yescollision = true;
 if (keyboard_input.is_up() && yescollision == true)
    {
    trace ("boop")
    Smallclock.y_speed = -40
    yescollision = false;
    }

else {
Smallclock.y_speed *= 0;
}
}
if (Scrolling == true) {
PlatformInstance[i].y += 1; // this moves the platforms down.
}
}

是否有一种简单易用的方法可以在它到达一个点(1000)时删除PlatformInstance,然后再次使用相同的随机化代码添加实例?

提前谢谢。

为了清楚起见添加我的所有类文件,不确定是否需要它们

Start.as

package com {

 import flash.display.MovieClip;
import flash.events.Event; 

public class Start extends MovieClip {   
public var keyboard_input:Keys;     
 public var Smallclock_hero = new Smallclock;
public var BasePlatformInstance:BasePlatform = new BasePlatform;
public var BackgroundInstance:Background = new Background();
public var PlatformInstance:Platform = new Platform();
public var keyboard_sprite = new MovieClip();
public static var yescollision:Boolean = false
var yScrollSpeed:int = 1;
var Scrolling:Boolean = false;
var i:int =0;
public var Running:Boolean = true;



 public function Start () {
 trace("Hello")
 addChild (BackgroundInstance);
addChild (Smallclock_hero);
addChild (BasePlatformInstance);
BasePlatformInstance.x = 0;
BasePlatformInstance.y = 980;
 BackgroundInstance.height = stage.stageHeight +50 ;
 BackgroundInstance.width = stage.stageWidth  +50 ;
 Smallclock_hero.init();
var keyboard_sprite = new MovieClip();
addChild (keyboard_sprite);
keyboard_input = new Keys (keyboard_sprite);
stage.addEventListener(Event.ENTER_FRAME,on_enter);
addEventListener (Event.ENTER_FRAME, collisions);
//addEventListener (Event.ENTER_FRAME,refreshPlatform)
for(i=0;i<8;i++) {
        PlatformInstance[i] =new Platform();
     PlatformInstance[i].y= Math.random()*900;
     PlatformInstance[i].x= Math.random() *1500;
     stage.addChild(PlatformInstance[i]);

 }


 }  

 public function on_enter(event:Event) {

if (keyboard_input.is_left()){
Smallclock_hero.apply_force(-1,0);
Smallclock_hero.scaleX = -1

}
if (keyboard_input.is_right()) {
Smallclock_hero.apply_force(1,0);
Smallclock_hero.scaleX = 1
}


  }

  public function collisions (e:Event) {
 if (BasePlatformInstance.hitTestPoint (Smallclock_hero.x,Smallclock_hero.y+130, true)) {
    //trace ("touching!")
    yescollision = true;

    if (keyboard_input.is_up()) 
    {

    Smallclock.y_speed = -40
    Start.yescollision = false;
    }
if (Smallclock.y_speed ==-40) {
    Scrolling = true;
    removeChild(BasePlatformInstance);
}


else {

Smallclock.y_speed *= 0;
}
}

 for (i=0; i<8; i++) {

 if (PlatformInstance[i].hitTestPoint (Smallclock_hero.x,Smallclock_hero.y+130,     true))      {
yescollision = true;
 if (keyboard_input.is_up() && yescollision == true)
    {
    trace ("boop")
    Smallclock.y_speed = -40
    yescollision = false;
    }

else {
     Smallclock.y_speed *= 0;
  }
 }
 if (Scrolling == true) {
PlatformInstance[i].y += 1;
 }
 }

Smallclock.as

package  com {

import flash.display.Sprite;
import flash.events.Event;
public class Smallclock extends Sprite {
    private var x_speed:Number;
    public static var y_speed:Number;
    private var power:Number;
    public  var friction:Number;
    public static var gravity:Number;
    public static var jumping:Boolean = false;
    public static var jumppwr:Number;
    public static var jumpSpeedLimit:int = 15;


    public function Smallclock() {
        addEventListener (Event.ENTER_FRAME, move);

    }
    private function move (e:Event) {
        x+=x_speed;
        y+=y_speed;
        y_speed += gravity
        x_speed *= friction  ;
        y_speed *= friction  ;
        if (x < -25) { 
            x = 1650

        }
        if (x > 1650) {
            x = -25
        }

    }
    public function apply_force (x_force,y_force){
        x_speed += (x_force*power);
        y_speed += (y_force*power);
    }
    public function init() {
        jumppwr = 2;
        gravity = 1.0;
        power = 0.8;
        friction = 0.9;
        x_speed = 0;
        y_speed = 0;
        x= stage.stageWidth/2;
        y = 850;


    }
}

}

Keys.as

package com {

import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class Keys {
    private var press_left = false;
    private var press_right = false;
    private var press_up = false;
    private var press_down = false;
    private var press_space = false;

    public function Keys(movieclip) {
        movieclip.stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
        movieclip.stage.addEventListener(KeyboardEvent.KEY_UP, key_up);/**/
    }
    public function is_left() {
        return press_left;
    }
    public function is_right() {
        return press_right;
    }
    public function is_up() {
        return press_up;
    }
    public function is_down() {
        return press_down;
    }
    public function is_space() {
        return press_space;
    }
    public function key_down(event:KeyboardEvent) {
        if (event.keyCode == 32) {
            press_space = true;
        }
        if (event.keyCode == 37) {
            press_left = true;
        }
        if (event.keyCode == 38) {
            press_up = true;

        }
        if (event.keyCode == 39) {
            press_right = true;
        }
        if (event.keyCode == 40) {
            press_down = true;
        }
    }
    public function key_up(event:KeyboardEvent) {
        if (event.keyCode == 32) {
            press_space = false;
        }
        if (event.keyCode == 37) {
            press_left = false;
        }
        if (event.keyCode == 38) {
            press_up = false;
        }
        if (event.keyCode == 39) {
            press_right = false;
        }
        if (event.keyCode == 40) {
            press_down = false;
        }
    }
}
 }

1 个答案:

答案 0 :(得分:1)

我不打算通过你的所有代码阅读,抱歉。

当然有。在您更新仓位的区间/事件处理程序中,您必须遍历所有平台并检查其位置是否≥1000。如果是,您不需要将其删除,只需将其随机化即可并使用您已有的代码再次设置其位置:

for(i=0;i<8;i++) {
   if(PlatformInstance[i].x >= 1000) {
      var inst:Platform = PlatformInstance[i];
      inst.y= Math.random() * 900;
      inst.x= Math.random() * 1500;
}

这应该工作得很好。如果确实需要将其删除(??),您可以使用stage.removeChild(inst)然后stage.addChild(inst)再次执行此操作。

我在你的问题中读到的几条代码的一些提示:不要给大写的第一个字母的实例/变量名。那应该是一个类名(PlatformInstance显然是Array或Vector的一个实例,使用platformInstance)。不要将对象直接添加到舞台上。如果可能,将它们添加到舞台所有者(如果您在类中编写代码,则为文档类)。