だから囁くのさ

自分の日常とか音楽の話とかとか

プログラム

プログラミング学習と音楽なゲーム【思案中】

結構前に買ったゲームで「ヒューマン・リソース・マシーン」というのがSwitchにインストールされていた。
最近、思い出したようにプレイしてる。
簡単に言うと「ゲーム内のキャラの動きをプログラミングしてパズルを解くゲーム」
アセンブラのような単純な命令を組み合わせてキャラを動かす。
最後の方になると数字のソートとかも出てくる。



詳細は↓のような感じで




プログラムをGUIで組み立てて、その結果をキャラクターの動きで確認できるというのは単純に楽しい。
このゲーム性に音楽の要素を足したいと思っている。

すでに「MusicBlocks」っていうのがあって、楽器の演奏をプログラミングしたりするものがあるんだけど、これは楽器の譜面そのものをプログラミングする感じにみえる。。。
それも楽しいんだろうけど、ちょっとプログラミング学習に寄りすぎてる気もする。



プログラミング学習の目的も果たしつつ「ヒューマン・リソース・マシーン」のように、画面の中でキャラがコミカルに動きながら、その結果として音楽を奏でたり、リズムを刻んだりして、気持ちいいゲーム体験を作りたい。
しかし、まだアイデアが出ない…

頭の中では「ヒューマン・リソース・マシーン」*「Rez」*「RAYSTORM」のイメージがわき始めてるのだけど。。。まだまだ具体的な形になっていない…

うーむ、同じような趣向の人と語り合いたい。



numeric_limits orz

ASSERTで「unsigned intの最大値」以下って条件で↓のように書いてて、、、
void Func(unsigned int value){
  ASSERT(value <= std::numeric_limits::max());
}


とある拍子に、引数が「unsigned short」になった時にASSERTの部分も書き換えなくて良いように↓みたいに書けんもんかねぇ…

void Func(unsigned short value){
  // なんかの処理
  ASSERT(value <= std::numeric_limits<型(value)>::max());
}




ちがう、死にたい…orz
ASSERT(value <= ((0x80<

こう書いてみたけど、こんなふうにしたくなることって、あんまりないなぁって…

清潔なコーディング

3776add6.jpg
ボーイスカウト精神を持って、日々コードを書くに書かれているように、「来た時より綺麗にして帰る」の精神で「修正前より綺麗にしてコミットする」を継続すればプログラムコードは綺麗に保たれるのだろうか?
綺麗にするための具体的な方法は文化や宗教や美意識、その他の諸々の問題や僕の技術不足のため一言では片付かない…
しかし、少なくともボーイスカウトの精神を心の片隅に置いておけばとんでもなく酷い状態にはならない…ような気がする(^^;

↓の記事にもあるように、「週末に一気に大掃除しよう」って思っていると腰が重くなるし、相当な労力になるもの。
完璧でなくてもいいから日々ちょっとずつ綺麗にするっていうのが良いらしい…
完ぺきにしなくてもいい「1日15分の掃除を毎日続ける」というお掃除術
※実はこの記事は半年近く前に見つけて読んで、その後、キッチンタイマーを使って15分清掃を始めてみたんだけれど習慣にならなかったんだよなぁ…
※「継続は力なり」を実践できないでおります…

今日のクソース

class Base{
  protected Check check = null;
  protected void OnInit(){}
}

class Child extends Base {
  protected void OnInit(){
    // 親クラスのOnInit()を呼ぶ前に、protectedのメンバ変数にインスタンスをセットしてあげないとヌルポ
    check = new Check( "ほげほげ" );
    super.OnInit();
  }
}

なんだよ、、、親クラスのメンバ変数のインスタンス化を子クラスで記述しなくちゃいけないってどう考えてもおかしいだろ…

せめて、OnInit()が純粋仮想関数になってるか、
「protected abstract Check Base::createCheck(); 」になってて、子クラス側でCheckクラスの新しいインスタンスを返すことを強制されてれば良いのに…

オブジェクト指向言語覚えたての人というか丸っきり初心者過ぎて、なんで彼が共通ライブラリ書いてんだよ……

さっぱりとしたソースコードと見せてはいけない暗闇

b9b9324a.jpg
コンパイル済のclassファイルにヤヴァイテキストが混入していないかチェックするために、ランタイム時に調べたい。
文字リテラルのリソースにアクセスする手段あるかしら?
と小一時間調べてましたorz

class A{
  private String m_Text="しんでくださーーーい";
  public A( String text){
    // コンストラクタでどうせ書き換えられるけど、気晴らしにm_Textの初期値を入れておいた文字列がバイナリに含まれてハズカシー
    m_Text = text;
  }
}

いや、まぁ、こんなのなら漏れても良いんだけど、
テスト用のコードをなんで本番のソースに埋め込むかな……


タイトルとは全く関係ない感じに落ちた。
最近、SNSやらIMを色んな種類に手を広げすぎて若干収集がつかなくなっていた感じです。

※これ書いたの先月だ…

何の意味もない

c言語とかc++にて

void Func( const int value )
{
}


値型の引数にconstつけても………
何の意味もない!!何の意味もない!!
(小島よしお風)

一応うまくいってる?

一応、先月ここに書いた件に関してはうまくいってるっぽい
ヨカタ…目処はたったよ。

まだ終わりじゃないけど

眩暈がするコード

自前アロケータのマルチスレッド対応について。

// 自前アロケータmalloc
void *malloc(size_t size)
{
	pMutex->Lock();
	// 16バイトアライメントで空き容量取得して使用済みにする。
	MEMORY_TAG *tag = FindFreeTag(16, size);
	tag->bUse = true;
	pMutex->Unlock();

	return tag->buff;
}

// 自前アロケータのfree()
void MyFree( void *ptr )
{
	// メモリ管理タグから該当のタグを探して未使用領域にする。
	pMutex->Lock();

	MEMORY_TAG *tag = FindTag( ptr );
	tag->bUse = false;

	pMutex->Unlock();


	// 空きメモリを他の空きメモリと結合させる
	// この関数の中で「pMutex」のロックをしてるらしい。
	CompactionTag( tag );
}
ノンプリエンプティブな環境だと問題なかったんだけれど、
プリエンプティブな環境に持ってきたら吹っ飛んだw
当然だけど。

こんなコード書きながら、得意げにどや顔する彼に何て言えば良いでしょうか。

マルチプラットフォーム設計?

同僚が社内ライブラリの実装をしている
最初から「マルチプラットフォームを念頭に設計するように」と上からのお達しがあったにも関わらず、
機種依存バリバリのインターフェースを作ってくれちゃう。

しかも、ちょっとぐらい相談してくれれば良いのに、
誰にも相談せずSVNにも入れず(他人から見えない状態)一人で突っ走って実装してしまうもんだから。。。。
気付いた時にはヒドイ状態でコミットされてる
せめてSVNに入ってる状態なら他の人からの助言もはいるだろうに、、、

もう、奴に作らせたくねぇorz

痛い具体例。

// チャンネルの音量設定
void SetVolume(uint32 volL, uint32 volR);


なんと、ボリュームをLR別々にセットしてる!?

聞いてみたら、
「PSPではボリュームを左右別々に設定できるから」
とのこと。

いやいや、PS3やXboxだったら5.1ch、7.1chあるんだけど!?
つかマルチプラットフォームライブラリの設計段階で「PSPでは」とか思いっきり環境依存の話が出る時点でおかしい。

↓のように変更してみました。(正確にはちょっと違うけど)
void SetVolume(uint32 vol);
void SetPan(int16 x,int16 y,int16 z);

2ch環境ならy,zの値を無視した実装にすりゃ良いかぁとか思ったり。


これは単純な例だけど、、、こういうのばっかで辟易しとります。。。

ふぅ。。。

Mac mini欲しい

今更ですがMac mini欲しい
用途はこれまた今更ですがiPhoneアプリ開発用

安く手に入れるなら中古かオークションか・・・
「もういらない」って人が居れば安く譲ってください(;^_^A

1時間でテトリスを作る動画

1時間で、C++コンパイル環境インストールから初めてテトリス作る動画
プログラムの内容自体は普通なんだけど、それを1時間以内で記述して一応の完成まで持っていってる手際が驚異的。



自分ならどれぐらいの時間でできるだろうか…

上手く動かないんですど…

「プログラムは思ったとおりには動かない、書いた通りに動くんだ」ってのは僕の中では常識だったんだけど、、、
プログラムがうまく動かない原因をハードやライブラリのせいだと思い込んで悩み続ける人もいるんだ。
開発途上、あるいは新ハードならそういうこともあるかもしれないけど…

マニュアルに書かれてる処理を書かずに動かない動かない言うのはちょっとおかしいんじゃないかなぁ…
そんで「コンシューマはPCと違ってクセがあるからーメンドクサイ」って言われてもなぁ。
PCのプログラムだってDirectXだって仕様通りに作らないと動かない点に関して言えば同じなんだけどな…
せめてマニュアルは熟読しようよ…そのマニュアルが間違ってたら文句言っても良いからさ…

という愚痴だったとさ。
所詮はプログラマ同士のもにょりなので、レベル低い話でお恥ずかしい。

Java条件付きコンパイル

携帯アプリ中です
Javaでは条件付きコンパイル出来ないのかな?
Releaseビルドとデバッグビルドに分けたり、
Assertとかデバッグ時のみトレース出力とかどうやるんだろ・・・・

今更で且つググレカスな話題だけど、ネタが無いので〜

Variantのありかた3

Variant str = "ほげ";
Variant value = 3;

Variant result = str * value;


さて、「result」の中身はどうなってればいいんだ???

「ほげほげほげ」

でしょうか?w

 

[PGネタ]犯罪パターン3

最近、物騒&悲しい事件が多発している中で、非常に不謹慎な気もしますが…
GoFの復習をしていて見つけたもの。

「3.TemplateMethod パターン」よりコード抜粋

「版材」と「犯罪」…
自分がサンプルコードをUPするときは、誤解のない変数名・メソッド名・クラス名を心がけたいと思う次第。

----------------------------
public abstract class WoodCutPrint{
  public abstract void draw( Cuttable hanzai );
  public abstract void cut( Cuttable hanzai );
  public abstract void print( Cuttable hanzai );
  public void createWoodCutPrint(){
    Wood hanzai = new Wood();//Wood クラスは、Cuttable インタフェースを実装している
    draw( hanzai );
    cut( hanzai );
    print( hanzai );
  }
}
----------------------------

さてTemplateMethodパターンを少し誤解していたかもしれない。
(この記事の説明を鵜呑みにしたとすると)
ちょっ、「draw」「cut」「print」をpublicにしたらTemplateMethodパターンの意味なくね???
これを例にするならprotectedだろ常考。
とか思ってしまったんですが、コレは理解が足りないのでしょうか。

こっちのサンプルコードに至っては、
TemplateMethodパターンですらねーだろ、とか思ってしまうのも理解が足りないんでしょうか

勉強不足過ぎです。サーセン。
ネットの情報に依存しすぎるのも良くないな〜と思った昼下がり。

久々にプログラムネタ3

久しぶりにプログラムネタというか作業実績
グラフィックファイルの独自形式を作り変えた。
エンコツールとエンジン側の読み込みルーチン

あー、まだデコード速度のテストしてなかった。
ギャクアセされたら相当へっぽこだということが分かると思うけどー
しかも殆ど流通してないエンジンのファイルフォーマット変えても意味なしという自己満足の領域。

数日前に書いたコードをすっかり忘れて似たようなコード書いている最中に思い出して途中で消して関数一個呼ぶように1行追加しただけで終わった…
orz

らめぇ、壊れちゃう3

落ちたり落ちなかったりする不具合…超ありがちな原因ですた。
適当に改変してあるけれど。

--- hoge.cpp ------------
const UINT MAX_SIZE = 40;
const char *ENV_VALUE = "JJJ";
  :
char *param[MAX_SIZE];
for(UINT i=0; i<MAX_SIZE; ++i) param[i] = new char[1024];
  :
// そんなことしたら、、、
if(適当な条件) param[10] = ENV_VALUE;
  :
// らめぇーーー
for(UINT i=0; i<MAX_SIZE; ++i) delete [] param[i];
-------------------------

コレってコンパイルする時に警告出なかったカナ?
手元では試してないので。

技術的に浦島太郎3

最近、今更のようにC#を触り始めた。
もう浦島太郎状態だ。
.NET Framework 3.0
C#3.0
ASP.NET2.0

それぞれのVer1.0の時代を知らないYO(汗

それはともかく、C#のコードを書き始めると何をするにしても「new
newしまくり。

btn.Location = new Point( 100, 100 );
btn.Size = new Size( 100, 20);

とか、最初は非常に気持ち悪かったんだけど、慣れてくると気持ちよくなってくる(笑)
C++でいえば、全てがスマートポインタに格納されてると思えば良いのか。

それでも、なんとなーくだけどゲームの処理というか、画像処理とかには向かない気がするけれど、それはまだ僕が知らないことが多いからそう思うのかな。
C#で実践的な画像エフェクト処理(DIB処理みたいな)ことをしてるサンプルとか書籍とかご存知の方がいれば教えて欲しいデス(^-^)
※普通に「System.Byte」の配列を使えばいいのかな…

しかし、C++/CLIは非常に気持ち悪い…

List<double>^ doubleList;
doubleList = gcnew List<double>();

「^」とか「gcnew」とか、凄く気持ち悪い記号で嫌だなぁ。
いずれにしても、慣れの問題かもしれないけれど…

同業者の飲み会5

今日は、某業界の同業者飲み会に参加させてもらった。
僕自身参加するのもとても久しぶり。

少し前は10人チョイ集まれば多いかな?って感じてるぐらいの規模の飲み会だったが、今回はなんと20名もの人が参加した。
5時間という時間の中で、僕が疑問に思ってること、勘違いしていたこと、悩んでることなど濃厚な話をすることが出来てとても充実した時間だった。

惜しくも残念だったのは、人数が多すぎて少ししか話せない方もいたり、席が遠すぎて話すことすら出来なかった人もいたことかな…
1次会の会場は割りと広かったから積極的に歩き回ればよかった。
しかし、その場で話していた内容も興味深くてなかなか腰が浮かなかった(^^;

ともかく、集まった人のほとんどが自分より洗練していたり経験豊富な人たちであったりするので、話しを聞くだけでもとても面白い。
次回も是非参加したいと思う。
月に1度ぐらいは何かの口実で開けないものか(笑

NScripter興味深いな3

今は内容は公表できないが、NScripterの研究を始めた。
今更だけれども…
前回、ちょろっと触ったのはかれこれ3〜4年前だろうか。
その当時は微塵も興味がわかなかったが…

大分機能強化されているようだ。
特にアドベンチャーゲームのUI関連を実装するのが大分楽になっている。

市販のエロゲでは、最近吉里吉里を使っているのを見かけるが、TJSでまともにカスタマイズ出来ないようなスクリプタはNScripterを使った方が賢明だ。

僕自身は「JavaScriptもどきのTJS覚えるぐらいならC++で書く」というのが一応の信念ではあったが、ものによってはNScripterを使った方が低コストで出来るだろう。

もっとも派手なアクションや複雑なルールが必要なゲームを作るのには全然向いていないと感じる。痒いところに手が届かないというか…
そもそも、言語構文が貧弱だから、複雑な処理を書こうとするとアセンブラでも書いてるかのように感じて頭がおかしくなりそうだから(笑

そんなわけで、C++もTJSが無理って人に(・∀・)つ NScripter

[PGネタ]ちんけなプログラムを晒します3

久しぶりにプログラミングネタ
ゲームプログラミングに役に立つか。
俺のレベルが知れるな。。。
もっと良い方法があれば教えてください(ぉ
多分、ヌケもあると思われ
クラスの命名も適当

/*
今回代入された値と、前回まで保持していた値が不一致だった場合、「IsChange()」がtrueを返す。
たとえば、毎フレーム下記のような処理が実行される場合、、、、

ChangeValue<long> m_value;

m_value = m_Object.GetValue();
if( m_value.IsChange() ){
  //結構重い処理
}

毎フレーム重い処理を実行すると非効率なので、値が変わったときのみ処理を実行したい場合に使用する。

*/

template< typename T >
class ChangeValue{
public:
  ChangeValue() : m_NowValue( T() ), m_PrevValue( T() )
  {
  }

  bool IsChange() const { return m_NowValue != m_PrevValue; }

  const ChangeValue & operator = ( const T &val ){
    m_PrevValue = m_NowValue;
    m_NowValue = val;
    return *this;
  }

  const ChangeValue & operator = ( const ChangeValue &src ){
    m_PrevValue = src.m_PrevValue;
    m_NowValue = src.m_NowValue;

    return *this;
  }

  operator T(){
    return m_NowValue;
  }
private:
  T  m_NowValue;
  T  m_PrevValue;
};


はぁ、、、、(;´Д`)

ところで、 コンストラクタの初期化で 例えば、m_value( int() ) って合法?

ニコニコ動画、サービス中止かYO!?1

楽しい日々が終わった(´・ω・`)続きを読む

使われるか不明1

だーいぶ、ほったらかしといたプログラムを、”とりあえず完”させた。
いつごろだろう?と思って日記を遡れば、、、
9月…って半年近く前じゃん(;´Д`)何やってんだ…
もう駄目だわ。

Netの力を借りたので、本読んで復習。数値計算教本

続きを読む

アライメントに苦しむ2

つい先日、コンパイルオプションで「構造体メンバのアライメント」を「1BYTE」に設定した。
しばらく作業してて全く問題なかったんだけれど、急に落ちるようになった。
buffer over runとかなんとか。

BoundsCheckerとか頭の良いツールを使えない現状では頭を抱えてチマチマとデバッグ。
結論から言うと他社製のライブラリ関数を呼ぶところで落ちてますた。
コンパイル済みのライブラリ関数に渡す構造体の形式を勝手に変えたら、そりゃ駄目に決まってるやん…orz

ものぐさな僕は、コンパイルオプションで指定しちゃったけど、局所的に必要なところだけ設定するようにしよう…OTL

変更した瞬間に落ちるんじゃなくて、しばらくしてから落ちる問題が発生すると、色々な原因を推測してしまって余計なところまでチェックする必要があるので凹む。
まぁ、そんだけ疑い深いコード書いてるって証拠だがw(;´Д`)

寝坊して3

あまり仕事がうまくいかなかった。
テキストの変換処理やら何やら修正。
新規に書いた部分はほとんど無かった。

ところで、今日、とあるアプリケーションを「HOGE++」というフォルダにインストールしたら正常に動作しなかったw
「+」という文字が良くなかったみたいだ。
今度からは「HOGE_PURUPURU」ってフォルダにインストールすることにしよう。

Resource Hacker3

「Resource Hacker」
今日は、このツールにお世話になった
ソースを紛失してしまった実行ファイルのバージョン情報を書き換えるのに使用した。
ふむ、ふむ、○○工作完了w

色々使えそうだ、コレハ(・∀・)

正規表現で全角文字にマッチ3

Shift-jisの全角文字列にマッチさせる正規表現を考えなくてはいけなくなった。
結果的にはググって得た情報に+αしてなんとかなったっぽいけれど。

具体的な内容を書けないのがもどかしいな…

[^ -~。-゚]*

こんなんどうでしょうか?的な情報を得た。
なるほど、"半角の文字コード以外"って狙いか。
頭良い人いるな〜と思った。

結果的には、これだけじゃ不十分で、若干複雑な正規表現になったけれど、とりあえずの目的は達成した。

こんだけの情報じゃ誰の役にも立たないけれど、「全角文字列にマッチさせたい」って時に「全角文字以外にマッチ」って逆の表現で目的を達成できた。。。というのが今回のミソでした。
Profile

take_de_x

キックの音に拘るテクノ野郎です!
ホームページをチェックしてね♪

お問い合わせ
お問い合わせはこちらまで
Categories
Archives
タグ絞り込み検索
ほしいものリスト公開中