ヤッチマイナシコ

たまには気分を変えよう

ナシコ
  • 1002
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  

1/25

なんか色々忘れとる。AS3 Object Copy

AS3の話なんですが、JSばっかやってたらすっかり忘れてた・・・。

ArrayのコピーならArray.concat()とかArray.slice()でサクっといけるのは覚えてたのに、Objectのコピーがどうしてもでてこなかった。

ByteArrayって単語見たら思い出したけどこりゃマズイです。
というわけで忘れっぽいので書いておこう。


ActionScript 3
import flash.utils.ByteArray;
public static function clone(obj:*):*
{
  var ba:ByteArray = new ByteArray();
  ba.writeObject(obj);
  ba.position = 0;
  return ba.readObject();
}

いっちょあると便利です。

思い出させてくれたサイトさん。

2010/1/25 - 21:32 | コメント (0)

Category : FLASH AS3

6/30

2点から角度を求める - AS3

2点から角度を求める方法をすぐ忘れるのでメモメモ。

ActionScript 3
// e.y = 終了点 Y
// s.y = 開始点 Y
// e.x = 終了点 X
// s.x = 開始点 X
var rot:Number = Math.atan2(e.y - s.y, e.x - s.x) * 180 /Math.PI;

2009/6/30 - 2:00 | コメント (0)

Category : FLASH AS3

5/26

Zend_Amf_Server x FlashのBMPを保存

昨日に引き続き、Zend_Amf_Serverを使ってデータ送信です。

今日はイメージの保存をやってみました。
BMP保存と書いていますが正確にはPNGとして保存するんですけどね。

イメージデータの保存がこれほど単純に作れるとは恐ろしいです。
今まであーだーこーだ思いながら作ってたのに><

PNGを保存するPHP

PHP
<?php
require_once('Zend/Amf/Server.php');

$server = new Zend_Amf_Server();
$server->setClass('Image');
$response = $server->handle();
echo $response;

class Image
{
 /**
 * @param string name
 * @param array data
 * @return boolean
 */
 public function pngsave($name, $data)
 {
  $success = false;
  if( !is_null($name) && $fp = fopen($name.".png", "w+") )
  {
   fwrite($fp, $data);
   fclose($fp);
   $success = true;
  }
  return $success;
 }

}

?>

BmpをPNGに変換して送信

ActionScript 3
import flash.net.NetConnection;
import flash.net.Responder;
import com.adobe.images.PNGEncoder;

var gateway:String = "http://localhost/zend_amf_img/zend_amf_img.php";
var connection:NetConnection = new NetConnection();
var responder:Responder = new Responder(onResultHandler, onFaultHandler);
connection.connect(gateway);

var bmpd:BitmapData = new BitmapData(200,200,true,0x00000000);
bmpd.draw(this);
var imgByte:ByteArray = PNGEncoder.encode( bmpd );

// phpCall, response, 保存ファイル名, 送信イメージデータ
connection.call("Image.pngsave", responder, "filename", imgByte);

function onResultHandler(evt:Object):void
{
	trace(String(evt));
}

function onFaultHandler(evt:Object):void
{
	trace(String(evt));
}


これだけです。PHPの処理が適当すぎますが保存はできます。
AS3のPNGEncoderはググルとでてきます。

お手軽っすな〜···。

ダウンロードはこちらから

2009/5/26 - 23:26 | コメント (0)

Category : FLASH AS3

5/25

Zend_Amf_Serverを使ってFlashと通信

Zend Frameworkが便利だと思う今日この頃です。
MVCモデルで構築できたり、コンポーネントととして扱うこともできたり。

以前からAMF通信を試そうと思いつつも色々と面倒だったんで後回しにしていたのですが、
このZend FrameworkのZend_Amf_Serverを使うと簡単にできました。
AMFはバイナリ通信(データ圧縮もされる)なので、テキストベースの通信より軽くて早いと言われています。

FLASHとPHPの通信といえばURLVariablesで、この場合ってArrayを渡すだけでも結構大変です。
・Flash Array → JSONエンコード → PHPに送信 → PHP側でJSONデコード → PHP Array

Zend_Amf_Serverを使えば、
・Flash Array → PHPに送信 → PHP Array

単純に書くと上記のような処理になりスッキリします。
これは覚えておいて損はしないのでやってみました。
ほぼ公式のサンプルになってますが以下がソースです。

単純な文字列を送信
AMFデータを受取るPHPの作成

PHP
<?php
require_once('Zend/Amf/Server.php');

$server = new Zend_Amf_Server();
$server->setClass('Greeting');
$response = $server->handle();
echo $response;

class Greeting
{
 /**
 * @param string name
 * @return string
 */
 public function hello($name)
 {
  return 'Hello! ' . $name;
 }
}

?>

AMFデータを送信するFLASHの作成。

ActionScript 3
import flash.net.NetConnection;
import flash.net.Responder;

var gateway:String = "http://localhost/zend_amf_greeting_20090525/amftest.php";
var connection:NetConnection = new NetConnection();
var responder:Responder = new Responder(onResultHandler, onFaultHandler);
connection.connect(gateway);

// 送信データの作成
var data:String = "HOGE";

// AMF送信
// Greetingクラスのhelloメソッドを呼び出す
connection.call("Greeting.hello", responder, data);

function onResultHandler(evt:Object):void
{
	trace(String(evt));
}

function onFaultHandler(evt:Object):void
{
	trace(String(evt));
}
実行するとHello! HOGEとtraceに表示されます。


Arrayを送信

PHP
<?php
require_once('Zend/Amf/Server.php');

$server = new Zend_Amf_Server();
$server->setClass('Greeting');
$response = $server->handle();
echo $response;

class Greeting
{
 /**
 * @param array names
 * @return string
 */
 public function helloAry($names)
 {
  $str = "";
  foreach($names as $key => $val)
  {
   $str .= $val . ",";
  }
  return 'Hello!! ' . $str;
 }

}

?>


ActionScript 3
import flash.net.NetConnection;
import flash.net.Responder;	

var gateway:String = "http://localhost/zend_amf_greeting_20090525/amftest.php";
var connection:NetConnection = new NetConnection();
var responder:Responder = new Responder(onResultHandler, onFaultHandler);
connection.connect(gateway);

var data:Array = new Array("HOGE", "HOGE1", "HOGE2");
connection.call("Greeting.helloAry", responder, data);

function onResultHandler(evt:Object):void
{
	trace(String(evt));
}

function onFaultHandler(evt:Object):void
{
	trace(String(evt));
}

実行するとHello!! HOGE,HOGE1,HOGE2,とtraceに表示されます。

このような感じでArrayも直接渡せます。
Flashからのコール(Greeting.hello)が直感的で分かりやすいのも良いと思います。
NetConnectionのところにエラー系のイベントリスナーsecurityError等を登録した方がいいかもですね。

お試しアレ。

テストファイルのダウンロードはこちら

2009/5/25 - 20:30 | コメント (0)

Category : FLASH AS3

3/25

if-in, hasOwnProperty どっちが早い?

ネタ切れ感がありますが気になったので「if in」と「hasOwnProperty」はどっちが早いか調べてみた。
100万回ルーープ。


ActionScript 3
var sp:Sprite = new Sprite();
var sTime:uint;
var eTime:uint;
var n:uint;

sTime = getTimer();
for(n = 0; n < 1000000; n++)
{
	if( "x" in sp)
	{
	}
}
eTime= getTimer();
trace(eTime - sTime);


sTime = getTimer();
for(n = 0; n < 1000000; n++)
{
	if(sp.hasOwnProperty("x"))
	{	
	}
}
eTime= getTimer();
trace(eTime - sTime);

結果
if in = 108 ms
hasOwnProperty = 302 ms


まぁどっちでもって感じ。
プロトタイプのプロパティを調べる必要がないからhasOwnPropertyが早いかと思ったんだけどなぁ。
メソッドだから?コードの流れが複雑なのか??

まぁいいや。

if in 超便利!!

2009/3/25 - 0:23 | コメント (0)

Category : FLASH AS3

2/19

Mac Flash x Quicksilver x Fusion x FlashDevelop

MacのFlashを使いつつVMware FusionでFlashDevelopを使う場合にネックなのがパブリッシュ。いちいち画面を切り替えてパブリッシュするのがとても面倒だった。

しかぁし!ようやく簡単にパブリッシュが可能になった!準備は面倒だったが···。

参考サイトの中の人に感謝!
memo kappa-lab.comさん
議事ログさん

実現方法はMacにホットキーを登録してAppleScriptでパブリッシュ(Command+Enterを実行)させる。
これ思いついたのはすげーなーと思った。まずAppleScriptで諦めそうだけどmemoさんとこに置いてあった。
ではレッツラ。

必要な物
・memoさんとこにあるAppleScript
・Quicksilver

memoさんとこにあるAppleScriptをゲット
memoさんページへ行き一番下にある
今日の「AS(AppleScript)」
をダウンロードします。
詳しい内容はmemoさんとこに書いてあるので読んでください。
自分はAppleScriptをちと改造して使ってます。

monoさんのAppleScript

Plain Text
set uiScript to "keystroke \"s\" using {option down, command down}"
run script "tell application \"System Events\"
" & uiScript & "
end tell"

tell application "Adobe Flash CS3"
	activate
end tell

set uiScript to "keystroke \"
\" using command down"
run script "tell application \"System Events\"
" & uiScript & "
end tell"]


改造したAppleScript

Plain Text
set uiScript to "keystroke \"s\" using {control down}"
run script "tell application \"System Events\"
" & uiScript & "
end tell"

delay 0.2

tell application "Adobe Flash CS3"
	activate
end tell

delay 0.3

set uiScript to "keystroke \"
\" using command down"
run script "tell application \"System Events\"
" & uiScript & "
end tell"

ほんのちょこっと改造です。
理由は様々ですが自分の好きなようにしてます。
あとは好きなディレクトリに保存するなりリネームするなりしてください。
自分の場合は /Applications/AppleScript/CallFlashIDE.scpt としました。


Quicksilverのインストール
Quicksilverがホットキーの役目を果たしてくれます。
「Command+Enterでホニャララする」みたいな。

Quicksilver ダウンロード先

議事ログさんとこ情報でIntelMacはUniversal版では駄目ということでした。
Universal版を試してはいないんですが、Quicksilverの公式サイトからダウンロードしたやつは駄目でした。駄目な理由は「Scope」機能が動かないからです。
これが効かないと後々面倒なことになります。

というわけでIntelMacの方はArchived/Intel版をダウンロードしましょう。
ダウンロードしたファイルを解凍し.appを叩けばインストールが始まるので指示にしたがってインストールします。

インストール後、「Quicksilverメニュー」→「Preferences」を選択。
090219_00 Scope機能を有効にするため「Enable advanced features」をチェックします。

次に保存したAppleScriptをCatalogに登録します。CatalogをクリックしCustomをクリック。
下にある「+」を押して「File & Folder Scanner」を選択し、保存したAppleScriptを選択します。
090219_05

次にTriggerを登録します。アプリケーション起動に対するホットキーの登録ってことです。Trigger画面が表示されたら下にある「+」を押し「HotKey」を選択します。
090219_01

次の画面が表示されたら保存したAppleScriptを登録します。保存したAppleScript名をタイプすると表示されます。Actionは「Run」を選択します。
090219_02

次にHotKeyの設定を行います。
登録した行のCommandマークをクリックすると次の画面が表示されます。
090219_03 「Hot Key」には「Command+Enter」を設定します。
残りの設定はお好みで。


次にScopeの設定を行います。
HotKeyを受け付けるアプリケーションの登録設定です。VMware Fusionを使用時に動けばいいので入力欄に「VMware Fusion」と入力し、「Enabled in selected applications」を選択します。
090219_04

この時点で「Command+Enter」を実行してみて何も動作しなければScopeが働いてるはずです。動作してしまう場合はScopeが働いていないのでAppleScriptが半永久にCallされます。
どういう事かというと···

Scopeが働かない場合
1. VMware Fusion上でCommand+Enter キーを押す。
2. Quicksilverで登録したホットキーでAppleScriptが呼び出される。
3. AppleScriptの処理でFlashをActiveにしCommand+Enterが自動実行される。
4. Command+Enterが実行されるがScopeが働かないのでQuicksilverがホットキーが押されたと勘違いして 1. に戻る。

Scopeが働く場合
1. VMware Fusion上でCommand+Enter キーを押す。
2. Quicksilverで登録したホットキーでAppleScriptが呼び出される。
3. AppleScriptの処理でFlashをActiveにしCommand+Enterが自動実行され、QuicksilverのScopeが働くがFlashがActiveになっているのでホットキー処理は無視され、そのままパブリッシュされる。

回りくどいけどこんな感じで伝わるかな?

まー、Scope設定しても動作しないならホットキーを別のキーにすればいいだけなんですが、やっぱ慣れたのがいいし誤作動防止もできるのでScopeを動作するバージョンを入れた方がいいです。

最終的にVMware Fusionの画面に切り替えて「Command+Enter」を実行すると自動的に画面が切り替わりパブリッシュされると思います。
自分がAppleScriptを改造してるのは保存とかを自動でしてくれる処理を変えてるだけです。

以上で設定は終わりっす!!おつかれさんでしたぁぁぁ!

よーーーっし!!これで楽々開発だ!


※補足 QuicksilverのTriggerが表示されない場合
突然表示されなくなる事があるようです。自分は3回もなりました(´-`)
直し方は以下のファイルを削除する。
/Users/ユーザ名/Library/Application Support/Quicksilver/Triggers.plist
もちろんTriggerで登録した内容は消えますけどね。

2009/2/19 - 23:51 | コメント (0)

Category : FLASH AS3MacPC

1/25

drawCircle等を検証 - AS3

グラフとか書くときに手軽に書けるdraw系の関数で不思議ちゃんな動きをしたので調べてみました。
とりあえずdrawCircleとdrawRectの二つです。


drawCircleをほぼ同じ位置に描く
さてどうなることやら···。


ActionScript 3
var testSprite:Sprite = new Sprite();
var testSprite_g:Graphics = testSprite.graphics;
testSprite_g.beginFill(0x000000, 1);
testSprite_g.drawCircle(50, 50, 20);
testSprite_g.drawCircle(60, 60, 20);
普通こう書いてあれば円が2個できるだけかと思いきや···

というふうに中がくり抜かれる。
buttomMode = true;を追加してMouseEventを入れてみたところくり抜かれた部分は反応しなかった。
というわけで同じ位置に描くと消える現象に悩まされてたってわけです。

解決策はこんな感じ

ActionScript 3
testSprite_g.beginFill(0x000000, 1);
testSprite_g.drawCircle(50, 50, 20);
testSprite_g.endFill();
testSprite_g.beginFill(0x000000, 1);
testSprite_g.drawCircle(60, 60, 20);
testSprite_g.endFill();
endFill();を書いてbeginFill(0x000000, 1);を書くと解決!
endFill();を省略してbeginFill(0x000000, 1);を書いてもOKでした。


drawRectをほぼ同じ位置に描く
結果は予想できるけど一応···。


ActionScript 3
testSprite_g.beginFill(0x000000, 1);
testSprite_g.drawRect(50, 50, 30,30);
testSprite_g.drawRect(60, 60, 30,30);
testSprite_g.endFill();

同じですな(´-`)。解決策も一緒です。


drawCircleとdrawRectを同時に描く
これは気になった。


ActionScript 3
testSprite_g.beginFill(0x000000, 1);
testSprite_g.drawCircle(50, 50, 20);
testSprite_g.drawRect(50, 50, 30,30);
testSprite_g.endFill();
同じ現象ですな。

意外な動きかと思いきやコレを利用すれば多少複雑な絵も描けそうな気がします。
描く事ないでしょうけど(´-`)

とまぁこんな感じです。
ちなみにlineToとmoveToとlineStyleにも書き順があるみたいですね。
この辺はググってくだされ。

2009/1/25 - 22:14 | コメント (0)

Category : FLASH AS3

CopyRight 2004 ヤッチマイナシコー! All rights reserved.

Powerd By neustil.com