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

【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) ネタ元の書き出しを踏襲させて頂きました。

Flashにおけるボタンのパスについて

2010年11月27日 土曜日

 例えば、FLASHにムービークリップを一つ配置して、その中にボタンを入れるとします。ボタンからルートを指すには、「_root」で指せます。
 では、ボタンを押したらムービークリップを消すというスクリプトを書くとき、ボタンからムービークリップを指すにはどうすれば良いか。

  • 「_root.mc1.removeMovieClip();」 というように絶対パスで指定

 実はもう一つ方法がありました。

 自分自身を指す場合は「this」を使います。なので、ボタンで「this」を使っても指すものはボタン自身だと思っていたのですが、実は違うようです。

※ボタンシンボルに設定するthisの場合は、ボタン自身ではなく、ボタンの配置先を指定するという意味になります。
引用元:http://1art.jp/flash/le/lesson15/lesson15.htm

 つまりボタンから「this」を使うだけで、ムービークリップを指せるという事です。
 今まで長々と絶対パス指定をしていたので、FLASHゲーム作成においても役立ちそうです。

 「this」が自分自身を指さないというのはボタンオブジェクトに限っての例外だそうです。
 参照:Buttonのthis

【AS】ブランチが32Kの範囲を超えています

2010年2月3日 水曜日

FLASHをコンパイルすると、突然謎コンパイルエラーが発生しました。

『**警告** xxxx と yyyyy の間の ブランチが 32K の範囲を超えています。』

突然発生して何故だろうと「32K」というキーワードで調べてみたら ActionScriptファイル(.as)が32Kbyteを超えていました。32Kbyte超えたらダメなんだね。これでFLASHが実行できなかったら詰んでいましたが、警告なのでとりあえず動いています。頼むからもう少し持ちこたえて欲しい。

ほんとは、もっと細かくクラス分けするべきなんだろうね。

追記

 たまたま私の場合は、32KB以下のファイルだとエラーがでなくなりましたが、200KBのASファイルを書いても問題なかったとの情報もコメントで頂きました。
 結局何が原因なのか。

PHPからFLASHへの変数の受け渡し

2010年1月14日 木曜日

あまりやらない事なので、いざやろうとした時に思い出せません。という事でPHPからFLASHへの変数の受け渡し方法を覚え書き。

PHP側 (test.php)

<?php
/*何らかの処理*/
echo '&var1='.$num;
?>

var1はFLASH側で受け取る変数名です。$numをFLASHへ送ります。

FLASH側

var lvar:LoadVars = new LoadVars();
var test:Number = 0;
lvar.load("test.php");
lvar.onLoad = function () {
  test = this.var1;
}

これで、testにPHPから送った$numが入りました。

【AS3.0】ローディングムービー

2009年1月2日 金曜日

 ローディングムービー作るにもAS2.0とは書き方が大分違いました。
 AS3.0では読み込み率を表示するダイナミックテキストのプロパティで変数を設定できなくなりました。AS3.0でローディングムービーを作る方法について覚書です。 

stop();
var num:Number = 0; //読み込み率の為の変数
addEventListener(Event.ENTER_FRAME, 関数名);

function 関数名(e:Event){
 num = Math.floor(loaderInfo.bytesLoaded / loaderInfo.bytesTotal * 100);
 per.text = num + "%";
 if(num == 100){
  gotoAndStop("ロード後に飛ぶフレーム");
  removeEventListener(Event.ENTER_FRAME, 関数名);
 }
}

 addEventListenerでイベントを受け取る準備をします。「Event.ENTER_FRAME」とは、AS2.0でいう「onEnterFrame」です。毎フレーム処理するイベントです。
 次にロード率を計算しています。従来と違うのは「loadInfo」ですね。loadInfoとは、ムービークリップのプロパティでロード状態を管理するもののようです。
 「per」とは、ロード率を表示するダイナミックテキストのインスタンス名です。.textプロパティで書く内容を設定します。

 あとは、ifでロード率が100になったら…という処理を書きます。
 最後にremoveEventListenerでリスナーの解除です。これをしないと、次フレームに飛んでも毎フレーム処理されてしまいエラーが吐き続けられます。

 毎回書くのは面倒なので、一度クラス化してしまえば1行で済みそうですね。AS3.0では個々にライブラリを作っていくのが良いのかな。

【AS3.0】外部サイトに飛ぶ方法

2009年1月1日 木曜日

 ActionScript2.0以下では「getURL」1行で済みましたが、3.0ではそうはいきません。
 ボタンを押すと外部サイトへ飛ぶ という方法について覚書です。

stop();
var url:URLRequest = new URLRequest(“http://www.sample.com/”);
ボタンインスタンス名.addEventListener(MouseEvent.CLICK, 関数名);

function 関数名(e:MouseEvent){
 navigateURL(url);
 removeEventListener(MouseEvent.CLICK, 関数名);
}

 まず、url変数を宣言します。
 次にaddEventListenerでイベントを受け取る準備を…ってほんとJAVAに近くなりましたね。
 引数にイベントの種 類と関数名(リスナーオブジェクト?)を記述し、クリックを検出すると指定した関数が実行されます。
 そして、関数でイベントを受け取り 「navigateURL」で飛びます。
 最後にリスナーの解除。
 これをどこに書くかというと、フレームです。AS3.0ではボタンイ ンスタンスに直接スクリプトを書けなくなりました。あちこちスクリプトを書くなという事ですね。

【メモ】重複しない乱数配列を作る

2008年5月19日 月曜日

for(i = 0 ; i < length ; i++){
  array[i] = Math.floor(Math.random()*30);
}
//length:配列の要素数

 これだけでは配列に重複した値が入ってしまう可能性があります。Actionscriptで書いてますが、C言語でもJAVAでもほぼ一緒です。
 重複しないようにするには…。

for(i = 0 ; i < length ; i++){
   array[i] = Math.floor(Math.random()*30);
   for(j = 0;j < length; j++){
      if(j != i){
         if(array[i] == array[j]){
            i--;
         }
      }
   }
}

 乱数を発生させた後、自分自身以外と比較して同じものがあれば i を1引いてもう一度乱数を発生という感じです。
 30を変えると乱数の範囲を変えられます。ただし、配列の要素数未満にすると無限ループになります。
 いろいろぐぐってたんですが、方法としてもっとややこしい仕組みになっていたりわかりにくかったので調べるのを諦めて自分で考えました。
 ただし、この方法は遅いです。

var宣言は何気に反故にできない

2007年11月26日 月曜日

ActionScript1.0、タイムラインに記述する変数にはvar宣言を省略できます。

ActionScript2.0では省略するとエラーになってしまうので1.0のみにいえる事らしいのですが、Var 宣言をするのとしないとでは処理速度に違いが出るようです。
速くなるのはもちろん付けた方。付けるに越したことはないですね。面倒と言わずに。

【AS3.0】ライブラリのMCを動的に配置

2006年12月16日 土曜日

ActionScript3.0 のリファレンスやいろいろぐぐって調べていたのですが、ライブラリのムービークリップをスクリプトで配置する方法が全然見つからなくて不思議でなりませんでした。
これができなければ先に進めないじゃないか。

ActionScript 2.0での手順

1.ムービークリップを作成。
2.ライブラリから作成したムービークリップを右クリック。
3.メニューからリンケージを選択。
4.識別子を決める。(名前のようなもの)
5.スクリプトで「attachMovie(“識別子”,”新たな名前”,深度,{_x:x座標,_y:y座標});」

ActionScript 3.0(スクリプトをasファイルとして外部に置いた場合。)

1.ムービークリップを作成
2.ライブラリから作成したムービークリップを右クリック。
3.メニューからリンケージを選択。
ここから違う。
4.関連付けるクラスをクラスの欄に入力。(例としてlineとする)
5.メインのクラスをプロパティウィンドウのDocument Classに入力。(例としてtestとする)
6.スクリプトで
mc = new (4で決めたクラス名);
addChild(mc);

 AS2.0とAS3.0では書き方も全く違うので以下サンプル。

package{
  import flash.display.MovieClip;
  public class test extends MovieClip{
    var mc:MovieClip;
    function test(){
      mc = new line();
      addChild(mc);
      mc.x = 100; //x座標
      mc.y = 100; //y座標
    }
  }
}

lineってのはリンケージで決めたクラス名であって、そのクラスを作る必要はない。
今の段階で言うと、今まで一行で済んだものをこれだけ書かなければならないのは面倒。しかし、AS3.0では深度管理も簡単になっているらしい。処理も数倍速いらしいし。