プログラミング

その8

マルチスレッディング part2 内部では単一スレッドにしようと考えてますがスレッドの制御が面倒です。 スレッドには忙しい状態と暇な状態があります。 忙しい時はCPUを独り占めして働き続けます。 60fps、30fpsでフレーム管理されてまして、暇なときはsleep…

その7

マルチスレッディング 現在、には画像の表示には同期式と非同期式を用意しています。 同期式は立ち絵の変更など、スクリプトの実行が止まるもので、 非同期式は雪や雨の天候エフェクトなどです。 後者は少し頑固に実装しています。 load "大きめ","中くらい"…

コメント付き絵日記CGI

以前コメントができる絵日記CGIが必要になりました。 ずっと使っていた画像掲示板を改造したんですが、意外と簡単にできます。 まずcgiファイルをコピーし、各々をedit.cgi、read.cgiとします。 edit.cgiは管理用で、絵日記を書く|編集|削除を担当します。 …

その6

変数名、ラベルの扱い Advシステムではいつ・どこでセーブされるか分かりません。 whileループの途中で割り込みが入って、そこでセーブされてもロード時にはメモリ内容が再現されなければなりません。 さらにパッチで変数を追加されても識別できるように、変…

その5

ループ構文 前回loop,forをwhileに変換しました。 次はwhile内部をif〜gotoに変換します。 while(i) { i--; }↓↓↓↓↓↓↓↓↓↓↓*Begin if (!(i)) goto *End; i--; *End continue→goto *Begin break→goto *End CやC++ならここで終わりなのですが、ここでは終われま…

オーラエフェクト

某オンラインゲームのオーラエフェクト(↓)。 不定形でぐにゃぐにゃしながら回転してるのでリアルタイムで計算でもしてるのかと思いきや よく見ると2、3周期で動いてるのでこんな感じでしょうか。 輪っか状のオブジェクトを作って、テクスチャのsrc座標をず…

その3

プログラミング用のエディタを作るのですが使い慣れた機能は継承したいです。 (オートインデント、Home/Endキーの動作etc.) その中の「ダブルクリックでキーワード抽出」をやります。 まずセパレータとなる文字を決めて、二つのセパレータ間の部分がキーワ…

パイプ処理

以前javaエディタを作った時、コンパイル結果をパイプ経由で取得することにしました。 google先生で調べたら CreatePipe関数→ReadFile関数としなさい、とあったのでその通りにしました。 ところが実行中の標準出力も同じように取得してみたところ、その実行…

指定範囲をループするint型

最近ネタ不足で、何かないかと自分のライブラリを眺めてます。 そこからの出展で内容はタイトルの通りです。 つまりこういうものです。 Counter i; i.Set(0,3); // min=0、max=3for(;;) { out(i++); }実行結果 0 1 2 3 0 1 2 3... 5を足すと一周して1 2 3 0 …

AIのキー入力

例えばぷよぷよの対戦。 AIもプレイヤーと同じキー入力をします。 キー入力は、 class Input { /** Onならtrueを返す */ bool isLeft(); bool isRight(); bool isUp(); bool isDown(); }class AI : public Input; class Player : public Input; { Input 1P, …

実装

ちょびちょび足していこうと思います。 新規作成時はメモリは0で、書かれたとこをnewしてくんですが 保存はどんな形式が良いでしょうか。 タイルのままシリアライズしますか? それともレイヤーごとを一枚のサーフェースとしますか? 前者だといろいろ互換性…

レイヤー管理

ちょっとずつ。

Photoshopのメモリ節約技術を推測する (4) (書き途中) を読みました

http://d.hatena.ne.jp/ryoko_komachi/20051030/1130857742: *失 言 小 町* さん コメントで「ミップマップのレベルを一段階に」とか書きました。 3Dのようにリアルタイム処理は必要ないのでフルで再計算しても大丈夫だと思ったんです。 しかし、リアルタイ…

その4

ほぼ必須なセーブについて。 セーブデータに必要な情報は現在表示してるCGだとか、鳴らしてるBGMだとか、シナリオファイルの読み込み位置だとか、大体そんなのです。 その中で読み込み位置を考えていきます。「あいうえお」という文章があって、「い」を表示…

拡大時の描き込み

1000%とかに拡大して描き込む場合はどういう処理をしてますか。 大抵のレタッチソフトでは元の位置を算出して描いた部分を再描画してるんだと思いますが、 拡大したまま描き込んで、元のサイズに戻すときに綺麗に縮小とか…。 常時だと使い辛そうですが(´ω`) …

Photoshopのレイヤの移動(上下左右)に関する謎(を読みました)

http://d.hatena.ne.jp/ryoko_komachi/20051019/1129910434: *失 言 小 町* さん 単純に実装すると、全てのレイヤを下層から上層まで合成してさらにリサンプリング(拡縮)します。 まず作業レイヤを選択した時点でそれより下層は合成して良いので、その分…

継承その2

ちょっとややこしいvirtualメソッド。 class Sound { public: virtual ~Sound() { stop(); } virtual void play() { stop(); 再生処理(); } virtual void stop() { 停止処理(); } };class SoundEx : public Sound { public: virtual ~SoundEx() { stop(); } …

継承

protected継承を間違えて覚えてました。・゜・(ノД`)・゜・。 Googleでも間違った情報がたまに…。 クラス定義でも継承でも、デフォルトはprivate属性です。 privateとなったメンバはそれ以降、外部や子はアクセスできなくなります。 (親 -> 子)・public継承 …

その2

前回の引き続いてストリーミング再生でのお話。 通知イベント用のイベントオブジェクトを(ややこしい^^;)、 static int m_nInstance = 0; ::wsprintf(name, "NGDK_DSOUND_EVENT0%d", m_nInstance++); m_hEvent = ::CreateEvent(NULL, FALSE, FALSE, nam…

その1

ストリーミング再生に DSBCAPS_CTRLPOSITIONNOTIFY フラグを使っています。 これは再生カーソルが指定した位置にくるとイベントをシグナル状態にしてくれるものです。 (yaneSDKみたいに自前で処理しても良いんですが^^;) ところが複数再生すると何故か…

sprintf? swprintf? wsprintf?

sprintf :Cライブラリ関数 swprintf:Cライブラリ関数 WideChar用 wsprintf:WindowsAPI UNICODEを定義するとwsprintfW しなければwsprintfA 動作はほとんど同じで、メモリに指定した書式で文字列を格納します。だから何と言われても、、、(´ω`)

Webサイトを作るときはほぼPHPを使ってます。 言語仕様が似てるのでC++畑のひとには取っ付きやすいかもです。 いろいろ好きなとこがあるんですが、一つは小規模用言語ならではの魅力というか、変数の型の単純さです。*1 一つの変数は数字やら文字列やらいろ…

MBCS文字列

MBCS(Multi-Byte Charactor Sets)では全て1文字で表現できるようになってます。 現在Windowsで使われるのはDBCS(Double-Byte)で、1文字2byteです。 ANSI文字列は全角文字(2byte)、半角文字(1byte)で構成されますが、 その半角文字を下位バイトに、0x…

その3

ループ構文について。 whileひとつ実装すれば他はwhileに変換して済ますことができます。 (プリプロセッサとかで)

その2

前回の続き。 newを必要最低限しか行わない→newした領域は無駄なく全て使用します。 popしようがclearしようが、領域はdeleteされません。 概要 領域の使用開始位置(offset)と使用サイズ(size)を記憶しておき、 pop_backされたらsize-1、pop_frontされた…

その1

Advシステムを作ると速度にも拘ります。 メインのAdvゲーム自体に速度はあまり関係ないですが、簡単なシューティングなど書きたいものです。 関数を作る 当然引数を取得するわけですが、それを何に格納しようかという話です。 メニューを作る関数など、ユー…

その2

引き続きエディットコントロールあれこれです。 今回は少し長いです(´ω`)

その1 Ctrl+Aの検出

名前いれたりとかに使用できるエディットコントロール。 しかし初期のままでは何かと使いにくいのでこれから改良していきます(゜ω゜*) 基本的にリソースは使いません。

その1

Advゲームでフルスクリーンモードとウィンドウモードを切替する手段として 「Alt+Enter」が提供されていることが多いです。

その2

クラスの識別子をチェックするような場合。 コピペしてると忘れることがあります(´ω`;) if (foo->id()==0) { ... } // コンパイルok 意図したプログラム if (foo->id==0) { ... } // コンパイルok しかし関数ポインタとして比較される if (foo->id==1) { ...…