オブジェクトが範囲外に出たら削除する例。
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メソッドとか、人によっては珍しいかも。
配列内の任意の位置から任意の数のオブジェクトを削除します。
おしまい。