あるエリアと重なる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 コメント:
境界線だけマスクして真ん中部分はvisible切り替えにするとだいぶ軽くなるとおもうんだけどどうかしら。
1個1個のMCにゴリゴリスクリプトが動いているので、それを効率よくとめたり動かしたりしたいんですよねー。
(って、書いててもよくわからない)
visibleだけだと中のスクリプトはとめられないんだよね?違ったかしら。
Post a Comment