無料で俺がRPGを作れるようにするスレ

■ このスレッドは過去ログ倉庫に格納されています
03/07/26 20:18ID:PRWX91og
やる気だけはあるぞ。
04/03/07 01:10ID:gNoMVuak
自分も2月の最初くらいからAPI始めた者です。
使用言語はCで、今のところテトリスとかボンバーマンもどきを作りました。

現在ttp://www.sm.rim.or.jp/~shishido/を見ながら、
DIBを勉強中ですが、かなり苦戦してます。
>>98さんは何で勉強しましたか?良かったら教えて下さい。
04/03/07 12:27ID:/QKwfpo/
>>162
そろそろファイル入出力もかじり始めた方がいいかもね。
DIBが使えるならファイル入出力はそんなに難しくはない・・・はず。
04/03/07 13:40ID:Ha7O6gmU
なんでPeekMessage使ってるの?
16698
垢版 |
04/03/07 14:44ID:/nCa36PZ
>>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))があってもなくても
同じだと思うので、使うときのために消していないだけです。
04/03/07 15:08ID:gNoMVuak
>>166
レスありがとうございます。
そこも前から見てたんですが、分からないのです。
でも、同じのを見て出来る方がいるという事は自分の努力が足りないって事ですね。
もう少し修行してきます。

ボンバーマンは全部マスク画像を使ってAND・ORする方法でやったのでそんなに難しくは無かったです。
では。RPG製作頑張って下さい。
16898
垢版 |
04/03/07 17:38ID:/nCa36PZ
>>167
俺もまだよく分かってないんですが、ちょっとずついじってれば使えるようになると思います。
汚くてよければ>>153>>158にソースがあるので、よかったらドゾー


右スクロール時のみ16ドット移動を2回するプログラム
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz38.txt
効率が悪すぎるような気がする。こういうのをスパゲティソースというのかもしれない。

(´-`)。oO(AND ORってなんだろう)
16998
垢版 |
04/03/09 18:14ID:quioYjmo
C/C++始めて一ヶ月たったので、今回はEXEでうp(28.4KB)
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a1.zip

次はキャラ表示をしようと思う。透過処理が難しそう。
04/03/09 20:50ID:nDvOJ8eM
>>169
透過処理はAND OR
04/03/09 22:45ID:sCetmjvX
>>169

透過処理は単に「抜き色を決めてその色以外を転送する」処理をすれば
よいだけ。キャラクタのDIBを1ピクセルずつ背景に転送していっても、
速度的には問題ない。

この場合は32ビットDIBだと楽だね(DWORD単位でアクセスできるから)。
17298
垢版 |
04/03/11 19:38ID:e07lqvXR
>>170
AND ORでググルとグーグルにヌッコロされるのでだめです
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=AND+OR+C&lr=lang_ja

>>171
肝心な部分が分かってないからなのか、実際にやろうとするとなぜかできないです。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz45.txt
1ピクセルずつ表示もやってみたんですが、俺のPCのスペックのせいか、若干遅く感じました。


ところで、俺はPCゲームはあまりやったことがないのでよく分からないんですが、
キャラが32*32ドットってどうなんでしょうか。どうも小さく感じます。
17398
垢版 |
04/03/11 21:52ID:e07lqvXR
微妙にずれるものの、透過しつつキャラクタのDIBを1ピクセルずつ背景に転送は成功。↓
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz46.txt

なめらかにスクロールさせるためにマップをtimeGetTimeで30msごとに描画しているんですが、
この透過方法だとキャラクタ描画処理が遅いため、歩行アニメーションをつけるときに
いろいろと苦労しそう。

メモリに読み込むときに透過処理をしたほうがよさそうだけど、なぜか透過しない。
17498
垢版 |
04/03/12 20:39ID:grlqwW2o
上がソースで下が実行ファイル
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz50.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a2.zip

問題点:画面がちらつく。キー入力を微妙に記憶してしまう。

次は街を作って、マップ切り替えをしようと思う。
どんなゲームにするかとかもそろそろ考えないといけないけど、そっちは興味がないので
適当に募集中。
175名前は開発中のものです。
垢版 |
04/03/12 21:26ID:qU+SxdKI
>画面がちらつく。
CreateDIBSectionでオフスクリーンバッファを作るんだ!
ダブルバッファリングともいう。

>キー入力を
簡潔に説明するのは難しいんだが、今のキー押下処理→描画処理のやり方は
ゲームのつくりk他としては完全に間違ってる。
ゲームループとか検索してみるとわかるかもしれん。

他のスレのレスからヒントをば。
http://pc2.2ch.net/test/read.cgi/gamedev/1020417733/124
>タイマ(WM_TIMER)は不安定なので普通ゲームには使わないぞ。
>↓ここの1.4.1みたいに処理すべし。
>http://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/
17698
垢版 |
04/03/13 19:41ID:xCK866zy
>>175
キー入力はできますた。かなり操作性向上

DIBSectionが難しくててこずってます。
本の通りにDIBSectionを使ってるはずなのに、エラーが出るのはなぜだろう。
04/03/14 08:15ID:wW4VHkXB
>>176

コンパイル時のエラーなら、型があっていない(またはSelectObjectなどが返す値を適切にキャストしていない)とか。
04/03/14 17:48ID:a3XrN6fU
>>176
とりあえずエラーを貼り付ける。
17998
垢版 |
04/03/14 22:20ID:13t3R65N
エラー E2034 zz53.cpp 135: 'void *' 型は 'HBITMAP__ *' 型に変換できない(関数 __s
tdcall WndProc(HWND__ *,unsigned int,unsigned int,long) )

エラー出るソース
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz53.txt

(HBITMAP)つけてみたらコンパイルは通ったんですが、DIBSectionには何もさせていない
のに、強制終了します。

本はCで書かれているんですが、自分の書いてるのがたぶんC++なので、
そのへんの問題でしょうか。
04/03/14 22:32ID:RZwlVtdf
>>179
>(HBITMAP)つけてみたらコンパイルは通ったんですが、DIBSectionには何もさせていない
>のに、強制終了します。

とりあえず、怪しいところをコメントアウトするなり変数の値を表示さ
せるなり(デバッガがあるならブレークポイントを入れる)してどこで
落ちるのか、特定してみた方が良いね。

>本はCで書かれているんですが、自分の書いてるのがたぶんC++なので、
>そのへんの問題でしょうか。

そうだね。
CとC++では、デフォルトの型チェックが違う。
C++でSelectObjectの返すハンドルをGDIのハンドルを保持する変数に
入れたいなら、個別にGDIのハンドルの型に合わせたキャストが必要。

まあ、拡張子をcにしてCのソースとしてコンパイルしても良いかもし
れんがw

ところで「本」って何の本?
18198
垢版 |
04/03/14 23:00ID:13t3R65N
ゲームプログラミング練習帳 という本見てます。

デバッガですが、今問題にしている部分より前の段階ですでに止まってくれるので
使い物にならない状態です。止まる部分も、CとC++の違いのせいの気がします。

Cは全然知らないんですが、見ているサイトも本もCを使ってAPIの解説をしているので、
Cで書き直すのが早いような気がしてきました・・・
04/03/14 23:21ID:gdC9c3eD
>>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の値を調べてみれば、壊れているのが分かるはず。
なぜ、上の指定の仕方ではいけないのか、とか、どうして値が壊れるのかとかは、自分で考えてみてね。
04/03/14 23:32ID:gdC9c3eD
あぁ、97行目の
>iOffset = *(LPDWORD)(lpBMP + 10);//iOffset ピクセルが格納されてるアドレス、ここでなぜかデバッガ止まる
でとまるのは、BMPファイルが見つかってないからでしょ。多分。
ちゃんとCreateFileのエラー処理を汁!

あと、
>(HBITMAP)つけてみたらコンパイルは通ったんですが、
これは、Windows的には正しい。Cだと書かなくてもコンパイルと折るけど、
C++は型違いを厳密に見るから、型変換しないといけないわけだ。
184182
垢版 |
04/03/15 00:06ID:mfA2vkrj
ごめn>>182は違った。
CreateDIBSection()なんか久しぶりに使ったから忘れてたよ。

>>179の使い方なら、
hBMP = CreateDIBSection(hdc , &biInfo , DIB_RGB_COLORS , NULL , NULL , 0);
でいいんじゃない?一応うごいたよ。
04/03/15 00:14ID:BH49Bw7k
ちうか、CreateDIBSectionで作ったビットマップ使って無いじゃん…
あと、hdcをグローバル変数にするのはよくないと思う。
18698
垢版 |
04/03/15 00:37ID:YR7Ealek
>>182
(LPVOID *)(lpPixel)でもNULLでも動きました。

CreateDIBSectionの第4引数にはポインタのポインタを指定しなければいけないのに、(LPVOID *)(&lpPixel)
だとアドレスのポインタのポインタだから間違いというところまでは分かったんですが、
Cだと(LPVOID *)(&lpPixel)が正しくて、C++だと(LPVOID *)(lpPixel)が正しいということは
ポインタの書き方がCとC++で違うということなんでしょうか。。


>>185
使おうとしてコンパイルエラーが出たので、まずは何もさせずにコンパイルできることを目指してました。
>hdcをグローバル変数にするのはよくない
ローカル変数の呼び出し方がよく分からないので、とりあえずグローバル変数にしてあります。
分かり次第直します。
04/03/15 11:07ID:BH49Bw7k
>>186
>(LPVOID *)(lpPixel)
は間違い。
引数の指定の仕方としては、もとのソースの(LPVOID *)(&lpPixel)が正しい。

ただし、(LPVOID *)(&lpPixel)のままだと、CreateDIBSectioiでlpPixelが上書きされてしまうから
今度は透過処理の部分で今度は止まるよ。
CreateDIBSectionの説明をよく読んで、正しく使うべし。

>ローカル変数の呼び出し方がよく分からないので、とりあえずグローバル変数にしてあります。
まずは、そっちを勉強した方が良いよ。
04/03/16 21:28ID:av2PqUu3
ローカル変数は関数の冒頭で処理を記述する前に宣言する。
C言語の場合はね。
C++はドコでも良いことになっている。
18998
垢版 |
04/03/16 23:08ID:ALMDs/3/
難しくて混乱してきたのでちょっと整理
1.DIBとしてもDDBとしても操作可能なビットマップをCreateDIBSectionで作る
2.デバイスコンテキストを2つ用意する
3.デバイスコンテキストAに表示するマップより1マス分大きいマップを描画する。
4.AからデバイスコンテキストBに表示する部分だけ描画
5.Bから画面に描画

たぶんこうすればいいんだと思うんですが、4くらいで行き詰ってます。


hdcですが、仮引数とか使ってみたんですがだめでした。
04/03/16 23:47ID:R0OmoIwo
>>189
DIBSectionベースで、一マス多く描いたスクロール用ビットマップから
表示用ビットマップに転送していく、というのならこんな感じでやるとか。

http://www.sm.rim.or.jp/~shishido/threadsc.html
04/03/16 23:52ID:PRaC3s4r
だめですた、とかいうなら、詳細な症状を言うか、ソースを提示すべし。
初心者はエキセントリックなソースを書くからな。

>3.デバイスコンテキストAに表示するマップより1マス分大きいマップを描画する。
そんなことはない。CreateDIBSectioniで作るのはウィンドウサイズと同じ大きさで良いよ。
というか誰だよこんな嘘おしえたの。わざわざ難しく教えて面白いのか、といいたい。

これまでウィンドウのhdcに対して行ってきた描画とまったく同じ事をCreateDIBSectioinで
つくったDIB(を設定したhdc)に行えばいい。
んで、ウィンドウのhdcに対しては、かわりに↓をおおなう。

>4.AからデバイスコンテキストBに表示する部分だけ描画
この部分は、CreateDIBSectionで作ったDIBの内容をそのままウィンドウに転送するだけでいい。
ウィンドウのhdcは、BeginPaintで得られたhdcか、GetDC(hWnd)で得られたhdcだ。

なぜわざわざCreateDIBSectionで作ったDIBに描画してからウィンドウに転送するのか
といえば、それはチラツキをなくすためだ。なぜちらつきが起こるかは本に書いてあった?
19298
垢版 |
04/03/17 00:57ID:AN01uPyl
>>190
今の状態でマルチスレッドにまで手を出すのはちょっときついです・・・

>>191
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz55.txt
StretchDIBitsのデバイスコンテキストをhdcにすれば描画されるんですが、1段階ふむとなぜか
だめです。

>なぜちらつきが起こるか
本には、DIBSectionを使うことで効率がよくなるようなことは書いてありました。
04/03/17 02:56ID:QickIzjR
>>192
なぜかじゃねーよ。
まじで、ローカル変数のこと勉強しろ!今すぐ。
変数スコープって分かるか?

まぁ、一応答えを。
↓をグローバル変数に。以上。
86:HDC hdcBMP;

ローカル変数は一度関数から出ると無効になるんだよ!
WM_CREATEでhdcBMPに設定しても、WM_PAINTの時はすでに無効になってるんだよ!

ローカル変数のことがちゃんと理解できるまでstatic変数も禁止。
グローバル変数も最小限に汁!それが出来るまで先に進むべからず。
194190
垢版 |
04/03/17 07:13ID:EmljVs5P
>>192

いや、マルチスレッドにしろという話じゃなく、描画の流れを参考にしたら、ということなんだがw
04/03/17 09:55ID:ukkq6pEc
>>193
まぁ落ち着けや。
19698
垢版 |
04/03/17 23:43ID:AN01uPyl
変数と、ついでにクラスも勉強しておきました。
>変数スコープって分かるか?
:: 知らなかったけど使ってみます。

先に進むの禁止されたのでソースを見やすくした。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz70.txt
スクロール中に画面が消えるのは仕様なので気にしないでください
04/03/18 00:33ID:Si6/VCoc
つーか、OO使わないのかね?
04/03/18 00:33ID:Si6/VCoc
ヤターIDにVCデタヨー
04/03/18 02:13ID:XsvAPJOC
>>196
グローバル変数は「使う目的を明確にあらわした」変数名をつけるようにね。
たとえば、「lpbiInfoってどのBITMAPの情報なの?」ということが、変数名を見ただけで分かるように。

んで、前からずっと気になってたけど
>while((timeGetTime()-timeSc)<SecondPerSc);
このビジーループは本に載ってたやり方なの?
もしそうならその本は糞と認定せざるを得ないので書名を教えて。

「ビジーループ」って単語が分からない?なら、googleとかに聞いてみてね。
04/03/18 02:53ID:Si6/VCoc
今始めてマトモにソース見たんだが・・・・
猫でもわかるプログラミングから始めることをお勧めする。
もっとコンソールいじってからにしておきなさい。
20198
垢版 |
04/03/18 23:35ID:r5sO1u2T
>>197
よく分からないのでたぶん使わないです。


>>198
おめでd


>>199
自分で作ったSleepもどきです。
ビジーループでググったら、負荷が高くなるからやめろと書いてあったので
他のやり方を考えてみます。


>>200
コンソールだけだと何を作っていいのか分からないのと、モチベーションが続かないので
winAPIと並行してやっていきます。
04/03/19 00:17ID:whgiIXKB
>>201
>自分で作ったSleepもどきです。
>ビジーループでググったら、負荷が高くなるからやめろと書いてあったので
>他のやり方を考えてみます。
そか。えらい。

あとは、ちゃんとしたゲームループを作って、
・入力→ゲームの状態(主人公のマップ上での位置とか)の更新
・描画処理
をきっちり分ければ、ゲームの基礎は出来たも同然。
なぜ分けないといけないかというと、今のままだと、画面上に主人公とは独立して
動くNPCが出てきたときに処理できないからね。
203200
垢版 |
04/03/19 08:07ID:5YapUc1Z
>>201

気持ちは分かるんだけど、せめて一回くらい目を通しておくべきだと思う。
それだけで大分違うはず。
20498
垢版 |
04/03/20 18:53ID:th+dSxtZ
>>202
NPCの数が一定ならなんとか作れそうなんですが、
不定になるとどうやればいいのかさっぱりです。

>>200
理解したかどうかは置いといて、一通り読んでおきますた。


今のまま作っていくとグローバル変数だらけになりそうなので
http://www.geocities.co.jp/SiliconValley-Bay/2736/a001.txt
こんなの作ってみた。


変数名考えるのがマンドクセなんですが、何かこつとかありますか?
20598
垢版 |
04/03/20 23:02ID:th+dSxtZ
たぶん完成。上がソースで下が実行ファイル
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz73.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a3.zip

・ちらつきが減った。
・グローバル変数が少し減った。

次はマップ切り替えは中止して、エンターキーを押したらコマンドが出る、というのをやろうと思う。
04/03/20 23:23ID:70F0it+2
まだちょっとちらつくのは、InvalidateRectの最後の引数がTRUEだから。
あと、無意味なクラスが気持ち悪いぜ!
04/03/21 00:26ID:BKuLrlOv
>>205
動くが遅いけど、逆にそれが心地よかったり。クラスが分からんから
見れないけど、遅いのはたぶん1ドットずつずらしてるからだと思う。
2ドットずつ、極端な話32ドット一変にずらしてしまうと早くなると思う。

>自分で作ったSleepもどき
自分もコンソールの時はそれで、ウィンアプリの時はちゃんとPeekMessageを
使わずGetMessage+イベント取り分でやってた。ライブラリのTimerだと精度が
悪くなるから何か工夫していたと思うけど忘れてしまった。

>変数名考えるのがマンドクセなんですが、何かこつとかありますか?
自分もよく悩みます。自分はできるだけ1単語にして、その分
コメントをしっかりつけるようにしています。ただ、グローバル変数は
まず使いません。ファイル分割するようになると返ってめんどくさくなったり
するので。後、以下の所も参考にどうぞ。
http://pc2.2ch.net/test/read.cgi/tech/1067171530/l50
http://pc2.2ch.net/test/read.cgi/gamedev/1024902432/l50
20898
垢版 |
04/03/21 19:51ID:P8h6pce6
>>206
ちらつき撲滅できますた!

>>207
ビジーループを避けるためにいろいろ工夫したら結局Sleepになってしまった orz
>コメントをしっかりつけるようにしています
これいいですね。真似してみます。



コマンドは無理だったので、メッセージウィンドウ表示。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz76.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a4.zip

メッセージウィンドウの背景と文字色を変更したいんですが、
SetTextColorが使えないです。
こういうときはどうしたらいいんでしょうか
04/03/21 20:02ID:lBIVIhzW
静止状態では、結局CPU100%使っちゃってるよ。だめじゃん。
あと、マップ表示がスクロール終わるまで帰ってこない関数って後で困るよ。
スクロールしてる最中に同時にNPCを動かしたくなったらどうするのさ?
21098
垢版 |
04/03/21 20:27ID:P8h6pce6
進むの中断して組みなおして出直してきます。。
04/03/21 21:20ID:lBIVIhzW
スクロール位置の更新と描画が分離されてなかったり、
GDIじゃなくDirectXつかってたりするが、
↓見たいな感じにすればいいよ。
ttp://www.sm.rim.or.jp/~shishido/drpgs1.html

ゲームプログラミング練習長持ってるんだっけ?
読んだこと無いけど、そっちのほうもこういう処理になってない?
21298
垢版 |
04/03/22 21:35ID:qIg3ILGt
>>211
見てみました。↓draw()でSleep代わり?にこうしてるみたいなんですが、
if (GetTickCount()>dwTime+5) dwTime=GetTickCount();
else return;

前に自分で作ったのが↓
dwTime = GetTickCount();
while(GetTickCount()<dwTime+5);

上と下って何か違いあるんですか?どっちもビジーループに見えるんですが。

>そっちのほうもこういう処理になってない
本のほうではDirectX使ってないです。他の細かいところも、違う書き方してます。
04/03/22 22:18ID:IkgfwbwO
ていうか>>211のURLはゲームプログラミング練習帳の作者ジャン。

んでね、
http://www.sm.rim.or.jp/~shishido/src/drpgs1.txt
  } else
    draw(); // 描画処理
ここを
  } else {
    draw(); // 描画処理
    sleep(1);
  }
にすれば少なくともビジーループじゃないでしょ。
んで、>>211で言いたかったのはビジーループのことじゃなくて、>>209
>あと、マップ表示がスクロール終わるまで帰ってこない関数って後で困るよ。
>スクロールしてる最中に同時にNPCを動かしたくなったらどうするのさ?
これのこと。

上のURL(+Sleepバージョン)と>>208のプログラムを良く比べてみ?
04/03/22 22:50ID:8UFWL+KK
>>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);

だと「指定時間が過ぎるまで」どうなります?
04/03/22 22:58ID:8UFWL+KK
まあ、実際にRPG作ってみると「一定の周期で処理を行う関数」にゲーム
の処理をすべてまとめるのは無理があるから、メインループよりはゲーム
処理用にスレッド作った方が楽になるかな、という気がしてきたんですが。
特に厄介なのは、戦闘シーンやイベントの待ち時間・・・。 最初はあち
こちでPeekMessege()してたけど、これはちょっと違うかな、と。

スレッド作れば、最悪無限ループにしてもUI停まりませんからね(^^;。
もちろん、最終的なプログラムにするときにはスレッド内からの終了処理
(メインスレッドからの終了指示の監視)は必要だろうけど。

>>214
>ていうか>>211のURLはゲームプログラミング練習帳の作者ジャン。

そうですね。あのページの内容はもうかなり古いものもあったりして
書き直さないとなあ、と思っている部分が多いんですが、あちこちに
URL張られているようでちょっと焦ってます(^^;。

とりあえず、「4方向スクロールのマップ表示とキャラクタの透過描画」
あたりに関しては、もうちょいましなソース上げておくつもり。
216名前は開発中のものです。
垢版 |
04/03/22 23:27ID:hc5U3G0l
本物キター
217名前は開発中のものです。
垢版 |
04/03/22 23:29ID:mioo0vPT
著者降臨age!
218名前は開発中のものです。
垢版 |
04/03/22 23:33ID:nq9Pmduh
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
上げ忘れちまったよ。ごめんな上げ忘れちまったよ。ごめんな
21998
垢版 |
04/03/22 23:46ID:qIg3ILGt
>>213
ああ、分かりました!
1ドット描画するたびに関数を終了して、グローバル変数とか構造体とかで
描画回数をカウントしておいて、1マス描画し終わったらカウンタリセットする。
すると割り込み処理ができるようになる。

>>215
うお・・・著者様ですか・・・
while(GetTickCount()<dwTime+5);
だと5ms経過するまで待機しかできない上に、処理が重くなってしまう。でいいでしょうか・・
04/03/23 00:02ID:4auKbf0z
>の処理をすべてまとめるのは無理があるから、メインループよりはゲーム
>処理用にスレッド作った方が楽になるかな、という気がしてきたんですが。
この辺は、伝統的には所謂タスクシステムで解決してきたのかな。
スレッドだと同期が大変過ぎるしこういう用途には重すぎると思う。

まぁ、タスクシステムっていってもいろいろなやり方があるみたいだけど…
04/03/23 00:47ID:9F6tXsaP
シナリオスクリプトを実装する時にはスレッドにしたりもする
ファイバー(コルーチン)という手もあるようだけどね

異なるプログラム方式の連携
ttp://www.jah.ne.jp/~naoyuki/Writings/VScheme6.html
04/03/23 01:05ID:PMWtRlHb
シナリオなんかだと、タスクシステムでコールされるタスク関数を
ファイバ(マイクロスレッド、コルーチン、継続でもOK?)にしておくと
効率よく開発できるかな、とかおもったりしたけど全然試してない。

このへんは、やね本2だかに書いてあるらしいけど読んだこと無いです。
04/03/23 02:20ID:JCV/36ob
俺もスレッド使わないほうがいいと思う
マルチスレッドを毛嫌いするわけじゃないが、明確な理由なしにスレッド化するのはやめたほうがいい
ゲームで必要になる場面があるとすれば、SLGの思考ルーチンくらいだと思う

で、ちょっとスレ違いの話題になるが、
ファイバってCreateFiber関数とか使う奴のこと?
だとするとあんなの使わなくても関数ポインタ切り替えでいいじゃん、と思うんだが・・・
#少なくともゲームにおいては。なんかいい利用方法あるならスマン
04/03/23 02:48ID:PMWtRlHb
>だとするとあんなの使わなくても関数ポインタ切り替えでいいじゃん、と思うんだが・・・
その関数を減らすために使うんだよ。

普通はその関数の操作対象のオブジェクト(やシーンなど)の状態が変わったら
関数を切り替えるわけでしょ。ファイバを使うと、その「状態」が「関数をどこまで
実行したか」で表せるようになるから、状態ごとにいくつかに分かれてた関数を
ひとつに出来る、と。

まぁ、でもこういうのは大概スクリプトで実現するような気がしないでもない。
225223
垢版 |
04/03/23 05:14ID:JCV/36ob
>>224
ちょっと待て、その利点は間違ってると思うぞ
ファイバ使っても関数減らすことになるとは思えない

このスレなのでRPGの例で行くが、
RPGにおける「状態」ってたとえば
・マップ移動(キー入力待ち)
・マップ移動(スクロール)
・戦闘中
とかに分かれるよね
ファイバを使う場合、これらの関数をCreateFiber関数で登録し、SwitchToFiberで切り替えるだけだ。
使わなくとも一旦呼び出し元ループに戻って別の状態用関数を呼び出すのと関数の数はほぼ変わらん
#状態の定義が食い違ってるかも?

スレ違い継続&長文スマソ
04/03/23 08:41ID:PMWtRlHb
>>225
もっと先の話だよ。
イベントシーンとかそのへん(応用先はそれだけじゃないよ?)
スレ違いだが、シューティングの敵の動きの記述に使ったりもした。
04/03/23 09:03ID:PMWtRlHb
あぁ、でもこの場合、少なくてもマップ移動はまとめられるね。
ヘンテコ擬似コードだけど、こんな感じ?(描画はメインファイバ側でやるという前提)

void MapMove() {
 while(1) {
  //方向キーが押されるまで待つ
  while (!CheckHitCursorKey())
   SwithFiber(mainFiber);
  MoveMap(GetKeyState());//スクロール方向を決める処理

  //ここからスクロール処理
  for (int i = 0; i < MAP_CHIP_SIZE; i++) {
   ScrollMap();//1ドット分スクロール
   SwitchFiber(mainFiber);
  }
 }
}

この場合にまとめるのが正しいかは議論ありそうだがそれはおいといて、例としてね。
04/03/23 09:10ID:R4NaancD
>>220
別スレッドの利点は、他のスレッドと同期する必要をなるべく生じさせ
ない、ゲームに関する処理を一本道の流れに分離しておくような形式に
できた場合、Windowsのシステムの流れをあまり意識しないでゲームの
処理に集中できるかな、と。

実際、戦闘やスクリプトベースのイベント処理も含めてRPGのデータ処理
やバックバッファ(あとはウインドウのDCに出力するだけのDIBSection)
への描画処理をすべて別スレッド内で行うシステムを作ってみたんですが、
比較的単純なシステムではプログラムも一本道の単純なものにまとめられ
そうで、これはこれでよさそう。
小規模で単純なRPG/ADVでは、こういったタイプの処理もありかも。

まあ、一定時間ごとに呼び出す処理用関数で状態を管理しながら処理して
いく、という形にまとめられればその方がよさそうですけどね(ただ、
ゲーム本体の処理以外の部分でたいしたことをしていなければ毎回状態を
管理しながら一定時間ごとに処理を行う、という流れはスレッドで連続的
に実行しているように書く、というのと流れとしては同じになりそう)。
私もメインループ内で一定時間ごとに状態に応じて振り分け、という設計
を考えていましたが、別スレッドで処理する実験結果を見ると意外にうま
くいきそうだったんで、とりあえず別スレッドを作る方向で作っています。

ゲームの処理の流れを本格的に管理するつもりなら、フレームワークの開発
からやる方がよさそう・・・。
04/03/23 11:14ID:PfXAGYNf
エェー?本当にちゃんと同期できてる?データの整合性もちゃんと保ててる?
マルチCPUの場合は、同じデータをアクセスするコードが「同時に」2つ以上走ることも
あるんだよ?

マルチスレッドは、データの不整合性、デッドロック、抜け出せないロッキング、
優先順位の逆転などなど気をつけないといけない罠が多すぎるので、どうしても必要
なところ意外では使わないことにしてるよ。
スレッドがだめって言ってるわけじゃないけど、初心者向けでは無いよね。

「処理の流れ」を記述したいときは、大概スクリプトにするかなぁ?
マイクロスレッドでもいいと思う。
04/03/23 12:01ID:JCV/36ob
>>227
んー・・・なんとなく言いたいことは分かった、ありがとう
けどやっぱタスクシステムから乗り換えるほどの理由じゃないっす
#スレ違いすまんがSTGの敵の動き制御部分は特に意味がなさそう
#理由はたとえば同じ種別の敵が10いたら同じ関数を10回実行しなきゃいけない。
#けど同じ関数を回すわけだから結局状態データは外部に置かなきゃいけない
#同じ関数を10個ファイバとして登録して再利用するにしても、
#結局被弾したとかの状況によって初期化するわけだから外部で制御しても大差なし
#そもそも最近のハードだと敵の動きは外部データで持つことが多いので
#違う敵でも同じ関数で処理する

>>228
Windowsのシステムの流れってぶっちゃけメッセージループだよね
なら別スレッドにする必要はないかと
PeekMessage(およびそれに付属する処理)を1タスクとして考えればいいだけ
たとえばバックバッファを作った後でPeekMessageを呼び出せばいい
04/03/23 12:25ID:rzkxl8IS
>>230
>けどやっぱタスクシステムから乗り換えるほどの理由じゃないっす
いや、タスクシステムと併用するんだよ当然。
タスクシステムからタスク関数を呼び出すと思うけど、それをファイバにするという話。

>#同じ関数を10個ファイバとして登録して再利用するにしても、
>#結局被弾したとかの状況によって初期化するわけだから外部で制御しても大差なし
まぁ、被弾とか非同期で状態が変わる部分は、別関数にせざるを得ないよね。「例外(Exception)」だし。
でも、多数の状態が(ほぼ)シーケンシャルに切り替わっていく状態なんかでは、状態ごとに関数分けたり
状態変数作ってswitchで分けたりするよりは、すっきりしたプログラムになると思う。

まぁ、もちろん、
>#そもそも最近のハードだと敵の動きは外部データで持つことが多いので
なので>>224ではスクリプトでやる場合が多いと書いたわけだけど…

どっちにしろ「使いようによっては便利なときもある」って話だ。
全ての場合で使えると言ってるわけでもない。ファイバはメモリ食うしね。
04/03/23 16:31ID:cY6fF1y+
マルチスレッドにする利点はタイトルバーをクリックしても処理がとまらないことかな
23398
垢版 |
04/03/23 21:04ID:s4+zR2jB
よく分からないんですけど、マルチスレッド使えないとやばいっていうことでしょうか?


今度こそマップスクロール完成版↓
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz78.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a5.zip

・静止状態にCPU100%になっていたのを修正(Sleep(1);をつけた)
・メッセージウィンドウ表示時にCPU100%になっていたのを修正(Sleep(1);をつけた)
・描画関数を2つに分割

なんか処理が重くなったような気がする・・・
04/03/23 21:12ID:PMWtRlHb
んじゃ、次は、DrawMapの、「〜スクロール時描画」を「静止マップ表示」ひとつにまとめよう!
これでかなりすっきりするはず。
23598
垢版 |
04/03/24 22:18ID:w/FFfgKd
すっきりしたかどうか分かりませんが、まとめてみました↓
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz79.txt
・描画方法を少し変更

メッセージウィンドウ表示は置いといて、次はNPCを作ってみる予定
23698
垢版 |
04/03/29 19:11ID:hm6pjM86
ログが消えてる(´・ω・`)

NPCの移動をなめらかに描画するのが難しいんですが、
なんかいい方法とかないでしょうか・・・
23798
垢版 |
04/03/30 22:16ID:W6u+pmd7
NPCがどうしてもうまく描画できないので、マップ自体の描画方法を
「何か起こったら描画」から「常に一定時間おきに描画」に変更してみた。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz88.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a7.zip

方向性が間違ってるような気がしないでもないんですが、
こういう描画方法でもいいんでしょうか
23898
垢版 |
04/04/01 21:53ID:xdIEUIEH
NPCなめらか移動
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz91.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a8.zip

NPCの移動がランダムではないような気がする。
気のせいかもしれないけれど、ある方向にいったん進んだら、
次に進む方向も同じになる確率が高い。

次は当たり判定をつけようと思う。
239200
垢版 |
04/04/02 00:46ID:HxQygUy0
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が同じ結果を返すことになる。
って、コレも猫でもわかるプログラミングで説明されていたような・・・
240200
垢版 |
04/04/02 00:49ID:HxQygUy0
あ、別のサイトだったっぽいです。
24198
垢版 |
04/04/02 20:19ID:RjQBCx/D
おまじない程度の認識しかなかったので、ここが原因とは思いませんでした。
ランダムに動くようになりました。

ふと思ったんですが、WINAPIなら timeGetTime()%10; でも0~9のほぼ乱数ができるような
気がするんですが、これって邪道でしょうか。
24298
垢版 |
04/04/02 22:26ID:OS/Q3nYt
↑自己レス 同時に複数の乱数を得たいときに不便なのでやっぱりだめ

当たり判定をつけた。ついでに歩行アニメーションもつけた。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zz94.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/rpg_a9.zip

次はマップエディタを作る予定。
24398
垢版 |
04/04/03 22:19ID:eDSQOtXr
マップエディタセーブ機能なし
http://www.geocities.co.jp/SiliconValley-Bay/2736/zzz2.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_1.zip

マップエディタ作る時間 > テキストでマップを作る時間
な気がしてきた。

APIのファイル操作はできれば避けたいんですが、
#include <window.h>をすると#include <fstream>できなくなるんでしょうか?
04/04/03 23:40ID:ClmmNDdO
>>243
マップエディタはイベント配置機能なども含めRPG開発では必須
になるけど、開発するのは本体よりも大変かもしれませんね。
まあ、開発自体が良い練習になるしマップの仕様はゲーム設計で
いくらでも変わるから、時間はかかっても独自のマップエディタ
を作るのも良いでしょう。

あと、バイナリファイルは、特に理由がなければAPIで扱うのが
一番楽な気がw
04/04/04 00:10ID:8gkVG1Fa
私も参戦してよいでしょうか。
環境はVC++6だけど、DirectX(8or9)つかうかWinAPI(SDK)だけで行くか悩み中。
SDKだけでいけそうだけど、勉強のためにDX使おうかなぁとも。
覚えたほうが後々いいですかね。。(どうでしょう?)

とりあえずマップチップ表示してその上を歩き回れるようなものを作ろうと思ってるんですが。
24698
垢版 |
04/04/04 19:29ID:mMmF0Gyi
>>244
マップエディタも奥が深いんですね・・
作成したマップをどういう形式で保存するかっていうのも悩みどころです。

>>245
言語問わず参戦歓迎です。
マターリがんがりましょう
24798
垢版 |
04/04/04 23:33ID:t/HUZNZd
右クリックすると、直前に描画したマップの種類をテキストに出力するようにした。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zzz3.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_2.zip

保存の仕方がいまいちよく分からないので、
配列で記録しておいて、こぴぺでソースに貼り付けれるようにする予定。
248245
垢版 |
04/04/05 00:00ID:Exj/seSL
ども。
では最初の目標として、
なんか表示してキーボードで動かせる奴を作ってうpします。
DX使うかまだ未定。訳わかんなかったらSDKでやります。
04/04/05 12:22ID:qkWA7QuF
SDK -> Software Development Kit
250245
垢版 |
04/04/05 13:40ID:Exj/seSL
WinAPIどぅえす。
どっかのサイトでAPIのみでつくるのをSDKって言ってんの見て変な癖ついちゃいました。
それで、やっぱDirectXはこのくらいの規模の2Dもので使うにはめんどいだけで
恩恵無さそうな気がしてきたので使わないかもしれません。
(突っ込みが欲しい所であります。)
25198
垢版 |
04/04/05 20:25ID:jO2LaB8o
俺はDirextX使えないけど、将来的にすごいもの作ろうとしたら
避けて通れない道な気がするから、敢えて使ってみるのもいいかも
252245
垢版 |
04/04/06 14:51ID:I/KdK9GY
実は超最終的な目標は3Dのネットゲー作りたいんですよねぇ。
だからDXは絶対覚えないと・・・
でもCのプログラミング自体基本ができてないから
とりあえず難しいDXは抜きに多少使った事があるAPIでやって、
C自体の基本的なところの習得に集中してからDXに移ろうかなぁ
なんて気分になってきました。
25398
垢版 |
04/04/06 20:50ID:VKrLl24Q
>>252
教材が見つからなかったんで、俺は諦めたけどELっていう手も。
でもAPIの知識が必要だった気がするから、結局APIだけでやってみるのが
一番いいのかもしれません・・・


初期化ファイル(MapDataAlpha.ini)にセーブするようにした。操作方法はソースの上のほうに書いてあります。
http://www.geocities.co.jp/SiliconValley-Bay/2736/zzz8.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_3.zip

・WM_RBUTTONDOWN時に
 POSITION[0][0] = ...
 POSITION[1][0] = ...
 POSITION[2][0] = ... のように記録させたいんですが、どうすればいいんでしょうか?
04/04/07 03:10ID:6G2QeT26
RPG製作に興味あってこのスレきますた。
後半部を流し読みしかしてませんが、なにやらAPIやDXベースで話がすすんでるようですが
それらを学習しながらはたしてモノが完成するのかなぁと思ったので。
最初は253氏が触れてるようなEL等のライブラリを使用するのがいいかと思います。
ゲームの中身の処理以外で悩むのつまんないし。
255245
垢版 |
04/04/07 05:36ID:RS4YRj46
>>253>>254
結局APIで作り始めますた。
私のほうは、あくまで技術の学習・習得が第一の目的でして、
特にゲームを完成させることに拘りはないです。
でも「作るスレじゃ」なくて「作れるようにするスレ」なので
あんまり矛盾はないかなぁなんて。

現状ですが、とりあえず超適当ですがPCの画像を表示できました。(うpする価値なし)
次はテキストファイルを読み込み、それにしたがって
マップチップを敷き詰めてみようと思います。
25698
垢版 |
04/04/07 20:26ID:MMz7Nn2x
>>255
一応、目安ということで見ておくといいかも↓
http://gamdev.org/w/?%5B%5BFF%C9%F7RPG%A4%F2%BA%EE%A4%EC%5D%5D


最低限の機能しかないけどマップエディタ完成
http://www.geocities.co.jp/SiliconValley-Bay/2736/zzz8.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_3.zip
次はメッセージウィンドウを表示させようと思う。
25798
垢版 |
04/04/07 20:27ID:MMz7Nn2x
URLミス・・・
http://www.geocities.co.jp/SiliconValley-Bay/2736/zzz10.txt
http://www.geocities.co.jp/SiliconValley-Bay/2736/map_ed_4.zip
258245
垢版 |
04/04/08 05:12ID:rdLQdFbl
>>256
おぉそこは知りませんでした。凄く参考になります。
現状ですがテキストファイルからマップデータを読み込み、
表示することができました。
http://gamdev.org/up/img/426.zip

本当はバイナリにして暗号化したりした独自形式にしりたいんだけど
よくわかんないのでとりあえず放置。
次はキーボードでキャラを移動して画面をスクロールさせてみようと思います。
しかし98さんは進歩早いですね。私も早く追いつけるようにがんばります。
25998
垢版 |
04/04/08 20:18ID:GQOUbMkn
2ヶ月前からやっててまだこの程度なので、かなり遅いと思われます・・

保存形式ですけど、
XML→難しい割りにメリットなさそう バイナリ→シラネ レジストリ→怖い
ってことで、消去法で初期化ファイル使ってます。

データ書き換えが簡単で、ゲームとして成り立たなくなりそうですが。
260245
垢版 |
04/04/08 22:58ID:rdLQdFbl
ファイル操作の辺りって結構でかい壁ですよね。(俺だけかも)
いずれ絶対やらなきゃなんないし、かなり面倒くさそう。。。

今回はPCを矢印キーで操作して画面をスクロールできるようにしました。
ついでに当たり判定もつけました。
ttp://gamdev.org/up/img/439.zip

現状はまだ隣のマスへワープしてる状態なので、
つぎは滑らかに移動できるようにしたいと思います。
26198
垢版 |
04/04/09 00:11ID:vWYKL39D
俺もファイル操作で何回も挫折してます。
バイナリでの保存方法教えて。エロイ人。

>ついでに当たり判定もつけました
ダウソしてみたんですが、実行前の注意必読.txt読んだら
怖くて実行できなくなってしまったorz
262200
垢版 |
04/04/09 00:16ID:PDI25ArR
うぃっす。そのうち暇になったら俺も晒そうかな。今は忙しいが。

>>259
XMLはHTMLと同じようなマークアップ言語のことじゃないん?
だから出力形式としてはテキストorバイナリになると思うんだけど。
あと、ツール関係もC言語で作るって言うのはどうかと。
ツールは他の言語で作って出力データだけ使うのが良いと思われる。
テキストで出力するのであれば、マップチップ番号をカンマで区切って出力したり
すればいいんじゃない。
コレが有名なCSVファイルね。
ちょうど245の晒しているマップデータをカンマで区切ったような形式。
もちろん、出力するデータの桁が決まっていれば区切る必要はない。
バイナリはただ単に数値をそのまま出力しただけのデータ。
通常のテキストファイルは文字コードによって人間の理解できる文字になっているが、
コンピュータで扱っている数字はそのまま出力した場合、テキストファイルのように
数字を読み取ることは出来ない。
しかし、プログラムから読み込む場合は余計な数字>数値変換を行わなくて済むのと、
サイズが小さくなると言うメリットがある。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況