2008-11-09

マスクじゃないんだよ

仕事でやりたいことを模索中。
あるエリアと重なるMovieClipのみを表示したい。
なんとかCPUを食わずに処理する方法を検討中

■マスクを使うとこんな感じになる


マスクを使う範囲検索

object_mc.setMask(display_mc);
setMotion();

function setMotion(){
display_mc.onPress = function(){
this.startDrag();
delete this.onPress;
this.onPress = function(){
this.stopDrag();
delete this.onPress;
_level0.setMotion();
}
}
}


■マスクじゃないんだよ!ちょっとちがうんだよ
エリアのRectangleとMovieClipのRectangleを比較して、出力する。
けど、onEnterFrameでやってるので重い。

Rectangle範囲検索

import flash.geom.Point;
import flash.geom.Rectangle;
import mx.utils.Delegate;
var showArea:Rectangle = new Rectangle(display_mc._x,display_mc._y,display_mc._width,display_mc._height);
var ary:Array = [];
var mcArray:Array = [];

for(var i in this){
if(i.substr(0,2) == "mc"){
ary.push(new Rectangle(this[i]._x,this[i]._y,this[i]._width,this[i]._height));
mcArray.push(i);
}
}
setMotion();
function setMotion(){
display_mc.onPress = function(){
this.startDrag();
delete this.onPress;
this.onPress = function(){
delete this.onPress;
this.stopDrag();
_level0.setMotion();
}
}
}
display_mc.onEnterFrame = Delegate.create(this,checkArea);
function checkArea(){
trace("checkArea");
trace(this);
showArea = new Rectangle(display_mc._x,display_mc._y,display_mc._width,display_mc._height);
for(var i in mcArray){
this[mcArray[i]]._visible = true;
this[mcArray[i]].play();
}
for(var i in ary){
if(showArea.intersection(ary[i]).isEmpty()){
this[mcArray[i]]._visible =false;
//this[mcArray[i]].gotoAndPlay("empty");
}
}
}


■結構CPU食うなぁ・・・もっと何とかできないのかな・・・
MovieClipの数を少なくする。横1列をひとつにして比較。
onEnterFrameもやめてsetIntervalにする。
けど、タイムラグがありすぎてこれつかえんのか?ってかんじ。




Rectangle範囲検索(setInterval使用)

import flash.geom.Point;
import flash.geom.Rectangle;
import mx.utils.Delegate;
var showArea:Rectangle = new Rectangle(display_mc._x,display_mc._y,display_mc._width,display_mc._height);
var ary:Array = [];
var mcArray:Array = [];

for(var i in this){
if(i.substr(0,2) == "mc"){
ary.push(new Rectangle(this[i]._x,this[i]._y,this[i]._width,this[i]._height));
mcArray.push(i);
}
}
setMotion();
function setMotion(){
display_mc.onPress = function(){
this.startDrag();
delete this.onPress;
this.onPress = function(){
delete this.onPress;
this.stopDrag();
_level0.setMotion();
}
}
}
//display_mc.onEnterFrame = Delegate.create(this,checkArea);
setInterval(this,"checkArea",2000);
function checkArea(){
trace("checkArea");
trace(this);
showArea = new Rectangle(display_mc._x,display_mc._y,display_mc._width,display_mc._height);

for(var i in ary){
if(showArea.intersection(ary[i]).isEmpty()){
this[mcArray[i]].gotoAndStop("empty");
this[mcArray[i]]._visible =false;

}else{
this[mcArray[i]].gotoAndPlay("loop");
this[mcArray[i]]._visible =true;

}
}
}


なんかほかにもやり方あるんすかね…
すごい非効率的な感じがするんだけども

2 コメント:

よしたに said...

境界線だけマスクして真ん中部分はvisible切り替えにするとだいぶ軽くなるとおもうんだけどどうかしら。

うり said...

1個1個のMCにゴリゴリスクリプトが動いているので、それを効率よくとめたり動かしたりしたいんですよねー。
(って、書いててもよくわからない)
visibleだけだと中のスクリプトはとめられないんだよね?違ったかしら。