- 1 名前:1 ◆SLnV723rxg mailto:sage [03/07/26 20:18 ID:PRWX91og.net]
- やる気だけはあるぞ。
- 165 名前:名前は開発中のものです。 mailto:sage [04/03/07 13:40 ID:Ha7O6gmU.net]
- なんでPeekMessage使ってるの?
- 166 名前:98 mailto:sage [04/03/07 14:44 ID:/nCa36PZ.net]
- >>163
ttp://black.sakura.ne.jp/~third/system/winapi/win.html ここと、MSDN見てます。 同じ時期に始めてもうボンバーマン作れるってすごい・・・。 >>164 DIBの前に少しかじったんですが、挫折しました。 xxx.iniというファイルを使えばいろいろできそうだけど、絶対パスで指定しなければいけない ので、使えねー!ってところで思考停止してます。 難しくてトラウマになってるんですが、ここを乗り越えないとしょぼいゲームしか作れなそうなので ちょっとずつやってみます。 >>165 昔の名残です。if(PeekMessage(&msg , NULL , 0 , 0 , PM_NOREMOVE))があってもなくても 同じだと思うので、使うときのために消していないだけです。
- 167 名前:名前は開発中のものです。 mailto:sage [04/03/07 15:08 ID:gNoMVuak.net]
- >>166
レスありがとうございます。 そこも前から見てたんですが、分からないのです。 でも、同じのを見て出来る方がいるという事は自分の努力が足りないって事ですね。 もう少し修行してきます。 ボンバーマンは全部マスク画像を使ってAND・ORする方法でやったのでそんなに難しくは無かったです。 では。RPG製作頑張って下さい。
- 168 名前:98 mailto:sage [04/03/07 17:38 ID:/nCa36PZ.net]
- >>167
俺もまだよく分かってないんですが、ちょっとずついじってれば使えるようになると思います。 汚くてよければ>>153と>>158にソースがあるので、よかったらドゾー 右スクロール時のみ16ドット移動を2回するプログラム www.geocities.co.jp/SiliconValley-Bay/2736/zz38.txt 効率が悪すぎるような気がする。こういうのをスパゲティソースというのかもしれない。 (´-`)。oO(AND ORってなんだろう)
- 169 名前:98 [04/03/09 18:14 ID:quioYjmo.net]
- C/C++始めて一ヶ月たったので、今回はEXEでうp(28.4KB)
www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a1.zip 次はキャラ表示をしようと思う。透過処理が難しそう。
- 170 名前:名前は開発中のものです。 mailto:sage [04/03/09 20:50 ID:nDvOJ8eM.net]
- >>169
透過処理はAND OR
- 171 名前:名前は開発中のものです。 mailto:sage [04/03/09 22:45 ID:sCetmjvX.net]
- >>169
透過処理は単に「抜き色を決めてその色以外を転送する」処理をすれば よいだけ。キャラクタのDIBを1ピクセルずつ背景に転送していっても、 速度的には問題ない。 この場合は32ビットDIBだと楽だね(DWORD単位でアクセスできるから)。
- 172 名前:98 mailto:sage [04/03/11 19:38 ID:e07lqvXR.net]
- >>170
AND ORでググルとグーグルにヌッコロされるのでだめです www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=AND+OR+C&lr=lang_ja >>171 肝心な部分が分かってないからなのか、実際にやろうとするとなぜかできないです。 www.geocities.co.jp/SiliconValley-Bay/2736/zz45.txt 1ピクセルずつ表示もやってみたんですが、俺のPCのスペックのせいか、若干遅く感じました。 ところで、俺はPCゲームはあまりやったことがないのでよく分からないんですが、 キャラが32*32ドットってどうなんでしょうか。どうも小さく感じます。
- 173 名前:98 mailto:sage [04/03/11 21:52 ID:e07lqvXR.net]
- 微妙にずれるものの、透過しつつキャラクタのDIBを1ピクセルずつ背景に転送は成功。↓
www.geocities.co.jp/SiliconValley-Bay/2736/zz46.txt なめらかにスクロールさせるためにマップをtimeGetTimeで30msごとに描画しているんですが、 この透過方法だとキャラクタ描画処理が遅いため、歩行アニメーションをつけるときに いろいろと苦労しそう。 メモリに読み込むときに透過処理をしたほうがよさそうだけど、なぜか透過しない。
- 174 名前:98 [04/03/12 20:39 ID:grlqwW2o.net]
- 上がソースで下が実行ファイル
www.geocities.co.jp/SiliconValley-Bay/2736/zz50.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a2.zip 問題点:画面がちらつく。キー入力を微妙に記憶してしまう。 次は街を作って、マップ切り替えをしようと思う。 どんなゲームにするかとかもそろそろ考えないといけないけど、そっちは興味がないので 適当に募集中。
- 175 名前:名前は開発中のものです。 [04/03/12 21:26 ID:qU+SxdKI.net]
- >画面がちらつく。
CreateDIBSectionでオフスクリーンバッファを作るんだ! ダブルバッファリングともいう。 >キー入力を 簡潔に説明するのは難しいんだが、今のキー押下処理→描画処理のやり方は ゲームのつくりk他としては完全に間違ってる。 ゲームループとか検索してみるとわかるかもしれん。 他のスレのレスからヒントをば。 pc2.2ch.net/test/read.cgi/gamedev/1020417733/124 >タイマ(WM_TIMER)は不安定なので普通ゲームには使わないぞ。 >↓ここの1.4.1みたいに処理すべし。 >www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/
- 176 名前:98 mailto:sage [04/03/13 19:41 ID:xCK866zy.net]
- >>175
キー入力はできますた。かなり操作性向上 DIBSectionが難しくててこずってます。 本の通りにDIBSectionを使ってるはずなのに、エラーが出るのはなぜだろう。
- 177 名前:名前は開発中のものです。 mailto:sage [04/03/14 08:15 ID:wW4VHkXB.net]
- >>176
コンパイル時のエラーなら、型があっていない(またはSelectObjectなどが返す値を適切にキャストしていない)とか。
- 178 名前:名前は開発中のものです。 mailto:sage [04/03/14 17:48 ID:a3XrN6fU.net]
- >>176
とりあえずエラーを貼り付ける。
- 179 名前:98 mailto:sage [04/03/14 22:20 ID:13t3R65N.net]
- エラー E2034 zz53.cpp 135: 'void *' 型は 'HBITMAP__ *' 型に変換できない(関数 __s
tdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラー出るソース www.geocities.co.jp/SiliconValley-Bay/2736/zz53.txt (HBITMAP)つけてみたらコンパイルは通ったんですが、DIBSectionには何もさせていない のに、強制終了します。 本はCで書かれているんですが、自分の書いてるのがたぶんC++なので、 そのへんの問題でしょうか。
- 180 名前:名前は開発中のものです。 mailto:sage [04/03/14 22:32 ID:RZwlVtdf.net]
- >>179
>(HBITMAP)つけてみたらコンパイルは通ったんですが、DIBSectionには何もさせていない >のに、強制終了します。 とりあえず、怪しいところをコメントアウトするなり変数の値を表示さ せるなり(デバッガがあるならブレークポイントを入れる)してどこで 落ちるのか、特定してみた方が良いね。 >本はCで書かれているんですが、自分の書いてるのがたぶんC++なので、 >そのへんの問題でしょうか。 そうだね。 CとC++では、デフォルトの型チェックが違う。 C++でSelectObjectの返すハンドルをGDIのハンドルを保持する変数に 入れたいなら、個別にGDIのハンドルの型に合わせたキャストが必要。 まあ、拡張子をcにしてCのソースとしてコンパイルしても良いかもし れんがw ところで「本」って何の本?
- 181 名前:98 mailto:sage [04/03/14 23:00 ID:13t3R65N.net]
- ゲームプログラミング練習帳 という本見てます。
デバッガですが、今問題にしている部分より前の段階ですでに止まってくれるので 使い物にならない状態です。止まる部分も、CとC++の違いのせいの気がします。 Cは全然知らないんですが、見ているサイトも本もCを使ってAPIの解説をしているので、 Cで書き直すのが早いような気がしてきました・・・
- 182 名前:名前は開発中のものです。 mailto:sage [04/03/14 23:21 ID:gdC9c3eD.net]
- >>179
原因は133行目の&lpPixel。 hBMP = CreateDIBSection(hdc , &biInfo , DIB_RGB_COLORS , (LPVOID *)(&lpPixel) , NULL , 0); ↓ hBMP = CreateDIBSection(hdc , &biInfo , DIB_RGB_COLORS , (LPVOID *)(lpPixel) , NULL , 0); おかしな指定をしたせいで、lpPixelのポインタの値が変な値に書き換わって壊れてしまっている。 HeapAllocしたときのlpPixelの値と133行目でのlpPixelの値を調べてみれば、壊れているのが分かるはず。 なぜ、上の指定の仕方ではいけないのか、とか、どうして値が壊れるのかとかは、自分で考えてみてね。
- 183 名前:名前は開発中のものです。 mailto:sage [04/03/14 23:32 ID:gdC9c3eD.net]
- あぁ、97行目の
>iOffset = *(LPDWORD)(lpBMP + 10);//iOffset ピクセルが格納されてるアドレス、ここでなぜかデバッガ止まる でとまるのは、BMPファイルが見つかってないからでしょ。多分。 ちゃんとCreateFileのエラー処理を汁! あと、 >(HBITMAP)つけてみたらコンパイルは通ったんですが、 これは、Windows的には正しい。Cだと書かなくてもコンパイルと折るけど、 C++は型違いを厳密に見るから、型変換しないといけないわけだ。
- 184 名前:182 mailto:sage [04/03/15 00:06 ID:mfA2vkrj.net]
- ごめn>>182は違った。
CreateDIBSection()なんか久しぶりに使ったから忘れてたよ。 >>179の使い方なら、 hBMP = CreateDIBSection(hdc , &biInfo , DIB_RGB_COLORS , NULL , NULL , 0); でいいんじゃない?一応うごいたよ。
- 185 名前:名前は開発中のものです。 mailto:sage [04/03/15 00:14 ID:BH49Bw7k.net]
- ちうか、CreateDIBSectionで作ったビットマップ使って無いじゃん…
あと、hdcをグローバル変数にするのはよくないと思う。
- 186 名前:98 mailto:sage [04/03/15 00:37 ID:YR7Ealek.net]
- >>182
(LPVOID *)(lpPixel)でもNULLでも動きました。 CreateDIBSectionの第4引数にはポインタのポインタを指定しなければいけないのに、(LPVOID *)(&lpPixel) だとアドレスのポインタのポインタだから間違いというところまでは分かったんですが、 Cだと(LPVOID *)(&lpPixel)が正しくて、C++だと(LPVOID *)(lpPixel)が正しいということは ポインタの書き方がCとC++で違うということなんでしょうか。。 >>185 使おうとしてコンパイルエラーが出たので、まずは何もさせずにコンパイルできることを目指してました。 >hdcをグローバル変数にするのはよくない ローカル変数の呼び出し方がよく分からないので、とりあえずグローバル変数にしてあります。 分かり次第直します。
- 187 名前:名前は開発中のものです。 mailto:sage [04/03/15 11:07 ID:BH49Bw7k.net]
- >>186
>(LPVOID *)(lpPixel) は間違い。 引数の指定の仕方としては、もとのソースの(LPVOID *)(&lpPixel)が正しい。 ただし、(LPVOID *)(&lpPixel)のままだと、CreateDIBSectioiでlpPixelが上書きされてしまうから 今度は透過処理の部分で今度は止まるよ。 CreateDIBSectionの説明をよく読んで、正しく使うべし。 >ローカル変数の呼び出し方がよく分からないので、とりあえずグローバル変数にしてあります。 まずは、そっちを勉強した方が良いよ。
- 188 名前:名前は開発中のものです。 mailto:sage [04/03/16 21:28 ID:av2PqUu3.net]
- ローカル変数は関数の冒頭で処理を記述する前に宣言する。
C言語の場合はね。 C++はドコでも良いことになっている。
- 189 名前:98 mailto:sage [04/03/16 23:08 ID:ALMDs/3/.net]
- 難しくて混乱してきたのでちょっと整理
1.DIBとしてもDDBとしても操作可能なビットマップをCreateDIBSectionで作る 2.デバイスコンテキストを2つ用意する 3.デバイスコンテキストAに表示するマップより1マス分大きいマップを描画する。 4.AからデバイスコンテキストBに表示する部分だけ描画 5.Bから画面に描画 たぶんこうすればいいんだと思うんですが、4くらいで行き詰ってます。 hdcですが、仮引数とか使ってみたんですがだめでした。
- 190 名前:名前は開発中のものです。 mailto:sage [04/03/16 23:47 ID:R0OmoIwo.net]
- >>189
DIBSectionベースで、一マス多く描いたスクロール用ビットマップから 表示用ビットマップに転送していく、というのならこんな感じでやるとか。 www.sm.rim.or.jp/~shishido/threadsc.html
- 191 名前:名前は開発中のものです。 mailto:sage [04/03/16 23:52 ID:PRaC3s4r.net]
- だめですた、とかいうなら、詳細な症状を言うか、ソースを提示すべし。
初心者はエキセントリックなソースを書くからな。 >3.デバイスコンテキストAに表示するマップより1マス分大きいマップを描画する。 そんなことはない。CreateDIBSectioniで作るのはウィンドウサイズと同じ大きさで良いよ。 というか誰だよこんな嘘おしえたの。わざわざ難しく教えて面白いのか、といいたい。 これまでウィンドウのhdcに対して行ってきた描画とまったく同じ事をCreateDIBSectioinで つくったDIB(を設定したhdc)に行えばいい。 んで、ウィンドウのhdcに対しては、かわりに↓をおおなう。 >4.AからデバイスコンテキストBに表示する部分だけ描画 この部分は、CreateDIBSectionで作ったDIBの内容をそのままウィンドウに転送するだけでいい。 ウィンドウのhdcは、BeginPaintで得られたhdcか、GetDC(hWnd)で得られたhdcだ。 なぜわざわざCreateDIBSectionで作ったDIBに描画してからウィンドウに転送するのか といえば、それはチラツキをなくすためだ。なぜちらつきが起こるかは本に書いてあった?
- 192 名前:98 mailto:sage [04/03/17 00:57 ID:AN01uPyl.net]
- >>190
今の状態でマルチスレッドにまで手を出すのはちょっときついです・・・ >>191 www.geocities.co.jp/SiliconValley-Bay/2736/zz55.txt StretchDIBitsのデバイスコンテキストをhdcにすれば描画されるんですが、1段階ふむとなぜか だめです。 >なぜちらつきが起こるか 本には、DIBSectionを使うことで効率がよくなるようなことは書いてありました。
- 193 名前:名前は開発中のものです。 mailto:俺は解読に2時間もかかったアホage [04/03/17 02:56 ID:QickIzjR.net]
- >>192
なぜかじゃねーよ。 まじで、ローカル変数のこと勉強しろ!今すぐ。 変数スコープって分かるか? まぁ、一応答えを。 ↓をグローバル変数に。以上。 86:HDC hdcBMP; ローカル変数は一度関数から出ると無効になるんだよ! WM_CREATEでhdcBMPに設定しても、WM_PAINTの時はすでに無効になってるんだよ! ローカル変数のことがちゃんと理解できるまでstatic変数も禁止。 グローバル変数も最小限に汁!それが出来るまで先に進むべからず。
- 194 名前:190 mailto:sage [04/03/17 07:13 ID:EmljVs5P.net]
- >>192
いや、マルチスレッドにしろという話じゃなく、描画の流れを参考にしたら、ということなんだがw
- 195 名前:名前は開発中のものです。 mailto:sage [04/03/17 09:55 ID:ukkq6pEc.net]
- >>193
まぁ落ち着けや。
- 196 名前:98 mailto:sage [04/03/17 23:43 ID:AN01uPyl.net]
- 変数と、ついでにクラスも勉強しておきました。
>変数スコープって分かるか? :: 知らなかったけど使ってみます。 先に進むの禁止されたのでソースを見やすくした。 www.geocities.co.jp/SiliconValley-Bay/2736/zz70.txt スクロール中に画面が消えるのは仕様なので気にしないでください
- 197 名前:名前は開発中のものです。 mailto:sage [04/03/18 00:33 ID:Si6/VCoc.net]
- つーか、OO使わないのかね?
- 198 名前:名前は開発中のものです。 mailto:sage [04/03/18 00:33 ID:Si6/VCoc.net]
- ヤターIDにVCデタヨー
- 199 名前:名前は開発中のものです。 mailto:sage [04/03/18 02:13 ID:XsvAPJOC.net]
- >>196
グローバル変数は「使う目的を明確にあらわした」変数名をつけるようにね。 たとえば、「lpbiInfoってどのBITMAPの情報なの?」ということが、変数名を見ただけで分かるように。 んで、前からずっと気になってたけど >while((timeGetTime()-timeSc)<SecondPerSc); このビジーループは本に載ってたやり方なの? もしそうならその本は糞と認定せざるを得ないので書名を教えて。 「ビジーループ」って単語が分からない?なら、googleとかに聞いてみてね。
- 200 名前:名前は開発中のものです。 mailto:sage [04/03/18 02:53 ID:Si6/VCoc.net]
- 今始めてマトモにソース見たんだが・・・・
猫でもわかるプログラミングから始めることをお勧めする。 もっとコンソールいじってからにしておきなさい。
- 201 名前:98 mailto:sage [04/03/18 23:35 ID:r5sO1u2T.net]
- >>197
よく分からないのでたぶん使わないです。 >>198 おめでd >>199 自分で作ったSleepもどきです。 ビジーループでググったら、負荷が高くなるからやめろと書いてあったので 他のやり方を考えてみます。 >>200 コンソールだけだと何を作っていいのか分からないのと、モチベーションが続かないので winAPIと並行してやっていきます。
- 202 名前:名前は開発中のものです。 mailto:sage [04/03/19 00:17 ID:whgiIXKB.net]
- >>201
>自分で作ったSleepもどきです。 >ビジーループでググったら、負荷が高くなるからやめろと書いてあったので >他のやり方を考えてみます。 そか。えらい。 あとは、ちゃんとしたゲームループを作って、 ・入力→ゲームの状態(主人公のマップ上での位置とか)の更新 ・描画処理 をきっちり分ければ、ゲームの基礎は出来たも同然。 なぜ分けないといけないかというと、今のままだと、画面上に主人公とは独立して 動くNPCが出てきたときに処理できないからね。
- 203 名前:200 mailto:sage [04/03/19 08:07 ID:5YapUc1Z.net]
- >>201
気持ちは分かるんだけど、せめて一回くらい目を通しておくべきだと思う。 それだけで大分違うはず。
- 204 名前:98 mailto:sage [04/03/20 18:53 ID:th+dSxtZ.net]
- >>202
NPCの数が一定ならなんとか作れそうなんですが、 不定になるとどうやればいいのかさっぱりです。 >>200 理解したかどうかは置いといて、一通り読んでおきますた。 今のまま作っていくとグローバル変数だらけになりそうなので www.geocities.co.jp/SiliconValley-Bay/2736/a001.txt こんなの作ってみた。 変数名考えるのがマンドクセなんですが、何かこつとかありますか?
- 205 名前:98 [04/03/20 23:02 ID:th+dSxtZ.net]
- たぶん完成。上がソースで下が実行ファイル
www.geocities.co.jp/SiliconValley-Bay/2736/zz73.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a3.zip ・ちらつきが減った。 ・グローバル変数が少し減った。 次はマップ切り替えは中止して、エンターキーを押したらコマンドが出る、というのをやろうと思う。
- 206 名前:名前は開発中のものです。 mailto:sage [04/03/20 23:23 ID:70F0it+2.net]
- まだちょっとちらつくのは、InvalidateRectの最後の引数がTRUEだから。
あと、無意味なクラスが気持ち悪いぜ!
- 207 名前:名前は開発中のものです。 mailto:sage [04/03/21 00:26 ID:BKuLrlOv.net]
- >>205
動くが遅いけど、逆にそれが心地よかったり。クラスが分からんから 見れないけど、遅いのはたぶん1ドットずつずらしてるからだと思う。 2ドットずつ、極端な話32ドット一変にずらしてしまうと早くなると思う。 >自分で作ったSleepもどき 自分もコンソールの時はそれで、ウィンアプリの時はちゃんとPeekMessageを 使わずGetMessage+イベント取り分でやってた。ライブラリのTimerだと精度が 悪くなるから何か工夫していたと思うけど忘れてしまった。 >変数名考えるのがマンドクセなんですが、何かこつとかありますか? 自分もよく悩みます。自分はできるだけ1単語にして、その分 コメントをしっかりつけるようにしています。ただ、グローバル変数は まず使いません。ファイル分割するようになると返ってめんどくさくなったり するので。後、以下の所も参考にどうぞ。 pc2.2ch.net/test/read.cgi/tech/1067171530/l50 pc2.2ch.net/test/read.cgi/gamedev/1024902432/l50
- 208 名前:98 mailto:sage [04/03/21 19:51 ID:P8h6pce6.net]
- >>206
ちらつき撲滅できますた! >>207 ビジーループを避けるためにいろいろ工夫したら結局Sleepになってしまった orz >コメントをしっかりつけるようにしています これいいですね。真似してみます。 コマンドは無理だったので、メッセージウィンドウ表示。 www.geocities.co.jp/SiliconValley-Bay/2736/zz76.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a4.zip メッセージウィンドウの背景と文字色を変更したいんですが、 SetTextColorが使えないです。 こういうときはどうしたらいいんでしょうか
- 209 名前:名前は開発中のものです。 mailto:sage [04/03/21 20:02 ID:lBIVIhzW.net]
- 静止状態では、結局CPU100%使っちゃってるよ。だめじゃん。
あと、マップ表示がスクロール終わるまで帰ってこない関数って後で困るよ。 スクロールしてる最中に同時にNPCを動かしたくなったらどうするのさ?
- 210 名前:98 mailto:sage [04/03/21 20:27 ID:P8h6pce6.net]
- 進むの中断して組みなおして出直してきます。。
- 211 名前:名前は開発中のものです。 mailto:sage [04/03/21 21:20 ID:lBIVIhzW.net]
- スクロール位置の更新と描画が分離されてなかったり、
GDIじゃなくDirectXつかってたりするが、 ↓見たいな感じにすればいいよ。 ttp://www.sm.rim.or.jp/~shishido/drpgs1.html ゲームプログラミング練習長持ってるんだっけ? 読んだこと無いけど、そっちのほうもこういう処理になってない?
- 212 名前:98 mailto:sage [04/03/22 21:35 ID:qIg3ILGt.net]
- >>211
見てみました。↓draw()でSleep代わり?にこうしてるみたいなんですが、 if (GetTickCount()>dwTime+5) dwTime=GetTickCount(); else return; 前に自分で作ったのが↓ dwTime = GetTickCount(); while(GetTickCount()<dwTime+5); 上と下って何か違いあるんですか?どっちもビジーループに見えるんですが。 >そっちのほうもこういう処理になってない 本のほうではDirectX使ってないです。他の細かいところも、違う書き方してます。
- 213 名前:名前は開発中のものです。 mailto:sage [04/03/22 22:18 ID:IkgfwbwO.net]
- ていうか>>211のURLはゲームプログラミング練習帳の作者ジャン。
んでね、 www.sm.rim.or.jp/~shishido/src/drpgs1.txt } else draw(); // 描画処理 ここを } else { draw(); // 描画処理 sleep(1); } にすれば少なくともビジーループじゃないでしょ。 んで、>>211で言いたかったのはビジーループのことじゃなくて、>>209の >あと、マップ表示がスクロール終わるまで帰ってこない関数って後で困るよ。 >スクロールしてる最中に同時にNPCを動かしたくなったらどうするのさ? これのこと。 上のURL(+Sleepバージョン)と>>208のプログラムを良く比べてみ?
- 214 名前:練習帳著者 mailto:sage [04/03/22 22:50 ID:8UFWL+KK.net]
- >>212
>if (GetTickCount()>dwTime+5) dwTime=GetTickCount(); >else return; これは、一つのif文の中で書けば if (GetTickCount() > dwTime + 5) { dwTime = GetTickCount(); ゲームの処理(draw()の中身) } という流れ。 「前回処理時間から指定時間(5ms)が過ぎていたら、現在の時間を 処理時間として記録し処理を行う」もので、処理を行わない場合には そのままメインループ(if文の外にあるメッセージポンプ)に処理が 返るから、処理がそこで停まるビジーループにはなりません(あの ソースももう5年前・・・。RPG関連の記事はそろそろ全面的に書き 直さないといけないですかねえ)。 >while(GetTickCount()<dwTime+5); だと「指定時間が過ぎるまで」どうなります?
- 215 名前:練習帳著者 mailto:sage [04/03/22 22:58 ID:8UFWL+KK.net]
- まあ、実際にRPG作ってみると「一定の周期で処理を行う関数」にゲーム
の処理をすべてまとめるのは無理があるから、メインループよりはゲーム 処理用にスレッド作った方が楽になるかな、という気がしてきたんですが。 特に厄介なのは、戦闘シーンやイベントの待ち時間・・・。 最初はあち こちでPeekMessege()してたけど、これはちょっと違うかな、と。 スレッド作れば、最悪無限ループにしてもUI停まりませんからね(^^;。 もちろん、最終的なプログラムにするときにはスレッド内からの終了処理 (メインスレッドからの終了指示の監視)は必要だろうけど。 >>214 >ていうか>>211のURLはゲームプログラミング練習帳の作者ジャン。 そうですね。あのページの内容はもうかなり古いものもあったりして 書き直さないとなあ、と思っている部分が多いんですが、あちこちに URL張られているようでちょっと焦ってます(^^;。 とりあえず、「4方向スクロールのマップ表示とキャラクタの透過描画」 あたりに関しては、もうちょいましなソース上げておくつもり。
- 216 名前:名前は開発中のものです。 [04/03/22 23:27 ID:hc5U3G0l.net]
- 本物キター
- 217 名前:名前は開発中のものです。 [04/03/22 23:29 ID:mioo0vPT.net]
- 著者降臨age!
- 218 名前:名前は開発中のものです。 [04/03/22 23:33 ID:nq9Pmduh.net]
- 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな 上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
- 219 名前:98 mailto:sage [04/03/22 23:46 ID:qIg3ILGt.net]
- >>213
ああ、分かりました! 1ドット描画するたびに関数を終了して、グローバル変数とか構造体とかで 描画回数をカウントしておいて、1マス描画し終わったらカウンタリセットする。 すると割り込み処理ができるようになる。 >>215 うお・・・著者様ですか・・・ while(GetTickCount()<dwTime+5); だと5ms経過するまで待機しかできない上に、処理が重くなってしまう。でいいでしょうか・・
- 220 名前:名前は開発中のものです。 mailto:sage [04/03/23 00:02 ID:4auKbf0z.net]
- >の処理をすべてまとめるのは無理があるから、メインループよりはゲーム
>処理用にスレッド作った方が楽になるかな、という気がしてきたんですが。 この辺は、伝統的には所謂タスクシステムで解決してきたのかな。 スレッドだと同期が大変過ぎるしこういう用途には重すぎると思う。 まぁ、タスクシステムっていってもいろいろなやり方があるみたいだけど…
- 221 名前:名前は開発中のものです。 mailto:sage [04/03/23 00:47 ID:9F6tXsaP.net]
- シナリオスクリプトを実装する時にはスレッドにしたりもする
ファイバー(コルーチン)という手もあるようだけどね 異なるプログラム方式の連携 ttp://www.jah.ne.jp/~naoyuki/Writings/VScheme6.html
- 222 名前:名前は開発中のものです。 mailto:sage [04/03/23 01:05 ID:PMWtRlHb.net]
- シナリオなんかだと、タスクシステムでコールされるタスク関数を
ファイバ(マイクロスレッド、コルーチン、継続でもOK?)にしておくと 効率よく開発できるかな、とかおもったりしたけど全然試してない。 このへんは、やね本2だかに書いてあるらしいけど読んだこと無いです。
- 223 名前:名前は開発中のものです。 mailto:sage [04/03/23 02:20 ID:JCV/36ob.net]
- 俺もスレッド使わないほうがいいと思う
マルチスレッドを毛嫌いするわけじゃないが、明確な理由なしにスレッド化するのはやめたほうがいい ゲームで必要になる場面があるとすれば、SLGの思考ルーチンくらいだと思う で、ちょっとスレ違いの話題になるが、 ファイバってCreateFiber関数とか使う奴のこと? だとするとあんなの使わなくても関数ポインタ切り替えでいいじゃん、と思うんだが・・・ #少なくともゲームにおいては。なんかいい利用方法あるならスマン
- 224 名前:名前は開発中のものです。 mailto:sage [04/03/23 02:48 ID:PMWtRlHb.net]
- >だとするとあんなの使わなくても関数ポインタ切り替えでいいじゃん、と思うんだが・・・
その関数を減らすために使うんだよ。 普通はその関数の操作対象のオブジェクト(やシーンなど)の状態が変わったら 関数を切り替えるわけでしょ。ファイバを使うと、その「状態」が「関数をどこまで 実行したか」で表せるようになるから、状態ごとにいくつかに分かれてた関数を ひとつに出来る、と。 まぁ、でもこういうのは大概スクリプトで実現するような気がしないでもない。
- 225 名前:223 mailto:sage [04/03/23 05:14 ID:JCV/36ob.net]
- >>224
ちょっと待て、その利点は間違ってると思うぞ ファイバ使っても関数減らすことになるとは思えない このスレなのでRPGの例で行くが、 RPGにおける「状態」ってたとえば ・マップ移動(キー入力待ち) ・マップ移動(スクロール) ・戦闘中 とかに分かれるよね ファイバを使う場合、これらの関数をCreateFiber関数で登録し、SwitchToFiberで切り替えるだけだ。 使わなくとも一旦呼び出し元ループに戻って別の状態用関数を呼び出すのと関数の数はほぼ変わらん #状態の定義が食い違ってるかも? スレ違い継続&長文スマソ
- 226 名前:名前は開発中のものです。 mailto:sage [04/03/23 08:41 ID:PMWtRlHb.net]
- >>225
もっと先の話だよ。 イベントシーンとかそのへん(応用先はそれだけじゃないよ?) スレ違いだが、シューティングの敵の動きの記述に使ったりもした。
- 227 名前:名前は開発中のものです。 mailto:sage [04/03/23 09:03 ID:PMWtRlHb.net]
- あぁ、でもこの場合、少なくてもマップ移動はまとめられるね。
ヘンテコ擬似コードだけど、こんな感じ?(描画はメインファイバ側でやるという前提) void MapMove() { while(1) { //方向キーが押されるまで待つ while (!CheckHitCursorKey()) SwithFiber(mainFiber); MoveMap(GetKeyState());//スクロール方向を決める処理 //ここからスクロール処理 for (int i = 0; i < MAP_CHIP_SIZE; i++) { ScrollMap();//1ドット分スクロール SwitchFiber(mainFiber); } } } この場合にまとめるのが正しいかは議論ありそうだがそれはおいといて、例としてね。
- 228 名前:練習帳著者 mailto:sage [04/03/23 09:10 ID:R4NaancD.net]
- >>220
別スレッドの利点は、他のスレッドと同期する必要をなるべく生じさせ ない、ゲームに関する処理を一本道の流れに分離しておくような形式に できた場合、Windowsのシステムの流れをあまり意識しないでゲームの 処理に集中できるかな、と。 実際、戦闘やスクリプトベースのイベント処理も含めてRPGのデータ処理 やバックバッファ(あとはウインドウのDCに出力するだけのDIBSection) への描画処理をすべて別スレッド内で行うシステムを作ってみたんですが、 比較的単純なシステムではプログラムも一本道の単純なものにまとめられ そうで、これはこれでよさそう。 小規模で単純なRPG/ADVでは、こういったタイプの処理もありかも。 まあ、一定時間ごとに呼び出す処理用関数で状態を管理しながら処理して いく、という形にまとめられればその方がよさそうですけどね(ただ、 ゲーム本体の処理以外の部分でたいしたことをしていなければ毎回状態を 管理しながら一定時間ごとに処理を行う、という流れはスレッドで連続的 に実行しているように書く、というのと流れとしては同じになりそう)。 私もメインループ内で一定時間ごとに状態に応じて振り分け、という設計 を考えていましたが、別スレッドで処理する実験結果を見ると意外にうま くいきそうだったんで、とりあえず別スレッドを作る方向で作っています。 ゲームの処理の流れを本格的に管理するつもりなら、フレームワークの開発 からやる方がよさそう・・・。
- 229 名前:名前は開発中のものです。 mailto:sage [04/03/23 11:14 ID:PfXAGYNf.net]
- エェー?本当にちゃんと同期できてる?データの整合性もちゃんと保ててる?
マルチCPUの場合は、同じデータをアクセスするコードが「同時に」2つ以上走ることも あるんだよ? マルチスレッドは、データの不整合性、デッドロック、抜け出せないロッキング、 優先順位の逆転などなど気をつけないといけない罠が多すぎるので、どうしても必要 なところ意外では使わないことにしてるよ。 スレッドがだめって言ってるわけじゃないけど、初心者向けでは無いよね。 「処理の流れ」を記述したいときは、大概スクリプトにするかなぁ? マイクロスレッドでもいいと思う。
- 230 名前:名前は開発中のものです。 mailto:sage [04/03/23 12:01 ID:JCV/36ob.net]
- >>227
んー・・・なんとなく言いたいことは分かった、ありがとう けどやっぱタスクシステムから乗り換えるほどの理由じゃないっす #スレ違いすまんがSTGの敵の動き制御部分は特に意味がなさそう #理由はたとえば同じ種別の敵が10いたら同じ関数を10回実行しなきゃいけない。 #けど同じ関数を回すわけだから結局状態データは外部に置かなきゃいけない #同じ関数を10個ファイバとして登録して再利用するにしても、 #結局被弾したとかの状況によって初期化するわけだから外部で制御しても大差なし #そもそも最近のハードだと敵の動きは外部データで持つことが多いので #違う敵でも同じ関数で処理する >>228 Windowsのシステムの流れってぶっちゃけメッセージループだよね なら別スレッドにする必要はないかと PeekMessage(およびそれに付属する処理)を1タスクとして考えればいいだけ たとえばバックバッファを作った後でPeekMessageを呼び出せばいい
- 231 名前:名前は開発中のものです。 mailto:sage [04/03/23 12:25 ID:rzkxl8IS.net]
- >>230
>けどやっぱタスクシステムから乗り換えるほどの理由じゃないっす いや、タスクシステムと併用するんだよ当然。 タスクシステムからタスク関数を呼び出すと思うけど、それをファイバにするという話。 >#同じ関数を10個ファイバとして登録して再利用するにしても、 >#結局被弾したとかの状況によって初期化するわけだから外部で制御しても大差なし まぁ、被弾とか非同期で状態が変わる部分は、別関数にせざるを得ないよね。「例外(Exception)」だし。 でも、多数の状態が(ほぼ)シーケンシャルに切り替わっていく状態なんかでは、状態ごとに関数分けたり 状態変数作ってswitchで分けたりするよりは、すっきりしたプログラムになると思う。 まぁ、もちろん、 >#そもそも最近のハードだと敵の動きは外部データで持つことが多いので なので>>224ではスクリプトでやる場合が多いと書いたわけだけど… どっちにしろ「使いようによっては便利なときもある」って話だ。 全ての場合で使えると言ってるわけでもない。ファイバはメモリ食うしね。
- 232 名前:名前は開発中のものです。 mailto:sage [04/03/23 16:31 ID:cY6fF1y+.net]
- マルチスレッドにする利点はタイトルバーをクリックしても処理がとまらないことかな
- 233 名前:98 mailto:sage [04/03/23 21:04 ID:s4+zR2jB.net]
- よく分からないんですけど、マルチスレッド使えないとやばいっていうことでしょうか?
今度こそマップスクロール完成版↓ www.geocities.co.jp/SiliconValley-Bay/2736/zz78.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a5.zip ・静止状態にCPU100%になっていたのを修正(Sleep(1);をつけた) ・メッセージウィンドウ表示時にCPU100%になっていたのを修正(Sleep(1);をつけた) ・描画関数を2つに分割 なんか処理が重くなったような気がする・・・
- 234 名前:名前は開発中のものです。 mailto:sage [04/03/23 21:12 ID:PMWtRlHb.net]
- んじゃ、次は、DrawMapの、「〜スクロール時描画」を「静止マップ表示」ひとつにまとめよう!
これでかなりすっきりするはず。
- 235 名前:98 mailto:sage [04/03/24 22:18 ID:w/FFfgKd.net]
- すっきりしたかどうか分かりませんが、まとめてみました↓
www.geocities.co.jp/SiliconValley-Bay/2736/zz79.txt ・描画方法を少し変更 メッセージウィンドウ表示は置いといて、次はNPCを作ってみる予定
- 236 名前:98 mailto:sage [04/03/29 19:11 ID:hm6pjM86.net]
- ログが消えてる(´・ω・`)
NPCの移動をなめらかに描画するのが難しいんですが、 なんかいい方法とかないでしょうか・・・
- 237 名前:98 [04/03/30 22:16 ID:W6u+pmd7.net]
- NPCがどうしてもうまく描画できないので、マップ自体の描画方法を
「何か起こったら描画」から「常に一定時間おきに描画」に変更してみた。 www.geocities.co.jp/SiliconValley-Bay/2736/zz88.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a7.zip 方向性が間違ってるような気がしないでもないんですが、 こういう描画方法でもいいんでしょうか
- 238 名前:98 mailto:sage [04/04/01 21:53 ID:xdIEUIEH.net]
- NPCなめらか移動
www.geocities.co.jp/SiliconValley-Bay/2736/zz91.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a8.zip NPCの移動がランダムではないような気がする。 気のせいかもしれないけれど、ある方向にいったん進んだら、 次に進む方向も同じになる確率が高い。 次は当たり判定をつけようと思う。
- 239 名前:200 mailto:sage [04/04/02 00:46 ID:HxQygUy0.net]
- srand((unsigned)time(NULL));
は、最初に一回だけね。ループには入れないで。 srandは乱数ジェネレータの初期値。 rand()関数はsrandを実行しなくても一回一回違う値を返すけど、もう一度プログラムを実行してもまた同じ値を返してきてしまう。 一回目の結果:7,2,5,6,4,1... 二回目の結果:7,2,5,6,4,1... こんなカンジで。 srandでtime(NULL)を与える理由は、プログラムを起動するごとに違う値を出力するようにするため。 一回目の結果:7,2,5,6,4,1... 二回目の結果:5,1,8,4,3,7... ってカンジで。 timeは確か秒単位だったから1秒以内ならrandが同じ結果を返すことになる。 って、コレも猫でもわかるプログラミングで説明されていたような・・・
- 240 名前:200 mailto:sage [04/04/02 00:49 ID:HxQygUy0.net]
- あ、別のサイトだったっぽいです。
- 241 名前:98 mailto:sage [04/04/02 20:19 ID:RjQBCx/D.net]
- おまじない程度の認識しかなかったので、ここが原因とは思いませんでした。
ランダムに動くようになりました。 ふと思ったんですが、WINAPIなら timeGetTime()%10; でも0~9のほぼ乱数ができるような 気がするんですが、これって邪道でしょうか。
- 242 名前:98 mailto:sage [04/04/02 22:26 ID:OS/Q3nYt.net]
- ↑自己レス 同時に複数の乱数を得たいときに不便なのでやっぱりだめ
当たり判定をつけた。ついでに歩行アニメーションもつけた。 www.geocities.co.jp/SiliconValley-Bay/2736/zz94.txt www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a9.zip 次はマップエディタを作る予定。
- 243 名前:98 [04/04/03 22:19 ID:eDSQOtXr.net]
- マップエディタセーブ機能なし
www.geocities.co.jp/SiliconValley-Bay/2736/zzz2.txt www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_1.zip マップエディタ作る時間 > テキストでマップを作る時間 な気がしてきた。 APIのファイル操作はできれば避けたいんですが、 #include <window.h>をすると#include <fstream>できなくなるんでしょうか?
- 244 名前:練習帳著者 mailto:sage [04/04/03 23:40 ID:ClmmNDdO.net]
- >>243
マップエディタはイベント配置機能なども含めRPG開発では必須 になるけど、開発するのは本体よりも大変かもしれませんね。 まあ、開発自体が良い練習になるしマップの仕様はゲーム設計で いくらでも変わるから、時間はかかっても独自のマップエディタ を作るのも良いでしょう。 あと、バイナリファイルは、特に理由がなければAPIで扱うのが 一番楽な気がw
- 245 名前:名前は開発中のものです。 mailto:sage [04/04/04 00:10 ID:8gkVG1Fa.net]
- 私も参戦してよいでしょうか。
環境はVC++6だけど、DirectX(8or9)つかうかWinAPI(SDK)だけで行くか悩み中。 SDKだけでいけそうだけど、勉強のためにDX使おうかなぁとも。 覚えたほうが後々いいですかね。。(どうでしょう?) とりあえずマップチップ表示してその上を歩き回れるようなものを作ろうと思ってるんですが。
- 246 名前:98 mailto:sage [04/04/04 19:29 ID:mMmF0Gyi.net]
- >>244
マップエディタも奥が深いんですね・・ 作成したマップをどういう形式で保存するかっていうのも悩みどころです。 >>245 言語問わず参戦歓迎です。 マターリがんがりましょう
- 247 名前:98 mailto:sage [04/04/04 23:33 ID:t/HUZNZd.net]
- 右クリックすると、直前に描画したマップの種類をテキストに出力するようにした。
www.geocities.co.jp/SiliconValley-Bay/2736/zzz3.txt www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_2.zip 保存の仕方がいまいちよく分からないので、 配列で記録しておいて、こぴぺでソースに貼り付けれるようにする予定。
- 248 名前:245 mailto:sage [04/04/05 00:00 ID:Exj/seSL.net]
- ども。
では最初の目標として、 なんか表示してキーボードで動かせる奴を作ってうpします。 DX使うかまだ未定。訳わかんなかったらSDKでやります。
- 249 名前:名前は開発中のものです。 mailto:sage [04/04/05 12:22 ID:qkWA7QuF.net]
- SDK -> Software Development Kit
- 250 名前:245 mailto:sage [04/04/05 13:40 ID:Exj/seSL.net]
- WinAPIどぅえす。
どっかのサイトでAPIのみでつくるのをSDKって言ってんの見て変な癖ついちゃいました。 それで、やっぱDirectXはこのくらいの規模の2Dもので使うにはめんどいだけで 恩恵無さそうな気がしてきたので使わないかもしれません。 (突っ込みが欲しい所であります。)
- 251 名前:98 mailto:sage [04/04/05 20:25 ID:jO2LaB8o.net]
- 俺はDirextX使えないけど、将来的にすごいもの作ろうとしたら
避けて通れない道な気がするから、敢えて使ってみるのもいいかも
- 252 名前:245 mailto:sage [04/04/06 14:51 ID:I/KdK9GY.net]
- 実は超最終的な目標は3Dのネットゲー作りたいんですよねぇ。
だからDXは絶対覚えないと・・・ でもCのプログラミング自体基本ができてないから とりあえず難しいDXは抜きに多少使った事があるAPIでやって、 C自体の基本的なところの習得に集中してからDXに移ろうかなぁ なんて気分になってきました。
- 253 名前:98 [04/04/06 20:50 ID:VKrLl24Q.net]
- >>252
教材が見つからなかったんで、俺は諦めたけどELっていう手も。 でもAPIの知識が必要だった気がするから、結局APIだけでやってみるのが 一番いいのかもしれません・・・ 初期化ファイル(MapDataAlpha.ini)にセーブするようにした。操作方法はソースの上のほうに書いてあります。 www.geocities.co.jp/SiliconValley-Bay/2736/zzz8.txt www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_3.zip ・WM_RBUTTONDOWN時に POSITION[0][0] = ... POSITION[1][0] = ... POSITION[2][0] = ... のように記録させたいんですが、どうすればいいんでしょうか?
- 254 名前:名前は開発中のものです。 mailto:sage [04/04/07 03:10 ID:6G2QeT26.net]
- RPG製作に興味あってこのスレきますた。
後半部を流し読みしかしてませんが、なにやらAPIやDXベースで話がすすんでるようですが それらを学習しながらはたしてモノが完成するのかなぁと思ったので。 最初は253氏が触れてるようなEL等のライブラリを使用するのがいいかと思います。 ゲームの中身の処理以外で悩むのつまんないし。
- 255 名前:245 mailto:sage [04/04/07 05:36 ID:RS4YRj46.net]
- >>253>>254
結局APIで作り始めますた。 私のほうは、あくまで技術の学習・習得が第一の目的でして、 特にゲームを完成させることに拘りはないです。 でも「作るスレじゃ」なくて「作れるようにするスレ」なので あんまり矛盾はないかなぁなんて。 現状ですが、とりあえず超適当ですがPCの画像を表示できました。(うpする価値なし) 次はテキストファイルを読み込み、それにしたがって マップチップを敷き詰めてみようと思います。
- 256 名前:98 mailto:sage [04/04/07 20:26 ID:MMz7Nn2x.net]
- >>255
一応、目安ということで見ておくといいかも↓ gamdev.org/w/?%5B%5BFF%C9%F7RPG%A4%F2%BA%EE%A4%EC%5D%5D 最低限の機能しかないけどマップエディタ完成 www.geocities.co.jp/SiliconValley-Bay/2736/zzz8.txt www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_3.zip 次はメッセージウィンドウを表示させようと思う。
- 257 名前:98 mailto:sage [04/04/07 20:27 ID:MMz7Nn2x.net]
- URLミス・・・
www.geocities.co.jp/SiliconValley-Bay/2736/zzz10.txt www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_4.zip
- 258 名前:245 mailto:sage [04/04/08 05:12 ID:rdLQdFbl.net]
- >>256
おぉそこは知りませんでした。凄く参考になります。 現状ですがテキストファイルからマップデータを読み込み、 表示することができました。 gamdev.org/up/img/426.zip 本当はバイナリにして暗号化したりした独自形式にしりたいんだけど よくわかんないのでとりあえず放置。 次はキーボードでキャラを移動して画面をスクロールさせてみようと思います。 しかし98さんは進歩早いですね。私も早く追いつけるようにがんばります。
- 259 名前:98 mailto:sage [04/04/08 20:18 ID:GQOUbMkn.net]
- 2ヶ月前からやっててまだこの程度なので、かなり遅いと思われます・・
保存形式ですけど、 XML→難しい割りにメリットなさそう バイナリ→シラネ レジストリ→怖い ってことで、消去法で初期化ファイル使ってます。 データ書き換えが簡単で、ゲームとして成り立たなくなりそうですが。
- 260 名前:245 mailto:sage [04/04/08 22:58 ID:rdLQdFbl.net]
- ファイル操作の辺りって結構でかい壁ですよね。(俺だけかも)
いずれ絶対やらなきゃなんないし、かなり面倒くさそう。。。 今回はPCを矢印キーで操作して画面をスクロールできるようにしました。 ついでに当たり判定もつけました。 ttp://gamdev.org/up/img/439.zip 現状はまだ隣のマスへワープしてる状態なので、 つぎは滑らかに移動できるようにしたいと思います。
- 261 名前:98 mailto:sage [04/04/09 00:11 ID:vWYKL39D.net]
- 俺もファイル操作で何回も挫折してます。
バイナリでの保存方法教えて。エロイ人。 >ついでに当たり判定もつけました ダウソしてみたんですが、実行前の注意必読.txt読んだら 怖くて実行できなくなってしまったorz
- 262 名前:200 mailto:sage [04/04/09 00:16 ID:PDI25ArR.net]
- うぃっす。そのうち暇になったら俺も晒そうかな。今は忙しいが。
>>259 XMLはHTMLと同じようなマークアップ言語のことじゃないん? だから出力形式としてはテキストorバイナリになると思うんだけど。 あと、ツール関係もC言語で作るって言うのはどうかと。 ツールは他の言語で作って出力データだけ使うのが良いと思われる。 テキストで出力するのであれば、マップチップ番号をカンマで区切って出力したり すればいいんじゃない。 コレが有名なCSVファイルね。 ちょうど245の晒しているマップデータをカンマで区切ったような形式。 もちろん、出力するデータの桁が決まっていれば区切る必要はない。 バイナリはただ単に数値をそのまま出力しただけのデータ。 通常のテキストファイルは文字コードによって人間の理解できる文字になっているが、 コンピュータで扱っている数字はそのまま出力した場合、テキストファイルのように 数字を読み取ることは出来ない。 しかし、プログラムから読み込む場合は余計な数字>数値変換を行わなくて済むのと、 サイズが小さくなると言うメリットがある。
- 263 名前:200 mailto:sage [04/04/09 00:23 ID:PDI25ArR.net]
- 発言が前後しちまったーヨ。
出力・・・猫でもわかるミレ
- 264 名前:245 mailto:sage [04/04/09 06:14 ID:PD92y+NK.net]
- >>261
何があるかわかんないので、一応、免責事項を書いておいたほうがいいかなと思って。 フリーソフトに限らず書いてあるのが多いので見習いました。 多分大丈夫だと思います。多分。。。(でもやっぱり責任はもてませんw) >>262 CSVにしようと思ったんですけど、まんどくせのでとりあえずあんな感じに。 カンマとかって普通に文字列操作でくっ付けて〜.CSVでWilteFileすれば 出来上がるんですかね。そのうちやってみようと思います。 ちなみに私のほうはVC++でやってるので、 マップツールの方はダイアログベースで作るか APIでクライアントにコントロール直張りにして作るか、 普通のクライアントウィンドウ+モーダレスダイアログで作る予定。 MFCは使わない。というか使い方知らない。 「猫でもわかる」に「MFCの使い方覚えてるうちにAPIで1000個くらいアプリ作れちゃう!」 とか書いてあるので、それを信じてひとまずMFCは放置しようかな、と。 ところで↓みたいに ttp://www.nurs.or.jp/~urara/sbo/grp/sbo086.png チップをスクロールバー付きで並べて表示して、 それを選択したりするようにするのって「リストビュー」をつかうのかなぁ、、、 ↑のはどうやってやってんだろう。ここが難関。誰か教えてたもれ。
- 265 名前:練習帳著者 mailto:sage [04/04/09 08:53 ID:NNIXc1rk.net]
- >>261
バイナリファイル保存は、CreateFile()でファイルハンドルを作って バイナリデータ(データを記録したバッファ)をWriteFile()で書き 出し、ファイルハンドルを閉じる、という流れでできます。 lpszFilePathをファイルパス、lpDataをデータの先頭アドレス、dwSize をデータのバイト数とすればこんな感じ。 HANDLE hFile = CreateFile(lpszFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, lpData, dwSize, &dwWrote, NULL); CloseHandle(hFile); ファイル操作は、標準関数よりAPIの方が楽ですね。
|

|