Murayama blog.

プログラミングと、その次の話

オブジェクトが範囲外に出たら削除する例。

ActionScript3.0アニメーション本も、
第6章 跳ね返りと摩擦に突入。


なかなか終わりに辿りつかないけど、人生は長いのでゆっくりがんばる。


で、内容。
跳ね返り、とタイトルにはあるけれど、
第6章で習うのは、限られた空間(ASでいうStageとか)での跳ね返りの話で、
物体と物体の衝突の話はもうちょっと先で扱うみたい。


ビリヤードでいうなら、テーブル枠内での跳ね返りを実装するけど、
ボール同士の跳ね返りは実装しないかんじ。


さて、1本目のサンプル。
ボールが移動して、画面(Stage)の外に出ると消去されます。


コードはこんなかんじ。

package
{
  import flash.display.Sprite;
  import flash.display.StageAlign;
  import flash.display.StageScaleMode;
  import flash.events.Event;
  
  public class Removal extends Sprite
  {
    private var count:int = 100;
    private var balls:Array;
 
    public function Removal()
    {
      init();
    }
    
    private function init():void{
      stage.scaleMode = StageScaleMode.NO_SCALE;
      stage.align = StageAlign.TOP_LEFT;
      
      balls = new Array;
      for(var i:int = 0; i < count; i++){
        var ball:Ball = new Ball(10, 0xFFFFFF * Math.random());
        // 真ん中に配置。ブラウザによってはちゃんと機能しない?
        ball.x = Math.random() * stage.stageWidth;
        ball.y = Math.random() * stage.stageHeight;
        // 縦横のスピード
        ball.vx = Math.random() * 2 - 1;
        ball.vy = Math.random() * 2 - 1;
        addChild(ball);
        balls.push(ball);
      }
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
 
    private function onEnterFrame(evt:Event):void
    {
      for(var i:Number = 0; i < balls.length; i++){
        var ball:Ball = balls[i];
        // 移動
        ball.x += ball.vx;
        ball.y += ball.vy;
        // 少しずつ大きく
        ball.scaleX = ball.scaleY = ball.scaleX + 0.01
        // 範囲外(Stageの外)に出ると削除
        if(ball.x > stage.stageWidth || ball.x < 0
         || ball.y > stage.stageHeight || ball.y < 0){
           removeChild(ball);
           balls.splice(i, 1);
           if(balls.length <= 0){
             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
           }
         }
      }
    }
  }
}
 
import flash.display.Sprite;
 
class Ball extends Sprite
{
  private var radious:Number;
  private var color:uint;
  public var vx:Number;
  public var vy:Number;
 
  public function Ball(radius:Number = 40, color:uint = 0xff0000)
  {
    this.radious = radius;
    this.color = color;
    init();
  }
 
  private function init():void{
    graphics.beginFill(color);
    graphics.drawCircle(0, 0, radious);
    graphics.endFill();
  }
}


これまでと違って、
onEnterFrameメソッドの中で、
ボールが範囲外に出てしまったときの削除処理を追加しています。

        // 範囲外(Stageの外)に出ると削除
        if(ball.x > stage.stageWidth || ball.x < 0
         || ball.y > stage.stageHeight || ball.y < 0){
           removeChild(ball);
           balls.splice(i, 1);
           if(balls.length <= 0){
             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
           }
         }

配列のspliceメソッドとか、人によっては珍しいかも。
配列内の任意の位置から任意の数のオブジェクトを削除します。


おしまい。