2010年2月24日水曜日

【mixiアプリ】MouseEvent.MOUSE_WHEEL

最初はブラウザのスクロールを止め、Flash上でホイールイベントを処理したかったのが目的でしたが、
mixiにアップするとローカルでは取れていたのに何故か取れない状況に陥ったために色々と調べてみました。

検証にはIE6,FireFox3.5,GoogleChromeを使用しました。

元々まともにイベントが取れたのはIE6だけで、他の二つは取ることは出来ていませんでした。
更にブラウザのスクロールを止める処理を追加するとIE6でも取ることは出来なくなりました。

ブラウザのスクロールを止めるにはJavaScript側に以下のコードを追加します。

if(window.addEventListener){
window.addEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = wheel;

function wheel(event){
if(!event){
event = window.event;
}
if(event.preventDefault){
event.preventDefault();
}
event.returnValue = false;
}


これでブラウザのスクロールが無効になります。

しかし、Flash側ではイベントが取れません。
何故イベントが取れないのか?正直まだわかっていません。

ローカルに置いてあるswfをブラウザにドラッグしていって起動したときは問題なく取れていました。
mixiにアップした時に取れなくなるのはmixiに原因があるのか?と、mixiアプリの仕様などを熟読

1箇所怪しい場所を発見
http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/use_flash
>embedタグについて、wmode属性を指定します。wmode属性値として、”transparent”もしくは”opaque”を記述します。
>マウスホイールイベントをFlash上で拾うことができない

でも今回作ったやつにwmodeは指定していないのでこれではないのかも

このままではラチがあかないので強硬手段!
JavaScript側でスクロール値が取れるので、ActionScriptのExternalInterfaceの機能を使い、
JavaScript側からFlash側にスクロール値を送信する処理を作りました。

スクロール値を受け取ったFlashはその値を元にMouseEventを作成してdispatchEventをステージに流し、
擬似的にホイールイベントが発生するようにして対応しました!

その時JavaScriptのwheel関数に以下の処理を追加しました。

var delta;
if(event.wheelDelta){ /* IE/Opera */
delta = event.wheelDelta/120;
if(window.opera){ /* Opera9 */
delta = -delta;
}
}else if(event.detail){ /* Firefox */
delta = -event.detail/3;
}

一応これで動いているのでこのまま行ってみようかと思います。
もっと正しい方法があれば教えていただきたいです。

2010年2月3日水曜日

Twitterクライアント OAuth認証処理(mixiアプリ)

前回はデスクトップアプリ(AIR)での認証でしたが、今回はブラウザタイプということで若干処理がことなる。
Twitterのアプリ登録ではApplication TypeとCallback URLが違うくらい。

とりあえず、AIRと違ってアプリから別ドメインへの通信は設定が必要だったり、mixiアプリ自身gadgets.io.makeRequestを使用して通信しなければいけなかったりするのでソースをそれに合うように変更。
http://developer.mixi.co.jp/appli/pc/lets_enjoy_making_mixiapp/require_servers

最初はとりあえず確認のため自分のタイムラインを取得、形式はXMLで取得しました。
受け取ったレスポンスデータをFlashに渡してやって、内部でXMLデータに変換し、解析。

次に認証処理を作ったのですが、どうしてもCallback URLが呼ばれないでデスクトップアプリの時みたいにPINコードが表示される。いろいろ調べてたら以下のようなページを見つけた。

opensocial-jqueryを使ってMixiアプリを作ろうとしてみた

opensocial-jqueryを使ってMixiアプリを作ろうとしてみた(後日談)

>※ mixiアプリから外部サーバへのOAuthによる認証認可要求は、現在サポートされていません。
あれ?無理なの・・・か?よく見たら最初に貼ってるデベロッパーセンターのページじゃんw

うーん、どうしようかなぁ、胡散臭い手だけどPINコード表示は行くんだから、それを手入力してもらうとか!? ブラウザアプリでそれはなんか微妙だなぁ、まだ試してないから出来るかもわからないけどw

後は、mixi経由じゃなくて自分んとこのサーバーにその処理を任せちゃうとかね。それなら行けるのかな?

2010年2月2日火曜日

Twitterクライアント OAuth認証処理

タイムライン上のFrom○○の部分にクライアント名を出したい場合はOAuth認証の処理が必要なのでそれの導入メモ。

大体下記のサイトを参考にして作成。

coderranger.com blog
http://www.coderanger.com/blog/?p=59

google code (暗号化用のライブラリ)
http://code.google.com/p/as3crypto/

posterous
http://tech.yambal.net/flex-air-oauth-twitter-httpbitly4akwpm

某開発者の独り言
http://aqubiblog.blogspot.com/2009/11/twitterfriendfeed.html

まちゅダイヤリー
http://www.machu.jp/diary/20090818.html#p01

2010年2月1日月曜日

Twitterクライアント登録

自分でTwitterのクライアントを作る場合、Twitterにてアプリケーション登録が必要です。

http://twitter.com/oauth_clients

1.Twitterにログインした状態でアクセス
2."Register a new application"を選択
3.必要な情報を入力
  Application Name (日本語可)
  Description (日本語可)
  Application Website
   を入力しておけば大丈夫そう

  Application Typeはとりあえず"Client"
  Default Access typeは"Read & Write"

4.登録が完了すると、"Consumer key" "Consumer secret"が発行されるのでメモ
  (これがアプリケーションと紐付けるための物になります)

2010年1月22日金曜日

ダーツ記録管理ツール




自分の練習の記録をわざわざテキストに打っていくのが疲れたので作りましたw
まだまだ発展途上のツールです。とりあえず自分で使う分にはOKなレベルには来ました。

2010年1月13日水曜日

PNGコンバーター


画像ファイルをPNGファイルに変換するツール

ある程度の無駄なチャンクデータは削除します。ただ、最適化かどうかといわれれば怪しい。

使い方は変換を掛けたい画像ファイルをここにドラッグしてくるだけ!複数ファイルのドラッグにも対応しています。

開発環境は
VisualStudio2008 + .NetFramework

2009年12月22日火曜日

mixiアプリ gadgets.flash.embedFlash使用時のクロスブラウザ対策

gadgets.flash.embedFlash(
"same.swf" + time, ------ ①
"swf",
"9.0.0",
{
id : "externalswf",
name : "externalswf", ------- ②
width : 600,
height : 480,
allowScriptAccess : "always" --------③
}


①IE Component (= trident)をホストしているブラウザだと
一回目のリクエストでキャッシュした.swfをfile://--- プロトコルとみなしてhttp://---プロトコルと通信しようとしているようなので、キャッシュされないようにタイムスタンプを付与しています。

②nameタグを入れない場合GoogleChromeでASとうまく連携できないようなので追加

③ASからJSに向けて連携できるように追加

これでとりあえずIE6,7,8 FireFox, Opera, Chrome, Sleipnir, Lunascapeは動くはず

参考サイト
http://builder.japan.zdnet.com/member/u518424/blog/2009/06/17/entry_27023075/

2009年11月18日水曜日

FlashCS4 レイヤー数、フレーム数、シンボル数 メモ

StageのWidth,Height
MovieClipのWidth,Height

2880pxまで

フレーム数、レイヤー数、シンボル数などは

16000まで可能

2009年11月12日木曜日

【Flash】外部swfにてリンクしてあるクラスを使用する

var load:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
var url:URLRequest = new URLRequest("swfファイルへのパス");

context.applicationDomain = ApplicationDomain.currentDomain; // 外部swfのクラスを使用するのに必要
load.load( url, context );


この後Event.COMPLETEがきた後に

var obj:Class = getDefinitionByName("定義されているクラス名") as Class;
var mc:MovieClip = new obj();

addChild( mc );

これで表示されます。

2009年10月8日木曜日

配信環境

忘れないうちにどこかに書いておかないと危険なのでメモ


私は時々IRCなどでネットゲームの実況配信的な事をしたりしています。
このエントリーは配信で使う音声関係のメモです。
--------------------------------------------------------------

まず目的
・スカイプで多人数と話ながらその音声を配信する
・iTunesなどで鳴らしている音楽も配信する
・プレイしているゲーム中の音も配信する
・その時スカイプの相手にはiTunesやゲームの音は配信させない。
・自分の声ももちろん配信する。
・自分の声はスピーカーから聞こえてこないようにする

ざっと目的を書きましたが、これを全部実現するのには苦労しましたw

■まずは自分のサウンドボード環境
1.カード(Envy24 Family Audio (WDM))
2.オンボ (SoundMAX HD Audio)

■オーディオプロパティの設定
オーディオの再生「オンボ」
オーディオの録音「オンボ」
音声の再生「オンボ」
音声の録音「カード」

■スカイプの設定
マイク「カード」
スピーカー「オンボ」

■WMEの設定 (配信用のエンコーダー)
オーディオ「オンボ」

 音声の録音とマイクだけ「カード」にすることによって、
自分の声はスピーカーからは出ずに、スカイプの相手に届きます。
そして私の声はスピーカーからは出ません。

 それ以外はオンボから鳴っています。
WMEはオンボの音だけを拾うようにしているので、
現時点では"相手の声","iTunesの曲","ゲームの音"が配信されます。

 ですがこのままでは私の声が配信されないので、カードにあるマルチスピーカー出力端子から
オンボのライン入力端子にオーディオコードを引っ張ってやります。
(カードのマルチスピーカー出力端子は録音する音声も出力できる)

 ライン入力は"オーディオの録音"扱いなのでオンボのステレオミキサーを有効にしていると、WMEがその音声を拾ってくれます。
"オーディオの録音"なので自分の声はスピーカーからは出ません。


これが現在の私の配信環境になります。

2009年9月10日木曜日

ドロネー図&ボロノイ図


最近、携帯の「コロニーな生活PLUS」ってサイトで遊んでます。
http://pc.colopl.jp/pages/wl/welcome.html

簡単に言えば自分が移動した距離に応じてポイントがもらえ、それで土地を育てるみたいなサイトです。

そこのサイトの位置情報というのがボロノイ図で作られているということなのでそれを再現しようと画像な感じで作ってみました。

画面をクリックしていくと、そこに点が打たれていって、3角形で分割しています。
青い線が「ドロネー図」
緑の線が「ボロノイ図」


まー久しぶりに高校数学的な部分使いましたね~

ネットがあるから助かりますが、方程式とかプログラムにそのまま使えんのでプログラム的な事をしている所を探すのに苦労しましたw

やっぱりなんでも使わないと忘れますね。ちょっと数学勉強しる

2009年8月18日火曜日

【BREW】マスコットカプセル

久しぶりのエントリー

最近BREWでマスコットカプセルを使用しています。
本日判明したのですが、マスコットカプセルを使用する場合、2D系のAPIを使用するためには
IMICRO3D_mcext_BindColorBufferなどを使用してやらないといけないのはサンプルの通りなのですが、IGRAPHICS系のAPIには非対応でIDISPLAYインターフェイスのみサポートしているらしいです。

なので、円とか多角形を描画する場合はプリミティブなどで代用する必要があるようです。

なんだかなー

2009年1月9日金曜日

BREWメモ

ソニーエリクソン系の端末にて、マナーモード状態で電源キー押し終了以外の方法でアプリを終了すると、その時BGMが”内部的”に鳴っていた場合、何故か終了寸前に音が少しなる現象が発生。
内部的っていうのはマナーモードだけどアプリ内の設定では音量がONの状態の事で、
普通にプレイしている時は音はなっていない。
まだソニーエリクソン系以外の端末だと今の所この現象は確認できてないから機種依存かな・・・・

原因はまだいまいち分かんないけど、終了直前は音全部止めるのが安全?

2008年12月10日水曜日

iPhoneメモ - AVFoundation

iphoneOS2.2から追加されたAVFoundationフレームワーク

今日ループ曲を鳴らしてるとループのタイミングで音が一瞬途切れていることに気づいた。
調べてみると、どうやらエンコードによって変わるらしい。

●以下の三つの形式だけチェック
wave - 問題ない
Appleロスレス - 問題ない
aac - おかしい (320kbps, 192kbps, 32kbps)

ロスレスとaacはitunesでエンコード。
上の二つは音もいいんだけどサイズも大きい。ソフトバンクの3G網で落とせる10M以内に抑えるならレートを下げるしかないのかな?
もっとちゃんと調べればもしかしたら大丈夫なのかもしれないけどさ・・・


--
ちなみに音の鳴らし方のメモも

NSString* path = [[NSBundle mainBundle] pathForResource:@"title" ofType:@"wav"];
AVAudioPlayer
* player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[player play];


こんな感じで簡単に音を再生できます。

2008年9月14日日曜日

リーグ戦スケジューラー

個人的に参加している某ゲームの対戦会用に、リーグ戦のスケジューラーを作りました。
メッセとかに貼り付けれるように、リーグ表とか順位表とかも表示するようにしています。
以下がそのイメージ












巷では.Netがはやってそうですが、知らないのでMFCを使用。


デバッグは5~12人まで目視で行いました。
それ以上、以下はしていないのでミスがあるかも。

アルゴリズムとしては
-------------------------------------------------------------
1:まず奇数人数の場合、1人ダミーの人を入れて偶数人数化します。(後でダミーと当った対戦は除外)
2:A vs B で左の人をホスト、右の人をクライアントと呼ぶ
3:各回戦ごとにホスト基準で対戦相手を検索開始する。
4:検索順は A~F の6人の場合 A>B>C>F>E>D となる、 注意するのは(人数/2)を超えた場合最後の人から戻ってくるような検索の仕方に変わること。
5:基準のホストが決まったら次に対戦相手のクライアントを探して行く。
6:この時 クライアント候補は F>E>D>C>B>A>F>E... と 1回戦内でループしていき、対戦相手が決まったら、次に相手を決定するホストは直前のホストの相手-1の位置にいる相手から検索を始める。
7:例えば、最初の試合が A vs Fになった場合、 次にホストとなったBはEから検索を始める。
8:対戦相手が決まらなかった場合、クライアント検索開始位置は変わらず、4に戻る


プログラムソース的には 以下を回戦数分繰り返す。というか試合数が最大になる回戦まで繰り返す
int mMemberNum = x; // グループ人数
int client = mMemberNum- 1; // クライアント候補の人のID
bool roundCache[mMemberNum]; // 各ラウンドごとに対戦相手が決定したかどうかを表すフラグ
int league[mMemberNum * mMemberNum] // 各対戦情報を管理する配列
int roundCount; // N回戦をあらわす
for( int hostCount = 0; hostCount < (mMemberNum); hostCount++ )
{
     int host = hostCount;
    // ホスト位置が半分を超えたら、最後の人から逆方向にホスト位置をずらしはじめる
     if( host >= (mMemberNum)/2 ) host = (mMemberNum-1) - (host-mMemberNum/2);
    // ホスト候補の人が既に対戦が決定している
    if( roundCache[host] ) continue;

    for( int count = 0; count < (mMemberNum); client = (client - 1 + mMemberNum) % mMemberNum, count++ )
    {
        // クライアント候補が自分なら飛ばす
        if( host == client ) continue;
        // その人が対戦相手決定済みなら飛ばす
        if( roundCache[client] ) continue;
        // すでにクライアント候補の人とは対戦している場合は飛ばす
        if( league[(host *mMemberNum) + client] != -1 ) continue;
        // 対戦情報を設定
        league[(host *(mMemberNum+gisou)) + client] = roundCount;
        league[(client *(mMemberNum+gisou)) + host] = roundCount;
        roundCache[host] = true;
        roundCache[client] = true;

        break;
    }
}


--------------------------------------------------------------

無理やりな思いつきのアルゴリズムだからかなり穴があるかもしれない。

2008年5月23日金曜日

続・シャープ端末の罠

またまたシャープ端末のへんてこりんな仕様?が発覚。

Imageデータをそこそこの枚数用意しただけで速度が遅くなるみたい。
量は結構端末によってまちまちみたいだけど、シャープ端末のは酷い。
なんたって最新機種でもおこるし・・

null値のImage配列だけでも影響が出る。
画像を沢山使うアプリだとそれだけでもうPSみたいなローディングがw

今後、そういうことも意識してプログラムしていかないと行けないな。(てかシャープが改善しろよ・・・)

2008年5月12日月曜日

Android Developer Challenge

落ちました。入賞ならずorz

まぁそう簡単には行かないと思ってたけどさ
ありきたりなアイディアだと思ったし、多分Googleが求めている物はもっと違う物なんじゃないか?
とも感じてた。

これから入賞者のアプリを見れる機会があるだろうし、そこで感銘を受けようw
家でも開発したいけど、家のPCだと重くてきついかなぁ。

新しいPC買わないとなぁ

2008年4月24日木曜日

Google デベロッパー交流会

Google主催のデベロッパー交流会に参加してきました。

参加したのは今回のテーマが「Android SDK」だったからw

本当は明日、渋谷でAndroid開発セミナーみたいなのがあるらしいんだけど、
ちょっとヤボ用があるので参加できません。

今日の内容だけど、個人的に収穫があったのはIMEが搭載される的な事を言ってたことくらいかなぁ。
あとは確認事項とか折込済み的なことだったような気がする。

パネラーの人がサンプルアプリ作ってきてたけど、
ケイブの人がデススマイルズ持ってくるとは思わなかったww
めちゃくちゃメンドクサソウに話してたけどねw

あとはオンラインゲームっぽいのを作ってた人のは結構すごかった感じがする。
(あくまでゲーム屋から見た感じでね)

2008年3月30日日曜日

パレット操作

Direct3Dにて読み込んだ画像のパレット操作をしようとしてみたけど

中々資料が出てこない。

いや、

中々というかまったく出てこない。


DirectDraw時代のは出てくる。

しかし!

Direct3Dになった今、そういうことをしている資料が見つからない。


もしかして出来ない?(出来たとしてもメンドクサイ?探し方が悪いだけ?)

2008年2月27日水曜日

シャープ端末の罠?

久しぶりの書き込みw

仕事でシャープ系端末(ソフトバンク)の挙動がおかしかったのでメモ的に書いておこう。


【現象】
ネットから落としてきた画像データをImage.createImage(byte[] data,int ofset, int length)
で生成しようとしたらException吐いて失敗する。

【対策】
Image.createImage(InputStream stream)
を使用したら回避できた模様。

【原因】
詳しくは不明