ラベル ActionScript の投稿を表示しています。 すべての投稿を表示
ラベル ActionScript の投稿を表示しています。 すべての投稿を表示

2010-06-06

JapaninoのPOV用データをテキストから作る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Japaninoとは、大人の科学vol.27のおまけのArduino互換8bitマイコンです。



大人の科学vo.27ではPOVと言われる光残像で文字を書くキットが付属しています。
なかなか楽しげなのですが、ちょっと面倒なのが文字データを作ることです。
なのでテキストからこのJapaninoのPOV用データを作成するものをつくってみました。

Txt2Pov

使い方は、
テキストボックス(ABC)と書いてあるところに好きな文字(10文字まで)を入れてデータ作成のボタンを押します。
すると作成されたPOVデータイメージが表示されます。
あわせてテキストエリアにPOV用データが表示されます。

POV用データイメージはクリックすると反転して微調整できます。
テキストエリアのデータをコピーしてJapaninoのPOVサンプルデータのデータ部分を書き換えればOKです。

やっていることはActionScriptで、
・テキストを画像に変換
・変換された画像をピクセル単位で解析
をしてデータを作成してます。
抜粋版のソースを、
http://wonderfl.net/c/aBqZ
に置いておきました。

Txt2Povは、Japanino用のデータになっていますのが、http://wonderfl.net/c/aBqZを書き換えれば他のデータ形式のものを作成できると思います。

本当は、サーバー側にテキストデータを投げれば、POVデータが帰ってくる感じのWebサービスをGoogle App Engine上で創ってみようと思ったのですが、Google App Engineに用意されている画像操作系の機能ではちょっとできそうもない感じでした。
自前でサーバを持っていればPHPとかで比較的容易に実装できそうな感じではあります。

次は、HTML5でいろいろできる感じだと思ったので、Javascriptで実装しようと思ったのですが、
画像操作系のやり方がいまいちわからず挫折。
というわけでflashでやってみました。

2009-05-15

ActionScriptでマウスがのると大きくなるフキダシを作る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
SOBARCO用に作ったブログパーツでは、小さな吹き出し部分にマウスを持ってくると大きくなってコメントが見れるようにしてみました。
まず吹き出しをActionScriptで作る方法は、

にきっちり書いてあったので、そちらを参考にさせていただきました。

これを改良して、マウスが来ると大きくなるような修正をしてみました。
マウス動作の部分を中心に抜粋した感じですが以下のような感じです。

package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import caurina.transitions.Tweener;

public dynamic class Fukidashi extends Sprite {
public var max_width:uint;
private var max_height:uint;
private var min_width:uint;
private var min_height:uint;
private var start_x:uint;
private var start_y:uint;
private var end_x:uint;
private var end_y:uint;
private var set_pos:Boolean = false;
private var zoom_on:Boolean = false;

public function Fukidashi(fillColor:Number = 0xEDE5D7, max_w:uint = 70, max_h:uint = 35, min_w:uint = 18, min_h:uint = 9) {
max_width = max_w;
max_height = max_h;
min_width = min_w;
min_height = min_h;
var canvas:Sprite = new Sprite();
var fukidashi:Sprite = createFukidashi(canvas, fillColor);
//回転の中心が左下になるように移動する
addChild(fukidashi);
max_width = fukidashi.width;
max_height = fukidashi.height;
buttonMode = true;
set_minisize();
addEventListener(MouseEvent.ROLL_OVER, overHandler);
}

private function set_minisize() : void {
width = min_width;
height = min_height;
}

public function set_position(sx:uint, sy:uint, ex:uint, ey:uint) : void {
start_x = sx;
start_y = sy;
end_x = ex;
end_y = ey;
set_pos = true;
}

public function overHandler(event:Event):void {
if (set_pos) {
zoom_on = true;
Tweener.addTween(this, {x:end_x,y:end_y,width:max_width,height:max_height,time:0.1,transition:"easeOutBack",onComplete:tweenEnd} );
} else {
width = max_width;
height = max_height;
}
}

public function outHandler(event:Event):void {
if (set_pos) {
zoom_on = false;
Tweener.addTween(this, {x:start_x,y:start_y,width:min_width,height:min_height,time:0.2,transition:"easeOutBack",onComplete:tweenEnd} );
} else {
width = min_width;
height = min_height;
}
}

public function tweenEnd() :void {
if (zoom_on) {
removeEventListener(MouseEvent.ROLL_OVER, overHandler);
addEventListener(MouseEvent.ROLL_OUT, outHandler);
} else {
removeEventListener(MouseEvent.ROLL_OUT, outHandler);
addEventListener(MouseEvent.ROLL_OVER, overHandler);
}
}

//フィールドを囲む吹き出しを作る
private function createFukidashi(canvas:Sprite, fillColor:Number) :Sprite {
var fldW:uint = max_width;
var fldH:uint = max_height;
//吹き出しを描く;
var w:uint = Math.ceil(fldW * 1.1);
var h:uint = Math.ceil(fldH * 1.4);
canvas.graphics.lineStyle(1, fillColor);
canvas.graphics.beginFill(fillColor);
canvas.graphics.drawRoundRect(0, 0, w, h,10,10);
canvas.graphics.endFill();
canvas.graphics.beginFill(fillColor);
canvas.graphics.moveTo(w * 0.15, h * 1.3);
canvas.graphics.lineTo(w * 0.35, h);
canvas.graphics.lineTo(w * 0.25, h * 0.5);
canvas.graphics.endFill();
return canvas;
}

}

}

本来ならば、フキダシにメッセージを入れたり、フキダシに輪郭線があったりするのですが、そこまでいれるとあまりにも本の内容そのままなので、そこは抜粋しているので気になるときは本を見てみてください。

あと、なぜか作ったブログパーツではマウスがフキダシの左側にあるとイベントをうまく拾ってくれなかったり、ROLL_OVERのイベントが連続で発生したりとかちょっとおかしな感じになっているのですが、よくわからなかったのでそのままにしてみました。

2009-05-12

MOUSE_OVER,ROLL_OVERの違い

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActionScriptではいろんなイベントをいい感じで利用できるようになるのが重要な感じですが、そのなかでMouseEventの
MOUSE_OVER
ROLL_OVER
の違いがわかりにくいですが
http://blog.flair4.jp/2007/12/-as30-mouse-overroll-over.html
がわかりやすく説明しています。

一言で違いをいうとオブジェクトが重なっているときの振る舞いの違いです。
なので重なってなければどっちでも同じだと思います。

flashdevelopではtweenは使えない?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
tweenとは、拡大とか移動とかシンプルなflashのアニメーションを簡単に実装するためのオブジェクトです。

利用する際には、
import fl.transitions.Tween;
とするらしいのですが、
flashdevelopを利用している場合は、importできないようです。

設定が悪いのか、TweenはCS3とか製品版で利用できるものということなのか
ちょっとわからないのですが、tweenが使えなくても代わりに
tweener
というものが使えます。

http://d.hatena.ne.jp/flashrod/20070527
が参考になります。

tweenerのzipファイルを取得したら、解凍してできた
caurina
というディレクトリをActionScriptのメインとなるスクリプトを置いているディレクトリに置くことで利用できます。

ブログパーツでは、吹き出しの上にマウスを置くと大きくなるアニメーションで利用してみました。

TextField上のカーソル形状をI型でなくす

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
flash上の普通にTextFieldをaddChildした場合には、そのTextFiled上にマウスがきたらテキストが選択できるようにI型のカーソルになります。
たんなる画面上の表示要素にしたい場合は、他の部分と同じカーソルになってもらいのです。
そんなときは、TextFieldのselectableをfalseにすることで変更できます。

ちなみにクリックするときのようにカーソルを指形状にしたいときは、指形状にしたいSpriteオブジェクトのbuttonModeをtrueにすればできます。

flashの画面上の要素に影をつける

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActionScriptで画面に表示するオブジェクトになんらかの効果をつけるには、
.filters
メソッドに適用するフィルター効果のオブジェクトをセットするといいようです。
オブジェクトに影をつける効果のオブジェクトは、
DropShadowFilter
です。
使い方は、

import flash.filters.DropShadowFilter;

・・・

var filter : DropShadowFilter = new DropShadowFilter();
filter.distance = 2;
var box : Sprite = new Sprite();
box.graphics.drawRect(0, 0, 50, 50);
box.filters = [filter];

みたいな感じです。
DropShadowFilterは、影をつける以外にdistanceを0に設定することでオブジェクトの輪郭線を描くことにも使えます。
四角とか丸に対して輪郭線をわざわざDropShadowFilterを使ってつけることはないと思いますが、Sprite上にいろんな図形を組み合わせたちょっと複雑なgraphicに対して輪郭線をつけるには便利な感じです。

ActionScriptでwebページを開く

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
flashコンテンツでどっかをクリックしたら関連ページを開くとかを実装する時に使うのは、
navigateToURL
という関数で、
navigateToURL(new URLRequest(urlPath));
みたいな感じで使います。

2009-05-10

画像の読み込み完了を検知する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
xmlなどを読み込む場合には、URLLoaderオブジェクトを使って読み込み完了の検知は、
URLLoaderオブジェクト直下のaddEventListenerでEvent.COMPLETEを以下のような感じでセットすればよいわけですが、

var myLoader:URLLoader = new URLLoader();
myLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);

これと同じノリで、web上の画像を読み込もうとしたわけなのですが、読み込み完了が検知できなかったのです。
調べたところimageの場合は、
LoaderオブジェクトのcontentLoaderInfoのaddEventListenerにイベントを登録する必要がありました。
以下のような感じです。

var myImgLoader:Loader = new Loader();
myImgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);

ちょっとややこしかったのでメモです。

TextFieldのサイズにあわせて表示テキストを途中で区切る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
テキストフィールド1行ではみ出した場合の末尾に「…」をつけたい場合の例として
http://level0.kayac.com/2008/05/textfield_sample.php
が参考になりまして、こちらを改良して
幅と高さのテキストフィールドを用意して、このテキストフィールドをはみだす場合は、末尾に「…」をつけてみました。

var sample_tf : TextField = new TextField();
sample_tf.width = 100;
sample_tf.autoSize = TextFieldAutoSize.LEFT;
sample_tf.selectable = false;
sample_tf.multiline = sample.wordWrap = true;
sample_tf.text = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわ";
var need_dot:Boolean = false;
var max_height = 30;
while ( sample_tf.height > max_height ) {
sample_tf.text = sample_tf.text.slice( 0, sample_tf.text.length -1 );
need_dot = true;
}
if (need_dot) {
sample_tf.text = sample_tf.text.slice( 0, sample_tf.text.length -1 ) + "…";
//削除した文字がたまたま半角文字だと「…」をつけると
//heightをオーバーする可能性があるので念のためもう一度チェックを入れる
if (sample_tf.height > max_height) {
sample_tf.text = sample_tf.text.slice( 0, sample_tf.text.length -2 ) + "…";
}
}

ブログパーツの帯のタイトル部分と吹き出しの部分でこれを利用しています。

2009-05-08

flashコンテンツを呼び出すhtmlの書き方

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
http://coderepos.org/share/wiki/suzunari
を参考にさせていただきました。

今回は、以下のような感じです。

<object type="application/x-shockwave-flash"
id="http___sobarco_blog_parts_swf"
data="swfファイルの置き場所を指定" style=""
height="194" width="120">
<param name="wmode" value="transparent">
<param name="allowScriptAccess" value="always">
<param name="scale" value="noScale">
<param name="flashvars" value="aaa=val1&bbb=val2">
</object>

objectタグ内のdataでflashファイルが置いてある場所を指定します。
読み込んだflashの表示サイズをwidthとheightで指定します。
idの値は適当でよいとは思うのですが、blogパーツの場合は人様のサイトに貼っていただくのでありがちなidにするとサイトで利用しているcssの影響を受けるかもしれないので、いい感じにかぶることのなさそうな名称がいい気がします。


<param name="wmode" value="transparent">

で読み込んだflashの背景を透明にするようにしています。


<param name="flashvars" value="aaa=val1&bbb=val2">

で読み込んだflashに対してパラメータを与えています。

後のparamタグのallowScriptAccessとscaleに関しては、正直よくわかりません。

htmlに記載されたパラメータをActionScriptで受け取る

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
flashを呼び出すHTMLには、パラメータを記載できます。
以下のような感じで記載します。

ActionScriptで利用するには、

var flashvars:Object = loaderInfo.parameters;
var a:String = flashvars["aaa"]; //val1
var b:String = flashvars["bbb"]; //val2

という感じです。
スクリプトが実行されるとloaderInfoという値が勝手にセットされるようで、ここにhtmlから読み込んだ値が設定されているようです。

flash内に事前に用意した画像を埋め込む

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ブログパーツには、事前に用意した画像をいくつか埋め込んでいます。
ActionScriptでこの画像を利用するには、
Embed
というのを使うようです。
参考になるのは、
http://gihyo.jp/dev/feature/01/box2d/0006
です。
いい感じで普通のオブジェクトとして利用できます。

ブログパーツの通信終了待ちのグルグル回転

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今回のブログパーツは、サイトと通信をしています。
なので通信が終わるまでは表示されないものが多く殺風景なため、よくあるflashサイトのようになんかしらのloading中のアクションを入れてみようと思って検索したところ
http://blog.garden-place.jp/oborobeer/item_198.html
がいい感じでしたので利用させていただきました。

こちらのサイトで紹介されているスクリプトをコピーして、ブログパーツ用のaction scriptファイルが置いてある場所と同じ場所に
LoadingPicture.as
という名前で保存しました。

そして、サイトの例にあるとおりLoadingPictureのインスタンスを作成して、ブログパーツ用クラスのコンストラクタでshowメソッドとstartメソッドを呼んでいます。
そして通信の完了イベントがイベントリスナーで検知して、イベント検知後に呼ばれる関数内でLoadingPictureのremoveメソッドを呼んでグルグルを消しています。

大雑把に書くと、以下のような感じです。

package
{
import flash.display.*;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.text.TextField;
import flash.net.URLLoader;
import flash.net.URLRequest;

public class BlogParts extends Sprite {
private var loading : TextField = new TextField();
private var loadPic : LoadingPicture = new LoadingPicture(30, 10, 9, 12, 0xC79810, 0xDDEEDD);

public function BlogParts() {
loadPic.show(this,stage.stageWidth/2,stage.stageHeight/2);
loadPic.start();
loading.text = "loading...";
addChild(loading);
loading.x = stage.stageWidth/2 - loading.textWidth/2;
loading.y = stage.stageHeight/2 - loading.textHeight/2;
loadXML();
}

private function loadXML():void {
var myLoader:URLLoader = new URLLoader();
myLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
myLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
var urlPath:String = "http://aaaaa";
myLoader.load(new URLRequest(urlPath));
}

private function removeLoading():void {
removeChild(loading);
loadPic.remove();
}

private function errorHandler(e:IOErrorEvent):void {
removeLoading();
//以下でエラー処理を行う
}

private function loadCompleteHandler(event:Event):void {
removeLoading();
var loadedXml:XML = new XML(event.target.data);
//以下で読み込んだxmlを処理する

}
}

}

BLOGパーツを作ってみました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
SOBARCO用のブログパーツをActionScriptで作ってみました。

本は、

がとてもわかりやすくてよかったです。
他の言語を知っていれば、それほどガッツリ読まなくてもダイジョブですが、ActionScript独特なこと(フレームの概念)とかが結構、しっくり理解できました。
つづけて

も読みました。こちらもとても参考になりました。
こちらは、具体的な事例集という感じで要所要所ブログパーツを作る際に参考にさせていただきました。

ActionScriptは、やっぱりプログラム言語とは違うノウハウは必要ですねぇという感じです。
イベントとかアニメーションの手法とかがあまり見てくれ系の経験がないので新鮮なことが多いです。
独特なものも多いですが、うまくクラス化されているのでクラスを理解すればいい感じではあります。

web上の資料では、やはりAdobeのサイトが一番役に立ちました。
http://help.adobe.com/ja_JP/Flash/10.0_Welcome/WS091A3800-D889-4425-B647-C44097B73F34.html

ブログパーツを作っていくうえで知ったこともまとめてご紹介していこうと思っています。

2009-03-18

ActionScriptを始めてみよう

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ちょっと最近、flashが気になってActionScriptをちょっと勉強を始めてみました。
一応、制限はありますが携帯でも動いたりといろんなデバイスで動くのがいいなぁと思ったわけです。
で、まずは開発環境ということでFlashDevelopを入れてみました。
手順的には、
http://sothis.blog.so-net.ne.jp/2008-03-26
http://www15.plala.or.jp/kichijitsu/as/flex_ide.html
が参考になります。
私がインストールしたversionは、
flexが3.2.0.3958
FlashDevelopが3.0.0-RC1
です。今のところ問題なく動いています。
ちなみに以下の設定だけしています。

FlashDevelop を起動、F10 を押して Program Settings ダイアログを表示
FlashViewer → External Player Path を flex_sdk_3\runtimes\player\win\FlashPlayer.exe に設定
FlashDevelop→Fallback CodePageをEightBitsからUTF-8に変更します。

まだ漫然といろいろいじっているのですが、以下の2点にとりあえずしっくりこないでいました
が、勝手に納得してみました。(間違っているかもしれないけど)
・なんでループがないのに動くのだ?
 →どうもflashには、普通にフレームというのがあって1/24秒ぐらい毎に常にENTER_FRAMEというイベントが発生するようなので、そのイベントに対してイベントハンドラを設定して動くようなコードを書いてやれば動くらしい。
・なんで再描画していないのに、前の位置のモノが消えて新しい位置にちゃんと描画されているのだ?
 →Spriteオブジェクトというものがどうもそういうものらしい。

なんとなく漫然とやっていてもわからなそうなので、
http://cs3book.flashoop.jp/wiki/index.php?%E7%9B%AE%E6%AC%A1
をじっくり読んでみようと気になったところなのです。

そして

が気になるので、そのうち購入のためにメモ。