‘ActionScript’ カテゴリーのアーカイブ

とあるDTMツールを作ってたんだけど…

2012年5月19日 土曜日

こんな DTM ツールあったらいいな?と思ってネットで探してもなかったので自分で作り始めていたのですが行き詰まりました。プログラムの組み方がわからないとかじゃなくて、ある時点から仕様通り動いてくれなくなるのです。言葉だけ聞けばプログラムの組み方が悪いようにしか見えません。

しかし処理は至って単純で入力した数値によってループ内で if で条件分岐されるだけ。ただ if else による条件分岐が物凄く多い。300分岐までは順調にいっていたものの、320を越えたあたりから if の中を通ってくれなくなったり、初期化したはずの変数が初期化されていなかったりおかしな現象が起き始めました。試しに if の数を減らしたら正常に動き、減らした分を書きなおしたら現象再発という。

if else の数に制限がある?という線で調べてみましたが、やっぱり制限はないようです。ActionScriptだから?という線がありそうです。

Re: switch や if での場合分けの上限数

アイディアはあるのに実現不可というのは悔しいものです。Web Tool で展開するには FLASH がやりやすいので FLASH でやりましたが、他となると html5 かな…。

【AS2.0】イントロがあるBGMをループさせる方法

2011年6月16日 木曜日

 ActionScript で BGM をループさせようとする場合…

 var s:Sound = new Sound(this);
 s.attachSound(“識別子”);
 s.start(再生開始時点,ループ回数);

 ループ回数の部分で何回ループするか数字で指定すればいいわけですが、イントロがある BGM だとそうはいきません。このままだと2回目のループでもイントロが再生されてしまいます。

識別子の指定方法

 ちなみに BGM に限らず ActionScript でオブジェクトを扱う場合、識別子を与えます。これで ActionScript で各オブジェクトを判別できるようになります。方法は次のようにします。

  • ライブラリから読み込んだサウンドを右クリックし、プロパティを開く。
  • サウンドプロパティが開くので、「ActionScript用に書き出し」にチェックする。
  • 識別子に任意の名前を指定する。(下図参照)

 前置きはこれくらいにして、イントロがあるBGMをループさせる方法です。

準備

 イントロとループする部分を波形編集ソフトなどを使って2つに分割します。
 この時点でイントロ部分・ループ部分を綺麗に切り取っていないとプログラムに組み込んだ時に不自然なループになってしまいます。

ActionScript を書く

//イントロ部分
var bgm_intro:Sound = new Sound();
bgm_intro.attachSound(“intro”);
bgm_intro.start();

//ループ部分
//イントロが終わったらループを再生する
bgm_intro.onSoundComplete = function() {
  var bgm_loop:Sound = new Sound();
  bgm_loop.attachSound(“loop”);
  bgm_loop.start();
  //ループ部分の曲が終わったらもう一回再生する
  bgm_loop.onSoundComplete = function() {
    bgm_loop.start();
  };
};

 onSoundComplete メソッドを使用します。指定したサウンドが終了したら~するという処理を記述する事ができます。onSoundComplete の前にサウンドオブジェクトを指定して以下のように記述します。

サウンドオブジェクト名.onSoundComplete = function() { … };

無限ループ

 bgm_loop.start(0,999); というようにすると擬似無限ループですが、999回再生すれば止まってしまいます。そこで、onSoundComplete を入れ子にすることで無限ループにしています。

5分で分かるActionScriptを知らない人がActionScriptの便利さを学べる記事を書いたよ

2011年1月2日 日曜日

 ActionScript を知らない人に ActionScript の話をして欲しいという初夢を見たのでブログ書きました。(*1)時代は ActionScript3.0 ですが、3.0は初心者なので勝手ながら2.0にさせて頂きます。
 ActionScriptとは、Adobe FLASHに使われるプログラミング言語です。

 難しい話は抜きにしてFLASHのアクションパネルに書けば動きます。FLASHオーサリングツールであれば特別な設定は不要です。

アクションパネル

 FLASH の拡張子は「.swf」ですが、object タグで FLASH を埋め込むことで「.html」ファイルで表示する事ができます。フレームの代わりにPHPを使うというWeb制作においては有用な記事があるのですが、ここではあまり関係ないので割愛します。

 ついでに ActionScript を少しでも使えるようになれば、こんなことができるという一例を紹介します。

準備

 FLASH上に任意の値を表示する為には、「ダイナミックテキスト」という変数の入れ物を準備する必要があります。

  1. テキストツールで任意の文字を表示させたい場所を指定します。
  2. プロパティからダイナミックテキストを選択します。
  3. オプションから、表示させたい変数を指定します。

ダイナミックテキストを使う準備

コピーライトの西暦を自動更新

 ActionScript を使えばページフッタの西暦も自動更新します。

var d:Date = new Date();
var copyright:String;	//コピーライトの入れ物
copyright = "copyright (c) 2002 - " + d.getFullYear().toString() 
+ "Episodes & Melody All rights reserved.";

自分の年齢を自動更新

 ActionScript を使えば自分の年齢を自動更新して表示できます。

var d:Date = new Date();
var profiles:String;//結果の入れ物
var now:String = d.getFullYear().toString();

if (d.getMonth()+1<10) {
	now += "0"+(d.getMonth()+1).toString();
} else {
	now += d.getMonth().toString();
}
if (d.getDate()<10) {
	now += "0"+d.getDate().toString();
} else {
	now += d.getDate().toString();
}

profiles = Math.floor((Number(now)-19850115)/10000)+"歳";

ページの部品を読み込む

 ActionScript を使えば、同ドメイン内の外部のFLASHを読み込む事ができます。

var parts = new MovieClipLoader ();
parts.loadClip("test1.swf" , 1);	//1の部分は外部SWFを読み込む場所へのパス

 これを応用するとヘッダとフッタを同期したりできますが、そんな事をするくらいなら1つのFLASHで作ったほうが効率的です。

他人のサイトの内容を読み込む

 通常 FLASH では、セキュリティの関係上別ドメインのファイルを読み込めない事になっています。アクセス許可などを記述する「クロスドメインポリシーファイル」を使う方法がありますが、別ドメインのファイルを読み込む為にはクロスドメインポリシーファイルを読み込みたいファイルがある別ドメインにアップロードしなくてはいけません。RSSなどを読み込みたい場合、配信先にアップロードする事は難しいです。その場合、PHPさんの力を借りればRSSを読み込めるかもしれません。

複数のメッセージをランダムに表示

var comment:Array = new Array("メッセージ1","メッセージ2","メッセージ3");
var output:String = comment[Math.floor(Math.random()*3)];

指定した月のカレンダーを出力

 少し長いですが、2010年12月のカレンダーを出力します。FLASHですから、枠や装飾はFLASHで描きます。

準備

 カレンダーの7*5分だけダイナミックテキストを配置し、プロパティから名前をつける。
 (ここでは、d1~d35という名前をつけています。)

 サンプル

calender(2010,12);

function calender(year, month) {
	var d:Date = new Date(year, month-1, 1);
	var week:Number;
	var days:Number;
	var day_count:Number = 1;

	week = d.getDay();
	d.setFullYear(year,month,0);
	days = d.getDate();

	for (var i = 1; i<=35; i++) {
		if (i>week && day_count <= days) {
			this["d"+i].text = day_count;
			day_count++;
		} else {
			this["d"+i].text = "";
		}
	}
}

まとめ

 以上のように結構便利なものがあります。準備欄の事をやってもらってコピーして貼りつけてたら大体のFLASHオーサリングツールで動きますのでどうぞ。
 他の方のPHP版、JS版、Ruby版、Python版と比べると ActionScriptは大分畑違いな感じがしますが、一応出来るよという事で書いてみました。
 興味のある方はぜひ以下の記事をご覧ください。

(*1) ネタ元の書き出しを踏襲させて頂きました。