投稿

9月, 2021の投稿を表示しています

C++言語 ビットフィールド サイズについて

ビットフィールドとして構造体を作ったときのメモリ確保について 構造体の変数としてビットフィールドを使用したときにどのようにメモリが確保されるか。 サンプルプログラム1 #include <iostream> using namespace std; struct k_bool{ unsigned a : 8; unsigned b : 8; unsigned c : 8; unsigned d : 1; unsigned e : 1; unsigned f : 1; unsigned g : 1; unsigned h : 1; }; int main(void){ k_bool abcd; cout &lt&lt "sizeof : " &lt&lt sizeof(abcd); } これを実行すると次のようになる sizeof : 4 構造体内のコロンの後の数字がビット数である。 つまり、上のプログラムでは合計29ビットとなる。 8ビットで1バイトなので単純に計算すると3.625バイトと4バイトには満たない。 では、dで8ビット確保するとどうなるのか? #include <iostream> using namespace std; struct k_bool{ unsigned a : 8; unsigned b : 8; unsigned c : 8; unsigned d : 8; unsigned e : 1; unsigned f : 1; unsigned g : 1; unsigned h : 1; }; int main(void){ k_bool abcd; cout &lt&lt "sizeof : " &lt&lt sizeof(abcd); } これを実行すると次のようになる sizeof : 8 では、念のためにiを8ビットで追加して実行すると #include ...

PCゲーム【HyperNova】を作った話

イメージ
HyperNovaを作った話 友人に誘われて2週間で開発して3日でBoothに公開した時の話。 開発環境 ゲームエンジン:Unity 2019.4.11f1 統合開発環境:VisualStudio2019Comunity ミドルウェア:ADX2LE オーディオオーサリングツール:CRI Atom Craft LE プラットフォーム:Windows, MacOSX (2021/09/06 時点) プロジェクト共有:UnityCollaborate 開発人数:4人 開発の経緯 友人:テキトウにゲーム作ろうぜ! わい:面白そうだしいいよ~ 以上 これで開発が始まったのがHyperNovaである。 友人はゲームの完成図をすでに持っていたらしいが私は一切考えずに開発していたw 私が担当したのはサウンド実装とUIとモーション、セーブデータに関する部分であった。 友人はゲームのシステム自体をプログラムするのが得意で私は、コンピュータに影響が 出るようなシステム周りやミドルウェアを用いた負荷軽減などが得意でお互いにすみ分け ができていた。 開発の流れはTwitterで毎日進捗を投稿していたので興味があったら見てほしい。 リプライに毎日追加していった。 ① 8/14 ゲームジャム始動!! #tdu_gamejam 「進捗」 ・ゲームシステムの土台 ・PlayerとEnemy with @komiho_ri pic.twitter.com/qHAnNfNvR0 — どんぐり (@OhDonguri) August 14, 2021 初日はゲームのジャンルがSTGと決まったので早速、システムを作成。 友人は以前から開発していたゲームで使っていた汎用性の高いスクリプトのおかげで、敵と プレイヤーのステータス管理と判定管理が一気に片付いた。 2日目にしてステージの実装に敵の出現、エフェクト、モーション、サウンド実装… 今振り返ってみると開発スピードが免停覚悟するほど速い。 その日の進捗投稿会議で8割公開することが軽いノリで決まったがその後若干後悔したw 3日目はプレイヤーを追尾して一緒に弾を打つオプション砲が追加された。 Twitterにも進捗が投稿されている。 ここまではいいと。 問題はこの辺から。 丸1日作業して進捗を投稿できるほどの視覚的進...

Unity ADX2LE 演出付きでBGMを再生する CriAtomExPlayer

UnityでADX2LEを用いた演出付きBGM再生 サウンドミドルウェアのADX2LEを用いたBGM再生についてまとめてみた。 ※自己流のため参考程度にお願いします。 サンプルプログラム1 using CriWare; using System.Collections; using UnityEngine; using UnityEngine.UI; public class SoundSample : MonoBehaviour { public CriAtomSource criAtomSource; public string bgmCueSheet = "BGM"; public string[] bgmCueNames = new string[] { "BGM1", "BGM2", "BGM3", "BGM4", "BGM5" }; //キューシート「BGM」に入っているキューの名前一覧 private CriAtomExPlayer exPlayer, exPlayer2; private CriAtomExAcb atomExAcb; int num = 0; private IEnumerator Start(){ /* キューシートファイルのロード待ち */ yield return new WaitUntil(() =&gt !CriAtom.CueSheetsAreLoading); atomExAcb = CriAtom.GetAcb("BGM"); //BGMの入ったACBファイルを拾う //クロスフェードPlayer exPlayer = new CriAtomExPlayer(); //プレイヤーの生成 exPlayer.SetCue(atomExAcb, bgmCueNames[0]); //プレイヤーにキューをセットする exPlayer.Loop(true); //プレイヤーにループを設定する ...

C/C++言語 再帰関数

C/C++での再帰関数の挙動 C/C++で関数を作成し、その中で同じ関数を実行すると for文を用いなくとも繰り返し処理される。 サンプルプログラム1 #include <iostream> using namespace std; void increase(int i); int main(void){ increase(0); return 0; } void increase(int i){ if(i &lt 5){ increase(i + 1); cout &lt&lt i &lt&lt " " &lt&lt endl; } } これを実行すると次のようになる 4 3 2 1 0 これは同じ関数が同じ関数内で実行されているのだが、イメージしづらいだろう。 挙動自体は次のプログラムのようにふるまう。 void increase(int i) { if (0 &lt 5) { if (1 &lt 5) { if (2 &lt 5) { if (3 &lt 5) { if (4 &lt 5) { if (5 &lt 5) { cout &lt&lt 5 &lt&lt " " &lt&lt endl; //ここから外に出る連鎖が始まる } cout &lt&lt 4 &lt&lt " " &lt&lt endl; } cout &lt&lt 3 &lt&lt " " &lt&lt endl; ...