2007年12月アーカイブ

あんまり取り沙汰されてない気がするけども、AS3になって複数キーのイベントがきちんと取れるようになったのはすばらしい事だと思う。
import flash.events.KeyboardEvent;
import flash.display.Sprite;

var sprite:Sprite = new Sprite();
this.addChild( sprite );
var pressPattern:Array = new Array(300);

function keyDownHandler( event:KeyboardEvent ):void
{
  if( !pressPattern[event.keyCode] ){
    trace("DOWN : " + event.keyCode);
    pressPattern[event.keyCode] = true;
  }
}

function keyUpHandler( event:KeyboardEvent ):void
{
  if( pressPattern[event.keyCode] ){
    trace("UP   : " + event.keyCode);
    pressPattern[event.keyCode] = false;
  }
}

sprite.addEventListener( KeyboardEvent.KEY_DOWN , keyDownHandler );
sprite.addEventListener( KeyboardEvent.KEY_UP   , keyUpHandler   );
this.stage.focus = sprite;
出力例
DOWN : 97
DOWN : 98
DOWN : 99
UP   : 98
UP   : 99
UP   : 97
ちなみにAS2だとこうなる。
DOWN : 97
DOWN : 98
DOWN : 99
UP   : 99
しばらくほったらかしにしてましたが、そろそろムービークリップについて少し触れておこうと思います。

まずは新規ファイルを作成して、パブリッシュ設定の「ActionScript のバージョン」を "ActionScript 2.0" に設定しておきます。

ステージ上に下図のように "rect" というムービークリップを作成します。
今回「基準点」は左上に設定しておきます。


次にインスタンス名も同じく "rect" と設定します。


タイムラインは以下のようになっています。

レイヤー "rect" は、ムービークリップ"rect"のみを配置しています。
レイヤー "@root" はこれからActionScriptを書き込むレイヤーです。

次回からムービークリップの話をするときは、これを基に進めていきますので頭の隅っこの方にでも置いておいてください。

レイヤー "@root" に以下のスクリプトを書いてみます。
trace( _root );
Ctrl + Enter(Command + return)でプレビューしてみると、出力パネルに "_level0" と出力されました。
"_root" は、このムービーの一番上の階層を指定する場合に用います。
次に以下のように変更してもう一度プレビューしてみましょう。
trace( rect );
今度は "_level0.rect" と出力されました。
ムービークリップ "rect" は_rootに配置されているため、_lovel0のrectと表示されたわけです。

試しに以下のようなことをしてみましょう。
ステージ上のムービークリップ "rect" をダブルクリックで選択して、編集モードにした状態で、更に配置されている矩形をムービークリップに変換(F8)します。
名前は"fill"としてみました。


先ほどと同様にインスタンス名、レイヤー名をそれぞれ "fill" にして、さらに上にレイヤーを追加して "@rect" とします。


レイヤー "@rect" に以下のスクリプトを記述して、プレビューします。
trace( fill );
//出力結果 : _lovel0.rect.fill
出力結果は「_lovel0内のムービークリップrectの、更に内部のfill」であることを示しています。
この表記は何かと似ていませんか?HTMLでリンクの記述をするときに「contents/category1/page2.html」のように書くと思いますが、原理はこれと同じです。
Flashもすべて階層構造になっているため、階層を辿るために"/"の代わりに"."を使っているだけです。

レイヤー "@rect" は、ムービークリップ"rect" 自身の持つタイムラインであるため、 レイヤー "@rect"から、ムービークリップ"rect"を指定する場合は "this" を使います。
trace( this );
//出力結果 : _lovel0.rect
また、レイヤー "@rect"から一番上の階層(ルート)を指定する場合は "_root" で直接指定することも出来ますが、"_parent" を用いて相対的に、ひとつ上の階層として指定することも出来ます。
trace( _root );   // 出力結果 : _lovel0
trace( _parent ); // 出力結果 : _lovel0
HTMLで言えば "_root" は「http://」から指定する絶対パス、 "_parent" は「../」やディレクトリ名を用いて指定する相対パスといえます。
ちなみにルートに作成したレイヤー "@root" から、ムービークリップ"fill" を指定する場合は
trace( rect.fill );   // 出力結果 : _lovel0.rect.fill
となります。
最近どうも真っ白の背景に真っ黒の文字が並んでいる画面で、文字を読んでいると、目に焼きついてしばらく影が残るのが非常に疲れると感じるようになりました。
自分も年なのかな。とか思いつつモニタの輝度を 100% から 40% にまで下げたワケですが。

で、実際どの程度までコントラストを落とせばちらつかないか、自分レベルで試してみたので一応アップしときます。

background:#FFFFFF / text:#000000
(1) background:#FFFFFF / text:#000000
背景とテキストの色の差が最も大きいもの。
範囲が狭いとさほど疲れは感じないようですが、一応比較対象として。

background:#FFFFFF / text:#141414
(2) background:#FFFFFF / text:#141414
文字の色を黒と認識できる範囲で、少し明度を上げたもの。

background:#F4F4F4 / text:#141414
(3) background:#F4F4F4 / text:#141414
2 に加え背景の白を若干暗くしたもの。
1 に比べると大分目への負担が下がったように思う。

background:#F8F8F4 / text:#142014
(4) background:#F8F8F4 / text:#142014
3 に対して、背景、文字ともに若干色味を加えたもの。
かなり目に優しくなった気がする。

background:#E3E3E0 / text:#99998C
(5) background:#E3E3E0 / text:#99998C
逆にコントラストを下げすぎてみた。
やりすぎると読みにくい。
部分的な使い方ならいいと思うけど、テキストが全文このコントラストだとさすがにしんどい。

結局のところ、モニタ環境によってかなり差がでるので、
webだと微妙な色の強弱はあまり意味を成さないのかもしれないなあと。
意味があるかはまったく不明。
使いどころが分からないけど、なんとなくやってみた。
import mx.events.EventDispatcher;

var execute = function( func:Function ):Void
{
  arguments.callee.dispatchEvent( { type:"call" } );
  func();
  arguments.callee.dispatchEvent( { type:"fin" } );
}

EventDispatcher.initialize( execute );

var eventListener = {};
eventListener.call = function():Void
{
  trace("Event : call");
}
eventListener.fin = function():Void
{
  trace("Event : fin");
}
execute.addEventListener( "call", eventListener );
execute.addEventListener( "fin" , eventListener );

execute( execution );


function execution():Void
{
  trace("execution");
}
ランダムっぽく見えるけど何度実行しても同じ値が返される関数。
値は固定の値がほしいけど、一見ランダムに見える値がほしくて作ったもの。
param と i の値を変更すれば 0 以上 1 未満の異なる数値が返されますが、
それぞれが同じ値であれば、常に同じ値を返します。


function quasiRandom( param:Number, i:Number ):Number
{
  var PI:Number = 3.14159265358979;
  var E:Number  = 2.71828182845905;
  var P:Number  = PI * ( param + 0.5 );
  var t:Number  = 173*i*i*i;
  var r:Number  = (i*E+t)*P%1;
  return r;
}

var param = 0.8;
trace( quasiRandom( param , 1 ) );// 0.645842281819569
trace( quasiRandom( param , 2 ) );// 0.556811317701431
trace( quasiRandom( param , 3 ) );// 0.998033861713338
trace( quasiRandom( param , 4 ) );// 0.234636667912127
trace( quasiRandom( param , 5 ) );// 0.53174649036373
trace( quasiRandom( param , 6 ) );// 0.154490083106793
trace( quasiRandom( param , 7 ) );// 0.367994200292742