ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2014年2月28日金曜日

良い文房具の自己満足/マルマン ニーモシネ

良いノートって自己満足だと思う。
キャンパスのノートなんて一山いくらなんだし、良い書き心地だのなんだのでアイデアが変わるわけじゃなし、しかもノートに書いてる時間なんて昨今じゃそんなに多くない。一日中ノートに向かっていた時代ならまだしも、現在じゃ良いノートの価値なんてどれほどのもんだ。メモなんざレシートの裏だって問題ない。


しかし創作なんてのはそもそもが自己満足だ。
別に金になるからやってるわけじゃない。もしかすっと金になるかもしれないが、コスパとかなんだとか気にするほどに真剣に儲けなんて気にするならバイトに行った方がよほど儲かる。そうしないのは、物を作るとバイトするより満足できるからだ。
それならば好きなノートに好きなペンを使って書けばいい。何より重要なのは満足することだ。自己満足は素人の創作において何より優先する。
そんなわけでちょっと良いノートを買ってみた。


マルマンのニーモシネというノートで上の部分にタイトルと日付が書き込めるようになっていて、ページにはミシン目が入っていて一枚ずつ切り取れるようになっている。書き心地はさすがに良いけど、もうちょっと紙が分厚い方が好みかと思う。
同じマルマンならスケッチブックなんかでも良いかもしれない。

ちなみにボールペンはドクターグリップの白いやつ。
お気に入り。


まあなんかただの落書きでも良い物作ってる気になる。
満足である。



マルマン A4 ノート ニーモシネ 無地 N181 ブラック
マルマン(maruman)
売り上げランキング: 741

でも消耗品なのに高いよね。


ボールペンは中身入れ替えれば長いこと使えるし、うん。

2014年2月26日水曜日

スマホとつながるDECT方式の電話/Uniden 可憐

家の電話をUnidenの可憐という電話に変えた。


親機は土台部分だけで、受話器は全部DECT方式の子機になっている。
また売りのひとつとしてスマホとのBluetooth接続に対応している。
ハンドセットみたいにスマホの電話を受けたり、スマホ経由で電話をかけたりできる。
みたいにというかハンドセットとして使える。

我が家では複数のゲーム機やタブレットやスマホが無線LANに接続されている。
そのため自宅に掛けるとひどいノイズが乗り、時には肥が聞こえないこともあった。
DECT方式はそういう無線LANや電子レンジの周波数帯と干渉しない1.9GHzを利用しているのでノイズが乗らないとかなんとか。

で、本当にノイズがすっきり無くなった。
このノイズは家の電話側からは聞こえず、通話相手にのみ乗るものだったので、家から電話するときは、いつもノイズが入ってないか、相手には確かに聞こえているかと心配だったがそれがすっきりした。
また、DECT方式のためのなのかは不明だが音質もなかなか良い気がする。


Bluetooth接続、これもなかなか便利である。
これについて人に話したら、そんなもの何に使うのかと訝しがられたが、これはスマホを常に携帯している人には利点がよく分からない機能なのかもしれない。しかし私にとっては便利だった。
というのも、私は家に帰ればスマホは定位置に出して、次に出かけるまでそこにおきっぱなしにしている。それに常にマナーモードにしてある。そのため自宅でスマホにかかってきた電話になかなか気づけないのだ。
その点、Bluetoothで接続しておけば家の電話の方が鳴るのですぐに気づくことができる。
もっとも私に電話がかかってくることなどほとんど無いのだが、それでも不在着信があるとかけ直すべきか、またかかってくるのを待つべきか思い悩むので、取り逃さないという安心感があるのは良いと思う。
(かけ直したことなんてほとんど無いが)



余談。
こういう新しい技術を搭載した電話というのがもっと出ると良いなと思う。
たとえば電話機にサーバーを搭載して、API経由で発話・受話が出来ればいいのにとずっと思ってる。
音声と発信相手が取得できれば、あとは外部のシステム次第で検索を出来るようにすることが出来るし、電話での会話量なんてたかが知れてるのだからMP3にすれば十年分だって保存できるだろう。そうすればもう電話をしているときにメモを取る必要も無いし、あとから聞き漏らしなんかを確認することも出来る。
不在時に着信通知をtwitterに流すことも、複数のスマホのアプリで同時に受話することも、記録を取得する手段さえあれば何ら難しいことではない。
電話というのは常に電源と電話回線のそばに置くのでサーバーを動かしたり連携させるのにも便利だ。KickStarterとかで誰かが作ってくれないだろうか。

もっとも電話機は一時改造してみようと思ったが調べると違法だったので、法律の面から色々厳しいのかもしれない。だがインターホンならどうか。Webカメラなんかもかなり廉価で変える昨今である。自作のインターホンを作ってみるのも良いかもしれない。




この色だけ安かった。

2014年2月25日火曜日

Plunkerでゲームをつくってブログに貼るよ

できあがったゲーム


tiny艦隊clicker! これのために作った!(保存できません)

言いたいこと

コードのサンプルはPlunkerとか使って動かせる形にしたほうがわかりやすいし楽しい。

まえおき

前のAngularJSのエントリでPlunkerの埋め込みページを使った。
このページではPlunkerでゲームをざっくり書いて、それをこのブログに貼るまでを説明する。ちなみにゲームそのものの作り方とか内容には触れない。どうせクソゲーだね。

類似サービスの比較

PlunkerはHTML・JavaScript・CSSなんかをWebアプリ上で作成して、公開できるサービス。競合としてはJSFiddle、Plunker、CodePenとか。ざっくりと比較するとこんな感じ。

JSFiddle
Githubなんかでもバグ報告するとバグが再現するfiddleでくれとか言われるのを見かける。とにかく一番メジャー。
ただ、コード全部を単純に書くことが出来るわけじゃなくて、メニューからJavaScriptのロード位置を設定したり、読み込みライブラリも別途指定したりという感じで、最初は多少戸惑うかもしれない。慣れれば別にって程度ではある。

CodePen
見た目がかっこいいしさくっと動く。
コード全体を書けないのはJSFiddle譲りだけど、今風にJavaScriptにCoffeeScriptつかったりLiveScriptつかったり、CSSにSassとかScssとかLESSとか使ったり出来る。普通にこれが一番良いな! と思ったんだけど無料プランだと外部ライブラリが一個しか読めないとか書いてあって使ってない。使い方あるなら是非使いたい。
でも使ってる人はあんまり見たことない。

Plunker
二番手な感じながら、上の二つとは違って、普通のHTMLとかJavaScriptを書く感じで使えるサービス。つまり普通にファイル作ってそこにプログラムを分割できる。ので、そこそこのサイズのプログラムでも作れる。外部ライブラリ云々とかもHTMLから書けるので気にする必要は無い。というか新規作成時に有名なライブラリを一覧にしてくれて、クリックで挿入してくれたりするのが結構嬉しい。
あとエディタのテーマ変えられるのも良い。難点としてはなんか、実際の動作速度なのかデザイン上の問題なのか、なんとなくもっさりした印象があるところ(個人の感想です)。
こっちもPlunkerでくれとか言う人をわりあいと見かける。

というわけで、私はPlunkerを使う。

Plunkerの使い方

というほど詳細な話はしない。だいたいのことは触れば分かる。
Ctrl+Sを押せば保存もできるし、その履歴も残る。
自分が作ったPlunkじゃなければ保存は出来ないけどForkして自分のページに取り込んで編集することができる。左側がファイルとタイトル・概要、右側がプレビュー、外部ライブラリの検索とインポート(別に使わないでも取り込むことは可能)、右側の一番下が設定でエディタの色とハイライトのテーマとか、タブサイズとか、更新の間隔やオンオフを切り替えられる。
作ったものは冒頭の例のようにiframeでブログなどに埋め込み可能だ。

tiny艦隊Clickerについて


好きにForkして改変等してもらってOK。
ただ画像はAmazon S3上に置いてあるので、呼び出し量が増えてお金がかかるようになったりするとこっちの都合で消したり差し替えたりDropboxに置き直したりする可能性がある。そのためフォークしてどこかに公開するなら差し替えたほうが良いと思う(個人で改変したり実験したりする分にはそのまま使ってもらって全然OKです)。
あともしどっかに公開したりするときはこの記事にリンクしてくれると嬉しい。

てなわけで、コードを公開するときにPlunkerとか使って実際に動いていじれるようにしてくれると色々楽しいと思った。

2014年2月23日日曜日

悪夢のような80年代、Hotline Miami

Hotline Miamiをクリアした。
マスク・武器・パズルなど実績以外の要素をあつめて12時間くらいかかった。


Hotline Miamiは2012年に発売された見下ろし型のアクションゲームで、つい最近日本語のローカライズが追加されたので、Steamで$9.99で買った。他にもgogとかいくつかのサイトで販売中みたいで、もうちょい安く売ってるところもあるらしい。


見下ろしゲーというと有名所だとGTA1,2とかが思い浮かぶけど、このゲームはそれに輪をかけて残酷だ。でもこのゲームの面白かったところはゴア表現より、徐々に正気を失い悪夢のようになっていく世界観だ。主人公は誰かわからぬ覆面の三人組の夢を見て、自分が殺したはずの死体がなぜか行きつけのコンビニに転がっているところを見る。


毎回電話がかかってきては、うっすらとだけある日常のシーンから非日常の殺しに出かけて行くというところやステージごとにすべて違ったイカす音楽がかかるところはキラー7のようだし、80年代という舞台の中で主人公が荒唐無稽な陰謀に翻弄され飲み込まれていくのはフィリップ・K・ディックのようでもあり、とにかく自分の好きなど真ん中に来る作品だった。

またストーリーや演出もさることながら、アクションも大変に素晴らしい。
ステルス要素のあるアクションというと、うだうだ敵が行き過ぎるのを待ってミスったらやりなおしで鬱陶しいし正直好きじゃないのだけど、このゲームでは何よりも速度と立ち回りが要求される。敵は今にも敵が来るということを理解してピリピリしている感じの速度で撃ってくるし、たとえ真後ろでも一定距離に近づけば即座に振り向いてくる。後ろ向きだと、こちらに振り向いて撃ってくるまでに多少時間があるくらいのものだ。
そのため部屋に飛び込んだら、まず銃を持っている方を殴り、バットを持っている奴が振り向く前に殴り、倒れた二人に順番にトドメを刺すというような立ち回りを考えなくてはならない。
銃は強力だが、撃つと他の部屋の敵が駆けつけて来るし、何より銃だろうが打撃だろうが主人公は敵と同じく一撃で死ぬ。そんなわけで、ステルスにしろ強行突破にしろとにかく素早く的確に攻撃して、増援が来たらすぐさま部屋に逃げ込み、銃を持ち替え、考えるより早く判断していかないとならない。
難易度はそれなりに高いが、リプレイは押した瞬間に再開するので苦痛はない。敵のAIにはある程度クセがあるのでそれに慣れれば、多少無理な状況になっても切り抜けられるようになる。そうして上手くプレイできるようになると、自分が強い殺し屋になったかのような感覚を味わうことができる。

そんなわけで、もしこれをプレイしてた人が殺人で逮捕されたりすると確実に報道に乗ってしまうようなゲームではあるけど、今年中には2の発売も予定されているということなので、今後何か悪いことをする予定の無い人であれば、やってみてはいかがだろうか。
ちなみにレーティングは無いけど怖いものが苦手な人にはおすすめしない。



killer7【CEROレーティング「Z」】
カプコン (2005-06-09)
売り上げランキング: 12,175

Killer7!

スキャナー・ダークリー (ハヤカワ文庫SF)
フィリップ・K. ディック
早川書房
売り上げランキング: 33,912

ディック!

2014年2月21日金曜日

クソでいこう





いや本当に。
この霊夢の絵とかすげー良く描けたと思ってる。
あとこのユニティの絵も積極的に使っていきたい。

Unityはじめた講座

まえおき

Unityを使い始めてはや一月ちょい、りつとびとかflappy霊夢とか作った。
そいで多少はUnityにも慣れて、最初にこういうことがよく分からなかったなあ、ということをまとめてみた。メインは調べて出てくる記事で頻出する基本的な単語とかのざっくりした解説(ざっくりとしか理解してない)多め。共通する部分はあるけど、メインで2Dのゲームを作ろうとしているのでそっちよりの内容。まあ読まなくてもしばらくやってれば分かることだけど、軽くでも頭に入れておくと何かとはかどるんじゃないかと思う。

内容

ゲームオブジェクト
ゲーム上に表示されるもの。
Game Object > Create Emptyとかで箱みたいに使ったりする。
表示されてるものはなんでもゲームオブジェクトっぽい。
それ以外のものがあるのかは知らない。

プレファブ(Prefab)
オブジェクトのひな形みたいな感じのもの。
Scene上で作ったゲームオブジェクトをプロジェクトに戻すとプレファブになる。
で、プレファブをまた配置することができるんだけど、これは元のゲームオブジェクトとは違って、プレファブを修正すると一緒に修正される。これが何が嬉しいかってと、敵とか作って動きなんかを変えたときに、一個変えればすべて変わるってこと。
プレファブかどうかは置いた後に上の方見ると、Tagとかの行の下にPrefab用のボタンがあるので分かる。で、何か変更したあとにそこのApplyとか押すと変更が適用される。

タグ
ゲームオブジェクトにつけておいて、検索とかにつかう。

レイヤー
ゲームオブジェクトにつけておいて、階層を管理する。

ソーティングレイヤー
レイヤーと同じ感じなのだけど、こっちは2Dの重なり順の制御に使う。
上のレイヤーは処理上の階層としてまとめたりするけど、こっちはすべてに前後関係がある。

スクリプトについて
・コードエディタで保存しないとUnity側に反映されない(実行しても保存されない)。

・小文字で始まってるのがプロパティ名でそのゲームオブジェクトにあるほかのコンポーネント。つまりrigidbody2dだったらそのゲームオブジェクトの持ってるRigidbody2d。って書くとthisがgameObjectみたいだけどちがう。gameObjectはthis.gameObjectにある。回転とかサイズとかはgameObjectの持つプロパティなのでthis.gameObject.transformとかにある。

・規定の名前のメソッドを作るとそのイベントの発生時に呼ばれる。最初にあるStart(開始時に呼ばれる),Update(更新時(フレーム?)に呼ばれる)もイベント処理のはず。つまりOnCollisionEnter2Dってメソッドを書けば、2Dの衝突発生時に呼ばれる。ちなみにisTriggerを使う場合はOnTriggerEnter2D(ここ気づかないで悩んだ)。
他に、OnGUI(GUI.Buttonとか待ち受けるときに使う)とか、FixedUpdate(物理演算用の一定時間ごとのアップデート)とかある。エディタでメソッド名書くときに補完してほしいなと思う(あるのかもしれない)。

・スクリプトのパブリックプロパティで設定したものはGUI上から設定できるようになる。速度とか、敵の発生間隔とかはもちろん、発生させる敵そのものとかもGUIから設定させられる。
画像はflappy霊夢のスクリプト部分で、Pole(モアイです)の発生間隔とか、発生するPoleのプレファブを指定したり、スコア表示の体裁なんかを指定できるようにしてる。これでやると後から調整が楽だし、チームでやってるなら非プログラマにパラメータの調整を任したりできるかも。

スプライトについて
画像を取り込んで、Sprite ModeのSingleのところをMultipleにすると画像を切り分けできる。自動でも切れるし、手で設定もできる。私は適当に書いててゴミが混じってたりサイズがまちまちだったりして自動でうまく読み込めないので、手で幅を合わせてtrimで空白を削って取り込んでる。
ここで取り込んでも単純にバラの画像になるだけで、いきなりコマアニメになるわけではない。アニメを作るにはAnimatorとAnimationを設定する必要がある。

Animationについて
Animationはどのタイミングでスプライトを差し替えたり、回転させたり、当たり判定をつけたりするのかなど、アニメーションそのもののこと。FlashのタイムラインっぽいWindowでゲームオブジェクトの各コンポーネントの値を変えたりできる。
それで作ったAnimationをどういう条件で、どういうタイミングで表示するとかを決めるのがAnimator。

Animatorについて
上記のとおり、Animationをコントロールするためのコンポーネント。
ステート(状態)を作成して、それぞれにAnimationを設定して、状態の遷移(Transition)を書く。
遷移の条件はAnimatorそのものにintとかfloatとかboolとかの型でプロパティみたいなもんを作って、各状態間の遷移に○○がいくつ以上になったら、とか設定する。
flappy霊夢だと、霊夢の角度が変わるのは、上と真ん中と下のstateがあって加速度の範囲で遷移するようにしている。
そのプロパティはスクリプト側からセットする。
上の例のflappy霊夢だと加速度(velocity)をUpdate内で毎回セットしている。

その他
Game(プレビュー)をScene(編集画面)と一緒に表示したほうが便利

上のはWindow>Layoutsで2by3を選んで並べ替えたもの。
2Dゲーだとカメラ動かさなかったりするので、プレビュー見ながら作業が便利。
下の床どの辺に置くかとか、天井が見えないようにするとか。
デフォルトのままだと一緒に見えないので不便。
 
以上、また何か分かってきたらぽつぽつ書いていきます。

2014年2月19日水曜日

Unityで作ったFlappy BirdクローンをGoogle Playに公開した

結論

公開できた。

おはなし

もう何度も書いているけど、Flappy Birdのクローンの東方二次創作のゲームをUnityで作った。
Flappy Birdは500万/日稼ぐも作者がヤになって公開停止したゲームで、現在クローンが大量に公開されてる。で、それならば俺も公開して500万円欲しいので慌ててクローンゲームを作った。500万入ったらうちの息子大学に入れてやりますねん。まだ2歳だけど。

ご存知のとおりかどうか知らんけどUnityは出力先を自由に選べるので、Webプレーヤー向けで出力したのち、Android向けにビルドしなおした。いくつか設定をして解像度が変わったりしたけど(後述)、ほとんど問題なく出力できて、やっぱUnityすごーいって思った。
あと4年ぶり二回目のPlayストア(一回目のときはPlayストアって名前じゃなかったけど)登録だったので、あれこれ戸惑うことも多かった。っていうか、最初のことはあんまり覚えてないけど、IS01(メガネケース)を開発機にして作ったりしたので、まあずいぶん勝手も変わった。
この辺まとめて技術的なことは、後ろの方に書く。

何より心配だったのが登録を却下されないかということで、Flappy某というソフトは登録却下されるというのがニュースにも出ていた。

AppleおよびGoogle、「Flappy」の名前が入ったゲームの登録を停止中 | TechCrunch Japan

なのでまずふわふわ霊夢という名前にして登録したところ、ふわふわまりさという東方で題名丸かぶりで青空の中を横スクロールで移動するというアプリがあって、しかもちゃんとしたゲームらしく、何をどう考えてもこちらが悪質なパクりにしか見えず慌てて題名を変えた。もともとFlappy Birdのクローンなのに全く意図せず関係ないアプリのパクりゲーになりかけたので、今度からもっとちゃんと検索してから名前を決めようと思った。
というわけで名前はジャンピング霊夢になった。

Flappy Birdとの関連性がバレ疑われぬよう説明文には念には念を押す感じで関係性がないことを書き、名前を入れるだけで検索スパムと見なされるかもと思ったので非常に曖昧な書き方になった。またGoogle様に全力で媚びた方が登録されやすくなるかもという考えからアイコンも最近のAndroidのデザインに合わせたフラットデザインを採用した。
準備は万端であった。

万端過ぎてここで計算違いが生じた。

Flappy Birdは日本では特に人気になってないんじゃないかということだ。一日500万円というところと、それをあっさり捨てたというのがニュースになっているだけで、そんなに流行っているという話は聞かない。クッキークリッカーのときはみんながやっていたし、私もやっていたが、こっちはニュースを先に聞いている。また、やっている人をそんなに見かけたこともない。だから今更日本でクローンを作ったところで500万円は稼げないことは目に見えていた。そもそもクローンで1日500万も稼げるわけがない。500円稼げれば大成功である。

いやそんなことは分かっていた。分かっていて、これだけやって最後に登録却下になれば大変面白いんじゃないかと思っていたのだ。「Flappy Birdのクローン制作者、登録却下される!」みたいなことを誰かがブログに書いてくれて話題になれば面白いなと考えていた。世に言う炎上商法である。

結果は記事の最初に書いた通りである。
案外ふつうに登録できた。
これでは話のネタにもならない。
500万円は稼げなかったし、息子を大学に行かせるために私はあと数十年は働かねばなるまい。

で結局どうなの?

たぶん誰もやってない。

(以下、技術的なおはなし)

UnityのAndroid出力について

Unityでゲームを作ったら出力先はWindows PC、Mac、Web Player、Android、iPhoneなんかに出力できる。それぞれのプラットフォーム間では解像度が違ったりするので、かっちり作ってる場合は色々面倒なのだろうけど、ジャンピング霊夢の場合はごくいい加減に作ったものなので、余裕を持たせるために多少背景を大きめに描画したり、Replayボタンとかのフォントサイズを大きくするくらいだった。
あとビルドするときにAndroid SDKが必要になったけど、Android Studio入れてたのでそれにバンドルされたのを使った。そうじゃない場合は別途インストールしなきゃならないかも。

Android固有の設定としては、build settingから行える。
うろ覚えの記憶で適当にやってるのでちゃんと知りたい人は調べた方が良い。
設定したのは以下の項目(必須ではないものもあるかも)。

・Company Name(会社名。Idiot Toysにしたけど多分適当でも困らない)
・Product Name(製品名。アイコンの下の文字に表示されるので適当だと困る)
・Default Icon(アイコン。設定しないとUnityのアレになる)

Unityのアレ

Resolution and Presentation
・ Default Orientation(縦か横かみたいなの。Portrait:縦にした)

Other Settings
>Identification
・Bundle Identification
(自分のアプリのID。完全修飾名みたいなの。国名.作者名.ソフト名みたいな感じ)
(jp.Sakana.Freimuにした。これがPlayストアのURLのパラメータに入る。ので後から修正不可)
(最初間違えたので、アプリを公開停止にして再登録する羽目になった)
・Bundle Version(バージョン)
・Bundle Version Code(バージョンコード。Playストアに公開後APKを修正するときはココを変える)
(バージョンは変えないでも、ここさえ変えれば直せる。もちろんバージョンも変えても良い)
(軽微な修正だけならバージョン表記変えないでコードだけ変えるとかあるのかな?)

Publishing Settings
アプリ登録するには署名しないとダメなんだけど、ここで設定する。
まずKeystoreを作って、それからKeyを作る。
>Keystore
・Create New Key(チェックを入れてから、Browse KeyStoreでファイルを作る)
・Keystore password(Confirmも忘れずに入れる)
>Key
・Alias(Create New Keyを選ぶとダイアログが出るので適当に入れる。名前とか都市とか空欄でも一箇所だけあればOKらしい)
・Password(さっきのダイアログで決めたパスワードを入れる)

以上でBuildしてエラーとか出なかったらOKのはず。
Build & RunだとUSBでAndroid接続しておかないとダメだと思う。

Androidで追加したこと

admobに登録して広告表示するようにした。一行で追加できるプラグインをGithubで公開されている方がいたので、それをそのまんまお借りして使った。


あと、ホームキー、戻るキーとか押したときにアプリ終了するようにした。
ネット上で最初に見つけたのはKeyCode.Escape使えって記事なんだけど上手く動かなくて、HomeとかMenuも関係あるとか読んでとにかく全部突っ込んだ。本来はアプリを終了するか否かはOS側に任せて、メモリが足りなければバックグラウンドで落とされるとかそういうデザインなんじゃないかなぁと思うのだけど、これないと検証機に使ってるGalaxySではホームに戻るとそのままフリーズして死ぬことがある。たぶんメモリ不足とかなんじゃないかと思う。
ちなみにこれはこのゲーム固有の問題じゃ無くて、他にもUnityから出力した場合は全く同じ症状になるので、Unityのエンジンがメモリ食い過ぎなんじゃないかと思う。

Google Playへの登録

項目は適当に上から埋めていけばいい。スクリーンショット2枚以上と512x512のアイコンが必要になる。ので、Unityのアイコンは144x144サイズからだけど、512x512以上で描いておいたほうが良い。
スクリーンショットは音量下げ+電源の長押しとか、バック+ホームとかバージョンとか機械ごとにいろいろあるっぽい。どっかのバージョンから前者で統一されてるとかなんとか。で、そういうのでスクリーンショットを撮ってDropbox経由でPCに取り込んでアップロードした。
登録してから数時間程度で検索にひっかかるようになった。
また前述の通り、一度アプリを公開停止にして再度登録したが、そのときも公開停止にしてもしばらくはダウンロード可能なままになっていた。

というわけで

おしまい。今年はアプリで一日500万円稼ぐことを目標にします。
(本日までの記録0円)

2014年2月17日月曜日

Flappy Birdクローンのflappy霊夢をUnityでつくった

完成品

flappy霊夢 - ばかおもちゃゲームス

制作記

前エントリのとおりFlappy Birdのクローンを作った。
Flappy Birdクローンは以下の記事からあるリンクなんかでプレイできる。

Flappy Birdの狂乱は続く ― HTML5ウェブゲームも登場 | TechCrunch Japan

Unityでの制作にもやや慣れ始めたので、絵に二時間、ゲーム部分に三、四時間くらいで完成した。ちょっとしたコードだけでゲームができあがっていくのは本当に楽しい。また絵なんかも自分が描いたへちょいコマアニメが動いたりするのはちょっと感動する。

画像はサイズと表示の関係が今ひとつよく分からないので、とりあえずデカめに描いて圧縮して使った。この辺、きっちりやるために寸法と解像度の関係を理解すべきかもしれない。

オブジェクト間のメッセージの送受信にはNotificationCenterというサンプルがあったので、それを利用した。SendMessageだと送信相手を特定しなければならないけど、NotificationCenterだと特に考えずにアタリ判定があれば発行、動作が終わったら発行とか適当に作っておいて、あとから必要なように購読側を作れば良いので楽だった。

CSharpNotificationCenter - Unify Community Wiki

もっともプログラムがどうにもとっちらかるなという感じがすっきり解消されるってわけでもないので、どうにかすっきり作れる方法みたいなものが見つかると良いなと思う。

あと、スマホの解像度のこととかアイコンとかが出来たらAndroidのPlay Storeに出してみようかなと思ったのだけど、どうもFlappy云々というタイトルがRejectされているみたいでどうやら微妙らしい。

AppleおよびGoogle、「Flappy」の名前が入ったゲームの登録を停止中 | TechCrunch Japan

名前を変えたらOKなのか、ゲームがクローンなだけでアウトなのか、アウトならアウトで記事が書けるから、やっぱり一応登録してみようかなと思う。

追記:

登録した!
Unityで作ったFlappy BirdクローンをGoogle Playに公開した - ばかおもちゃ製作所

2014年2月16日日曜日

UnityでFlappy Birdのクローンを作りたい

このエントリの要旨


アートワーク


※書いていた絵をうっかり飛ばしたのでイメージ映像でお届けしています

2014年2月14日金曜日

cheero Power Plusのダンボーバージョン買った

モバイルバッテリー買った。ダンボーバージョン。


パッケージから既にかわいい。


右上のボタン押すと、電池残量が表示されて 充電が始まる。



2.1Aのも充電できる。


袋もついてる。質感はざらざらしてて良い感じ。


充電してるとこ。



スマホとかiPodとかたまに充電を忘れて不便なので買ったんだけど、そもそもモバイルバッテリーの充電を忘れそうな気もする。まあどっちも忘れるよりは可能性は減るんだろうけど、昨今じゃ充電しなきゃいけないものが多すぎて面倒くさい感じもある。
どうにかならんもんかね。


2014年2月9日日曜日

AngularUI Routerのつかいかた

まえおき

AngularUI RouterはAngularJSのルーティングモジュール。
AngularJSの標準のルーティング機能より高機能で、ページ内に複数のviewを持ったり、
階層化されたviewを利用することなどができる。
最終的なプロジェクトの目標はngRouteに取って代わって標準搭載されることだそうで、AngularJS本体も興味を示しているらしい(GitHubのwikiに書いてある)。
で、ちょこっと触ってみて、実際の使い方に触れた解説記事は少ないようなのでざっくり使い方を書く。

https://github.com/angular-ui/ui-router/wiki

ちなみに上記の公式のwikiを読めば分かることしか書いてない。

あとQiitaに抜粋版を書いたので、細かい説明が要らない人はたぶんそっちのがわかりやすい。

AngularJS - AngularUI Routerの使い方 - Qiita

サンプル


以下でやっていることをだいたい盛り込んだサンプルがこれ。
右側のメニューのCodeを押せば各ファイルが、Editを押せばPlunkerで編集できる。Plunkerでいろいろコードを変えてみたりして試してみるとわかりやすいかもしれない(知ってると思うけど、Plunkerで編集したりしても別にこっちのサンプルが壊れたりしないので安心していい)
いちいち対応させて説明することはしない。

つかいかた

モジュールなので、ダウンロードしたら普通のモジュールと同じように読み込む。
ちなみにAngularJS Ver1.2から標準のルーティング機能もモジュール化されてる。
なのでそっからの移行だと、ngRouteを読み込む部分をui.routerに書き換えればいい。

ngRouteとの対比で書いていくと、

$route -> $state
$routeParams -> $stateParams
$routeProvider -> $stateProvider
ng-view -> ui-view

のような感じで置き換える。
メソッド名は同じにしてあるところもあり、使いまわせるところもある。
たとえば$routeParamsなんかは、$stateParamsに置き換えるだけで使える。
ちなみに$locationProvider(html5Mode設定するやつ)はngRouteと関係ないので
そのまま。

$stateProvider

$stateProviderのstateメソッドでルーティングの設定をする。
ngRouteでの$routeProvider.whenを$stateProvider.stateに置き換える。
で、設定はぱっと見似たようなもんだけど、考え方はちょっと違う。

ngRouteはシンプルで、特定のURLに来たらアプリ全体で唯一のng-viewに対して、指定のテンプレートとコントローラを埋め込むというだけのものだ。設定するのはURLとテンプレートおよびコントローラーの対応関係になる。

それに対してui-routerはstate(状態)を設定する。stateがまず先にあり、そのstateに対応するURLを設定し、また、そのstateのとき、どのview(複数もあり得る)にテンプレートとコントローラーを当てるかという設定をする。
stateは階層を持ち、ドットで区切って指定をする。
つまりitemsというstateを設定して、items.detailというstateを設定すると、items.detailはitemsの子として作成される。子として作成されると、viewで設定するテンプレートを表示する位置が親の内側になったり、URLが親のURLに続く感じになる。もっともこれは何も指定しなければそうなるというだけで、設定次第で変更できる(後述)。

とにかく、ngRouteはURLを基準にして動作するが、ui-routerはstateが基準になる。
なので設定も以下のような感じになる。

$routeProvider(url,{設定}) → $stateProvider(state名,{設定})

たとえば/emp/12345みたいなURLがあり、empだけなら社員一覧、12345が渡されたら詳細というような設計なら、以下のようなコードになる。

ngRouteの場合
$routeProvider
    .when("/emp",{
        templateUrl:"list.html"
        ,controller:"ListCtrl"
    })
    .when("/emp/:empID"){
        templateUrl:"emp.html"
        ,controller:"EmpCtrl"
    };
ui-routeの場合
$stateProvider
    .state("emp",{
        url:"/emp"
        ,templateUrl:"list.html"
        ,controller:"ListCtrl"
    })
    .state("emp.detail",{
        url:"/:empID"
        ,templateUrl:"emp.html"
        ,controller:"EmpCtrl"
    });
という感じになる。
上でも書いてるがemp.detailはempの子なので、:empIDというUrlは、empのUrl(/emp)に続く。
つまり/emp/:empIDとなるので、ngRouteと同じURLになる。

もっとも、ngRouteの場合、すべてのテンプレートは常に単一のng-viewに表示されるが、ui-routerの場合この設定だとemp.htmlはlist.htmlの中のui-viewに表示される。
つまり一覧のリストのページの一部に詳細が表示されるような感じになる。
で、先に書いたとおり、ngRouteと同じように単一のviewに表示することもできる。
そのためには表示先のviewを指定すれば良い。そのためにはviewの名前の指定と、参照先のviewを絶対指定することが必要になるので、順に説明する。

viewの名前付け

表示先のviewは名前をつけることができ、これにより一度に複数指定したりできる。
<div ui-view="view1"></div>

<div ui-view="view2"></div>
上記のタグのviewを設定する場合、
.state("emp.detail"),{
    url:"/:empID"
    ,views:{
        view1:{
            templateUrl:"view1.html"
            ,controller:"View1Ctrl"
        }
        ,view2:{
            templateUrl:"view1.html"
            ,controller:"View1Ctrl"
        }
    }
}
のように設定する。viewsは保持するプロパティ名がviewの名前に対応する。
ちなみに最初のコードでは名前を指定していないが、それは以下の設定と同じだ。
.state("emp.detail"),{
    url:"/:empID"
    ,views:{
        "":{
            templateUrl:"emp.html"
            ,controller:"EmpCtrl"
        }
    }
}
これでも問題なく動作する。
ちなみにAngularJSの話からはやや脱線するがJavaScriptでプロパティ名に上記のような空文字やハイフン、アットマークなんかを使ったりするときは二重引用符(")で囲まないとエラーになる。
で、何でそんなことを書くかと言うと、viewsのプロパティでアットマークを使えば、表示対象のviewの位置を親と関係なく絶対指定することができるためだ。

viewの絶対・相対指定

画面遷移とURLの階層は常に対応するわけではない。
ファイラーとか常に階層化された画面構造ならともかく、一番上のサンプルと同じように社員の一覧から、社員の詳細を選び、その社員の投稿した画像一覧をほぼ画面全域に展開したい、なんてことがありうる。その場合、URL上は親子関係があっても、画像一覧の画面は親の表示位置を上書きすることになる。
(画像一覧ページが階層的に詳細の下に入る必要はないとかいうことはさておく)
(さておくけど、うまい設計なら良い感じに階層化できるのかもしれない)

ともかく、viewsのプロパティ名は単純に名前だけ指定すると、親の持つビュー名になる。
だがビュー名@ステート名のように書けば、直接表示対象のビューを指定できる。つまり絶対指定だ。
ちなみにビュー名@で終わる場合は、一番上位の階層のui-viewになる。
一番上位階層のビューが名前無しの場合、ただ"@"で指定することができる。
同じく、各ステートの名前無しビューは、"@ステート名"という形で指定する。
.state("emp.detail.picture"),{
    url:"/all"
    ,views:{
        "@emp":{
            templateUrl:"picture.html"
            ,controller:"PictureCtrl"
        }
    }
}
このコードだと、empの持つ名前無しのビューに表示される。
つまり現在emp.detailが表示されている位置が差し替えられる。

その他設定

設定側で書きたいことはだいたい書けたのであとは適当に列挙。
詳しくは公式のWikiを見てね。

  • 抽象(abstract)指定で親になるが指定はできないステートとか作れる。
  • urlは{id:[0-9]{5}}みたいに正規表現指定できる。
  • urlは^から始めると絶対指定で最上位から始められる。
    • これ移動時にstate指定するときの^(親のステート)と同文字で意味が違ってわかりにくい気がする。

ルートの利用

今まで設定したルートを利用する場合、つまりアンカータグ(a)なんか移動するときは、ui-srefディレクティブを使う。
もちろん#/hogeみたいにhrefとかng-hrefに書いても正しく動作するんだけど、
それだとhtml5Modeを切り替えたりURLの構造を変えた時に全部書きなおすことになる。
ui-srefはステートとパラメータを渡しておけば、あとのURL構造の変更とかhtml5Modeへの対応なんかは勝手にやってくれる。

使い方はこんな感じ。
<a href="#/emp/hoge/1234" .. → <a ui-sref=".hoge({id:empID})"...>
これも相対パスと絶対パスがあって、この例だと現在のstate直下のhogeというstateに移動する。ドットが頭に付くと相対パスで、ドットが無ければ絶対パスで、^から始まると親のステートとか、そんな感じ。詳しくはWikiを参照のこと。
引数で渡すオブジェクトのプロパティ名は当然設定したときにurlが受け取るパラメータ名と一致していないとならない。

ui-sref-activeにそのステートがアクティブなときに付けたいクラスを指定すると、上のサンプルみたいにbootstrapのactiveなんかを簡単に利用できるので何かと楽。ng-classと違って、普通のclass指定とも共存するので便利。

ちなみにコード上から移動するときは$state.go()を利用する。

以上、そんな感じ。

2014年2月3日月曜日

アルミの弁当箱の記憶

アルミ弁当箱小判型・L
アルミ弁当箱小判型・L
posted with amazlet at 14.02.02
大一アルミニウム
売り上げランキング: 8,677

Amazonでアルミの弁当箱を見ていて、なかなか可愛いもんだなと思った。
私が子供のころうちにあったアルミの弁当箱って四角くて何かしらのキャラクターが描いてあったような気がする。私は次男坊なので、お下がりで塗装がはげていて何が書いてあるかはよく分からなかったけど、自分の知らない何代か前の戦隊だった気がする。

まだ幼稚園に入る前、兄が小学校の遠足でお弁当を持っていく日があった。
私がねだったか、駄々をこねたかで、母は私にもお弁当を作ってくれた。
弁当箱に入っていたのがおにぎりだったか、海苔巻きだったがはっきりしないがとにかく嬉しかった。その頃は公団の団地住まいで、狭い家だったけど、部屋と部屋の間をぐるぐる回り、和室と洋室の敷居に腰掛けてお弁当を開いた。自分も遠足でどこかに行ったような気持ちになったのを覚えている。

あたたかい春になったら、お弁当を作ってどこかの公園に子供を連れて行くのも良いな。
すくすく大きくなっていく子供を見ると、その向こうに幼い自分が立っている気がする。

2014年2月2日日曜日

MyPaintで艦これの島風描いた

MyPaintで島風を描いた。

MyPaint

MyPaintはオープンソースのお絵かきツールで、Linux、Windows、Macで利用できる。
上の絵は下絵だけsaiで適当に描いていて、その後MyPaintで描いた。
ペインターみたいに色々な種類の筆があって、なかなか書き味も良い。無料で利用出来るソフトなので、細かい設定が何もかも出来るとかいうものではないけど、とにかくストレス無くお絵かきを出来るように調整してある感じ。

たとえば筆のサイズを変えたり色を拾ったり、クリアしたりみたいなことよく使うキーは全部ワンキーのショートカットにしてあったり、画面を開いた瞬間にサイズ指定の無いキャンバスがどーんと広がっていたり(描いた部分のサイズになる)、お絵かきツールを使っていて自分が面倒くさいなあと思うことが良い感じに省いてある。

ツールを開いて、あとは筆を選んで描くことだけ出来れば良いのにと思う人にお勧めのソフトだと思う。逆にレイヤーとかチャンネルとかエフェクトなんかを多用して使いこなすような人には向かないかも知れない。