コード書いとる?
ゲーム内の挙動を一部スクリプトに引き受けてもらい、アプリの再ビルド無しに挙動を変える...
過去に仕事ではいくつか経験があるんだけど、自分のアプリではまったく無い!
というわけで、最近覚えたJavaScriptの組み込み環境がないか調べてみました。あったら拙作でぜひ使いたい...!!
結果としてはめっちゃ大アリ!だったので以下そのメモ書き。
JavaScriptの組み込み環境として、QuickJSというものがあり、これがモジュール・非同期ジェネレータ・プロキシ・BigIntを含めた ES2020 仕様に対応している...!! 強い!
で、これをmacOS、iOS、Windows環境でビルドして自分のアプリで使うには、スタティックライブラリをビルドするプロジェクトを作って、以下のファイルをビルドします。
cutils.c libbf.c libregexp.c libunicode.c quickjs-libc.c quickjs.c
ビルド時にプリプロセッサに CONFIG_VERSION=\"2020-04-12\" を定義する必要があります(バージョン番号をプリプロセッサでソースに埋め込んでいる)
BigIntを使いたい場合はプリプロセッサに CONFIG_BIGNUM を定義します。おそらくこれでビルドが完了して、ライブラリ ファイルが出来上がるんじゃないでしょうか。
アプリで使う場合は quickjs.h をインクルードして、ビルドして出来上がった.aとかをリンクすればOK。
で! まあ後は導入解説ページを見つつ動作を確認してけばいいんですが、拙者的に結構動作検証が高かったのが yield です。
LuaとかSquirrelで有り難い機能のひとつが yield を使ってスクリプトの処理を一旦止めてアプリ側に処理を戻せることだと思っているので、JavaScriptでも似たようなことができないかしら...と。調べてみたら最近のJavaScriptに追加されていました。 QuickJSでも使えるっぽい。
JavaScriptはこんな感じに書いた。
function* test(x, y) { yield 1; yield 2; return x + y; } var it = test(5, 2); function update() { return it.next().value; }
アプリ側はC++でこんな感じに書いた。
実行結果はこうなった。
やったね!yield 使えました。フハハハ!
ではまた次回。
Bullet Physics + Cinder 続いてます。
Bulletは事あるごとに16バイトのメモリーアライメントを要求してくるのが少々困り物だったのですが、よくよく調べてみたらC++11以降、特にC++17ならあっさりと解決できる事がわかったのでメモ書き。
alignas(C++11)
alignas(16) btVector3 v; // OK struct alignas(16) Hoge{}; Hoge a; // OK!! struct Fuga { alignas(16) btVector3 v; }; Fuga b; // OK!!!! これも賢く16バイト境界に配置された
C++17ならnewにもこのルールが適用されます
struct alignas(16) Hoge{}; auto* a = new Hoge{}; // OK struct Fuga { alignas(8) float a; alignas(16) int b; }; auto* b = Fuga{}; // OK!!!! これも賢く16バイト境界に配置された
さらにnewする時に指定するのも用意されている!ありがたや...
float* q = new (std::align_val_t{16}) float; // new演算子に直接アライメント指定することもできる
参照リンク(cpprefjp)
メモリアライメントを標準でサポートしてくれるのはマジでありがたい...!!
スッキリ!
Emacs 27.1が待ち遠しい拙者です(この記事を書いている時点で27.0.91)
ところでEmacs26.3でC++のコードを書いていると目に見えて処理速度の低下が... キー入力の応答性も下がりストレスだけが上がる...!!
こりゃ堪忍ならんと調べてみたら、同じ状況に遭遇している人を発見!
この問題、Emacs26.1の頃からあったのか... 公式でも言及していますね。
というわけでこの記事に倣って設定を変更!
Emacsのカスタマイズ機能を使い font-lock-maximum-decoration の値を書き換えてEmacsを再起動!
スッキリ!
Bullet Physics + Cinder続けてます。
プロトタイプ版を作ってて気づいたんですが、以下の実装が終了時にハングアウトする...
生のポインタを扱うのを嫌った結果不具合を呼び込んでしまうのか... C++よ!(不条理)
struct Physics { Physics() { // ワールド生成 world = std::make_unique<btDiscreteDynamicsWorld>(/* 引数色々 */); // 剛体生成 rigid_body = std::make_shared<btRigidBody>(/* 引数色々 */); // ワールドに登録 world->addRigidBody(rigid_body_.get()); }
~Physics() = default; std::unique_ptr<btDiscreteDynamicsWorld> world; std::shared_ptr<btRigidBody> rigid_body; };
これしばらく悩みましたが、実装を読んでみたら world_ を破棄する時に内部で確保したメモリを色々とdeleteしている...
それには...btRigidBody内のメンバ変数も含まれている...。Oh!!
つまり、先にbtRigodBodyをdeleteしてはいけない...それめっちゃ重要やん!
なので、インスタンスのデストラクトをコンパイラ任せにする場合は、こんな感じで実装する必要がありそうです。
struct Physics { Physics() { // ワールド生成 world = std::make_unique<btDiscreteDynamicsWorld>(/* 引数色々 */); // 剛体生成 rigid_body = std::make_shared<btRigidBody>(/* 引数色々 */); // ワールドに登録 world->addRigidBody(rigid_body_.get()); }
~Physics() = default; std::shared_ptr<btRigidBody> rigid_body; // 先にworld_が破棄されるように仕向ける std::unique_ptr<btDiscreteDynamicsWorld> world; };
とりあえずこれで収まったという認識ですが、皆さんはどうお考えでしょうか。
もんやり...
コード書いとる?
ふとしたきっかけでミスタードーナツのマグカップが欲しくなった...
お店のあのシンプルで飽きのこないマグカップ...
Bullet Physics + Cinder 続いてます。
ゲーム的には2つの剛体が衝突した瞬間を捉えるコールバックが欲しくなりますが、Bulletでは一捻りして実装する必要があるっぽいです。
このサイトに詳しい例が書いてあって助かりました。英語と言う名の日本語でしょうか...
以下拙者の実装例。
btDiscreteDynamicsWorld* world; auto* dispatcher = world->getDispatcher(); int num = dispatcher->getNumManifolds(); for (int i = 0; i < num; ++i) { const btPersistentManifold* contactManifold = dispatcher->getManifoldByIndexInternal(i); // 衝突物体 const btCollisionObject* obA = contactManifold->getBody0(); const btCollisionObject* obB = contactManifold->getBody1(); int num_contacts = contactManifold->getNumContacts(); for (int j = 0; j < num_contacts; ++j) { // 衝突点の情報を取得 const btManifoldPoint& pt = contactManifold->getContactPoint(j); if (pt.getDistance() < 0.f) { // 実際に衝突した auto normal = pt.m_normalWorldOnB; auto impulse = pt.getAppliedImpulse(); // 何かしら処理 } } }
まあ大体こんな感じの処理ですかね! Bullet内部で別の試みも見受けられますが、まだ実装途中かな...という印象です(btPersistentManifold.cpp に、いくつかのUndocumentedなコールバックが用意されている)
今回はC++17を積極的に取り入れてまして、色々発見があって楽しいです。
int array[] = { 1, 2, 3, 4, 5 }; // 配列の要素数 auto array_size = std::size(array); std::map<int, std::string> container{ { 1, "Hoge" }, { 2, "Fuga" }, { 3, "Piyo" }, }; // if文で少し無茶ができる if (auto it = container.find(2); it != std::end(container)) { std::cout << it->second << "\n"; }
ではまた次回!
コード書いとる?
org-modeのagenda view最高に便利ですよね!
所定のorgファイルからTODOリストを抽出したり、週ごとの予定にしてくれたり!
便利なので、拙プロジェクトでTODOリスト作って、これのagenda viewを...その機能は無いんかい!
org-agenda-files に登録するのは微妙ですな...
org-agenda-files に登録するのは微妙ですな...
とずっこけていたら、さすがネットの世界。やり方を見つけました!
ありがたや。
(defun org-todo-list-current-file (&optional arg) "Like `org-todo-list', but using only the current buffer's file." (interactive "P") (let ((org-agenda-files (list (buffer-file-name (current-buffer))))) (if (null (car org-agenda-files)) (error "%s is not visiting a file" (buffer-name (current-buffer))) (org-todo-list arg))))
拙者はspacemacs使いなので、キーバインドはこんな感じに定義。
(with-eval-after-load 'org (spacemacs/set-leader-keys-for-major-mode 'org-mode "v" 'org-todo-list-current-file))
これで、カレントバッファのagenda viewが生成されるようになりました!
DONEを自動的に除外してくれるのが良いのだ。
スッキリ!
ではまた次回。
Bullet Phisycs + Cinder 0.9.2 順調です。
無事手持ちのiPadでも動作しました!
で、毎回毎回忘れてるんですが、iPadの縦横画面両対応にする方法!
今回もバッチリ忘れていたので自分向けのメモとして残しておきます...
まず、Cinder側での対応
getSignalSupportedOrientations().connect([]() { return ci::app::InterfaceOrientation::All; });
実機の向きが変わった時のコールバックで「全部対応」と宣言します。
続いてXcodeのターゲット内Deployment Infoの設定で... ポチポチと...
で、うまく動作しないw
これ、iPhoneでのみ有効な設定なんですね。多分。
iPadの設定は、Custom iOS Target Propaties でやります。
Supported interface orientation (iPad) っていうプロパティです。これに値を手動で追加する必要があります。多分。
対応する画面の向きを追加!
これでようやくiPadも縦横画面両対応になりました!
スッキリ!
Bullet Physicsを再び使い始めています。
最初の印象は「ポインタ多っ!!!」だったのですが(Bullet Physicsはメモリ管理を行わないスタイル)、C++11以降ならスマートポインタがあるので慣れてきました。まだそんなにハードに使ってませんが。
そんな状況で2つほど発見があったのでメモ。
物理演算の計算の前に何かしらbiRigidBodyに対して計算したい場合は、setInternalTickCallbackでコールバックを設定する方法を使うのですが、これC++11以降のラムダ式使えるのね。
btDiscreteDynamicsWorld* world; Hoge* hoge; world->setInternalTickCallback([](auto* world, auto timeStep) { // 渡したポインタを取り出す auto* hoge = static_cast<Hoge*>(world->getWorldUserInfo()); }, hoge, // 何かしらポインタを渡せる true); // 内部計算の前or後にコールバックを呼ぶ(true: 前)
さすがにキャプチャは使えませんでしたが、別の場所に関数を作るのがめんどい怠惰な拙者にとってはありがたい。C++14なら引数も推論してくれてさらにありがたい。
あと、btRigidBodyを継承したクラスを作る必要があって、その場合にbtRigidBodyのコンストラクタをどうやって引き継げば...と思ってたら、C++11には継承コンストラクタがあったじゃないですか!(これまでコツコツ追加していた)
struct RigidBody : public btRigidBody { // 継承元のコンストラクタを引き継ぐ using btRigidBody::btRigidBody; ~RigidBody() = default; // 以下独自の定義 };
スッキリ!!
ではまた次回!
で、あまり使わないライブラリを抜いた状態でビルドしたのに、公式ドキュメントにあるサンプルのプロジェクトを同梱したのを Cinder0.9.2スターターキット として置いておきます。約340MB。
・Windows(VisualStudio2017)、macOS、iOS(Xcode11)で利用可能です。
・glm 0.9.9.8
・boost 1.72.0
・C++17
・オフラインドキュメント
毎回プロジェクトをセットアップして、それを忘れちゃってるからね。未来への自分に向けた配布です。
そしてしばらくぶりにCinderに触ってみてわけわからん。すっかり忘れてもーた...
ではまた次回!
C++でベクトルと行列を扱うのにglmというライブラリを使っています。
この記事を書いている時点での最新バージョンは0.9.9.8。バージョン刻んできてますね。という印象。
今回は2次元ベクトルの外積が無いと思い込んでいた話です。
glmでは3次元のベクトル同士の外積の計算は以下のように書きます。
#include <glm/glm.hpp> int main() { glm::vec3 v1{ 1.0f, 0.0f, 0.0f }; glm::vec3 v2{ 0.0f, 1.0f, 0.0f }; auto cross = glm::cross(v1, v2); }
で、2次元のもあるかな、と思って試してみると、
#include <glm/glm.hpp> int main() { glm::vec2 v1{ 1.0f, 0.0f }; glm::vec2 v2{ 0.0f, 1.0f }; auto cross = glm::cross(v1, v2); // コンパイルエラー }
ダメなんですよねこれが...なので自作する訳です。
と思っていたのですが、ふと過去のリリースノートを読み返していたら、ありました、ありました!
0.9.9.0 で追加されてるじゃん!2年前じゃん!
Added GTX_exterior_product with a vec2 cross implementation #621
って書いてあるので、glm/gtx/exterior_product.hpp をインクルードすればいい訳だな?と解釈。
#include <glm/glm.hpp> #include <glm/gtx/exterior_product.hpp> // ←追加 int main() { glm::vec2 v1{ 1.0f, 0.0f }; glm::vec2 v2{ 0.0f, 1.0f }; auto cross = glm::cross(v1, v2); }
おおー!できたできた!!ビルド通った!
glm入門はこちらのページを激しくオススメ!
ではまた次回!
今回の内容はVisualStudio2019でC++のコードを書いている人向けです。
一見何でもないこのコードがVisualStudio2019だとビルドエラーになるらしい。
#include <sstream> int main() { std::ostringstream s; s << u8"Hoge"; }
えっ・・・何で?
まずWandboxで試してみるも問題なし。
手元の環境でVisualStudio2019でプロジェクトを作って試してみるも、やっぱり問題なし。
先輩「あ!コンパイラの言語設定をC++20にしてたかも!」
はい、ビルドエラーになりました。
C++20ではUTF-8の文字コードを扱えるようにとchar8_tが導入予定ですが、C++標準ライブラリの対応がまだ間に合っていないだけだったという訳でした。
みんなも業務でプレビュー版を使うのは遠慮した方がいいかもね...
新らしい機能が盛り込まれててワクワクするけどさ...まだプレビューなんだからさ...
ではまた次回!
JSON for Modern C++ を紹介するよ!
ブログに書いた書いたと思い込んでてまったく触れてなかった...
このJSON読み書きライブラリは他のライブラリに依存しておらず、json.hppをインクルードするだけというお手軽さながら、JSONオブジェクトをめっちゃ気楽に扱えるようにしてくれます。
ざっと README.md に目を通せばだいたい使い方は把握できるかと思いますが(一時ソースだいじ)、順にサンプルコードを交えて解説していきますね。
JSONオブジェクトはこんな感じで生成できます。組み込み型のように用意できる... C++11の初期化子リストのおかげですね。
#include <iostream> #include "nlohmann/json.hpp" int main() { auto json = nlohmann::json{ { "hoge", true }, { "fuga", 1.5 }, { "piyo", "piyopiyo" }, { "hogehoge", { 1, false } } }; std::cout << json["hoge"] << "\n"; // true std::cout << json["hogehoge"][1] << "\n"; // false }
文字列から生成するなら、 json:parse が使えます。
auto json = nlohmann::json::parse("{ \"happy\": true, \"pi\": 3.141 }");
C++11の生文字リテラル(raw string literal)も使えます。JSONデータをソースコードに貼り付けて使えますね。
#include <iostream> #include "nlohmann/json.hpp" int main() { auto json = R"( { "happy": true, "pi": 3.141 } )"_json; std::cout << json["pi"] << "\n"; }
値の読み書きは [] と at が用意されています。 [] と at の使い分けは std::map での使い分けと同じ感じでしょうかね。
#include <iostream> #include "nlohmann/json.hpp" int main() { // 配列 auto array = nlohmann::json{ 0, 1, 2 }; array[0] = std::string("hoge"); // 他の型の値で置き換え可能 array[5] = 1.5f; // [] でのアクセスだと配列が自動的に拡張される array.at(6) = false; // at でのアクセスだと範囲外の場合に例外を投げる std::cout << array.size() << "\n"; }
連想コンテナの取り扱いは配列ととくに変わらず。
#include <iostream> #include "nlohmann/json.hpp" int main() { // 連想コンテナ auto conteiner = nlohmann::json{ { "hoge", true, }, { "fuga", 0.5 }, }; conteiner["hoge"] = std::string("hogehoge"); conteiner.at("piyo") = 2; std::cout << conteiner["hoge"] << "\n"; }
値を取り出して使う時は以下の要領で。std::any とか std::variant っぽい感じ?
#include <iostream> #include "nlohmann/json.hpp" int main() { auto array = nlohmann::json{ true, 5, 0.4, "hoge" }; nlohmann::json v1 = array[0]; // 実際に格納されている値 auto v2 = array[3].get<std::string>(); // 型を指定して取り出す。実行時にキャストできないと例外を投げる bool v3 = array[1]; // これでもOK。実行時にキャストできないと例外を投げる }
STLのコンテナっぽく扱えるよう、おんなじ感じにAPIが用意されています。
⇒公式の解説
⇒公式の解説
自分が一番ありがたいと思ったのはこれ。
深い位置にあるデータを一発で取り出せる!
#include <iostream> #include "nlohmann/json.hpp" int main() { auto json = R"( { "hoge": { "fuga": [ 5, "piyo" ] } } )"_json; // よくある手法 auto v1 = json["hoge"]["fuga"][1]; // こう指定できる! auto v2 = json["/hoge/fuga/1"_json_pointer]; // std::string→json_pointer auto key = nlohmann::json::json_pointer("/hoge/fuga/1"); auto v3 = json[key]; std::cout << v1 << "\n"; std::cout << v2 << "\n"; std::cout << v3 << "\n"; }
他に依存しているライブラリがなく、ヘッダファイルのみで構成されているので気軽に拙プロジェクトに導入できます。
とくにJSON Pointerに対応しているのが素晴らしい!
今後JSONを扱う時にはこのライブラリを積極的に使っていこうと思います!!
ではまた次回!
コード書いとる?
今まで知らなかったのですが、VisualStudioには「他のプロジェクトのライブラリファイル(.lib)を自動的にリンク」する機能があったんですね!
今までプロジェクトのプロパティ内のリンク設定で指定したりソースコードに直接 #pragma で書いたりしてたのから解放される!
DebugビルドとReleaseビルドでの設定、x86ビルドとx64ビルドの設定と、まぁ大変だったからね...
って事でVisualStudio2017での設定方法のメモ書き。たぶんVisualStudio2019でも同じだと思う。VisualStudioはバージョン毎に設定方法が変わることもあるのでお気をつけください。
当該ソリューション内にリンクするライブラリのプロジェクトも含める
今回は実行ファイルを作る ConsoleApplication というプロジェクトと、スタティックライブラリを作る Framework というプロジェクトを1つのソリューション内に用意。Frameworkで生成されたライブラリファイルをConsoleApplicationがリンクするという構図。
ビルドの順番を設定する
プロジェクトConsoleApplicationを右クリック、ビルドの依存関係→プロジェクトの依存関係と進む
ダイアログが開くのでFrameworkにチェックを入れる
これで同一ソリューション内のプロジェクトのビルド順番が決まります。今回の場合は Framework→ConsoleApplecation の順にビルドされるようになります。Framework側の変更が反映されないまま実行ファイルが作られてしまう事態を防ぎます。
ライブラリファイルを自動的にリンクするよう設定する
プロジェクトConsoleApplication内の参照を右クリック→参照の追加と進む
ダイアログが開くので Framework にチェックを入れる
この設定を済ますとプロジェクトFrameworkで生成されたライブラリファイルをConsoleApplicationが自動的にリンクしてくれます。
最後にプロジェクトConsoleApplicationのプロパティ内リンカー→全般「ライブラリ依存関係のリンク」が「はい」になっているか確認。これが「いいえ」なっていると自動的にリンクしてくれません。
概ね以上の設定手順で別プロジェクトのライブラリファイルを自動的にリンクしてくれるかと思います。
アプリケーション側でリンクするファイルの設定をしなくて済むのでめっちゃお手軽になりました!ファイル名とか、Debugビルドの時とかReleaseビルドの時とか、x86の時とかx64の時とか、いろいろ気にしなくてもよくなったので心理的負担が激減しました!
不要になったら参照から外すだけですし。自動化だいじ。
不要になったら参照から外すだけですし。自動化だいじ。
追記
プロジェクトの参照に別プロジェクトを追加すると、ビルドの順番は自動的に決まりますね!
VisualStudioかしこい!
⇒検証用ソリューション(GitHub)
ではまた次回!
コード書いとる?
時々無性にWebサイトの内容を画像にして資料として使いたくなる事があります。
そんな時はページをちょっとずつスクロールして何枚もスクリーンショットを撮り、画像編集ソフトで一枚に繋げてたんですが...効率悪いですよねコレ。
「こりゃ不便だ!」ってんで調べてみたらありました、ありました!
Safariの場合はこうすればできます。
右クリックが禁止されている場合は「開発→ページのソースを表示」
2. 「要素」タブに切り替え、当該タグ上で「右クリック→スクリーンショットを取り込む」
bodyタグでもdivタグでも、好きなタグ内の内容をスクリーンショットの対象にできます。
bodyタグでもdivタグでも、好きなタグ内の内容をスクリーンショットの対象にできます。
これでページ全体のスクリーンショットが撮れます。簡単!便利!
Chromeにも同様の機能がありますね。こっちも便利!
ではまた次回!!
spacemacsでのファイル保存について便利な拡張機能を見つけたのでそのメモ。
spacemacs でのファイル保存はこれまで auto-save-buffers-enhanced を使っていました。
これはspacemacsがアイドル状態になった時に自動でバッファをファイルに書き出す拡張機能で、こちらが詳しいです。
これはこれで良かったのですが、Undoしたときの変更内容がファイルに書き出されず、時々「あれ?修正項目がファイルに反映されてない...?」という状況になっていました。
で、最近WebStormというエディタを使う機会があり、これには「アプリのフォーカスが外れたらファイルを即時保存」という機能が初期状態で有効になっていました。
これがめっちゃ便利で、ブラウザを行き来するような状況で「あれ?エディタでファイル保存したっけ?」ってなりがちだったのが一切ない!VisualStudioやXcodeだとビルド開始時にファイルを自動で保存してくれますが、あれと同じ印象です。ファイル保存という概念を忘れる。
これ emacs にも欲しいよな...便利だよな...と思って本腰を入れて探したらありました。super-save という拡張機能を発見!
ありがたい! さっそく spacemacs に導入。設定方法などはここが詳しいです。ありがとうございます!
dotspacemacs-additional-packages '( super-save ;; 追加 )
super-save-triggers
・ファイル保存のきっかけとなる命令を列挙。バッファ切り替えとかありますが、自分は設定を削除。
super-save-hook-triggers
・ファイル保存のきっかけとなる hook を列挙。ここに「マウスがフォーカスを外れた時、アプリがフォーカスを失った時」と指定されています。
他にも細かく設定できるのでソース内の変数を調べてみてください。
それからそれから、カレントバッファだけでなく、全バッファを保存対象にしたかったので、このプルリクエストを参考に手を入れる。
(defun super-save-command () "Save the buffers if needed." (let ((buffer-to-save (if super-save-all-buffers (buffer-list) (list (current-buffer))))) (save-excursion (dolist (buf buffer-to-save) (set-buffer buf) (when (and buffer-file-name (buffer-modified-p (current-buffer)) (file-writable-p buffer-file-name) (if (file-remote-p buffer-file-name) super-save-remote-files t) (super-save-include-p buffer-file-name)) (save-buffer))))))
うんバッチリ!思った通りの挙動になった!
...とここまで super-save を導入してみて思った。
a. バッファ切り替え時に適時ファイルを保存
b. フォーカスアウト時にまとめて書き出す
どっちがいいんだろね...super-saveの作者的には「a」オススメっぽいですが...拙者はしばらく「b」で使っていきます。
ではまた次回!
謹賀新年。今年もよろしくお願いいたします。
2019年大晦日にmacOSをCatalinaにバージョンアップしました。そのメモ書き。
QuickTime Player 7が使えなくなった
そういや最近使ってなかったのでヨシ!
Homebrew
brew cleanup -s
したらエラーが発生するようになったので、一旦アンインストール。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
/usr/local 以下をまっさらにしてから必要なパッケージのみインストール。
Quick Look plugins が動かない
以下のコマンドで解消。いいのかこれで。
以下のコマンドで解消。いいのかこれで。
xattr -d com.apple.quarantine ~/Library/QuickLook/QLColorCode.qlgenerator
emacsがビルドできない
configure: error: The following required libraries were not found:
gnutls
Maybe some development libraries/packages are missing?
If you don't want to link with them give
--with-gnutls=no
as options to configure
って出るのは
brew install gnutls brew install pkg-config brew install texinfo
あたりでビルドが通るようになった。パッケージの依存関係でしたか...
xml.c:23:10: fatal error: 'libxml/tree.h' file not found
って出るのは
こちらの記事を参考にビルドスクリプトを修正。ありがとうございます!
デスクトップの「場所が変更された項目」
古いアプリのファイルが残っていただけだったので削除!
ターミナルはmacOSを再起動するとWindowが微妙にちっちゃくなる問題
直ってる!
直ってる!
SoundFlower
より細かく設定を変更できるのを見つけたのでインストール。ありがたや!
より細かく設定を変更できるのを見つけたのでインストール。ありがたや!
Reaper
Catalinaで動くバージョンがあったのでインストール
Catalinaで動くバージョンがあったのでインストール
拙作アプリがRetina解像度固定になってしまう
Info.plistにNSHighResolutionCapableを追加して値をfalseにすれば良い。
既存のアプリの場合はアプリの情報を見る→低解像度で開く
で制御できる模様。
...こんな感じかな?
ではまた次回!
コード書いとる?
長いこと中断していた物理演算ライブラリの検証を始めたのでそのメモ。
対象ライブラリはこれ。Bullet Physics SDK。中の人は気づけばGoogleの中の人になっているぞ...
最新バージョンは2.88
ライブラリのビルドにはCMakeを使いました。もうすっかり軟派なのでGUI版を使います。
1. Source Codeの場所を指示して
2. Build時のファイル出力先を指示して
3. Configureボタンを押して
4. Generateボタンを押す
Windows版の場合、x86版かx64版か選ぶ場面がありますので、気をつけてください。
ビルド設定に手を入れるとだいたいうまくいきませんので、極力初期設定のままでGenerateしてください(苦笑)
Windows版はDLL形式でライブラリ作れないそうです。BUILD_SHARED_LIBSオプションを有効にするとビルドが失敗します。
これで、Build時の出力先にプロジェクトが生成されているはずです。
あとは「ALL_BUILD」SchemeでビルドすればOK。
Releaseビルドしたい場合は「ALL_BUILD」Scheme内のビルド設定を変更してください。
ビルドが完了すると各種サンプルやライブラリファイルが出力されています。
ライブラリファイルはフォルダ別に出力されているので、よしなにしてください。
自分のプロジェクトにBulletライブラリを追加する場合、
- includeファイルはBulletライブラリのsrcフォルダを直接指定
- libファイルは、適時ファイルをコピー
っていう感じがいいんでしょうかね... とりあえず自分はincludeファイルもlibファイルも自分のプロジェクトの専用のフォルダにコピーして使うことにしました。
という感じでサンプルプロジェクトを作ってGitHubにあげておきましたので、参考にしてみてください。
btRigidBody初期化時の摩擦係数とか反発係数とかの値や、btGeneric6DofConstraintの初期化手順とかを試行錯誤してなんとか形にしてみました...
ではまた次回!
コード書いとる?
「Windows使やすい!」ってゆーてる人はこの呪いに掛かった事がないからだと思います!(笑)
ネットワーク経由のファイルを扱ってるとほぼ毎日この呪いにかかってフォルダが消せなくなるし、移動もリネームもできなくなる! ...マジで勘弁して欲しいです。
サーバーは何を使ってるかって? もちろんWindows Server 2016ですよ! 純正最高!
冗談はさておき、もし Thumbs.db が原因でフォルダが消せない呪いにかかってしまったら、そのフォルダを別の場所に移動してください。
フォルダがネットワークドライブにある場合は、ローカルドライブの適当な場所に移動。
するとあら不思議!フォルダが削除できるじゃないですか!
意味わからん!!(笑)
とりあえず運用方法が確立できたのでよかった事にします...。
とりあえず運用方法が確立できたのでよかった事にします...。
スッキリ!!
拙作パズル&モナークでも大変お世話になっていたglmのバージョンが0.9.9.6になっていました。 リリースノートを見るについにNEON命令をサポートしたようです。それからVisualStudio2019環境の検出やその他細かい修正が中心みたいですね!
という訳でその導入記。
glm0.9.9.0からデフォルトコンストラクタで内部の初期化をしないという挙動に変更になってます。
// 従来だと成分すべて0で初期化されていたが、glm0.9.9.0以降は初期化されない auto v = glm::vec3(); // 従来だと単位行列に初期化されていたが、glm0.9.9.0以降は初期化されない auto m = glm::mac4();
全部修正するのはかなりしんどかったのでプリプロセッサマクロで GLM_FORCE_CTOR_INIT を定義し、昔の挙動と揃える。このオプションが廃止されないことを祈ります...
Cinder0.9.1の方は include/cinder/Matrix.h 内で
- glm::mat4 result( glm::uninitialize ); + glm::mat4 result;
こんな感じに修正。
NEON向け命令を生成するにはプリプロセッサマクロで GLM_FORCE_NEON を定義する。ただしガッツリ glm::vec3 や glm::mat4 を使っていないので違いがわからん。 0.9.9.7で対応命令を増やすとの事なので楽しみですね。
ではまた次回!
記事検索
電子書籍発売中
「チュートリアル形式で始めるOpenAL」
⇒Kindle版 ⇒iBooks版
「iPhoneアプリ『ういろう』のレシピ」
⇒Kindle版 ⇒iBooks版
『チュートリアル形式で始めるOpenGL[2D編]』
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中
『Puzzle & Monarch』
⇒AppStore
『BRICK & TRIP』
⇒AppStore
『ういろう』
⇒AppStore ⇒LITE版
『こなへん』
⇒AppStore ⇒LITE版
『GEOSPOT』
⇒Windows ⇒Mac
『TieGunner』
⇒Windows ⇒Mac
最新記事
iPhoneリンク
色々リンク
人気のあるタグ
- AppStore
- boost
- B級グルメ
- C++
- c++
- C++11
- c++11
- Cinder
- cinder
- cpp
- cpprefjp
- Cygwin
- develop
- DropOut
- elisp
- Elisp
- Emacs
- emacs
- epub
- Firefox
- framework
- GAME
- gamedev
- GLFW
- GLSL
- glut
- ibooks
- indiedev
- iOS
- ios
- iPad
- iPhone
- iphone
- iphoneアプリ
- isearch
- JSON
- Kaleidoprojector
- kindle
- lisp
- MAC
- macOS
- Objective-C
- OpenAL
- OpenGL
- opengl
- org-mode
- OSX
- osx
- SDK
- sdk
- spacemacs
- Tips
- UTF-8
- VisualStudio
- WIN
- Windows
- windows
- Windows7
- x64
- Xcode
- xcode
- おやつ
- アウトラインプロセッサ
- アプリ
- イベント
- インディーズ
- エコ
- カスタマイズ
- キーバインド
- ゲーム
- ゲームプログラミング
- スナップショット
- ダイエット
- デバッグ
- ネットTV
- フォント
- フルスクリーン
- ブラウザ
- プログラミング
- マクロ
- ミステリーガールズ
- メモリ管理
- ライブ
- ランチ
- 万華鏡
- 不具合
- 中央線
- 入門
- 名古屋弁
- 告知
- 声優
- 忘年会
- 新作
- 新製品
- 最適化
- 朗読
- 移行
- 自炊
- 舞台
- 設定
カテゴリ別バックナンバー
月別バックナンバー