でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

2014年01月

今日から始める「脱・やるやる詐欺」

tumblr_mqlmjcsuvl1sckns5o1_500

今日もコード書いとる??

  • 明日からダイエットする!!
  • プログラミングできるようになる!!
  • 英会話をマスターする!!
目標を立てて実行する。とても素晴らしい。みんなもきっと目標を立てて邁進していると思う。

でもこの3つ、どれにも共通の死亡フラグが立ってる…というか目標を達成するのが絶望的というのを知ったらきっと本人はがっかりすると思う。

それは

クリア条件が決まっていない


友人オススメのゲームを始めてみたんだけど、特に指示もないし敵っぽいのがやって来るわけでもなし。チュートリアルが始まる気配もない… え??オレどーしたらいいの??

みたいな。

  • ダイエットするのは結構。で、「何キロ減らすの??」
  • プログラミング結構。で、「何か作るの??」
  • 英会話結構。で、「マスターの定義は?? 髪の色が変わるとか??」
何かやろうとして、結果何もできなかった人たち共通の課題はこの「クリア条件の設定ミス」にあると思う。

これはもう何度もクリア条件を設定する練習を積まないと身に付かない。ので、身に覚えのある人はこういう風に考えてみて欲しい。
  • ダイエットするなら、その期間と目標体重を決める
  • プログラミングできるようになりたいなら、その期間と作るものを決める
  • 英会話をマスターしたいなら、その期間と、「人前で英語でプレゼンする」などの具体的目標を決める
ここで詰まる場合はまだ考えが不十分な証拠。いい機会なのでビシッと決めてみよう。

重要なのは「初心者なので失敗して当たり前。失敗したらまた具体的な目標を立てて挑戦する」という心構え。

これまでできていなかった事がいきなりできるようになる訳が無い。達成するまでに三回くらい失敗するくらいの余裕があると続けられる。


何かと「よし、やろう!!」って始めてみるけど続かない…という人。「このゲームのクリア条件って何だったっけ??」と考えてみて欲しい。


ではまた次回。

iOSでlibpngを使ってる人には朗報。NEON最適化

hero_iphone4-5_wide
今日もコード書いてる??

拙者はPNG画像を扱うのにlibpngを使っています。libpng使ってる人多いよね。OSXでもiOSでもWindowsでも同じコードで動くのだいじ。

んで先日1.6.8がリリースされとったのでいつも通りビルドしてiOSのプロジェクトにコピーして確認ついでにビルド。

photo1

…あれ?? リンクエラー…

まさかと思ってプロジェクトにファイルを2つ追加。

photo2

arm/arm_init.c
arm/filter_neon_intrinsics.c


おおおお!!!!! ビルド通った!!!!!!!!

ちょっと前のバージョンだとclangでビルドできなかったNEON最適化コードがビルドできとる!!!!

ざっくりと処理時間を計測してみたところ、処理時間が10%ほど短くなっている。素晴らしい。

あと試しに

cmake -G Xcode

してみたらちゃんとXcodeのプロジェクトが生成された。これまた素晴らしい。


ではまた次回。

個人で電子書籍のKindle版とiBooks版を配信してみて気づいた事

title

今日もコード書いとる??

拙著「iPhoneアプリ『ういろう』のレシピ」iBooks版も無事リリースされました。もちろんソースコードつき(笑)

Appleに申請したのが昨12月28日。んで、審査が完了したのが11日。年末年始を挟んでいるので、まあこんな感じでしょうな。
 
写真 2014-01-14 13 08 23

Kindle版は未確認ですが、iBooks版には全てのページを途切れず延々とスクロール表示するモードがあります。これがあるお陰で、ソースコードが途中で分断されません。技術書にとても向いている表示モードだと思うのですがどうなのでしょうかね。


さてこれまで2冊、電子書籍を出版しました。そこで、自分が感じたKindle版とiBooks版の違いについて、簡単にまとめておきます。

Kindle版
  • 申請からわずか二時間で配信開始。とにかく早い。
  • ユーザーにはメールを介して拙書を「おすすめ」として紹介してくれる。
  • OSX版プレビューワが激重で、チェック作業がしんどい。
  • epubのレイアウトが思った通りにならない。拙書の場合は画像の右端が切れてしまっている。
iBooks版
  • 申請から約一週間程度で配信開始。Kindle版とくらべるとやや遅く感じる。
  • 自分で宣伝広告を行わないと、ほぼiBooksユーザーに伝わらない
  • OSX版iBooksでのプレビュー作業が快適。
  • epubビュワーの表現力はよい。思った通りのレイアウトになった。
個人で細々と電子書籍を配信している身としてアマゾンの「オススメ」は強力。お陰で今後もKindle版とiBooks版の両方でリリースし続けていけばよいのかどうかが微妙。個人的にはiBooksでのレイアウトとスクロール機能が気に入っているだけに悩ましい。まだしばらくは両対応で進めてみましょうかね。


ではまた次回。

超簡単OpenGL環境「GLFW3」がすごい。

30
今日もコード書いとる??

拙iPhoneアプリ『ういろう』の諸々が一段落したので新作アプリに取り掛かるぜー!!と思ってネットをウロウロしたとたん、libpng1.6.8がリリースされとるわ、Emacs24.3 hackers-only patch 4.6がリリースされとるわ、GLFW3.0.4がリリースされとるわで、新年早々新春ビルド祭り開催決定!!みたいな年始だった。きっと拙者は2014年もビルドに明け暮れる事になるとのお達しなのでございましょう。

さてそのGLFWの新しいバージョン「GLFW3」なのですがこれがたいへん素晴らしい。拙者はOSXやWindowsでのタッチ処理の実装を待っているつもりだったのだが、これはC++使いを自負してるプログラマならいち早く体験しないと損するね。プログラマ人生における重大な損失といっても過言ではなかろう(おおげさ)

という訳でさっそくサンプルを書いてGitHubに上げておきましたのでお暇な方はチェックしてみてちょーだい。

~~以下、ダラダラと解説が続く~~
 
WindowsでもOSXでも同じコードで動作するOpenGL環境が手軽に作れるGLFW。GLFW2の頃から抜群の手軽さだったのですが、ひとつだけC++的に困った事があった。
  • GLFWのコールバックにクラスのメンバ関数を指定するのが困難
自分もこれができなくて、泣く泣くアプリ本体のインスタンスはこんな感じにしていた。

class App {
public: void createCharaInfo(const int key, const int state) { // Do something.. } }; App* app; void GLFWCALL createCharaInfo(const int key, const int state) { // クラスのメンバ関数をGLFWのコールバックに設定できないための措置 app->createCharaInfo(key, state); } int main() { app = new App(); // GLFWにキー入力のコールバックを指定 glfwSetCharCallback(charaCallback); while(app->isActive()) { app->update(); } delete app; }

つらぽよ…

ところがGLFW3ではなんとポインタを一個、覚えてくれるようになった。ポインタさえあればもうコッチのもの。これでようやくクラスのメンバ関数を簡単に呼び出せるようになった。素晴らしい!!

追記:cpp_akiraさんが素晴らしいサンプルを提示してくれました!! 多謝。 

class App {
  GLFWWindow* window_;
int a_; public: App() { // Do something..

// GLFWのウインドウを生成
window_ = glfwCreateWindow(640, 480, "App Window", nullptr, nullptr);
// GLFWのハンドルに自分自身を登録 glfwSetWindowUserPointer(window_, this); // コールバックとして静的メンバ関数を登録 glfwSetCharCallback(window_, createCharaInfo); } static void createCharaInfo(GLFWwindow* window, const u_int chara) { // ポインタからクラスのインスタンスを取り出せる!! App* app = static_cast<App*>(glfwGetWindowUserPointer(window)); // privateなメンバにもアクセス可 app->a_ = 0; } }; int main() { // アプリのインスタンスをローカル変数にできる App app; while(app.isActive()) { app.update(); } }

ついに念願の実装が我が手に。こう書きたかったのよ。こう。


スッキリ書けるという事は正義。もし今のコードを「なんかスッキリ書けないんだよなぁ…」と思いながら書いているとしたら、「じゃあスッキリ書けてるってどーゆ書き方だ??」って考えてみるといいかもしんない。

ではまた次回!! 

OSXのQuickLookを自作したい人のためのメモ

photo01

今日もコード書いてる??

OSXのQuickLook。FinderでSpaceキーを押すだけでざっくりファイルの詳細がわかるQuickLookが便利過ぎ。テキストでも画像でも音声でもモデルデータでも対応してればなんでも見られる。

んで、そのQuickLookって自作できるんだね!!自分で作れる事を知ってプチブームです。でした。

GitHubで公開中⇒tek-nishi/QLOgg 

という訳で、以下QuickLookプラグインを自作する為のメモ書き。


実はQuickLookプラグインの雛形はXcodeに入っています。

photo02
File→New→Projectと操作して表示される雛形から選ぶだけでよい。

photo03
  • GeneratePreviewForURL.c
    QuickLook時に独自のプレビューを生成する
    関数GeneratePreviewForURLにて実装
  • GenerateThumbnailForURL.c
    ファイルを選んだ時に独自サムネイルを生成する
    関数GenerateThumbnailForURLにて実装 
主に触るのはこの2つ。Objective-Cで書きたい人は拡張子を.c→.mにしておく。

photo04
続いて、対象ファイルを決める。雛形のinfo.plistの、SUPPORTED_UTI_TYPEと書いてある場所に、QuickLook対象のUTIを書き込む。

UTIはOSXのファイルの種類を決定する識別子。これはコンソールで

mdls hoge.txt 

として表示されるhoge.txt(実在するファイルである事!!)の情報の中の
kMDItemContentTypeと、kMDItemContentTypeTreeがUTIを指していると思われる。

といっても、大抵の場合はファイルの拡張子で事足りる。その場合は以下のようにinfo.plistに書く。

photo06
まず、一番上の階層にImported Type UTIsを追加。必須項目も一緒に追加されるので、Conforms to UTIsに(たぶん)システムで定義済みのUTIを書く。public.textとかpublic.imageとか、プレビューしたい書類のおおまかな分類を決める。 ⇒システム定義のUTI

続いてIdentifierに、他と被りそうにない識別子を書く。

Equivalent Typesにpublic.filename-extensionを追加。対応したいファイルの拡張子を書く(Arrayなので複数対応も可)。

最後に、Descriptionを追加してファイルの簡単な説明を追加。

photo05
それができたら、はじめに説明したSUPPORTED_UTI_TYPEをIdentifierで決めた識別子に置き換えて完了!!


続いて、テスト環境の設定。

QuickLookプラグインは直接起動できないので、ビルド時に所定のフォルダにコピーする必要がある。
 
photo07
TARGETSの対象ターゲット→Build Phasesと操作。

photo08
続いてEditor→Add Build Phase→Add Copy Files Build Phaseと操作してコピーフェーズを追加。

photo09
DistinationをAbsolute Pathに変更。
Pathは ~/Library/QuickLook と入力(ディレクトリが存在しない場合は作っておく)
※OSXを使う全ユーザーを対象にしたいなら、ここは /Library/QuickLook にする。
最後に「+」を押して、コピーするファイル(今回はQuickLookプラグイン)を追加。

photo10
Schemeにテスト実行の手順を追加。
 
photo11
Run→Run→Infoと操作。

photo12
Executableに /usr/bin/qlmanageを追加。これはあらかじめFinderで/usr/binを表示しておき、そのフォルダをドラッグアンドドロップすると楽。

photo13
Argumentsタブ、Arguments Passed On Launchに-p hoge.txtと入力。hoge.txtはQuickLook対象ファイル。パスが通っていないとプレビューできないので~/Documents/hoge.txtなどと書く事。

サムネイルの動作チェックの場合はArguments Passed On Launchに-t hoge.txtと書く。

その他のqlmanageの動作は、コンソールで

qlmanage -h

として確認できる。

photo14
試しにこんな感じにプログラムを書いてビルド→実行してみて、コンソールにNSLogの結果が表示されたらオッケィ!!

ビルドされたQuickLookプラグインは~/Library/QuickLookにコピーされ、qlmanage経由で起動される仕組みになっている。

実装の詳細については以下の情報を参照すべし。プログラミングにも近道は無い!!

オマケ

Finderのファイルアイコンもいい感じにサムネイル内容にしたい場合。
photo1
plistで定義されているQuick Look thumbnail minimum sizeの値を小さくしておけば、Finderでいい感じに表示される…かも。
photo2
こんなかんじにね。


ではまた次回。

OSX 10.9 Marvericks でなんとかogg vorbisをQuickLookする

Mac-OS-X-Mavericks-Logo

今年もコード書いてる??

OSX 10.9 Marvericks は軒並みQuickTimeプラグイン経由のQuickLookが動きません…。

この仕様変更にオロローンと泣いてる人は多いと思います。

主にオレが!!!!!!!

という訳で、ogg vorbis形式をQuickLookするプラグインを作ってGithubに上げたった!!
動作が微妙にアレなのでXcodeでビルドできる人限定。

28

buildスキーム内、Run qlimageの引数を、ダウンロードしたプロジェクトのパスにあわせて変更すること。じゃないと動作確認時にえらい事になるからね。
 

33

かなり無茶な実装方法なので動作が安定しません。いい感じに音声プレビューできる方法をご存知な方に実装方法を聞いてみたいです。

そして今年も宜しくお願いします2014!! 


ではまた次回。
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ