Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-settings.php on line 472

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-settings.php on line 487

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-settings.php on line 494

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-settings.php on line 530

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-includes/cache.php on line 103

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-includes/query.php on line 21

Deprecated: Assigning the return value of new by reference is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-includes/theme.php on line 623
馬鹿全 - ActionScript2.0 Archive

Home > ActionScript2.0 Archive

ActionScript2.0 Archive

Wii で Flash を使う時の失敗


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

相変わらず睡眠障害の JC です。

今日はちょっと Wii で Flash を扱う時の失敗談を。

かなりはまったのでメモとして。
JavaScript と Flash で連携する際に用いられる方法として、
FlashVars を利用して SWF(仮に A.swf とする) に値を送り、それと実際に値を受け取りたい SWF (仮に B.swf とする)に LocalConnection 等を使いやりとりをするやり方がある。

その方法を使う際に、A.swf は必ず表示されていないといけない。

A.swf が表示されない位置に配置されると、Wii のブラウザは「今は必要無いもの」として扱う。
すると、実際には DOM としてあるのだが、レンダリングされない。
つまり、Flash の表示まで行われない(Flash内の Script も実行されない)。
コレに気付くのに三日かかった・・・。

他には、原因不明だが、
簡単なシェイプをMC化(またはボタン化)した時に、表示されない時があった。

Wii に限った事では無いが SharedObject を扱う際に、
this.my_so = SharedObject.getLocal(”hoge”, “/”);
this.onEnterFrame = function() {
   this.my_so = SheredObject.getLocal(”hoge”, “/”);
   trace(this.my_so.data.huga);
}
と書いた時に SharedObject が参照されるのは最初の getLocal() の時のみ行われる。
もし、更新したい場合は、this.my_so = null; を行うか、
this.onEnterFrame = function() {
   var my_so: SharedObject = SharedObject.getLocal(”hoge”, “/”);
   trace(this.my_so.data.huga);
}
と書く。

 

こんなところに引っかかっているのは俺ぐらいなのだろうか・・・。
役に立つか分からないが一応載せてみた。
何か出てきたらまたの機会に。

  • Comments (Close): 0
  • Trackbacks (Close): 0

Flash が読み込まれるまで


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

どうも、最近不眠症気味のJCです。

ぐったり。

不眠症はさておき、Wii Flash API を作成していて速さを求めるには
色々と調査が必要な事に気付いた。

まず第一弾。
「Flash が読み込まれるまでってどれくらいかかんのよ?」
って事で正確では無いが一応調べてみた。

JavaScript で new Date().getTime() した値を FlashVars を使って Flash に渡す。
Flash内でも同じ事をする。
そんで差を求める。

結果:
210ms ~ 30ms ぐらい。
かなりまちまちのようだ。

予定では今週末は忙しいので来週末くらいには Wii Flash API の Version 0.4 ができあがりそうだ。
Version 0.4 は今まで使用していた Flash / JavaScript Integration Kit を使いません。
別の方法を使います。
理由としては、 遅いから。
ただそれだけ。
更に LocalConnection は Flash 同士の通信には向いているが一方的に呼ばれまくる Flash には
カナリの負荷がかかる。よって重くなる。
Version 0.3 がボツになった理由はそれ。
用は読み込みたい Flash 側が好きな時に情報を取りに行ければベストなんだろう。
と言うことで今作ってます。

しばらくお待ちを(誰もいない方向に向かって


[追記]

FireFox ではもっと遅い事が判明。
さらに Wii では上手く表示されない事も判明。
小数点とかでてる・・・。何故?

  • Comments (Close): 0
  • Trackbacks (Close): 0

WiiFlashAPI の速度を上げる


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

おはようございます。JC です。

一昨日とかに公開した Wii Flash API だが、難点は Flash と JavaScript の通信する速度が遅いこと。
それをどうにか解決できないかともがいてみました。

まずは実験。
「JavaScript 側から Flash へは、どれくらいの間隔で アクションの呼び出しができるのか。」

setInterval を使って定期的に関数を呼び出しているのだが、
ちゃんと取れる間隔は100ms だった。(10ms 刻みで測定)
それ以下になると、たまに呼び出しができない時が発生。
50ms くらいにすると、一切呼ばれない事態が発生する。

次は原因を追及する。
Flash / JavaScript Integration Kit (Beta) (以降FJIK)を使っているのでそのソースを見てみた。

FlashProxy の call が呼ばれると、関数 + 引数 を それぞれ FJIK の規定の形にシリアライズする。
target の DOM オブジェクトの innerHTML に Flash のタグを入れてやる。
その際、 シリアライズした 関数 + 引数 を flashvars を使って Flash に読み込ませる。
読み込まれるフラッシュは JavaScriptFlashGateway.swf だ。
その JavaScriptFlashGateway.swf が、LocalConnection を使い、ユーザーが作った SWF ファイルと通信を行う。
その時に恐らく、 SWF ファイル同士が通信を行う前に 次の call が呼ばれ、
通信することなく JavaScriptFlashGateway.swf の再読込が行われるのだろう。

さて、どうするか。
通信する前に消されなければOKって事だろう。って事でちょっと拡張してみる。

内容としては、 FlashProxy を複数作り、それぞれがそれぞれの SWF ファイルを使って順序よく call されれば問題ないのでは?
って事でやった結果のサンプルがこちら
3つの FlashProxy を使って順番に call させた。
40ms くらいでも大丈夫になったが、問題はもう一つでてきた。
Flash が LocalConnection を使って通信するのに結構マシンのパワーを使うのか、
呼ばれる回数が増えたので重くなっているのか分からないが、 Flash 側の FPS がガクンと落ちた。
コレは改良の余地有りか・・・。

ちなみに、コレがその時の Wii.js です。AS ファイルの方の変更は無し。
主な変更点は以下



// FlashTag の省力化
FlashTag.prototype.toString = function()

//// FlashProxy の拡張
// callJS の退避
var FlashProxyCallJS = FlashProxy.callJS;

// コンストラクターの拡張
FlashProxy = function(uid, proxySwfName)

// 初期化メソッド追加
FlashProxy.prototype.init = function(num)

// call 時の省力化
FlashProxy.prototype.call = function()

// 退避させた callJS を復活
FlashProxy.callJS = FlashProxyCallJS;


function の中身はソースをみてください。
初期化してできる事を先にやってみたのと、無駄な分岐を省いてみた。
元のソースファイルの後に読み込まないと意味がありません。
main 、 HTML の記述も少々変更したが、省略。

とりあえずこれから仕事なのでもう行きます。

  • Comments (Close): 0
  • Trackbacks (Close): 0

Wii リモコンのボタンを Flash で取得


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

例の如くJCです。

昨日 Wii Flash API を公開してみたが、一番苦労したのはボタンのところ。
ということでちょっとボタンのところの説明をしてみようと思う。

Wii のボタンの取得は 「キーコード」 と 「window.opera.wiiremote オブジェクト」 で取得している。
インターネットチャンネルのQ&A によると wii リモコンの ボタンのキーは以下の用になる。

ボタン キーコード
十字ボタンの上 175
十字ボタンの下 176
十字ボタンの左 178
十字ボタンの右 177
Aボタン 13
Bボタン 171
-ボタン 170
+ボタン 174
1ボタン 172
2ボタン 173
HOMEボタン 取得できません

 だそうだ。
しかし、コレは 1P のみ。
他のコントローラーのボタンを取るには window.opera.wiiremote オブジェクト の “hold” から取得する必要がある。
それぞれのボタンの値は以下の用に鳴っている。

ボタンフラグ対応表
十字ボタンの上 8
十字ボタンの下 4
十字ボタンの左 1
十字ボタンの右 2
Aボタン 2048
Bボタン 1024
-ボタン 4096
+ボタン 16
1ボタン 512
2ボタン 256
HOMEボタン 取得できません

 俺は1Pをこっちに合わせる事にした。

同時押しの際には、同時押しをしたボタンに対応した値の和が返ってくる。
そして、誰が見ても分かるようこの値は二進数に直すととても便利な値になっている。

1P を他のコントローラーに合わせるには以下の方法を取った。
onKeyDown , onMouseDown , onKeyUp , onMouseUp
をそれぞれ取り、今押しているボタンの値(holdに合わせた値)をオブジェクトに登録。
Up の際にはそれを削除する。
Flash 側に送信する時は 全てのトータルを送る。
すると、Flash 側では 全てのコントローラーを平等に扱う事ができる。

Flash 側では以下の様な方法で onPress , onRelease を取得した。
まずは 送られて来た値を 2進数に直す。
そしてその値に 11111111111111 (14桁) を足す。
事前に以前送られてきた値を記録しておいて、その差を取る。
すると、0,1,2 の値の答えが求められる。
例えば

1011010 (new(7桁))と言う値が送られてきたとしよう。前回送られてきた値は
1101100 (old(7桁)) とする。
new に 11111111 (8桁) を足す。
12122121 と言う値になる。その値に対して old の値を引く。
- 1101100

答えは 11021021 となる。 その『 1【1021021】』 【】の部分が onPress と onRelease の値になる。
0 は onRelease
1 は 前回と変わらない。
2 は onPress
になる。

もっと簡単に見やすい形にしてみよう。縦に見ていってください。

new new + old
1 2 1 1
1 2 0 2
0 1 1 0
0 1 0 1

 new と old の組み合わせは以上の4つしかない。
二つを見比べると onPress と onRelease の関係が一目瞭然。
この方法を思いつくまで2日も悩んだけどね(笑)
他の方法があったら教えてください!

ちなみに何故一桁多い値を足しているかと言うと、 一番位が上の値のonRelease の際に 一桁ずれてしまう為です。

後は 前から順に見ていくだけです。


以上がボタン取得のポイントでした。
いや~勉強になりました。
ヌンチャクの値とかも取れたら面白いことできそうだったのになぁ。

  • Comments (Close): 0
  • Trackbacks (Close): 0

Wii Flash API 公開してみる


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

あ、どうもいつも通り JC です。

前回作った JavaScript で取得した Wii リモコンの情報を Flash で扱うのに便利な、
WiiFlashAPI を公開してみる。
ちょっとブラッシュアップしました。

一応ドキュメントも作っていたんですが、読みにくいカモしれません(汗)

新しく作ったサンプルです。

やってみて色々楽しかった。
ボタン操作は結構完璧?だと思うが、まだまだリモコンの操作が難点。
どうにかしたい。
操作自体は前回よりずっと早くなった。

API はコレです -> WiiFlashAPI(Beta)

全体的にはこんな感じです。


■ Wii Flash API (Beta)

 date : 2007/06/02
 version : 0.2
 AS Ver. : 2.0
 author : jc

■ 概要

 Wii リモコンの情報を Flash で扱うための API

 Flash / JavaScript Integration Kit (Beta) 必須
 http://weblogs.macromedia.com/flashjavascript/
 
 上記 URL から DownLoad してそのまま使ってください。

■ 使い方 (JavaScript側)

 HTML に以下を書きます。(JSファイル、SWFファイルのパスは各自直してください。)
 
 <script type=”text/javascript” src=”js/JavaScriptFlashGateway.js”></script>
 <script type=”text/javascript” src=”js/Wii.js”></script>
 
 <script type=”text/javascript”>
 <!–
 var uid = new Date().getTime();
 var flashProxy = new FlashProxy(uid, ‘JavaScriptFlashGateway.swf’);
 //–>
 </script>
 
 
 <script type=”text/javascript”>
 <!–
 var tag = new FlashTag(’XXXX.swf’, 幅, 高さ);// 幅と高さは各自直してください。
 tag.setFlashvars(’lcId=’+uid);
 tag.write(document);
 //–>
 </script>
 
 
 Wii.js ファイルについて

 // Wii
 // proxy : FlashProxy
 function Wii(proxy)
 
 
 // default でのブラウザのアクションをキャンセルする。
 Wii.prototype.defaultActionCancel = function()

 // 初期化
 Wii.prototype.init = function()
 
 
 // Wiiリモコンの取得する限度をセットする。
 // コレを少なめにすると少し早くなる。(ような気がする)
 Wii.prototype.setLimit = function(limit)

 // limit を設定して Flash に Wii リモコンの情報をぶん投げ続ける。
 Wii.prototype.start = function(limit)

 // 情報をぶん投げるのをやめる
 Wii.prototype.stop = function()

 // Flash に情報を送る
 Wii.prototype.update = function()

 // Controller の情報をまとめる。
 Wii.prototype.getController = function()

 // 1P 用 KeyCode 取得
 Wii.prototype.getKeyTotal = function()

 // 1P 用 KeyCode 取得用
 Wii.prototype.onKeyDown = function()
 Wii.prototype.onMouseDown = function()
 Wii.prototype.onKeyUp = function()
 Wii.prototype.onMouseUp = function()

 // Wii リモコンのキーコード
 var WiiKeyCodeBind = {};

 // ブラウザの判定
 var WiiBrowser = function() {}
 WiiBrowser.isWiiBrowser = function()

 // Flash から Wii を初期化する時はココを呼ぶ
 function main()
 

 ※ 一部省略しています。詳しくはソースコードにあるコメントを見てください。

 

■ 使い方 (Flash側)
 // jc.wii.Wii を new します。(引数は_root)
 import jc.wii.Wii;
 import jc.wii.Controller;
 import mx.utils.Delegate;
 
 var wii: Wii = new Wii(_root);
 
 // 必ず初期化してください。
 wii.init();
 
 
 // wiiコントローラーインスタンスを取得します。
 var con1: Controller = wii.getController(1);
 var con2: Controller = wii.getController(2);
 
 
 // ボタン情報の取得は以下のようにします。Delegate を使うと便利です。
 function onAKeyPressTest() {
  trace(”A Button Press”);
 }
 function onTwoKeyReleaseTest() {
  trace(”Two Button Release”);
 }
 con1.onAKeyPress = Delegate.create(this, onAKeyPressTest);
 con1.onTwoKeyRelease = Delegate.create(this, onTwoKeyReleaseTest);
 // 以上の用に設定すると ボタンが press または release された時に
 // 設定した function が呼ばれます。
 
 
 // 位置、ねじれ
 // getX 等で位置情報を得ることができます。
 // ソースの方に詳しく書いたつもりです。そっちを見てください。
 // onEnterFrame とかで主に使われると思います。
 _root.test_mc._x = con1.getX();
 _root.test_mc.._rotation = con1.getRoolAngle();
 
 
 // start で 情報の取得を開始します。
 // ●● コレを実行しないと情報取得できないので忘れないように ●●
 wii.start(2);

 

■ その他

 wii.start() 以外にも wii.polling() なんて方法もあります。
 Wii ブラウザの Flash Player のバージョンが上がって、
 ExternalInterface が使える用に鳴ったらポーリングして返値を得た方が
 早いかも知れません。(根拠無し)
 
 何かバグ、要望等がありましたら連絡ください。

 


 

  • Comments (Close): 0
  • Trackbacks (Close): 0

Wii Flash API


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

どうもJCです。

TAKESAKOさんがWiiリモコンの値をJavaScriptで取得する方法を載せていたので
さっそく API を作ってみました。

先週色々実験してみたら Flash / JavaScript Integration Kit (Beta)が使えたので
それを使って、Flash との連携をしてみた。

Flash 側では Wiiクラスをnew してgetController(0);とかやると Controller クラスのインスタンスがgetできる。
そのインスタンスに getX() とかやると画面座標でのポインタの値が帰ってくる。
その他、homeボタン以外のキーイベントと、wiiリモコンの距離と傾きが取得可能。
それぞれのイベントハンドラ(onLeftKeyPress,onRightKeyRelease など)でイベントを取得することも可能。

JavaScript 側では Flash にWiiリモコンの情報をぶん投げ続ける。
どうやら、80~70ms での通信が精一杯らしい。それ以上早くすると何故かできない。
Wii では Bボタンなどにそれぞれデフォルトでブラウザの操作が割り当てられている。
それを無効化する事も可能。
ブラウジングできない 1P のキー操作も取得可能。
ボタンの同時押しも取得可能。

サンプルを作ってみた。(1~3Pまで取得可能)

 

結果。

激重(笑

誰か早くするコツを教えてください(泣)
ちょっとブラッシュアップしよう・・・。


[追記]
ブラッシュアップして公開しました

フィボナッチ数列


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

お腹減ったなぁ。

どうも JC の方です。

ActionScript を色々と調べていてこんなのを見つけました。

フィボナッチ数列を求める 関数

function fib(i:Number):Number{
	if (i<2) {
		return 1;
	} else {
		return fib(i-2) + fib(i-1);
	}
}

何か面白そうだったのでループで回してみた。
・・・・・・・・・
・・・・・・
・・・
PC が止まった。10回目くらいまではトレースされたがそれ以降はCPUフル稼働。

そこで考えてみた。
どうやったら早くできるか。
遅い原因は恐らく再起処理(?)を行っているからだと思う。
じゃあ早くするには?
再起じゃなく求めればいい!
って事でできたのがコレ。

var log:Array = new Array();
function fib(i:Number):Number {
	if (i<3) {
		log[i] = 1;
		return 1;
	} else {
		var l:Number = log[i - 1] + log[i - 2];
		log[i] = l;
		return l;
	}
}
var time1 = getTimer();
for (var n:Number = 1; n < 74; n++) trace(n + " : " +fib(n));
trace(getTimer() - time1);

73項までを 5ms で終了。

ActionScript 3.0 に至っては1ms で終了。
早い。

log として 配列に計算した数字を入れて、それから計算すれば
すぐに答えがでる。
log に無い項は後から計算してもすぐ終わるし、
特に再起処理を使って処理を行う必要も無い気がする。

コレを何かに使えないかなぁ?

  • Comments (Close): 0
  • Trackbacks (Close): 0

DateUtil AS 2.0


Deprecated: Function split() is deprecated in /virtual/jessejds/public_html/blog.bk-zen.com/wp-content/themes/wp.vicuna.ext/functions.php on line 358

今回は 久々に ActionScript に関して。

どうも JC の方です。

今更なんですが、ActionScript2.0 で書いた DateUtil.as を公開してみようかと思って。
ちょっと前に Flash でとあるゲームのプロトタイプを作ることになって、
その時に作った DateUtil です。
それをちょっと改造して、使い方のサンプルとコメント書いてみた。
以下からダウンロードしてください。

DownLoad
どんな事感じなのかをまとめておこう。

public static function str2Date(yyyymmdd: String): Date
public static function date2Str(date: Date): String
public static function num2Date(yyyymmddNum: Number): Date
public static function date2Num(date: Date): Number
public static function zeroSuplessStr2(num: Number): String
public static function getFullYear(yyyymmdd: String): Number
public static function getMonth(yyyymmdd: String): Number
public static function getDate(yyyymmdd: String): Number
public static function time2Zero(date: Date): Date
public static function isLeapYear(date: Date): Boolean
public static function min(): Date
public static function max(): Date
public static function shiftMilliseconds(date: Date, milliseconds: Number): Date
public static function shiftSeconds(date: Date, seconds: Number): Date
public static function shiftMinutes(date: Date, minutes: Number): Date
public static function shiftHours(date: Date, hours: Number): Date
public static function shiftDate(date: Date, dates: Number): Date
public static function shiftMonth(date: Date, months: Number): Date
public static function shiftYear(date: Date, years: Number): Date
public static function shiftTime(date: Date, years: Number, months: Number, dates: Number, hours: Number, minutes: Number, seconds: Number, milliseconds: Number): Date
public static function getMonthFirstDate(date: Date): Date
public static function getMonthLastDate(date: Date): Date
public static function getWeekFirstDate(date: Date, startDay: Number): Date
public static function getWeekLastDate(date: Date, startDay: Number): Date
public static function differenceDate(targetDate: Date, diffDate: Date): Number
public static function clone(date: Date): Date




メソッド一覧はこんな感じ。
26メソッドか。
いらなそうなのもあるが、意外と便利だったりするので一応取っておいたのもある。
max(), min() とか結構使える。(と思う)
引数に 複数の Date オブジェクトを渡してやると未来、または過去が帰ってくる。
あとは differnceDate() 、shiftDate() 、getMonthFirstDate() 、getMonthLastDate()、
getWeekFirstDate() 、 getWeekLastDate() も結構お気に入り。(多いな)

differenceDate() は 二つのDate オブジェクトが 何日差かを計算する。
shiftDate() は 日付をずらす。
getMonthFirstDate() と
getMonthLastDate() は、指定日の 月の始まり、または終わりの日を返してくれる。
getWeekFirstDate() と
getWeekLastDate() は、指定日の 週の始まり、または終わりの日を返してくれる。
さらに何曜日始まりかを第二引数に渡すとそれにあった日を返してくれる。

どれも閏年とか気にしなくて使えるから便利だと思う。

ってこんなのを公開してみているのは何故か。
恥ずかしながら、まだ Flash 仲間がいない(´・ω・`)ソーボン
なので、少しでも Flasher の方々に近づければと勉強中だったが、
俺も勉強してるだけでは近づけないと思い、コレを布石に一人でも仲間ができたらなぁ。
とか考えている。
実力の無い人間が実力のある人間に声を聞いてもらうには、
人一倍大きく声を張り上げなければいけないような気がしている。
実力が無くても、向上心のある人間がもっと色んな人と関われる世の中になってほしいなぁ。

話は逸れたが、何かバグとか「ココをこうした方が効率的だ!」とか言うのがある方は連絡ください。
もっと勉強がしたいので「こんなのもあったら便利」っていう意見もたくさん欲しいです。

 m(_ _)m 宜しくお願いします。

  • Comments (Close): 0
  • Trackbacks (Close): 0

Home > ActionScript2.0 Archive

Search
Feeds
Meta

Return to page top