Kinect開発合宿レポート
TrackBack URL :
Comments (1)iPhone・iPadアプリ大賞2011に、ウチのiPadアプリ「むげんメモ」を引っさげてプレゼン行ってきたのでレポートするよ!

![]()
むげんメモのプレゼンはなんとイチバン最初。
その方があとのプレゼンをしっかり聞けるってことで、むしろ望むところといったところなんすけどね。
そんなわけで心構えをする暇すら与えられず、早速ボクの番がまわってきたわけだ。
プレゼンの様子はustreamの録画がある模様なのでそちらをご覧いただければ….><
でもって反省、、、
どうもボクってば、マイクを持って話すと息を吸うのを忘れるヘキがあるらしく、この日も例に漏れずだんだん呼吸が苦しくなっていった次第。おかげで最後の方、うまく言い回しとかが出てこなくて、トークがいまいちキレなかった。
ぎゃふん!

デモ主体のプレゼンというのは、もうなんかボクの定番スタイルとして定着しつつあるのかね。今回もその文法をしっかり踏襲して、それなりに会場の反応もあったように思える。
グランプリは残念ながら逃してしまったが、そちらはHiroshima ARchiveを擁する渡邉先生が獲得。MA7で最後まで競った相手であり、くやしいが心から祝福もうしあげます!!
さて、そんでもって大賞ノミネートの中で特に気になった作品を、いくつかピックアップ….

聖なる夜が性なる夜になる20xx年のこの日本、我々に不幸を運ぶサンタどもを一掃すべくiPhoneをタッチしまくるシンプルゲーム。
コンボを重ねるとスコアが伸びる仕様で、ハイスコアを追求するのがまた楽しい。しかも憎むべきサンタどもをはじきとばすエフェクトも気持ちいいときた。
早速AppBankでも紹介されていたうらやましいアプリだ。

食べ物写真のライフログアプリ。
なんせデザインのクオリティが高い。エフェクトなども含めて、邪魔にならないレベルで作り込まれていて好感度がスゲく高かった。
それに加えて、Twitter連動しての友達機能や近傍検索など、機能の充実度も非常に高い。
常用アプリになりそう。。。
iOSアプリの世界がまだまだ熱いことを再確認できたイベントだった!
1年ちょっとぶりに再会できたするぷたんや、MA7でお会いしていた渡邉先生に雑魚雑魚のおふたり、AppBankのみなさんと、久々にお話できたのも超テンション上がった!!
来年もいいモノ作って参加したいなーと、心から思ってトーキョーを後にしたのであった!!!
TrackBack URL :
Comments (0)この記事はiOS Advent Calendarの12月15日ぶんとして書いてますよっと。
iOS開発者の諸兄にはもうご存知のかたも多いと思うが、去年はいろいろ紆余曲折があったわけで、いまiOS用のネイティブアプリは、Objective-C以外でもいろいろな言語で開発することができる。
C#でiOSアプリを開発するには、最近だとUnityが熱いが、よりネイティブに近い環境としてはMonoTouchというものが販売されている。
MonoTouchはiOS SDKの各APIをごく薄くラップしたライブラリを持っており、そのぶんOSアップデートへの対応が早いなどの利点がある。
ここで取り上げるのが、2Dゲーム向けフレームワークとして定評のあるCocos2Dである。
何パターンかのMonoTouch向けCocon2Dライブラリが公開されているが、今回注目するのはCocosNetというライブラリ。
ネイティブなCocos2Dをラップするのではなく、完全にC#のソースコードに移植しているのがこれである。おかげで移植カバー率はそれほど高くないという欠点はあるものの、後述するおおきな利点が期待できる。
CocosNetを使ったコーディングの例を、少しだけサンプルとともに追ってみる。
まずは初期化。
Application開始直前にでも、OpenGL ES1用のグラフィックコンテキストを生成しておく。
static void Main( string[] args ) { var c = Utilities.CreateGraphicsContext( EAGLRenderingAPI.OpenGLES1 ); UIApplication.Main( args ); }
次いではDirectorの初期化だ。
とりあえずはAppDelegate.FinishedLaunching()あたりで実行するのが手軽だろうか。。。
パラメータを順次設定して、最後にUIWindowにアタッチしている。
var d = Director.Instance; d.DeviceOrientation = DeviceOrientation.Portrait; d.AnimationInterval = 1.0 / 60.0; d.IsDisplayFPS = true; d.AttachInView( window );
そしてシーンとスプライトの初期化。
これで画面に何かが表示できるはずだ。
var scene = new Scene(); var s = new Sprite( "splite.png" ); s.SetPosition( d.WinSize.Width / 2, d.WinSize.Height / 2 ); scene.AddChild( s, 0 ); d.RunScene( scene );
もういっこおまけに、アニメーションも。
MoveTo move = new MoveTo( 1.0f, new PointF( 0, 0 ) ); s.RunAction( move );
Cocos2Dを触ったことがある人なら、これでだいたいの移植具合が分かってもらえるのではないかと思う。
その他パーティクル・パララックスノード・タイルマップなど、有用そうなクラス群はひととおり移植されている。
一点、アニメーションのイージングが移植されていないのが残念だが、これは追加コードを少し書いてやるだけですぐ移植できた。
このように、ゲームをシンプルに作り始める素地は、すでにしっかりと整備されている印象だ。
さて、いろいろプランを練り上げてゲームの完成をみる頃には、ロジックの分離やシーケンスの整理が行き届いたエクセレントなソースコードが手元にできあがっているはずだ。
そうすると、せっかくだから別のプラットフォームにむけても、このジーニアスなゲームをプレイしてもらいたいという欲求がわき上がってこないだろうか。
ここで、Mono for Androidの存在を思い出してほしい。
Mono for AndroidはMonoTouch同様、C#でAndroid向けのアプリが開発できるキットである。
そしてMonoTouchと同じOpenTKを使ってOpenGLをラップしているので、CocosNet実装もほとんどそのまま流用できるはずだ!
つまりはビューへのバインド部分だけそれぞれのプラットフォーム向けに書いてやれば、Cocos2Dの機能がiOS/Android双方で同じように使えるようになるはずなのだ!!
※ただし未検証でありライセンスにも注意する必要がある。
と、ちょっと投げっぱなしスープレックスな結びになってしまいつつあるが、C#で書けることによる開発効率の飛躍的なアップに加え、マルチプラットフォーム展開が容易になるというメリットがお分かりいただけたのではないかと。
Objective-Cは言語的にノイズが多すぎてどうも…. という諸氏にも強くお勧めできる、C#によるスマホアプリ開発。スマートなアプリをスピード開発してみてはいかが!?
明日は@M_Sakodaさんです。
よろしくですー。
TrackBack URL :
Comments (0)Mashup Awards 7のキャラバンイベント、Mashup Weekend in Fukuiに参加してきた!
前日からのエクストリーム進行の都合上、セミナーセッションを断念してミートアップ・アイデアソンからの合流になってしまったが、そこから全力疾走!
翌日のハッカソンをいっしょに進めるチームが運営さん主導で無作為にえらばれたのだが、蓋をあけてみるとなんと馴染みの@omyu氏と@shoito氏。これは勝てる布陣だ。ショイトォ!
さてまずはアイデアソンの結果、Kinectを使って、◯×クイズをジェスチャーで答えるゲームを作ってみることに決まり、そのまま翌日に突入。
MA7的には、クイズ研のAPIとKinect SDKをマッシュアップするということで開発の方向が決まった。
これまで参加してきたハッカソンだと、アイデアソンから当日まで1週間のインターバルがあったのだが、今回は翌日すぐにというはじめての体験。 前日のエクストリー(ry の都合上、初日終了後すぐ気絶してしまったのだが、そのあいだにショイトォ!が完璧な下調べをすすめてくれていた。
マジリスペクト。
明けてハッカソン当日。
滑り出しはKinectアプリ開発環境の構築からなのだが、これがなかなか一筋縄にはいかなかった。主に自分のポカで(^ω^;)
およそ午前中いっぱいを使って、どうにかKinect SDK付属のサンプルコードが動くところまでを完了。
そして昼食を挟んで、◯と×のポーズ認識を実装するところにとりかかった。
Kinectは頭や肩・肘・手首・手など 20点の骨格ジョイントの位置が取得できるので、今回は上半身のジョイントを活用してモーション認識を実現した。
ちなみにSDKの利用方法などに関しては、@ITのこの記事を全面的に参考にさせていただいており。@k1ha410さんありがとうございます!!
あそこよりこっちが上で左~のような条件をいくつか組み合わせ、簡単な判定ではあるものの、それなりの精度で認識を実装できたところで、次はUIの体裁を整えるステップだ。
デザイナーの確保に失敗した我々はUI面で大きなハンディを抱えていたのだが、ここでもショイトォ!が大活躍してくれた。
こちらの要望を的確にキャッチアップし、クールな画像素材を次々提供してくれたのだ。
さらに雰囲気を大いに盛り上げる音素材まで揃えてもらえたので、アプリ全体のクオリティがぐっと向上した。
完成したアプリのイメージがこんな感じ。
※顔は後でレタッチしてますw

よしこれで勝つる!?と思っていたら、ここで終わりじゃないよMA7で待ってるよという意味で今回投票はなし。
よかろう1M円獲得してやろうじゃないかMA7で会おうということでめでたく全スケジュールが完了。
みなさんほんとお疲れ様でした!
ハッタリのトッピングも含めてそれなりのクオリティで完成にこぎつけられたのは、先生とてもよかったと思います。
ハッカソン慣れしてきた賜だと思いますが、でもそこに慣れすぎて、1日で実現できる程度のアイデアに小さくまとまってしまう傾向が否定できません。クソでかい風呂敷をひろげて血反吐をはいてハックするのも 、先生いいんじゃないかと思います。
あとXbox持ってなくてすいません。
以上!
わざわざ遠方から来ていただいたゲストのみなさん、運営のみなさん、当日お会いできたみなさん、お疲れ様でした。ありがとうございましたー!!
このアプリで本戦エントリーいたしますことをここで公言しておきますー。
つぎはMashup Battleで会いましょうー!
TrackBack URL :
Comments (1)今年もGoogle Developer Day参加のためのハンター試験が無事終了。
ある程度で見切りつけちゃったんで参加できる自信がすげく薄いんですが…
スライドパズルの探索部分だけ、ソース晒してみますよー。
using System; using System.Collections.Generic; namespace SlidePuzzle { class StageBreaker { // ctors public StageBreaker( Stage stage ) { this.stage = stage; this.startTime = Environment.TickCount; } // Public Methods public string Break() { GC.Collect( GC.MaxGeneration ); List<Stage> nextStages = new List<Stage>(); string[] movables = stage.GetMovables(); foreach ( string movable in movables ) { Stage nextStage = stage.MakeClone(); nextStage.Move( movable ); this.snapShots[ nextStage.Data ] = true; if ( nextStage.Check() ) { return stage.MovedOperations; } nextStages.Add( nextStage ); } return this.BreakRecursive( nextStages.ToArray(), 1 ); } // Private Methods private string BreakRecursive( Stage[] stages, int step ) { if ( Environment.TickCount - this.startTime > 30 * 60 * 1000 || stages.Length > 800000 ) { return null; } List<Stage> nextStages = new List<Stage>(); foreach ( Stage stage in stages ) { string[] movables = stage.GetMovables(); foreach ( string movable in movables ) { if ( movable != stage.GetRevert() ) { Stage nextStage = stage.MakeClone(); nextStage.Move( movable ); if ( !this.snapShots.ContainsKey( nextStage.Data ) ) { this.snapShots[ nextStage.Data ] = true; if ( nextStage.Check() ) { return nextStage.MovedOperations; } nextStages.Add( nextStage ); } } } } string result = this.BreakRecursive( nextStages.ToArray(), step + 1 ); nextStages = null; GC.Collect( GC.MaxGeneration ); return result; } //========================================================================================= // Fields private readonly Stage stage; private readonly Dictionary<string, bool> snapShots = new Dictionary<string, bool>(); private readonly int startTime; } }
TrackBack URL :
Comments (0)HTML convert time: 2.635 sec. Powered by WordPress