ActionScript 3.0 , AIR , FLEXからCocoa, OpenGL
26 Jun
いやーすごいですね!astro!
ローカルへのファイル保存が可能だなんて!
実際は、FileReferenceはローカルファイルを読み込んで直接操作できるみたいですが、ひとまず今回は保存です。
サンプルはこちら。
(Flashサンプル。赤丸をクリックすると、保存ダイアログが現れて、適当な名前を入力してボタンを押すと、保存。)
注意点としては、同じファイル名で上書き保存しようとすると例外をはくらしいです。
(これはもしかすると僕のサンプルが悪いだけかもです。。)
corelibのJPGEncoderを使って、stageを画像として保存しています。
ようは、FileReferenceにsaveというメソッドができて、それを使うと保存できるよ、ということです。
ちなみに、保存できる形式は、
String, XML, ByteArrayらしいです。
今回のサンプルは、ByteArrayを使って保存しています。
ちなみにソースはこんなのです。
25 Jun
またまたDynamic Sound Generationです。
これは、mouseXの値をもとに、音程を変えるというサンプルです。
ちなみに、音のもとになるのはぜんかいのと同じ矩形波を使っています。
ソースは後ほど。
23 Jun
今回は色々とサンプルをつくってみながら書いてみます。
波形には色々とあるようですが、今回は、矩形波をいじってみました。
基本的なのは、これ。
ちなみに、512ってのはおまじないと思って下さい。
※サンプルFlash(音がなります。しかも制御できません。)

で、矩形の周期を半分にすると、こうなります。
※サンプルFlash(こちらも音がなります。もちろん制御はできないです。)

二つを聴き比べると、二つ目(周期が短い方)が音が高いですよね。
どうやら、周期が短いほど音が高くなる、という仕組みらしいです。
と、いうことは、この周期を徐々に短くしていくと、どうなるんでしょう?
※サンプルFlash(音がなり、制御不能。今までと同様ですね。)
うんうん。
ということは、これらをうにょうにょすると、宇宙っぽくできるかな?Perfumeっぽい音が出せるかな?○タヤスタカ的な音をasだけで出す事ができるのかな?
次は他のタイプの波形をいじってみようと思います。
あ、それぞれのサンプルASも.txtとしてリンク貼っておくのでよかったらいじって下さいね。(ごめんなさい。コメントつけれてないです)
13 Jun
またまたですが、Flash Player10 astroのDynamic Sound Generationです。
ボタンを押すと、音が流れます。
パルス波の長さを時間で変えています。
注意:音を止める方法がないので、音を消したい場合はリロードして下さい。
これがasだけでできるってのが素晴らしい!!
今、個人的にはこの辺の機能が楽しいなあ。
コードはこんなです。
main.as
<code>
</code>
10 Jun
ブログの移転にともない、RSSがかわりました。
http://blog.hi-farm.net/?feed=rss2
wordpressになりました。
10 Jun
えっと、ほんとは今日はパラグライダーで空を飛ぶ予定でしたが、天候により中止。
で、代わりにastroのdynamic sound generationやってました。
参考サイトはこちら:
http://www.kaourantin.net/2008/05/adobe-is-making-some-noise-part-3.html
http://memo.kappa-lab.com/2008/06/astroflash10_singing_do-re-mi–.html
取りあえずソースは後ほどということで、サンプルだけ。
http://www.hi-farm.net/astro/dynamicsound1.swf
つまらないやつですが、マウスを押している間、音が高くなっていきます。
マウスを放すと、音が低くなります。
これをasのみでできるのは楽しいですね。
デジタルシンセとか作れそう。
もうちょっとソース整理したら改めて書きます!
あー、デジタルシンセってか、サイン波の音とか、色々勉強したい事がふえるなあ。
2008年6月9日00:53
10 Jun
えっと、実はすごい前に作っていたので今は誰か作っているのかもですが、
adobeのcorelibにある、JpgEncoderの非同期版を作ってみました。
http://www.hi-farm.net/labs/modJPGEncoder.as.zip
ライセンス的に大丈夫だという判断で公開ですが、まずそうでしたらすぐに取り下げますのですみませんが、ご連絡下さい。
使い方は、
1. corelibのJpgEncoder.asを解凍したファイルに差し替えて下さい。
コードではこんな風にして下さい(サンプル:画像保存のAIRアプリ)
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[
import com.adobe.images.JPGEncoder;
import flash.events.*;
private var jpg:JPGEncoder;
private function initApp():void
{
btn.addEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(e:MouseEvent):void
{
//---
jpg = new JPGEncoder(100);
//--- 処理中のイベント
jpg.addEventListener("progressing", progressHandler);
//--- 処理完了のイベント
jpg.addEventListener("finished", finishedHandler);
var bmpdata:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false);
bmpdata.draw(stage);
jpg.encodeAsync(bmpdata);
}
private function progressHandler(e:Event):void
{
var percent:String = new int((jpg.cur/jpg.maxCur)*100).toString() + "%";
ti.text = percent;
}
private function finishedHandler(e:Event):void
{
ti.text = "convert finished.";
//-- 終了したら、ファイルに保存する。
var f:File = File.desktopDirectory.resolvePath("out.jpg");
var fs:FileStream = new FileStream();
fs.open(f, FileMode.WRITE);
fs.writeBytes( jpg.ba, 0, jpg.ba.length);
fs.close();
}
]]>
</mx:Script>
<mx:VBox>
<mx:TextInput id=”ti” width=”400″ text=”jpg export test” />
<mx:Button width=”300″ height=”40″ id=”btn” label=”generate desktop/out.jpg” />
</mx:VBox>
</mx:WindowedApplication>
内部的に行っていることは、bytearray形式でBitmapDataを作るときに、同期バージョンはforループでまわしてたのですが、timerでのまわし方に変えた、簡単に言えばそういう事です。
2008年6月1日04:14
10 Jun
取りあえず、flash player10 astroの練習をしてみました。
標準で3Dの機能がついたので、ひとまずちょっとしたサンプルを作成しました.
http://www.hi-farm.net/astro/main.swf
処理がかるくなるのかな?と思ってたのですが、Macのアクティビティモニタで見てみると、
今までの様にPapervision3Dを作った時と、重さがあまりかわらない気がしたんですけど、どうなんでしょう?
ソースはこれ。
main.as—————————————-
package
{
import flash.events.*;
import flash.display.*;
import flash.ui.*;
[SWF(backgroundColor="0x000000", frameRate="50")]
public class main extends MovieClip
{
private var container:Sprite;
private var rect_vc:Vector.<Rect>;
private var len:uint = 6;
private var radius:Number = 100;
private var container_vc:Vector.<Sprite>;
private var innerLen:uint=15;
public function main ()
{
init();
}
private function init():void
{
container_vc = new Vector.<Sprite>();
container = new Sprite();
container.x = 150;
container.y = 10;
addChild(container);
rect_vc = new Vector.<Rect>();
for( var i:uint=0; i < innerLen; i++ )
{
container_vc[i] = genCircle(0, 30*i+10,15*i);
container_vc[i].rotationY = 30 * i;
}
addEventListener(Event.ENTER_FRAME, enterframeHandler);
}
private function genCircle(cX:Number, cY:Number, ra:Number):Sprite
{
var innerContainer:Sprite = new Sprite();
for( var i:uint=0; i < len; i++ )
{
var rect:Rect = new Rect(0xffffff, 10, 10);
innerContainer.addChild(rect);
var rad:Number = (Math.PI/180) * ( (360/len)*i);
rect.x = (Math.cos(rad) – Math.sin(rad)) * ra;
rect.y = 0;
rect.z = (Math.sin(rad) + Math.cos(rad)) * ra;
rect_vc[i] = rect;
}
innerContainer.x = 0;
innerContainer.y = 0;
innerContainer.x = cX;
innerContainer.y = cY;
container.addChild(innerContainer);
return innerContainer;
}
private function enterframeHandler(e:Event):void
{
for( var i:uint=0; i < innerLen; i++ )
{
container_vc[i].rotationY++;
}
}
}
}
Rect.as—————————————-
package
{
import flash.display.*;
import flash.events.*;
public class Rect extends Sprite
{
function Rect(col:uint, w:Number, h:Number)
{
this.graphics.beginFill( 0xffffff, 1);
this.graphics.drawRect( 0, 0, w, h);
this.graphics.endFill();
}
}
}
2008年6月1日02:36
10 Jun
記事書くのをほっぽらかしていました。
僕はというと、3月から東京へ引越して、会社員はじめたのですが、そこでは今までやっていた、ASに加えて、WPFとかSilverlightも始めました。
で、会社のことはなかなかかけなかったので、更新できなかったですが、最近はVisual Studioも手に入り、CocoaとかOpenGLとか始めたのでその辺の事を書いて行こうと思います。
生存確認的な意味合いを込めて、エントリー。
2008年5月12日03:53
10 Jun
最近(というか昨日)、名古屋ちょい絶発表会 vol.2があり、AIRのHTML使ってみましょー、ってなことをやってたのですが、
その後触ってて、ちょっとメモ。
mx:HTMLのid=”browsing”
とすると、
履歴を取るんだったらこんなんでしょうか?
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute”>
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
private function init():void
{
//履歴をtrace()で出力してみる
browsing.addEventListener(Event.LOCATION_CHANGE, function():void{
trace(browsing.location);
});
}
private function changeLoc(e:FlexEvent):void
{
browsing.location = e.target.text;
}
]]>
</mx:Script>
<mx:VBox>
<mx:HBox>
<mx:Button label=”<” click=”browsing.historyBack()” />
<mx:Button label=”>” click=”browsing.historyForward()” />
<mx:Button label=”reload” click=”browsing.reload()” />
<mx:TextInput id=”urls” enter=”changeLoc(event)” />
</mx:HBox>
<mx:HTML id=”browsing” width=”500″ height=”700″ />
</mx:VBox>
</mx:WindowedApplication>
で、僕の経験不足+知識不足なのでしょうけど、ブラウザに履歴を残さずに移動するには、PHPなら、
header(”Location: http://sample.com”
;
とか書いておけばいいってきいたんですけど、AIRで作れば、上の方法で履歴をとれば、headerでも履歴を残せます。
例えば、試しに。
http://www.hi-farm.net/labs/location.php
これは
<?php
header(”Location: http://www.hi-farm.net”
;
?>
ってだけ書いているファイルで、
上にかいたコードを使ってみると、
http://www.hi-farm.net/labs/location.php
http://www.hi-farm.net/
って出力されます!!
これって普通ですか?
2008年2月17日01:01