maskをかけたいときには A.mask = B (AをBの範囲でマスクする)というように使います。
var tf:TextField = new TextField();
tf.text = "お願い!マスクして!お願い!マスクして!お願い!マスクして!お願い!マスクして!お願い!マスクして!お願い!マスクして!お願い!マスクして!お願い!マスクして!"
tf.selectable = true;
tf.wordWrap = true;
tf.width = 150;
addChild(tf);
var ball:Sprite = new Sprite();
ball.graphics.beginFill(0xFF0000);
ball.graphics.drawCircle(0, 0, 50);
addChild(ball);
tf.mask = ball;
とすれば好いはずですが、何度お願いしてもこの場合円の矩形の範囲でマスクされてしまいます。
その形でマスクするには 両方のcacheAsBitmap を trueにします。
tf.cacheAsBitmap = true;
ball.cacheAsBitmap = true;
参考
レベルがあまりに高すぎてビビりつつずっとサボってたwonderflをまたやり始めました。
パーティクル祭に乗り遅れること半年以上、今日からちまちま1人パーティクル祭りやってくよー。
第1回目の今日はとりあえず放射線状に発射。
最近クイズを作る機会が何度かありまして、総数20問から7問を重複しないよう抜き出して順番に表示していくというようなことをしました。その時に作ったクラスです。
配列から重複せずにn個取り出して新しい配列を返すRandomExtractクラス
package
{
public class RandomExtract
{
/**
* コンストラクタ
*
* @access public
* @param
* @return void
*/
public function RandomExtract():void
{
}
/**
* ランダムに配列の値を取り出す
*
* @access public
* @param array 元になる配列
* @param num 取り出す配列の個数
* @return Array
*/
public static function random(array, num):Array
{
var a:Array = array;
var t:Object = {};
var r:Array = [];
var l:int = a.length;
var n:int = num < l ? num : l;
while (n-- > 0) {
//配列の数からランダムな値を作成
var i = Math.random() * l | 0;
r[n] = t[i] || a[i];
// t[i]がundefinedにならない処理
--l;
t[i] = t[l] || a[l];
}
return r;
}
}
}
例えば10個の配列から3個の値を取り出したい時は以下のように記述します。
import RandomExtract;
var arr:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var num:int = 3;
var newArr:Array = RandomExtract.random(_arr, _num);
trace(newArr + "が取り出されるんだぜ");
出力結果はこんな感じです。
2,1,6が取り出されるんだぜ
参考サイトがあってそこのコードを自分に分かりやすいように書き換えただけなのですが、どこだったか分からなくなってしまいました。見つけたら追記します。
[9/21 追記]
ムダにRandomExtractクラスをインスタンス化していたのでrandomメソッドをstaticに修正。
【参考】
【Flash】FlashVarをFlashで受け取る(AS3)|atsumo+Flash
以下のようにして受け取ります。
var flashVars:Object = loaderInfo.parameters;
for (var i:String in flashVars) {
_txt.appendText(i + "=" + flashVars[i] + "\n");
}
受け取りたいFlashVarsの値の中身が複数あって、それぞれ別々の場所に格納したい以下のような場合には、
nickname=ore&age=10014
for…inループの変数部分にはObjectのプロパティ名が入ります。文字列を追加したいTextfieldを各プロパティ名に対応する値として格納しておくことで、別々のTextfieldに追加することができます。
var flashVars:Object = loaderInfo.parameters;
var txtData:Object = {nickname:name_txt, age:age_txt};
for (var i:String in flashVars) {
txtData[i].appendText(flashVars[i]);
}
【Progression】右クリックで表示されるコンテキストメニューを非表示にする。
上記ページを参考に俺もやってみました。Index.asの_onInitに以下の記述を追加して、
//コンテキストメニューを非表示
Progression.uiContextMenu.enabled = false;
CastObjectContextMenu.enabled = false;
CastButtonContextMenu.enabled = false;
このままだとエラーが出たのでimport文を追加。
import jp.progression.core.ui.CastButtonContextMenu;
import jp.progression.core.ui.CastObjectContextMenu;
これで右クリックすると「Powered by Progression 3.1.62」「設定」「Adobe Flash Player 10 について」の表示になりました。フォーラムではimport文を書いてもダメだったとあったけど…何ででしょ。
「印刷する」だけとか個別に設定したい時は以下を参考に設定。
CastObjectContextMenu – Progression 3.1 – API Reference
CastButtonContextMenu – Progression 3.1 – API Reference
OS10.5.6のFireFox3.0.1/Safari3.2.1で検証中、以下のエラーが出て処理が止まってしまった。

スタックオーバーフローとは何ぞ?と調べてみるとこれくさい。
StackOverflowError – ActionScript 3.0 言語およびコンポーネントリファレンス
ActionScript は、スクリプトで使用できるスタックを使い切った場合に StackOverflowError 例外をスローします。ActionScript はスタックを使用して、スクリプト内で行われた各メソッド呼び出しに関する情報 (例えば、メソッドが使用するローカル変数) を保管します。使用できるスタックスペースの量は、システムによって異なります。
StackOverflowError 例外は、無限反復が発生したことを示している可能性があります。その場合、関数に終了条件を追加する必要があります。また、再帰アルゴリズムには適切な終了条件があるものの、単にスタックを使い切ってしまったことを示している可能性もあります。この場合、代わりの方法として、アルゴリズムを反復的に表現するようにしてください。
スタックとはIT用語辞典によると、「最後に入力したデータが先に出力されるという特徴をもつ、データ構造の一種。」とのことなので、吐いたエラーはそんなに覚えらんねーよ、て事か。ローカル変数の使いすぎに注意、というのもどこかで見た。リファレンスの後半パラグラフは、最近やっと読み始めた「詳説 ActionScript 3.0」のP101にも書いてある内容。
今回エラーが出たコードはこんな感じのことをやっていました。
protected override function _onLoad():void {
var sList:SerialList = new SerialList();
(略)
for (var i:int = 0; i < 10; i++) {
var sp:Sprite = new Sprite();
(略)
sp.x = i *10;
sList.addCommand(
new AddChild(ore, sp)
);
}
// 実行したいコマンドを登録します。
addCommand(
(略)
sList
);
}
同じような処理を繰り返すことでスタックを使い切ってる?違う気もするが、同時に実行しても困らないものだったのでSerialListからParallelListに変更したところエラーは出なくなった。Progressionがどうこう言う前に(略)の箇所であれこれやってる部分が問題かも。要検証。
Colin Moock オライリージャパン 売り上げランキング: 17330
|
Progressionで作業中、new DoTweenerのループを作ってSWFProfilerでチェックしていたらメモリがどんどん増えていってしまう。簡略化してるけど要はこんなことをしていました。tween1→tween2→tween1……とループします。
private function tween1():void {
new SerialList(null,
new DoTweener(ore, {
x:500,
time:1
}),
new Func(tween2)
).execute();
}
private function tween2():void {
new SerialList(null,
new DoTweener(ore, {
x:0,
time:1
}),
new Func(tween1)
).execute();
}
解決策は以下のページにありました。
Progressionで起きたメモリリーク
こちらで書いておられる通り、DoTweenerでの記述をTweenerに直してみたら改善されました。
Tweenerでの記述はこんなんになりました。
private function tween1():void {
Tweener.addTween(ore, {
x:500,
time:1
onComplete:tween2
});
}
private function tween2():void {
Tweener.addTween(ore, {
x:0,
time:1
onComplete:tween1
});
}
とりあえずこれでよしとする。
Progressionの次のメジャーアップではメモリ関連の対策に重点が置かれるらしいのでそちらに超期待。
そもそもTweenerのループってもっとンマいやり方あるかも。
1つの配列から要素を1つずつずらした多次元配列の作り方。
var _array:Array = [1, 2, 3, 4];
var _allArray:Array = new Array();
var _length:int = _array.length;
for (var i:int = 0; i < _length; i++ ) {
var a:Array = new Array();
_allArray[i] = a;
for (var j:int = 0; j < _length; j++ ) {
a[j] = _array[j];
};
if (i != 0) {
for (var k:int = 0; k < i; k++ ) {
var n:Number = _allArray[i].pop();
_allArray[i].unshift(n);
}
}
}
出力結果は以下のようになります(見難いので改行してます)。
1,2,3,4,
4,1,2,3,
3,4,1,2,
2,3,4,1
配列を1つずつ2次元配列に追加して、pop()で配列の末尾を削除、unshift()で先頭に追加。1個目はそのまま、2個目だったら1回、3個目だったら2回削除&追加を繰り返す。
出現の順番を変えたい時とかに使えると想ったんだけど、もっといいやり方がありそう。そもそもこんなことやる意味ないかも。
wonderflデビュウしましたよ。三角関数使いこなせてませんが、凄腕のみなさんの作品で勉強させてもらいつつ、気持ちいいものをあげていければと想います。
String型の”4649″をint型の4649として計算したい時など、データ型を変換したい場合があります。
型変換には、暗黙的に行われる場合と、明示的に行う必要がある場合があります。明示的に行う型変換を「キャスト」と呼びます。
暗黙的な変換
以下はuint型とString型の連結の例。数値の11が暗黙的に文字列に変換され、文字列同士の連結が行われます。
var num:uint = 11;
var str1:String = "キングカズ";
var str2:String;
str2 = str1 + num;
trace(str2); //キングカズ11
明示的な変換
明示的な変換には関数によるキャストと構文によるキャストがあります。
関数によるキャスト
トップレベルに用意されているキャスト用の関数を使用します。
キャスト用関数
| 関数 |
説明 |
| Boolean() |
ブール値に変換 |
| Number() |
Number型の数値に変換 |
| int() |
int型の数値に変換 |
| uint() |
uint型の数値に変換 |
| String() |
文字列に変換 |
文字列をNumber型の数値に変換する例。
var str:String = "3.14";
var num:Number;
num = Number(str); //文字列を数値に変換
trace(num); //3.14
小数点以下の数値を含むNumber型の数値をint型やuint型にキャストすると小数点井が切り捨てられます。
var num1:Number = 3.14;
var num2:int;
num2 = int(num1); //Num型をint型にに変換
trace(num2); //3
構文によるキャスト
専用の関数が用意されていないデータ型に変換する場合でも、次のような構文を使用することで関連するクラスにキャストできます。
クラス(値)
以下はMovieClipクラスのインスタンス「mc」をSpriteクラスにキャストします。
var mc:MovieClip = new MovieClip();
var sp:Sprite;
sp = Sprite(mc); //MovieClipクラスをSpriteクラスに変換