お仕事でFLash作ってて、これからも個人的に使えそうだったのでメモ。
結構Flash使ってるとランダムな数値が必要になることがちょいちょいある
結構あるのだとAdobeさんのTechNoteにのっているような
private function RandomInt(nMax:Number,nMin:Number){
//nMinからnMaxまでのランダムな整数を返す
nRandomInt= Math.floor(Math.random()*(nMax-nMin+1))+nMin;
return nRandomInt;
}
RandomInt(hogeMax, hogeMin);
で取得。
で、今回必要だったのは「指定範囲までの乱数でかつ重複しない数値の取得」だったので
上にちょっと足しました
private var randomArray:Array = [];
//nMin~nMaxまでのランダムな数値を取得
private function selectRundomFunc(nMax:Number, nMin:Number , nCount:Number) {
for (var i:Number = 0; i < nMax; i ++) {
randomArray[i] = i + 1;
}
while (nMax--) {
var yy:Number = Math.floor(Math.random() * (nMax-nMin+1))+nMin;
var zz:Number = randomArray[nMax];
randomArray[nMax] = randomArray[yy];
randomArray[yy] = zz;
}
//test
for (i = 0; i < nCount; i ++) {
trace('random : ' + randomArray[i]);
}
}
例えば1~20の範囲の重複しない数値がほしい場合は
selectRundomFunc(20 , 1 , 20);
と指定してtraceをみると
random : 6
random : 1
random : 13
random : 8
random : 3
random : 5
random : 20
random : 9
random : 18
random : 4
random : 2
random : 15
random : 11
random : 14
random : 7
random : 17
random : 10
random : 12
random : 16
random : 19
とか重複しないで数値が取れるはず。
配列に+1しないと0が出てしまうので配列に+1を足した。
省き方とか上の取得方法でいいのかは疑問だけどうまいこと取得できたのでひとまずメモ!
Progressionようようはじめました!
Progressionクラススタイルガイドやみなさんのサイトや色々みてサンプルサイトを作ってみました。
http://mooco.in/wp/wp-content/uploads/2010/01/deploy/
書き方がまだぜんぜん理解できていない・・・・
でもこのシーン毎でのファイル分けや、初期からSWFadressやSWFWheelがついてたりと
Flashサイト制作をするのなら使うととても便利だと思いました。すばらしいです。
色々参考にしたサイトを下記に載せさせていただきます
→Progression – Framework for Flash >>> クラススタイルガイド
→フルFlashサイトをProgressionで作り始める時にまず読むべき16の記事
→[progression勉強]階層のあるサイトを作ってみる
→[AS]progression 出発シーン、到着シーンのsceneIdを取得する方法”departedSceneId”,”destinedSceneId”
→fffflash Progression 3 ベータやってみたよ1
→12分でできる! Progressionでスライドショーを作るチュートリアルビデオ | ClockMaker Blog
Resize処理がうまくいってないです・・・・今度直します。
AS2.0の本ですごく勉強になった
オライリー社発行の「Flash Hacks――プロが教えるテクニック & ツール100選」
この本に掲載されていた「ブルックリンで木を育てる」という木を生成するAS2.0のスクリプトを
AS3.0に修正してみました。

クリックで別ウィンドウでSWFを確認できます。(SWFクリックで木を再描画)
package {
import flash.display.Stage;
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.events.Event;
public class GrowTree extends MovieClip {
//Tree
private var trunk:MovieClip;
private var angle:Number = 80;
private var branch:Number = 5;
private var trunkThickness:Number = 8;
private var trunkLength:Number = -150;
private var branchSize:Number = 0.8;
private var branchCounter:Number = 0;
private var counterNumber:Number = 2000;
public function GrowTree() {
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event):void {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
trunkCreate();
stage.addEventListener(MouseEvent.CLICK, onClick);
}
//幹の初期設定
private function trunkCreate():void {
trunk = new MovieClip();
addChild(trunk);
trunk.x = stage.stageWidth / 2;
trunk.y = stage.stageHeight - 80;
trunk.name = 'trunk';
trunk.addEventListener(Event.ENTER_FRAME, grow);
}
//幹・枝を生成
private function grow(e:Event = null):void
{
if (e) {
var mc:MovieClip = e.target as MovieClip;
if (mc.name != 'trunk') {
//枝の生成
mc.graphics.lineStyle(trunkThickness, 0);
mc.graphics.moveTo(0, 0);
mc.graphics.lineTo(0, trunkLength);
mc.rotation = (Math.random()*angle)-angle/2;
mc.scaleX *= branchSize;
mc.scaleY *= branchSize;
}else {
//幹(ちょっと太めにするため)
mc.graphics.lineStyle(trunkThickness*1.1, 0);
mc.graphics.moveTo(0, 0);
mc.graphics.lineTo(0, trunkLength);
}
var seed:Number = Math.ceil(Math.random()*branch);
for ( var i:Number = 0; i < seed ; i++ ) {
if (counter() < counterNumber) {
var segment:MovieClip = new MovieClip();
segment.addEventListener(Event.ENTER_FRAME,grow);
segment.y = trunkLength;
mc.addChild(segment);
}
}
mc.removeEventListener(Event.ENTER_FRAME,grow);
}
}
private function counter():Number {
//counterNumber分処理を繰り返す
return (branchCounter++);
}
private function onClick(e:MouseEvent):void {
//クリックで再描画
removeChild(trunk);
branchCounter = 0;
trunkCreate();
}
}
}
「private var angle:Number = 80;」で角度を設定しているのでその角度内で枝がランダムに伸びていきます。
生成に使われている概念/構成自体は変わらないし、ソースがもともと短く簡潔なので分かりやすかったー。
この木を使って今度また別のものを作成してみたいと思います。
・160px以下のサイズですのでサイドバーにアクセントとして貼ることも可能です。
MolabBlog Clock02
下記をスクリプトをブログの貼りたい箇所に貼り付けてください
・デザイン性を重視したアナログ時計です。
・ローカルタイムを取得し、時・分・秒単位で表示をします。
Windows・Mac OS X
Adobe AIRがインストールされていない場合、AIRのインストールが求められます。
その後、インストーラの画面に従ってガジェットをインストールしてください。
2008.10.11 時間表示にエラーがあったため修正いたしました
・シンプルなデジタル時計です。
・ローカルタイムを取得し、表時・分・秒単位で表示をします。
Windows・Mac OS X
Adobe AIRがインストールされていない場合、AIRのインストールが求められます。
その後、インストーラの画面に従ってガジェットをインストールしてください。
as3.0でXML読み込みしてみました。
as2.0に比べると格段に便利~。ステキです。
as2.0のXMLオブジェクトは「XMLNode」として別扱いであるそう。
package
{
import flash.display.Sprite;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
public class Sample_XML extends Sprite
{
private var urlLoader:URLLoader = new URLLoader();
private var sampleXML:XML;
//定数を定義(変更不可)
private const XML_URL:String = "http://momoseneko.com/molab_blog/rss.xml";
public function Sample_XML(){
//request生成
var urlRequest:URLRequest = new URLRequest(XML_URL);
//XMLを読み込み後実行
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.load(urlRequest);
//XMLの読み込みに失敗した場合実行
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
}
public function completeHandler(event:Event):void {
//xml取得
var sampleXML:XML = new XML(urlLoader.data);
var element:Object = sampleXML.channel.item;
for(var i:Number=0; i < sampleXML.channel.item.length(); i++) {
trace("title:"+sampleXML.channel.item[i].title);
trace("description:"+sampleXML.channel.item[i].description);
}
}
private function onLoadError(event:Event):void {
trace("xml load error");
}
}
}



