4 :
デフォルトの名無しさん :2005/07/09(土) 15:18:22
5 :
デフォルトの名無しさん :2005/07/09(土) 15:22:15
終了。 ゲーム製作技術板に逝け。
Report Program Generator
RPGツクールを使うといいと思うよ
ロケットランチャーだろ でじゃぶー?
>ゲーム関係の話題はゲーム製作板へどうぞ。 注意書きくらい読もうねw
前スレの最初と同じ荒れ方にワロス
RPGツクールを使うといいと思うよ
いつの間に作られてる・・・ つくってみたーよさん来てるかな。
>>14 お、前スレ1さん。
お勉強の方はどうっすか?
ゲーム製作技術板より同人ゲーム板向けのネタだな
18 :
デフォルトの名無しさん :2005/07/09(土) 22:08:07
ム板なんで、RPGを作るというよりは RPGを作るためのシステムを作る にしたほうがいいかもな。 で、実際にゲーム作るのはゲ製板でやればいいし。
某スレより転載 ・クラス Object ├Controler - 一階層かます(なくても良いかも) |├GameControler - ゲームの進行を管理 |├GraphicControler - 表示を管理 |├SoundControler - 音の管理をする。 |├ButtleControler - 戦いを管理。 || 行動の順や、「この人が"戦う"選んでるからこの人にダメージ」なジャッジをする |└MapControler - マップを管理(町、ダンジョンの切り替えなどをつかさどる) | └GameObject - 一階層かます(ゲーム内登場物という共通特性がある場合に。Nameとか) ├Actor - 演者。主に有生物。 |├People - 町の人とか、戦わないマップキャラで終わる人々。 |├Enemy(Monster?) - 敵。Battleable実装 ||└[性格を持った敵] - 振る舞いが特化されていて、個々に実装必要な奴。ボスなど。Battleable実装 |└MainActor(Player?) - 主人公とその仲間。Battleable実装。 | └[性格を持った仲間] - それぞれ実装を必要とする場合のキャラ。 | NPCを含むためControlable実装は任意。
>>19 OOとしてはイマイチだな。
コントローラーて・・・
├Map - マップの名前とマップチップのデータを持つ。 ├MapChip - マップの特性を持った構造体(構造定義せずに配列とかでも良い?) ├Item - アイテム共通の性格。 |└[個々のアイテム] - 性格を持ったアイテム。振る舞いは個々に違うため別個に記述。 ├Magic |└[個々の魔法] - 性格を持った魔法。振る舞いは個々に違うため別個に記述。 └Skill(Action?) - スキル。プレイヤーごとにインスタンスを4つまで保持し、戦闘時コマンドとして表示。 ├Spel - 呪文をとなえる。(PlayerのMagicリストを参照したい)。 ├Fight - たたかう。 ├UseItem - アイテムを使う。(Playerのアイテムリストを参照したい) ├Defence - 防御 ├Escape - 逃げる。(隊列先頭の奴に強制的に付加されるって、なぁ) └[その他] - 昨今のドラクエの"とくぎ"など。 さっきの続き
なんと、ドアに話しかける必要が出てきたんですよ。
>>19 昔ム板でRPGのクラス設計のスレがあって、そんときもそんな感じだったな
人物クラスをドアとして扱えばいいだけ
魔法とアイテムとスキルと「戦う」と「防御」は、振舞いほとんど同じだ。
そうだよなー汎用コマンドがあって、「戦う」はMPを消費しないとか、 「防御」はダメージを与えないで防御力一時アップとか、あとはナレーションの辻褄だけだし
戦闘中のコマンドは外部に出してパラメータを編集するようにしておけば追加する時便利 逆にアイテムはクラスのほうが柔軟性が増す
スレの趣旨としては議論より「作ってみたぽ!」なんだが。
ゲ製作みたいに議論中に新しいネタが出てきたらうpするって流れだと思ってた ノウハウ貯めるためのスレじゃないんだねスマソ(^^;
だから作るっていうならム板じゃなくてゲ製って話だろ
>>31 ゲーム関係の話題はゲーム製作板へどうぞ。
この注意書きが読めない基地外でつか?
誰が見ても100%板違い。議論の余地は無い。OK?
>ゲーム製作板 そんな板はありません。
俺も最初このすれ見たときさ 、何でむ板にあるのかと思ったよ。 で、なんかコンソールベースのRPG見てああなるほどって思ったけど グラフィック使ってるとこ見ると、やっぱゲ製作のがいいんじゃないかと思った。 荒れるからさここらへんで定義を見直そう。 プログラム板でRPGを作ってみるということは ようするにプログラムの勉強のためだよね?よくわからんが・・・ それならライブラリなど使わずにテキストベースかGDIでアルゴリズムの勉強としてなら ここでもいいんジャマイカ? で、openglとかdirectxとか使うともうゲームの勉強になっちまうから、ゲ製作のほうが適している。 荒れないですむと思う。 そもそも作ってみるスレというのがあまりよくわからない。 作って何がしたいのか。 それでおれは作って勉強してみるスレと解釈したがまあわからんもんねる
一度はアマチュアゲーム板で引き取るって話がついたのにまた再燃してるね そういう不確定な話やごたごたをこのスレに持ち込まないで欲しい ローカルルールの揚げ足を取るのイクナイ
俺はゲ製に移動しとくか・・・
ここ叩いてるのってゲ製作のスレ片っ端から叩いて奴と同じかな
別にRPG関連で、C/C++なら、実際に作ったコードを載せてもいいし、
その前の過程でここに載せて、この先どうやって作ったらいいかとか聞いてもいいし、(それだったら、その専用スレのほうがいいかも)
初心者のために、
>>19 、
>>21 みたいなことを書いてもいいし、
まっ、とりあえずRPG関連で、C/C++なら、何だっていいわけ。
楽しく書いて、楽しく学ぶ。
これが一番かな。
そろそろデフォルトの名無しさんにもどろ。
RPG製作を通してC/C++言語と関連知識を学ぶスレで いいんじゃない。
ゲ製作がIDなしならこんなことにならないのに
そしてろくな本じゃない。
っていうか、プログラム板的にはRPGコンパイラ/インタープリンタを 作るスレにすべきでしょ? ゲームの話をする所じゃないんだから。
前スレからゲームデザインの話はあんま出てなかったかもね。 プログラムの話ばっかだったかと。
ム板だからね
>>18 それいいな。ゲ製板からは歓迎されそうな気がする。
[ マ板 ]
システム提供↓↑ゲーム本編作成。システム要望
[ ゲ製板 ]
52 :
デフォルトの名無しさん :2005/07/10(日) 12:24:11
ム板ってなにするところ?
人々を鬱にするところ。
たしかに「ム」だな・・・
じゃあ。 C/C++言語でRPGシステムを作ってみるスレ RPGシステムに関するC/C++プログラミングの話題。アルゴリズム・ データ構造・処理の効率化・ライブラリ等など、プログラミング の話題限定で語りませう。ゲーム製作の話はゲ製板で。 でOK?
それだな。
57 :
デフォルトの名無しさん :2005/07/10(日) 15:08:17
2スレ目に入っているのに今さら四の五の言うなよ。迷惑だ。
また前スレ前半の流れに戻るわけだ
つーか、もうこんな話題でスレが5%消費された時点で鬱い。 ム板なんだから、前スレにあったように「作ることを楽しむ」スレであって欲しい。 一番の問題は「実際に作ってる人」が少ないってことだな。
一番の問題は「板違い」(プゲラッチョ
いい加減、話戻さない?
クラス設計を考える時間>>>>>>>>ゲームの動かし方考える時間>>ゲームのアイディアを考える時間 ですわ。。 汎用性とか考え出すとキリが無いよ orz
ときどきでいいから、アイデアを考える時間を、増やしてあげてください。
ある程度妥協しろ。
妥協したり計画を立てないと、どんどん膨らんじまうからなぁRPGって orz
RPG作りで一番時間がかかるのはバランス調整だよ。 コーディングしている時間なんて全然大したことない。むしろ楽な部分。 一人で延々とテストプレイを繰り返してるとイヤになること請け合い。 まじでテストプレイヤーが欲しくなるよ。
69 :
64 :2005/07/10(日) 23:08:42
妥協しててもあんま進まなかったり ^^
ゲームを本格的に作るの初めて+クラスを本格的に使うの初めてなので。
勢いで始めましたけど、やぱちょっと無謀だったか。。
>>68 超小規模なのになる予定なので、
そこは一番心配してないです ^^
いやー、敵が10種類とかでも相当大変だよ?(w まあ頑張って。実際に作ってる人が少ないから期待してるよ。
>>64 自分もそうなりがち。頭でっかちというか。
だから、初心者の頃の、とにかくコーディング
という気持ちも忘れないようにしてる。
とりあえず、第一ゴールを決めるべし。
yoshaaaaaa, kisya----! orz
>>68 ム板的な視点で見ると、バランス調整自体をコーディングしたい。
インターフェイスをカットしたモードでAIが超高速でレベル上げする。
その統計を収集して、ここら辺で詰まるみたいなグラフを描くとかね。
進化するAI(GAとかか)ならFF6のバニシュデスみたいな穴も発見可。
つかプロのコンシューマのRPGでは既にそういうことやってんのか?知らないけど。
単純な戦闘だけじゃないんだけどな…。 プレーヤーがどこで迷って、その分どれだけ歩いてどれだけ敵に遭遇してレベルが上がるか ってのはやっぱり人間がテストしないと分からん気がする。
AIを進化させたとして、そのAIをどこに置くのだい? ROMに焼いた時点で進化を止めるのかい?
おいおい何故ROMに焼く。 デバッグとかバランス調整に使うだけなんだからゲーム本体には含めないだろ。
>>74 それは1つ楽するために10倍ぐらい苦労するアプローチだな(w
俺的には
>>75 に同意。やっぱ実際にプレイしてみないことには
バランスの善し悪しは分からん気がする。
そもそもバランスの最適値なんてないんじゃないかね。 ゲーマーもさまざまなんだし。 FF4なんかは2バージョンあったよね、普通のとムズいのと。
バランスはともかく、イベントフラグのデッドロック的なバグは AI(に満たちないほどの単純作業のルーチンだが)で発見できるといいかもしれん。 総当りだとものすごい時間かかりそうだが。
なんにせよ、動くものがなければ話にならんだろ。 最初はシンプルでいいから、なるべく後から構成要素の追加拡張が容易なフレームワークを設計するのが先だな。
DirectXAppWizaedってVS.net2003じゃ選択できないの?
83 :
74 :2005/07/11(月) 23:20:37
>>75 人間は必要だって。その省力化
>>78 ■だったら開発に一億位かかっても十倍位元が取れそうだ
>>80 イベントの到達不能バグの自動検出は
未踏ソフトなんとかでどっかの学生が題材にしていた
なんつーか、微妙だったけど。
http://49uper.com:8080/html/img-s/65902.zip 途中経過です。
前回のと動きはあんま変わってません。
キャラが動くだけです。
中身はメチャクチャかき混ぜたので、いまいち把握できてません。
メモリリークとかあったらホントごめんなさい。
絵がでるオブジェクトに使うために、基本クラスを作ったのですが、
GetX() とか、SetWide() みたいなのが大量にできちゃっいました。
これは一般的なんでしょか?
ソースがいたずらに長くなってしまう・・。
町の人とPlayerのクラスも共通のとこがいっぱいあるから、
もう一個基本クラスを作ったほうがいいかもしんないし。
あー、基本クラスのことだけで、三日は費やしてるわ orz
あう、またMSIMG32.dllで弾かれた・・・。 LoadImageとTransparentBltを適当に補ったら動いたんだけど、 ほとんど真っ暗だった(つд` GetXとかはinlineするといいかも。
OOPでは設計に時間を費やすべきだ。 設計次第でコーディング時間は短縮される。
>>86 あ、やぱしww
前スレでもそう言ってるの見ましたから、エラーがでると思ったんですが。
描画はあとで差し替える予定ですので、そのときまでは解決しないかもです。
前スレ821さんのような技術がないんで。。
ちなみに、実行ファイルは正常に動作するんでしょうか?
>>87 オブジェクト志向ってのがなんなのか全然わからない orz
そのクラスの中で自己完結的に動作すれば
オブジェクト志向を名乗っていいんでしょか?
(初期化→動作→表示→開放 みたいな・・)
ポリモーフィズムってのはあきらめました ^^
90 :
89 :2005/07/12(火) 17:53:19
ああ、ごめん。 パスにスペースが入ってるのが駄目だったのかもしれん。 移動したらちゃんと表示されるわ。 しかしなぜデバッグビルド?
92 :
89 :2005/07/12(火) 18:09:08
>>91 OK。ばっちりだ。
デバッグビルドっていうのはデバッグするためのビルド。
デバッガをつかってステップ実行したりできるように
ソースの情報が入っていたりする。
VC6なら
ビルド->アクティブな構成の設定->Win32Release
とかにすればReleaseビルドになるとおもう。多分。
あと、メモリリークしてると思う。
ベースクラスのデストラクタもvirtualじゃないし。
>>88 オブジェクト指向って、要はメッセージの送受信だけでプログラムの
流れを表現しましょうとゆー考え方だと思う。
例えば、プレイヤーオブジェクト P と敵オブジェクト E があって、
PがEを攻撃して2ポイントのダメージを与えたとする。
このとき、オブジェクト指向では E に「体力を2ポイント減らしなさい」
というメッセージを送る。例えば E.hp_herase(2) という具合。
ここでのミソは、E の内部構造がどうであれ、.hp_herase() という
メッセージ(つまりメソッド)が分かっていればプログラムが書ける、
というところ。仮に体力が E.hp というメンバで表されているとしても、
その値を外部から変更するのは無しにして、体力を変更するメッセージ
(メソッド)を使いましょう、ということ。
ゲーム全体がオブジェクト間のメッセージのやりとりだけで破綻なく
記述できれば、オブジェクト指向の設計として成功しているといえる。
しかし実際は、往々にしてオブジェクトの関係(メッセージのやりとり)が
チョー煩雑になったり内部メンバを直接変更したくなったりする。
「それは設計が悪いから」とゆーのがオブジェクト指向設計の切り捨て方。
大雑把すぎるなあ。
>>92 おお、役に立ちそうな情報をありがとうございます。
設定を変更したら、いつもより小さめな実行ファイルができました!
てゆか、デバッガ使ったことない、、今まで無駄なことしてたのかああぁ。
メモリリークはしてますか・・
実行しちゃった人、ごめんなさい m(__)m
仮想関数はちょっとやってみた程度なのでよくわからないです。
私のお勉強本には、デストラクタの virtual は乗ってないし。。
ちょっと研究してみます。
ホントありがとうございます。
>>93 こっちにも役にたちそうな情報が!
クラスを使いはじめて思ったんですが、
他のプログラマさんが作ったライブラリを使ってみないと、
自分ではうまく作れないような気がしてます。
(標準のやつ以外使ったことないww)
わかりやすくて安全で使いやすくて見やすい
プログラムを書けるようになるには、あと何年かかるんだろうか。
どもです。
>>95 とりあえずデストラクタをvirtualにしないと継承したクラスを
ベースクラスに入れて使ったときにメモリリークする。
CPeopleとCPlayerにはどちらもDrawメンバ関数があるけど
こういうやつをベースクラスに落とし込む。
ついでに例えば
CPlayerのメンバ変数に
HBITMAP hBitmap;
とでもしておいてCreateでビットマップをLoadImage、
DeleteでDeleteObjectとしたりする。
DrawではHDCを渡すだけ。
とか。
そういうのは、スーパークラスにDrawableObjectをおきたいな。 描画管理はここに任せて、派生クラスは継承したメンバ関数で、 なるべく描画処理の細かいロジックは気にしない。
>DrawではHDCを渡すだけ。 >とか。 デザパタのVisitorパターンもどきになるな。 描画オブジェクトはデバイスコンテキストを受け取って、自分自身を描画する。 systemの描画イベントが発生したら、リストアップされている描画オブジェクトに 順にdraw要求を出していけば、自動的に各オブジェクトが条件や状態に合わせ た個別描画をしてくれる。 さらに複数の描画オブジェクトをまとめた集合を現すクラスにも同様のI/Fをつ けることで、コンポジットパターンを活用できる。
こういうときデザパタ便利だね。
100を誘拐する
101 :
デフォルトの名無しさん :2005/07/13(水) 00:10:25
void SONY () { while (1) { gijutsu--; burando--; kabuka--; timer++; } }
最強だなw
そのうちすげーことになるが うちどめしとかんといかんな
アンダーフローが楽しみだな。 オーバーフローの方もな・・・。
>>101 俺ソニー株持っているけど、そのうち文字通りの「億万」長者になれそうだなw
途中でCtrl+Cで破綻するだろうけど。
やぱこのスレは親切な人が多いなぁ (´ー`)
>>96 〜
前スレ821さんが描画専用のクラスを作ってたみたいなので、
私もそれに習おうと思ってました。
明日あたりに、試作型をつくってみまっす!ども。
スーパークラスのデストラクタのvirtualは、昨日いくつかググってみたのですが、
イマイチよくわからず。。
とりあえず付けときますw
関数名はオーバーライドして使う気が無いなら、
同じ名前はさけたほうがいいのかなあ。
(効果的なvirtualの使い方がわからないだけなんですけどね・・)
>>108 お、いいなそこ。ブックマークしとこ。
と思ったら既にブックマークしてあった。orz
ブックマーク膨らみすぎ…
>>110 あるある、いいなと思ったら既にブ(ry
極論すれば、オブジェクト間の情報伝達は全てパケット通信でできる。
localohostを使ってもいいし、あるオブジェクトは地球の裏側にあってもいい。
しかしそれでは実現が難しいケースがある、というのが現実。
理論としては、聞いただけでオラなんだかワクワクしてこまいか?
ttp://49uper.com:8080/html/img-s/66048.zip ちょっとためしにグラフィック専用のクラスの雛形を作ってみました。
PlayerはTransparentBlt()で描画して、
BackGroundはBitBlt()で描画するプログラムです。
どうもいまだにHBITMAPとHDCをいつ開放していいのか
よくわからないのですが、これ、大丈夫ですかね?
描画クラスとPlayerクラスでHDCとHBITMAPを引数として
いっぱい受け取ってるのに何一つ開放してないし、
*m_pHbitmapはBitmapOriginalのアドレスを記憶したあとも
開放しないでそのまんまなんですが・・。
描画クラスのhBitmapOldもそのままですし。
うー、毎度のことですが、メモリリークしてたらごめんなさい。
あ、あと、*m_pHbitmapはBaseクラスに持たした方がいいですかね?
ファイルも分けてないし、見にくいプログラムですみませんが、お願いします m(__)m
>>108 >>109 なんかわかりやすそうなサイトですね。
私もブックマークしときました!
どうもありがとー。
うはー、 void BitBlt (int x, int y, RECT rect, HBITMAP hBitmap, HDC hdc, HDC hMemDC) 関数の一番下で、 ::SelectObject(hMemDC, hBmpOld); するのを忘れてました orz これやんなきゃまずいんですよね? 追加お願いします。
なんでDirectX使わないの?
>>114 さぁ、実行環境がGDIより限られるからじゃないかな。
>>115 どろどろしたものが湧いて出た!!!
やべー!逃げる!
おれもひけらかしてぇ・・・。
もしや、(・∀・)作ってミターヨさんでは?
ノートン先生大激怒
119 :
117 :2005/07/14(木) 00:26:00
>>115 おおー、よくできてますね。アスキーアートよりずっと見栄えがする(w
SDL 使ってるのかな。コードに興味があるのでソースを希望してみるテスト。
余談だけど、ちゃんと動くプログラムは汚いことが多いです。
もし気にしてるならその必要はないですよ。
あと、コードを流用していたとしても無問題です。
コードそのものをこのスレに貼ってる時点で著作権とか放棄してるつもり。
でも、そのコードがどっかからのパクリだとまずいことになるかもね。
君に言われてもなぁ
>>112 オブジェクト指向はそのソースとは程遠いので、
提示されたリンク先を読んでも、そのソースの
どこをどうするということには繋がりにくいだろうな。
具体的な視点から考えるのも良いかもしれない。
現状の CGraphic や CObjectBase は、クラスとしての意義が全く無い。
何のメリットも無いクラスを作るのは無駄にプログラムを複雑にしていると言えるだろう。
クラスを作る前に、クラスを作ることによるメリットを考えると良いよ。
クラスによるわかりやすいメリットとしては
・解放を忘れてはいけないリソースがある場合
RAII(Resource Acquisition Is Initialization) の考え方でリソースリークを根絶
・2つ以上の変数について整合性が必要な場合
変数を private にして整合性が崩れる可能性を根絶
というようなものがある。
HBITMAP や HDC のリークが心配なら、
それらをクラスにしてコンストラクタで取得し
デストラクタで解放すればいい。
とは言っても、いつ解放して良いのかわからないのでは問題外なので、
まずはMSDNでよく調べてくるべきだろう。
>>112 <気になった点>
・RECT型変数の値渡し
・大域変数と仮引数のシンボルが同じなので危険な香り (今は問題になっていないが・・・)
・ハンドル型のアドレスを保持しておく意味が分からない
・属性を持たない具象クラスは必要ないぽ
・WM_DESTROYでのリソース解放部分が怪しげ
・hMemMemDCにちょっとワラタ
<修正・改良すべき点>
・ある程度のサイズを持った構造体orクラスインスタンスは参照・アドレス渡しにする
・DCを削除する際は初期の状態に戻すべき (SelectObject)
・リソース管理クラスを作っておけば解放(や所有権)が明確化される
・HDCは必要な時にGet、Createすれば解放のタイミングは問題にならない。
(ハンドル数の節約にもなるが、フラグメンテーションが発生する可能性はないのだろうか・・・謎)
>>122 >>123 丁寧なご指摘、感謝です m(__)m
>>122 >現状の CGraphic や CObjectBase は、クラスとしての意義が全く無い。
いや、おっしゃるとおりで。。
今は絵を出すのに必死で、絵に必要なの以外のメンバは書いてないので、
オブジェクト指向もなにもあったもんじゃないです orz
MSDNは、がんばって調べてみます。
どうもありがとうございます。
>>123 広域変数とローカルの名前が同じなのは、全然考えてなかった・・変えときます。
ビットマップの読み込みと開放、バックバッファの作成と削除
この二つは制御するクラスを作ってみます。
::SelectObject()の話は、バックバッファ用のやつ(広域のhMemDC)のことでしょうか?
そえば最後に戻してないですね。。
作成したときの情報を、どっかに保存しておくべきか。
構造体やらの参照渡しも心がけておきます!
MemMemは、hWorkDCとかにすべきですかね ^^
色々ありがとうございました。
>>115 おー、すごい!
人の見ると刺激になります。
私もがむばらねば。
アドレス渡しに比べた参照渡しのメリットがいまいちわからんぽ。
オーバーロード演算子で大活躍してることを 時々でいいから思い出して下さい。
>>115 よく出来ていると思う。ややCPU率が高い気も。
ドラクエ系ではすぐにたどり着けるマップも、wiz系だとムズい。
ソースは自由でいいと思う。自分も作品をうpしたい時に出しやすいし。
>>123 自分はCだけど、そういうのは1つの関数の中でやってしまうかな。
BitBlt2() {
CreateCompatibleDC();
SelectObject();
BitBlt();
SelectObject();
DeleteDC();}
128 :
115 :2005/07/14(木) 21:13:41
CPU利用率が高いのは手抜きです。 実は迷路生成と、迷路表示だけが目的で 切った張ったしてでっち上げたもので、 悪影響しかないと思いますのでソースは勘弁してください。 一応肝の迷路生成と迷路表示だけは抜粋しておきます。 // マップを全部壁にして、穴掘り法で迷路を生成する。 // 周りには番兵として道がある。 void MazeSub(int x, int y){ if(Map[y][x] != MAP_ROAD){ return; } int r = rand() & 3; // 次の道の方向 int p = (rand() & 2) - 1; // 回転方向を適当に変えて遊ぶ(-1か1) for(int i = 0;i < 4;i++){ int px = GetDirX(r); int py = GetDirY(r); if(Map[y + py * 2][x + px * 2] == MAP_WALL){ Map[y + py][x + px] = MAP_ROAD; Map[y + py * 2][x + px * 2] = MAP_ROAD; MazeSub(x + px * 2, y + py * 2); } r = (r + p) & 3; // 回す } }
129 :
115 :2005/07/14(木) 21:15:26
// 3Dで表示する部分。 void DrawField(SDL_Surface *screen){ SDL_Color col; col.r = 255; col.g = 255; col.b = 255; DrawBox(screen, X_CENTER - X_HALF, Y_CENTER - Y_HALF, X_CENTER + X_HALF, Y_CENTER + Y_HALF, 255, 255, 255); int px = GetDirX(chara_dir); int py = GetDirY(chara_dir); for(int i = 0;i < 3;i++){ bool front = Map[chara_y + py * i + py][chara_x + px * i + px] == MAP_WALL; bool left = Map [chara_y + py * i + GetLeftY(chara_dir)] [chara_x + px * i + GetLeftX(chara_dir)] == MAP_WALL; bool right = Map [chara_y + py * i + GetRightY(chara_dir)] [chara_x + px * i + GetRightX(chara_dir)] == MAP_WALL; DrawFieldSub(screen, left, right, front, i); if(front)// 前に壁があったらそれ以上描画しない break; } }
130 :
115 :2005/07/14(木) 21:20:04
void DrawFieldSub(SDL_Surface *screen, bool wall_left, bool wall_right, bool wall_front, int depth){ if(wall_left){// 左上 SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * depth))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), 255, 255, 255); // 左下 SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * depth))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))), 255, 255, 255); }else{// 左 SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * depth))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * depth))), 255, 255, 255); if(depth < DRAW_DEPTH){ SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), 255, 255, 255);SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * depth))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))), 255, 255, 255);if(!wall_front){SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))), 255, 255, 255);}}} // 右については略 // 左と座標を逆にして処理しているだけ。
131 :
115 :2005/07/14(木) 21:20:38
if(wall_front && depth < DRAW_DEPTH){ // 上 SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER + (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))),255, 255, 255); // 下 SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER + (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))),255, 255, 255); if(wall_left){ SDL_DrawLine(screen, (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER - (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))),255, 255, 255); } if(wall_right){ SDL_DrawLine(screen, (int)(X_CENTER + (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER - (Y_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(X_CENTER + (X_HALF / (1 + Z_BLOCK * (depth+1)))), (int)(Y_CENTER + (Y_HALF / (1 + Z_BLOCK * (depth+1)))),255, 255, 255); }}}
132 :
115 :2005/07/14(木) 21:24:47
荒らしっぽくなってしまった… ごめんなさい。適当に整形してみてください。 整理すると消せる部分があるんですが、面倒でやっていません。 あと、文字表示にはSDL_kanjiを使っています。 配布ファイルに含めてしまったBDFは実は権利関係がまずいかもしれません。 FreeBSDからぶっこ抜いてきたものですから大丈夫だとは思いますが… もし次があるとしたら、あるいは次の人は東雲あたりを使ったほうがいいとおもいます。
134 :
デフォルトの名無しさん :2005/07/15(金) 14:46:40
良スレage
(´ー`)俺もひそかにROMってるぜ
(´ー`)俺もひそかに作りたいぜ
137 :
127 :2005/07/15(金) 17:16:11
3Dじゃなくて、疑似3Dじゃないのか。
141 :
115 :2005/07/15(金) 22:16:22
ちなみに Draw*という関数は自作です:-)
142 :
127 :2005/07/16(土) 05:06:00
143 :
デフォルトの名無しさん :2005/07/17(日) 02:35:29
HWNDやHDCやHBITMAPが元々ポインタなのに 何故そのアドレスを渡そうとするのかよく分からないのですが。 あと、0か1しか返さないのにint型を返すと言うのも違和感が・・・。 boolとintはほとんど一緒ですけどね。
>>143 Cではbool型がないからintを使うのは普通(C99はべつ)。
HWNDやHDCやHBITMAPは、やぱポインタなのか。 サイズも4バイトだし。
before/afterってネーミングは良く使われるのかな? 俺は初期化と終了処理は慣例的にopen/closeにしてる。
148 :
127 :2005/07/17(日) 14:09:13
HWNDらのポインタは意味ないね。一般関数でNULLを返すのがある所からも。 intとかでやってたので、そのままやってしまってた。 戻り値は大体あんな感じかな。場合によっては、正負0の3パターンを返すとか、 引数にchar *型を渡すと、エラーメッセージを得られるとか。 引数は、構造体にまとめた方がいいのか。 増やす時に、ちょっと直すだけでいいとかもあるし。 before/afterはダイエットとかの広告のをいただいた。違う人だろと思いつつ。
斜め移動がなくなって、操作感覚が悪くなったような。 でも斜め移動を残したら、判定たいへんそうですし。 あとスクロールさせたら画面がチラつくから、 バグってるのかどうかがわかりにくいです (T_T)
WinMain.cppで CreateWindowにWS_VISIBLEをつけるとShowWindowがいらなくなるし、 while(GetMessage(&msg, 0, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } のようにした方がいい気がする。 関係ないけど自分がコーティングするときと比べると だいぶ横幅が結構狭いですね。 ディスプレイの解像度はどのくらいでしょうか?
あと、何故スレッドやマルチメディアタイマーを使わずに 精度の低いタイマーを使うのかと、開発環境を聞きたいです。 他にも色々あるけど。
まあまあ。経験者はいろいろツッコミ入れたくなるだろうけど アドバイス程度にしておこうよ。
>>151 >>152 どもです。windowsに関しては無知そのものなので
ちょこっと調べてみました m(__)m
WS_VISIBLE
可視状態のウィンドウを作成します。
::GetMessage()の戻り値
WM_QUIT メッセージを取得すると、0 が返ります。
エラーが発生すると、-1 が返ります。たとえば、hWnd パラメータが
無効なハンドルを指していた場合、エラーが発生します。
とありました。
いずれもご指摘の通りにした方が良さげですね。感謝!
パソの解像度は 1400*1050 です ^^
画面の半分ちょいぐらいでプログラム書いてますので、幅は狭めかも。
空いてる部分で2ちゃんとかしてるので、こうなってしまいました。
使ってるのは東芝のノートパソで、celelon1.8ギガのやつです。
コンパイラはVC++6.0 Standerdです。
Timerは、とりあえず30フレ出ればなんでも良かったのと、
マルチスレッドが全然わからないんで。。
あと::PeekMessage()と::Sleep()使う方法は知ってるのですが、
あんまパソに負担かけたくなくて。
今のタイマーだとCPU使用率も5〜15%なので、
パソにやさしそうなのでこれ使ってます。
最終的にはマルチスレッドというのをやりたいと思ってます。
ご指摘ありがとうございました。
155 :
127 :2005/07/17(日) 18:53:39
>>149 CPU率が高いかな。
RPGとか動きの少ないゲームは、移動とかしない時は、FPS4でいいと思うけどな。
3枚の視界サイズのメモリビットマップに、視界の全キャラの全足踏みパターンを
書いておいて、WM_TIMERで250ミリ秒毎に0→1→2→1と描画するだけ。
キャラが移動した時、画面がスクロールした時には、
3つの歩行パターン全部に更新部分を描画する。
RPGプログラミングの書籍とかないかなぁ…
>>155 俺の環境だとCPU利用率が1%ぐらい。
158 :
157 :2005/07/17(日) 20:38:48
勘違いされると困るから一応言っておくけど、 俺のマシンのスペックは今となっては高くない。 CPUはPentium3 900MHz グラフィックはVIAのオンチップで
160 :
157 :2005/07/17(日) 21:35:51
Windows 2000 メモリは256M
>>149 >// 開放(この開放のしかたはいいのか?)
>void Free ();
よくねーよボケー!!!
Free(); としましょう。それじゃ宣言止まりです。
ワロタw それじゃ解放処理呼ばれて無いわw メモリリークしまくりんぐ
>>157 うちは600MHzぐらいorz。すごく重いとかいう意味ではなくて、
一般的にfpsが高い方が作品としてすぐれているみたいに考えられているけど、
RPGや、ゲームではないけどテキストエディタとかは、
描画の回数を減らせるなら減らした方がいいのではという意味で書いた。
>>163 まずは、基本的な移動という感じですな。
お互いレベルアップできるようにがんばりましょう。
>>155 おお、そんな技もあるのかあ。
プログラムはどんどん重くなっていきますし、
いずれはそんな方法も使ったほうがいいのかなあ。
ちょっと難しそう・・どうもありがとうです。
>>156 わたしも欲すぃ。
町の人のセリフとか、どうやって個々に持たせるのか
全然思いつかないし (T_T)
あと、イベントとか、ホントどうするんだろうか・・。
>>161 うはwwほんとだwwww
いちおうFree()の中で開放してるやつは
全部デストラクタにも入ってるので
このプログラムではあんま結果は変わらないのですが、
過去のヤツでは問題アリアリのもあったかも。。
てゆか、たぶんFree()作ったときからそのヘンテコ記述でしたよぉ。
気づいてくれて、ありがとうございます m(__)m
>>163 おー、なんか私の知らない未知のテクノロジーがいっぱいww
絵はどう使っても問題ないんですよ。
でも、、ホントにあんなんでいいんですかね ^^
改変とかもバシバシやっちゃっても全然かまわないので。。
マルチスレッドうらやますぃ。
>>163 クリティカルセクションをコンストラクタとデストラクタで
ロック/アンロックしてる部分は知らなかったんで「なるほど」と思いますた。
定石なのかもしれませんが・・。
wineからMSIMG32.dllの部分だけとって使おうと思ったら、
まだ実装すんでないのね。
と思ったらyaneSDKのものだったんすね。<CriticalSection ふむふむ。
>168-169 御指摘通り、yaneSDKからパクってます(;´Д`) コードを抜き出して組み込んでも良いと書かれていたので、 そうさせてもらってます:-) (他の部分もコードを読んでいるんですが、 yaneSDKの中身はおいらにとっては難しすぎますorz) 使えるオープンソースは使っていこうという方針っす
ロック/アンロックじゃなくて生成/破棄だね。 CriticalSectionはEnter回数をWin32側がカウントしているんじゃなかったけ。 そもそも動作しているスレッドがロックしているとか、ロック回数を保持するとか 必要あるのかな?
>>171 ソース読んでない&&Java屋の戯言だから間違っているかもしれんが...
コンストラクタでロック、デストラクタでアンロックしているようだから
>>168 で合ってるはず。
再帰ロックすると、単純にデストラクタでDeleteCriticalSectionを実行するとバグるからだと思う。
ゲームの場合、スレッドよりコルーチンの方が使いやすい希ガス。 WinでもConvertToFiber(うろ覚え)みたいなAPIで使えるよね。 ライブラリでも拾えるし。
そもそも初心者スレだし、 無理してスレッドやらコルーチンやら使わなくてもいい希ガス。
>>175 わお!スクリプト記述キター!
やはりゲームシステムとゲーム内容は分離すべきですね。
なんかちょっとやる気出てきたゾ。
177 :
175 :2005/07/19(火) 06:33:50
言い忘れ。 マップが適当なのは組み立て方が 良く分からなかったのと面倒だったから。 ソース自体は素敵処理が満載で、 まんま使ったりしようとすると恐らく 痛い目にあうからやめた方が無難。 ただし、スクリプトの実現や、 NPCの実現の一つの手法としては もしかしたら参考になるかもしれない。
>>175 うあっ、また未知のテクノロジーがw
NPCエディタとか、イベントエディタとか
やぱ作らなきゃいけないのかぁ。
どこまでできるかな。。
作らなきゃいけない、とゆーことはない。 作った方が楽できることもあるし、ゲームよりもエディタの方が 大掛かりになってしまうこともある(後者はある意味本末転倒)。 それに、一口にエディタといってもコンバータに毛が生えたようなものから GUIベースの凝ったものまで色んな形があり得る。 エディタはプレイヤーには見えない(ゲーム開発者だけが使う)道具だから、 「何がしたいか」をはっきりさせて手抜きできるところは手を抜かないと。 何から何まで本格的にやってたらとてもじゃないけど完成しないよ。
やっぱり、人のソース見るとやる気出てくるわ… がんばろっと…
やること満載なのがわかって、落ち込む人もいます orz
夢が広がりんぐwww
あんまり全体ばっかりを見て途方にくれるより 今できそうなことを着実にこなして、脳内を快感物質で満たし続ける方がいいよ そうすればやる気も持続しやすくなるはず
RPGはひとつひとつのルーチンは簡単だけど 全体の量が多くなるからねぇ…
185 :
デフォルトの名無しさん :2005/07/20(水) 08:43:08
>>184 基礎だけなら、シューティングやシュミレーションなんかとそれほど変わらんとおもうが、
大抵、RPGはドラクエとかFFみたく凝りたがる人が多いからね。
とりあえず、Rogueのソース読みこなせればいっきに世界が広がるよ
と言ってみるテスト。
Rogueやってみた。 ソース以前に操作方法でつまづいた orz
スクリプトの作り方なんて激しく人に依りけりだからなぁ。 まずは外部依存でイベントを実行できるアドベンチャーを作ってみるとか。
まずは2DマップでWizardryのシステムを作ったほうがいい気がする。 本家#1のやつね。あれはイベントスクリプトなんてものはないし、 そもそもNPCがいないし。フラグ管理もアイテムのみだ。 NPC以外の全てが詰まってるステキなゲーム。
本家#1って?
190 :
デフォルトの名無しさん :2005/07/20(水) 20:25:05
>>189 一番最初のシナリオ。ASCIIの外伝とかじゃないやつ。
Wizardryはシナリオごとに#1、#2〜と番号が振ってある。
I see.
Wizardryって何
おおっと! テレポーター
石の中にいる
なにやら面白そうなスレ
>>149 が落とせなかったんで現状把握が出来てないのだが、
今どこまで進んでて、どの辺りが詰まってるん?
きみょうなウサギは3かいかみついた せんし1のくびをはねた せんし1はまひした せんし1はどくにおかされた せんし1はいしになった せんし1ははいになった せんし1のレベルが7さがった どうする?
>せんし1ははいになった それでも生きてるのか…?
「くびをはねた」の時点で死んでる。 Wizには死より悪い状態がある。それが灰。 灰よりさらに悪い状態もあって、それがロスト。
>>196 >>149 は、プレイヤーらしきキャラが画面上を歩くだけのプログラムです。
今はフィールドのプレイヤーと町の人の共通の処理を、
なんとかクラスにまとめられないかを考え中です。
動きうんぬんよか、どういうクラスにするのかが難しい。
早くゲームっぽい動きを考えるとこまで行きたいよぉ。
>>188 さんの提案は凄く魅力的。
まずはイベントとか無いのを作るほうが、
モチベーションを維持できそうな気がする。
スクリプトってなに?
>スクリプトってなに? たとえば王様のイベントがあったとして、 event.cpp ---------- void king() { if(dead){ msg("おおぅ、勇者のくせに死んでしまうとは情けない"); msg("明日から来なくていいよ"); sound("derodero.wav"); } } ↑こんな風に直接コーディングするのではなく ↓こういうテキストを用意して、プログラムからこのテキストを解析することにより 上のコードと同じような動作を再現させる。 event.txt ---------- event king if $dead msg おおぅ、勇者のくせに死んでしまうとは情けない msg 明日から来なくていいよ sound derodero.wav endif endevent
>>201 げっ、マジですか?
それってメチャ難しそうなんですけど・・
たまにサイトとかで「独自のスクリプトを組んで〜」みたいなのを
見かけるのですが、コレのことだったのかぁ。
こりゃ無理ですわ orz
>>200 動く物(その場でアニメーションを含む)はスプライトを扱う基底クラスを
作って、それを継承すると後々楽になると思う。
下はパッと考えで書いたので甘すぎるクラスになっているが、
基本的にはdoMove()で次の位置を決めdraw()で描画といった形。
NPCObjectはそれぞれランダムで決めた方向に進む処理をdoMove()に実装し、
UserObjectはkeyDirectionに従って進む方向を処理する。
その他オブジェクトは移動なしのスプライトアニメーションに使う等。
class MoveableObject{
MoveableObject(void);
MoveableObject(int controller, int xPos, int yPos);
virtual ~MoveableObject(void);
virtual void doMove(void);
virtual void draw(void);
protected:
int controller; //0 = user controll, 1 = non player controll
int xPos, yPos;
};
改行多すぎたので分割、インデントが付けられないので醜くなってしまった class UserObject: public MoveableObject{ UserObject(void); UserObject(int xPos, int yPos); virtual void doMove(void); virtual void keyEvent(int direction); protected: int keyDirection; }; class NPCObject: public MoveableObject{ NPCObject(void); NPCObject(int xPos, int yPos); virtual void doMove(void); }; class OtherObject: public NPCObject{ ..その他、小爆発アニメーションなど };
ぶっちゃけ、スクリプトはなくてもどうにかなる。 けれども、自由にNPCを追加したりするときに重宝する。 マップとスクリプトあれば、同じシステムでいくらでもゲーム作れるからね。 まあ、それがRPGツクールなんだけど。 何も完全構文である必要はない。@eとか@nとか、プレフィックス+1文字で どうにかするとかもできる。
大規模ゲームになると、スクリプトがないとやってられないよ。 RPGならどうしても大規模ゲームになるよね。
>>202 スクリプトは、バイナリの簡単な仮想マシンにすると実装は楽だね。
大きなスクリプト書くのはしんどいがw
208 :
207 :2005/07/21(木) 21:15:22
小規模なRPGの場合、スクリプトなし、あるいはバイナリベースのスクリ プトシステムに簡易アセンブラ(ラベルのアドレス化と簡単なニーモック、 フラグレジスタの変換程度)、といった形が現実的かも。 実行時にテキストを読み込んで処理するのはちょっとしんどいし、配布 にも不利だからね。
まあスクリプトの処理方法が皆目分からないヤシはAhoのドラゴン本でも読んでなさいってこった。
http://49uper.com:8080/html/img-s/67378.zip 定期です。
本格的に
>>149 と変わってないのですが。
当たり判定で、ちょっとハマってしまいまして。。
>>203 私のプログラムでは、
CObjectBase ってのが MoveableObject に当たると思います。
てゆか、ベースクラスのメンバ変数を protected のとこで宣言すると、
派生クラスで直接使えるのにびっくりしてしまった。
あー、C++を覚えながらRPGを作るのは、やぱ無謀だったか。
>>203 と
>>204 に仮想関数がやたらと多いのは、
いったいなぜでしょうか?
アフォな質問で申し訳ありませんが、
お願いします m(__)m
派生クラスでオーバーライドするから
プログラマがスクリプト書くならLuaみたいな 既存の組み込みスクリプトでええじゃないか。
構文解析の処理とかプログラミングの基礎だろ? ゲーム作りたがる人は地味だから、これを飛ばしたがるけどねw 簡易電卓をまず作ってみるといい
>>210 仮想メンバ関数を多用しているのは、端的に言うと
>>212 の意味。
基底クラスなどでvirtual宣言している仮想メンバ関数は継承クラスで再定義できる。
>>203 を例にとると、
static MoveableObject spriteTable[MAX_SPRITE_COUNT];
int eventLoop()
{
for(int i = 0; i < MAX_SPRITE_COUNT; i++){
spriteTable[i]->doMove();
}
return(returnCode);
}
void intialize()
{
memset(spriteTable, 0, sizeof(spriteTable));
spriteTable[0] = new MoveableObject();
spriteTable[1] = new UserObject();
spriteTable[2] = new NPCObject();
while(!exitFlag){
eventLoop();
}
}
こんな感じで使うとして、i==0の時はMoveableObjectクラスのdoMoveに制御がまわり、
i==1 -> UserObjectクラスのdoMove()
i==2 -> NPCObjectクラスのdoMove()に制御がまわる。
使う側はその実際のクラスがなんであれ基底クラスとして扱えば
実際の制御は派生クラスで行ってくれるという感じ。
詳しくは派生クラスとバーチャル関数辺りを調べれば出てくると思う。
>スクリプト BulletMLみたいにXML使ってもよかですかい?
>>214 >これを飛ばしたがるけどねw
飛ばすもなにも、自己流で勉強した人はまず、そんなプロセス通らないだろ。
役に立つのは確かだから俺からもオススメするが。
なによりも知的好奇心が気持ちよく満たされる。
218 :
207 :2005/07/21(木) 21:54:01
>>216 「状態の設定」には良いんだけどね>XML。
処理の「流れ」をどう表現するか……。
結局、XMLに記録するものがまた「テキストスクリプト」になる気がw
>>215 誤: static MoveableObject spriteTable[MAX_SPRITE_COUNT];
正: static MoveableObject *spriteTable[MAX_SPRITE_COUNT];
>>217 自己流でやっていて、Cを覚えようとして、
BASICインタプリタ作った俺はなに?
221 :
デフォルトの名無しさん :2005/07/21(木) 22:01:38
神
WideとHeightとかWi、Hei、Ceeate、Oll、Animaあたり
前スレとちがって、なかなか面白くなってきたけど、今受験に専念したい自分には2ch自体が甘い誘惑。 だれか、このスレのLogを取って置いてくださいませ。 来年の4月には取りに着ますので。 よろしくお願いします。
VC++6.0 Standerdで、Cはコンパイル出来るんですーか? そもそも、VC++6.0 Standerdってなんですか?Yahooで調べてみたけど、いまいちよく分からん。 というより、Cで3DRPGを作れるの?聞く話によると、Javaの方がいいという。 まったく初心者の俺は、これだけで混乱してしまう。 だれか、厨房と思わずに教えてくれー!!
>Cで3DRPGを作れるの? >聞く話によると、Javaの方がいいという。 言語なんて飾りです エロい人にはそれが分からんのです ・・・つまり センスがある人ならCだろうがJavaだろうが作ってしまう センスが無い人は、どの言語を選ぼうが作れない ただそれだけのこと
>>225 VC++6.0 Standerd とは マイクロソフト製のC言語、C++言語でプログラミングをする統合開発環境
Cで開発する場合、画像を表示する窓(ウィンドウ)から作らなくてはならない
Javaで開発する場合は、その窓を作らなくてもよい
3Dゲームを作る場合は、すでにあるライブラリーを使う場合が多いけどその時はCのほうがライブラリーを使いやすく、使用例が多くあります
>>210 あたり判定
ソースを読んでみたのだが、今プレイヤーが壁に向かっているか否かは
CPlayer::HitCheckMap()の中でcMap.GetMap()を使用して背景スプライト番号で
判定しているが、これを障害物マップに置き換えてみてはどうだろうか。
あるいは背景スプライト番号(m_pbyMap)の意味を拡張して、
障害物フラグも内包するなど、今は8ビットだがこれを16ビットにして
下8ビットをスプライト番号、上位8ビットを障害物フラグなど。
unsigned short mapItem;
mapItem = cMap.GetMap(...);
if(!(mapItem & 0xff00) && ((mapItem & 0x00ff) == 1)){
mapItem = cMap.GetMap(進行方向);
if((mapItem & 0xff00) || ((mapItem & 0x00ff) != 1)){
m_byWalkFlag &= ~WALK_XXXX;
nHit = true;
}
}
この場合CMap::m_pbyMapの内容は村人の移動とともに書き換えることになる。
絵付きで細かく説明しないとわかりにくいかもしれないが、ご容赦。
>>229 訂正
誤:この場合CMap::m_pbyMapの内容は村人の移動とともに書き換えることになる。
正:この場合CMap::m_pbyMapの上位8ビットは村人の移動とともに書き換えることになる。
>>215 なるほど。一つのインターフェイス、複数のメソッドってやつですかね。
う〜ん、でも効果的な使い方が思い浮かばないです orz
>>215 のを利用すると、プレイヤーキャラと町の人をソートして、
上から順番に表示するプログラムとか、やりやすそうに
なるような気がしなくもないですけど、、うーん。
もうちょっと考えて見ます。
ども!
>>229 おー、それはいいかもです!
マップチップの種類はそんなに多くならなそうですし、
8ビットのうち、1ビットは進入可能か不可能かの判定フラグにしてもいいですね。
村人の移動で書き換えるのも良いさげ!
でもそれだと、もう一個フラグが必要になるかなあ。
マップチップデータはunsigned short型にして、上位8ビットには
なんか他のデータを入れようかと思ってました。
敵の出現情報とか(川の向こうとこっちじゃ出てくる敵の種類が違う、みたいなやつ)は、
マップチップに持たせたほうがいいんですかね?
>マップチップデータ 構造体の配列にするといいと思う。 struct CHIP{ int image; int movable; int enemy_type; }; class CMap { CHIP *m_pbyMap; … }
233 :
207 :2005/07/22(金) 19:23:37
>>231 >敵の出現情報とか(川の向こうとこっちじゃ出てくる敵の種類が違う、みたいなやつ)は、
>マップチップに持たせたほうがいいんですかね?
それは別にした方が良い(出現情報自体が、地形情報とは異質の一つの
マップになるから)のでは?
配列で持つなら
地形(表示用マップチップ)
遭遇する敵
イベント情報(イベント番号)
はそれぞれ別にする方がわかりやすいと思う。
>>234 GDI+はどうやっても速くならないと思う
GDI+対応のアクセラレータが無いからGDI+は滅法おそい、って誰の話だったか
MMOに挑戦してみてるんだが、こりゃ大変だわ・・・。 微妙にチャットできるようになったらUPします。
>>232 >>233 どうもです。
そうか、構造体って手段がありましたね。
そのほうがわかりやすそうです。
マップエディタ作るまえに、最終的な仕様を決めとかないと
あとで大変なことになりそうですね。。
イベント情報もマップデータが持つのか。
マップチップ構造体
○絵
○敵のタイプ
○イベント情報
○なんか1ビットずつのフラグ
こんな感じになるのかなあ。
↑のやつだと、全部BYTE型ですみそうですけど、
念のためint型で宣言しといた方がいいのかなあ。
でもそれだとメモリいっぱい使いそうだし。
>>234 おつです。
やっぱ、けっこう差があるんですね。
ウチでもDirectDrawのビデオメモリverが異常に早かったようです。
>>237 うはww なんか、高レベルな感じ。
がんばってください。
>>238 仮に1チップあたり贅沢に16バイト使うとしても
たとえば50x50チップの町を表現するのに 40KBytes。
これは256色ビットマップ200x200程度の容量。ぜんぜん気にならない。
ちなみに SFC の RPGツクールでは、世界マップが 256x256 だった。
これだとちょうど 1MBytes 必要になるな…。今の PC なら気にならんだろうけど。
(それに1チップ16バイトも使わないだろう)
設計さえしっかりしてれば
メモリの節約なんて、完成の1歩手前でも十分間に合うから、
今は作りやすさを優先したほうがいいと思う。
>設計さえしっかりしてれば >メモリの節約なんて、完成の1歩手前でも十分間に合うから、 通常、それは設計がしっかりできていないというんだよ。
ちゃちゃ入れるなや。勉強中なんだからどのくらいっつー感覚ないだろうしな。 それにちっと位贅沢設計でも問題ないだろ。 仮に出来上がったものが1Gbyte以上必須だとしても、それはそれで面白い。 ま、1Gは大げさだが256M位だったら問題なしだろ。
いまどき設計でメモリのことなんかちまちま考える必要はない それより重要なことがある 設計者として節約の感覚はあったほうがいいとは思うが、 ゲームやるPCのメモリは潤沢だろ
大富豪プログラミング
大貧民プログラミング
だからまともなやつが育たない
大富豪はな
>>241 設計がしっかりしているとメモリの節約さえ柔軟にできないのですか?(ニヤニヤ
日本語編だなあぁ。 設計がシッカリしているのがまるで悪いことのように思える文章だ。
ぐだぐだと御託を並べても始まらない。 まずは、完成させることが大事であるわけだが。
・・・・
何だか、
>>253 で 雰囲気が一気に消沈した。
255ゲット。
257 :
みふね :2005/07/23(土) 23:42:26
脳内メモリーは節約しておけ Noobどもが!
口で言うより作ったプログラム(RPG)でアピールしる!
3get
つーかみふねさんじゃないですか! ネトゲ進んでますか? 陰から応援してまつ。
おこらないで ね おこらないで 好きにさせてね 大人にはわかんない ステキ 奇跡 完璧(ハイ!
氏牢徒に長編3DRPGは作れるのか。
すでにできているプログラムをいじくりまわすのが一番楽しい。 それ以外は苦行です (T_T)
一日中資料を漁り続けていると さすがに気が滅入ってくる。(ハァ...
ヒント:プログラマ
君の日本語は若干おかしい
ゲームはアイテム等のデータを作るためのエディタ作りからはじめなければならない そう思っていた時期が俺にもありました 今は反省して全てテキストファイルに手書きです
まぁアイテムくらいならな…
>>267 程度なら諸概念をテンプレートライブラリとして構成できそう
お決まりのルーチンを一からコーディングするなんて無駄が大きすぎる
今更だけど、出来れば、前スレのログを・・・
じゃ〜、RPGより先にそっちのソフトを作れということ?
276 :
デフォルトの名無しさん :2005/07/26(火) 20:55:42
ぶっちゃけ、RPG を含めてゲーム作りにセオリーなんて無い。 「こうしなければいけない」とか「こうするのがベスト」なんて一概には言えない。 10人いれば10通りの作り方があるのがゲーム作りであり RPG 作りだ。 耳学問をいくら積み重ねても絶対に作れるようにはならない。 唯一確かなのは他人のソースコードを参考にして自ら作ってみることだ。 それ以外に道は無い。
RPGなんてこの世に産まれてからたかだか20年 数学なんて7000年以上前と言われてるんだから
うう、ただただ時間が無い (ノω`)・゚・。。
フレームワーク
>279 それがどうした?
.net Framework
それがどうした
人大杉なのか。
ヽ(`Д´)ノ
 ̄/ ̄ジー
(・∀・)v
http://49uper.com:8080/html/img-s/68300.zip 定期です。とにかく村人出してみました。
週に二回のペースで上げようと思ってたんですが、
無理っぽいです ノω`)・゚・。。
着手してそろそろ一ヶ月がたつというのに、終わりが見えない。。
8月中に完成させたいと思ってたのですが、絶望的な感じです。
次はなにをやるべきですかね?
音か・・描画か・・はたまた戦闘とか。。
マップエディタも作らなきゃだし、そえばメニューもまだ無いし、
村人はセリフをしゃべれないし。
てゆか、そもそも本来の目的である、クラスの使い方はこれでいいのか、
メモリリークは本当にしてないのか。
orz...
乙。形になってきてるね。 残念ながらオブジェクト指向の持ち味はあんまり生かされてないぜ… 完成させるほうが大事だと思うのであんまり突っ込まないけど。 >音か・・描画か・・はたまた戦闘とか。。 >マップエディタも作らなきゃだし、そえばメニューもまだ無いし、 >村人はセリフをしゃべれないし。 絵をゴージャスにするとやる気が出る。これオススメ。 セリフ機能を入れるだけでプチ物語が作れる。これもやる気出る。 マップエディタを作ると疲れてやる気が消耗する。初めはテキストファイル手書きがオススメ。
マップエディタってフリーのPlatinumとかで良いと思うんだけど。
> 絵をゴージャスにするとやる気が出る。これオススメ。
> セリフ機能を入れるだけでプチ物語が作れる。これもやる気出る。
> マップエディタを作ると疲れてやる気が消耗する。初めはテキストファイル手書きがオススメ。
>>288 の要望だなw
>
>>288 オブジェクト指向・・。
今はカプセル化とか全然考えてなかったり ^^
最終的にはインターフェースっぽいの以外は隠蔽しちゃうのが
理想的だと思うのですが、私が雑魚なためにどれがインターフェースに当たるのかが
作った段階でイマイチ判断できないので、結果的に全部publicに置くことに・・
あと、オブジェクト間のメッセージのやりとりってのが全然わからないです orz
今は、たとえばマップ動かしたときPlayerの座標を修正する場合、
マップクラスのメンバ関数にPlayreをドーンと参照渡しして、
その中でPlayerの座標をバンバン変えちゃってるんですが、
これはオブジェクト指向的には大丈夫なんでしょうか?
うーん、よくわからず・・
提案してくれた「絵をゴージャス」にってのは私の画力では
不可能なのであきらめるとして、次はセリフに挑戦してみまっす!
とりあえず、
msg1:ここはアリアハンの城下町です。
msg2:北には洞窟があるらしいですよ。
msg3:スライムは弱いけど、おおアリ食いには注意してください。
みたいなテキストファイルを用意しといて、
村人にしゃべりかけたときメッセージの番号で判断して
しゃべらせばいいんでしょうか?
ファイル操作とかほとんどやったことがないので、メチャてこずりそう。
>>289 マップエディタはとにかく自分で挑戦してみて、ダメっぽかったら
それ使ってみます。ども。
子ウィンドウとか、どうやって出すんだろ。
あー、課題がいっぱいだわ。
>>293 誤爆?私のことなら、今10個ぐらいですけど。
>>291 >オブジェクト指向
>オブジェクト間のメッセージのやりとり
例えとしては、
class Player{ //プレイヤークラス
Position m_charaPosition; //メンバ変数 キャラクタの座標)
public:
Position getPosition(){return m_charaPosition}; //キャラクタの座標を返す
void setPosition(Position position){m_charaPosition = position;};//メンバ変数にキャラクタの座標をセットする
}
こんな感じ
Positionはユーザー定義の座標クラス(か構造体)
set〜で外から受けて、get〜で外へ渡す
メンバ変数を直接扱うと、間違った使い方をされてもエラーを返せないから
メンバ関数にしてエラーが出にくいようにしてやろうって事
本当はちょっと違うんだけどね
オブジェクト指向っていうのは、データと、それに関する操作を クラスにまとめましょうっていうことですよ。 例えば、NPCなら現在の座標、どっちを向いているか、 グラフィック、会話データなんかをまとめるわけですよ。 オブジェクト間のメッセージというのは、 例えばNPCが移動したいとするわけですよ。 そうしたときに、マップオブジェクトに問い合わせるわけですよ。 「(x,y)に行ってももいいですか?」 「はい。いいですよ。」 とか。そんな感じですよ。
オブジェクト指向はその人間の世界観や哲学による。
>>291 が世界は神がチェスのごとく物体を動かすことで構成していると思うならその手法が最も自然である。
しかし物体が意思を持って自分の判断で歩いていると思うなら
>>296 のようにするのがいい。
>>295 ご丁寧にありがとうございます。
参考にしまっす!
>>296 >>297 うーん、メッセージのやりとりはそんなに限定的にやらなくても良さげですね。
座標を変えたい場合は必要なデータだけconstで渡して、
結果を戻り値でPOINT構造体あたりに受け取ったほうが
いいのかとか思ってたんですが、そうすると無駄にプログラムが長くなるし、
どうしようかと考えてました。
とりあえず今まで通り、オブジェクト全体を参照渡しする方法で行ってみます。
毎度毎度、どうもありがとうございます m(__)m
( ゚Д゚)y─┛~~ どうよ?
300 :
デフォルトの名無しさん :2005/08/01(月) 12:53:48
300ゲト
とっとと夏休み中に仕上げやがれ!
windows再インストールしたら、なぜかメモリが壊れた orz
http://49uper.com:8080/html/img-s/69247.zip テキストファイルから、任意の文字列を読み込むプログラムを作ってみました。
msg:00000>0です!
msg:00001>aaa
msg:00002>(*^ー゚)b
てな感じのテキストファイルを用意して、
まずテキストファイル全体をメモリ上に読み込む →
メモリ上で「:」を探す → 「:」から「>」の間の数字を読み込む →
数字が指定された数字といっしょなら「>」の後ろの文字列を表示 →
「\n」まで表示されたら関数終了
という流れになってると思うんですが、
文字を出すだけならこれでいいでしょうか?
なんか無駄にプログラムが複雑になってるような気がするのですが・・。
おいおい、そのテキストファイルを手打ちすること考えたか? 専用ツールを作るまではエディタで手打ちすることになるわけだが、 そんなフォーマットじゃ毎回毎回面倒だと思うぞ。 ついでに言えば、csvかtsvにしておくとExcelで一覧できるし何かと便利だぞ。 #と言うわけで、仕様にダメだししたのでソースは見ないw
>>302 Cのソースからテキストデータだけを分離するのが目的なら
それでも構わんが…全くスマートでは無いw
まぁ、イベントをハードコーディングする方向でいってみるのも
勉強になるだろw
>>303 >>304 ひえー、なんか、めちゃめちゃアフォプログラムって言われてる気がww
>>201 みたいなのは私には無理っぽいので、
仕様が決まるまでとりあえずテキストの書式は保留ということで ^^
てゆか、永久に保留しときたい・・
エクセルは触ったことないので、使わない方向で。
どもです m(__)m
class CText{ std::vector<std::string*> messages; bool LoadFile(char* fname){ std::ifstream ifs(fname); char line[512], buf[512]; int idx; if(ifs == false) return false; while(ifs.getline(line, sizeof(line))){ if(strstr(line, "msg:") != NULL){ sscanf(line, "msg:%d>%s", &idx, buf); messages.push_back(new std::string(buf)); } }; return true; } public: CText(char* fname){ if(LoadFile(fname) == false){ std::cout << "失敗" << std::endl; exit(1); } } ~CText(){ std::vector<std::string*>::iterator it; for(it = messages.begin(); it != messages.end(); it++){ delete (*it); } } void Draw(int idx){std::cout << messages[idx]->c_str() << std::endl;} }; 暇なんでちょっと書き換えてみたお、どうなんだろ。
>>305 こんな感じのをお勧めする。間の改行数自由で。そんな難しくはない。
:msg0
0です!
:msg1
aaa
:msg2
(*^ー゚)b
だからぁ、フォーマットがダメなんだからコード以前だってば。 例えば、 msg.....1.......aaa msg.....2.......(*^ー゚)b みたいなんでいいじゃん。 #ドットのところはタブね。 それなら、1行分の解析もsscanf(line, "%s%d%[^\n]", ...)でいいし。 >306 文字列を%sにしちゃうと空白入れられないぞ。 そもそもmsgも固定でいいなら、 3.......orz で充分だしね。
あーそうか、RPGなら>307も自由度高くていいね。 私は文字列中に\nがあったら改行するなんて仕様をよく作るけど。
310 :
307 :2005/08/02(火) 19:18:32
暇な俺が
>>307 のサンプル作りましたよ。鵜呑みにはするなよ。
こういうの初めてな人には数字読取のところで「??」ってなるかもしれんが、たぶん定石なので覚えるべし。
bool get_message(const char* in,int id,char* out)
{
const char* p=in;
char* q=out;
int c,n;
//
while(p=strstr(p,":msg")){
//数字までシーク
p+=4;
//数字読取
n=0;
while(*p>='0' && *p<='9'){ n*=10; n+=*p-'0'; p++; }
//メッセージ
if(n==id){
//メッセージ先頭までシーク
while(*p=='\n')p++;
//メッセージ読取
while(*p!='\n'){
*q++=*p++;
}
*q++='\0';
//成功
return true;
}
}
//失敗
return false;
}
311 :
307 :2005/08/02(火) 19:23:14
うはwww読みにくスwwww固定幅フォントにすればまともに読めるwwwのかwうぇww 使用例 int main() { char in[]= ":msg0\n" "0です!\n" "\n" ":msg01\n" "aaa\n" "\n" ":msg23\n" "(*^ー゚)b\n" "\n"; int id=23; puts(in); printf("--↑抽出(ID=%d)↓--\n",id); char ret[256]; if(get_message(in,id,ret)){ puts(ret); }else{ puts("Error"); } }
>>310 うはwwスゴイwww
なんかいろんな技がいっぱいつまってるww
めちゃめちゃ鵜呑みにしちゃいます!
アナクロ…… こんな小手先の技術を覚えるよりも、スタンダードな文字列操作を覚えた方がましだ罠。
そりゃぁあんた、std::string以外に何があると? #>313がそう想定したかはしらんが。
正規表現だとか構文解析を想像したんだけどstd::stringってなんだよw
だから、スタンダードなストリングだろ? だれも構文解析なんて話はしてないと思うのだが。
>>313 std::stringべったりな厨は使い物にならん
基本的な文字列操作のアルゴリズムは覚えておくべき
>>318 まぁC/C++を使うなら、Cの文字列操作も覚えておくべきではあるな。
しかし、メモリ使用量や実行速度に余裕があれば std::string をおとなしく選択するべき。
std::string を必要以上に毛嫌いするような態度は無用。
構文解析においては生の文字列のほうがずっとスマートに書けると思う。 ここで std:string を使う利点はほとんど無い気がする。std::istream ならともかく。
>>320 > 構文解析においては生の文字列のほうがずっとスマートに書けると思う。
なんで?
少なくとも俺は std:string では
>>310 と同じ機能のものを
>>310 以上にスマートに書くことができない。
少なくとも仕事なら>310は不採用だが菜。
その理由は?(\0をチェックしてないとかは無しで。サンプルなんだから)
サンプルだからなんて言い訳は仕事じゃできないのだが…… サンプルとしてならどうでもいいよ。
そもそもなんで仕事が出てくるんだよ…
>310がスマートって言うのもあれだが、 仕事で使えないとか言うのもあれだな。 ここは一つ、>323(=>325か?)が仕事で使えるコードを出してくれるってことで。
328 :
310 :2005/08/03(水) 09:24:46
>>323 (=325?)
>>305 が混乱しちゃあかんから極力単純に組んだわけだが。「鵜呑みにするな」と書いただろ?
目的を見失う奴のほうが仕事に使えない。
(初心者向けのscanfのサンプルに厳密なチェックを入れて読者を混乱させる奴は無能だ)
メッセージを1つのファイル(テキストファイル内の1箇所)にまとめて置いておいて、それぞれにID割り振り、使うときにIDからメッセージ抽出して何かいいことありますか?
同じメッセージを何回も使いたいときは容量削減にはなるでしょうけど、非常に特殊な場合でしか使わないとおもうんですよ。。
ここはですね、単純に、msgという命令のあとにただ文章が続くと思ったほうがよいのではないかと、ぼくはおもうんですね。
ID方式にすると、開発者がイベントを編集してメッセージを発言させる命令を記述するときにIDとメッセージとの対応を把握しないといけなくなりますから。。。
しかしながら、
>>302 がどういうつもりで使用するのか知らないので、何か有効な使い道があれば教えてくださいな。
キャラ0に話し掛けるとメッセージ0が表示される、みたいな。 それにしても君の日本語はなんだか読みにくいな。
>>330 すみません。。MSDNを読んでるうちにこうなりました。。
>>328 単純に組むのにキャラを一文字ずつ加工するのってどうなのよ。
sscanf()使ったほうがよっぽど単純だと思うけどねぇ。
>313の言うアナクロってのはそういうことでしょ。
#そりゃぁ、昔はライブラリに頼るより自分で書いたもんだが今時、ねぇ……
今時はsscanfを使うのが流行りなのか。なんか嫌だな
可読性の低いコードをちまちま書くよりはましだね。
プレイヤーのクラス名は何がいいでしょうか?
Ossan
scanfなんてデータファイル書き間違えただけで止まるじゃん
それが最近の流行りらしい
可読性低すぎるソースなので上げにくい・・
http://49uper.com:8080/html/img-s/69433.zip >>310 さんのを入れてみました。
どうも「\n」の改行コードをフラグにしようとすると、うまくいきませんでした。
もしかしてこれがバイナリモードとテキストモードの違いってやつでしょうか。
もうちょっと研究が必要なようです。
いずれは条件分岐とか入れられるようになるんだろうか・・。
>>319 std::string使ったことない orz
やらなきゃとは思ってるんですけどねぇ。
>>329 今はただキャラクタにセリフしゃべらせたくて、コードに直書きするのもアレなので
無理にファイルから読み込んでるだけですので、あんま気にしないでー。
>>328 マジ勉強になりました。ホント感謝です m(__)m
>>340 メモ帳で保存したファイルの改行は \r\n 。
これをテキストとしてオープンすると 「\r\n」→「\n」の変換が自動で行われるので \r を気にしなくてもいい。
バイナリとしてオープンすると \r が残るので解析がちょっとめんどくさくなる。
>>341 // 指定された文字がファイル中にいくつあるか数えて返す
int FileSearch (char _str) {
int _num = 0;
for (int i = 0; i < m_dwFileSize; i++)
if (m_pchBuffer[i] == _str)
_num++;
return _num;
}
↑の関数をメンバに入れて、数を数えてみました
cout << cText.FileSearch('a') << endl;
cout << cText.FileSearch('m') << endl;
cout << cText.FileSearch('\n') << endl;
cout << cText.FileSearch('\r') << endl;
--結果--
3
12
63
63
どうも、\nと\rは同じ数だけあるようです。
うわさによると「\r\n」は二バイトらしいので、
解析もややこしそうですね。。
あれ?でも私のプログラムは改行一個飛ばすときは
一回しかインクリメントしてませんけど飛ばせたような・・。
あー、よくわからず。
っていうかなんで CreateFile なんだ? fopen や ifstream は使ったことないん?
>>343 素直にifstreamかfopenを使って置け。
それらを使えば、改行コードは'\n'とだけ意識していれば事が足りる。
>>344 >>345 うはwwそっちですかww
::CreateFile()は前にちょっと触ったことあったのと、
>>175 さんが使ってたので、これでいいのかなとww
全然迷いもなく使ってました。
・
・
::fopen()を使ったほうがいいみたいですね ^^
ifstreamは知らないので、::fopen()の方を研究してみます。
てゆか、今日今まで凄い無駄なことしてたっぽい orz
バッファは(ファイルサイズ+1)確保して、最後に\0を入れるべし…。 背中がかゆい…
FILE *pFile; pFile = ::fopen("msg003.txt", "r"); // ファイルのサイズ計る int n = 0; while (::fgetc(pFile) > 0) n++; // ファイルポインタを先頭に戻す fseek(pFile, 0, SEEK_SET); char *pchBuffer; pchBuffer = new char[n + 1]; ::fread(pchBuffer, sizeof(char), n, pFile); pchBuffer[n] = '\0'; ::fclose(pFile); cout << "size = " << n << endl; cout << pchBuffer; delete [] pchBuffer; いちおーできたんですが、 このファイルのサイズの計り方はアリなんでしょうか? 例文が一個も見つからなかったから、手探りでした (ノω`)・゚・。。
できたってのは読み込みだけです。 MSDNとのにらめっこはキツかった (T_T)
SEEK_ENDは何のためにあるんだ…… と思ったが、テキストモードではftellを信用できないことに 気づいた。
>343 >\rが入ってたら(中略)こういうのって、普通はどう処理するんでしょうか? 5:バイナリモードで開き、\rと\nを双方とも改行コードとして扱う(自前で処理)。\r\nと連続している場合はまとめて改行1つ分として扱う。 3の具体例の一つだが、これならSEEK_END→ftellでも問題ないし、直接fseekでも、 バッファに読む→直接インデックス作成→インデックスからポインタ指定で読み出しでもOK 作業してるソフトが違っても改行コードの違いはここで吸収できる。 もっとも、自分だったら簡易スクリプトコンパイラを作ってインデックス付きのバイナリ(ある意味で中間言語形式)にしてると思う。 (MinGWで出たerror/warning) 65行目と168行目 符号付数値と符号無し変数の比較で警告
>>348 悪くはない。getcしまくるのはアレなんでfseekしましょう。
> int n = 0;
> while (::fgetc(pFile) > 0)
> n++;
fseek(pFile,0,SEEK_END);
int n=ftell(pFile);
> ::fread(pchBuffer, sizeof(char), n, pFile);
> pchBuffer[n] = '\0';
n=fread(pchBuffer, sizeof(char), n, pFile);
pchBuffer[n] = '\0';
それと…これ↓はよくないぞ… while (::fgetc(pFile) > 0) ↓ while(fgetc(pFile)!=EOF)
sizeof(char)は常に1だから、 fread(pchBuffer, 1, n, pFile); でいい。
( ゚д゚)ポカーン
win32はろくに知らんのだが、unixでいうところの stat() 関数はないの? ファイルを開いて読んだりシークしたりしなくてもファイルサイズや属性を 得ることができそうなものだが。
>>356 unix はろくに知らんが、win32 でも sys/stat.h の _stat ってのが使える。
俺はシークを好んで使うが。
//
>>307 は仕様に反して一行メッセージしか扱えないのと毎回解析するのが無駄なので
// C++らしくstd::mapで作ってみた。
#include <string>
#include <map>
#include <iostream>
int main()
{
char in[]= (
":msg0\n"
"0です!\n"// 1行のみなら空行をあけない
":msg01\n"
"aaa\n"
"\n"
"\n"// 必要ならいくらでも改行を
":msg3\n"
"\n"// この場合はメッセージは空
":msg23\n"
"(*^ー゚)b\n"
"\n"
);
std::map<int, std::string> msgs = parseMessages(in);
std::cout << "msg" << 23 << '[' << msgs[23] << ']' << std::endl;
return 0;
}
// ':'の場所は(先頭の場合を除いて)行頭に限定→メッセージ中にも':'を使える
// 次のタグまでをメッセージとする→複数行のメッセージも扱える
// ":msg"以外のタグが追加される可能性を考慮
// ファイル末尾も適当に何とかする
// 関数本体は次に
std::map<int, std::string> parseMessages(const char * inputBuffer) { std::map<int, std::string> rtn; std::string buf(inputBuffer); unsigned pos = 0; while ((pos = buf.find(':', pos)) != std::string::npos) { ++pos;// ':'の次をポイント if (buf.compare(pos, 3, "msg") == 0) {// メッセージタグ int id = atoi(buf.c_str() + pos + 3);// 必要ならstrtol()やsscanf()も unsigned nextPos; unsigned bodyPos = buf.find('\n', pos + 3); if (bodyPos != std::string::npos) { ++bodyPos; nextPos = buf.find("\n:", bodyPos); if (nextPos == std::string::npos) { // 次のタグがない場合は最終行まで(末尾の改行は除く) nextPos = buf.size() - 1; } rtn[id] = buf.substr(bodyPos, nextPos - bodyPos); std::cout << '[' << rtn[id] << "]\n"; } pos = nextPos; } else {// その他のタグでは改行を見つけておく pos = buf.find('\n', pos); if (pos == std::string::npos) {// 改行が見つからないなら最後をポイント pos = buf.size(); } } } return rtn; }
C版が欲しかったらfind()→strchr() or strstr()、compare()→strcmp()、size()→strlen() or strchr()、substr()→sprintf()でできるね。
361 :
358 :2005/08/04(木) 14:42:36
あー、ミスリーディングだ。>307は複数行メッセージじゃなくて、 隙間の空行が任意ってだけか。 つーことで、「仕様に反して」は割愛。 うーん、マジックナンバーの3が気になるなぁ…… #ちゃんと"msg"から長さを得るべきだね。
CPUとM/Bをアプグレードしたよ。 でもあまり変ってないような。
363 :
デフォルトの名無しさん :2005/08/05(金) 18:41:10
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | もっと濃い構文解析器きぼん!!! | |_______________| ∧∧ || ( ゚д゚)|| / づΦ
365 :
デフォルトの名無しさん :2005/08/05(金) 19:44:32
ちぇっ
366 :
デフォルトの名無しさん :2005/08/05(金) 19:50:13
perlじゃむりですかそうですか
やっぱこのスレは親切な人多いわー! ・ ゚・。* 。 +゚。・.。* ゚ + 。・゚・(ノД`)
>>351 なるほど。プログラムでなんとかするってことですか。
今はバイナリモードで開く意義がわからないのでテキストモードを使いますが、
バイナリモードを使う必要がでてきたら、その方法を試してみます。ども。
簡易すくりぷとこんぱいら??
>>352 >>350 さんも言ってましたが、どうもテキストモードで開いてもftell()は
改行コードを"\r\n"で計算するようです(私の環境だけ?)
ちょっとためしてみましたが、fread()の戻り値より、ftell()の戻り値の方が
"\r"分だけ多く返ってきました。
バイナリモードで開く場合は、その方法を使ってみまっす。ども。
>>353 MSDN調べてて、なんかやたら-1を見ると思ったら、EOFは-1なんですね ^^
知りませんでした。
>>359 STLカコイイ・・
私もいつかそんなプログラムを組んでみたいです。
>>367 ・ファイルサイズ
今回ファイルサイズが欲しい理由は、単純にバッファを用意するためなんだから
ftell()で行数分多く返ってきてもそのまま使えば医院で内科医?
>352のようにfread()の戻り値でナルキャラ書き込めば無問題。
・STL(つーか、map)
>358に書いたように、msgs[23]と書けてしまう単純さに注目。
セットする方も、固定値ならばmsgs[2] = "Whee!";で済んでしまう。
つまりこれらはいつか到達する目標ではなく、初心者こそ使うべき道具だと思うぞ。
とりあえず、今までのコンソールプログラムのまとめ。
やっつけで一文字ずつ表示するやつを作ってみました。
http://49uper.com:8080/html/img-s/69951.zip ファイル関係はわからないことも多いのですが、次に進みたいと思います。
>>368 >ftell()で行数分多く返ってきてもそのまま使えば医院で内科医?
医院で内科医てww
fgetc()を何回も回すよりは、そっちのほうが良さげですね。スマートだし。
MSDNには
ftell 関数が返す値は、テキスト モードで開いたストリームに対しては、物理バイト オフセットを表さない場合があります。これは、テキスト モードでは CR-LF (キャリッジ リターンとライン フィード) シーケンスをライン フィード (LF) に変換するからです。
って書いてあったんですが、これは「"\r"も数える」って意味なんですかね?
「キャリッジ リターン」と「ライン フィード」はググってみたら、
どっちも改行に関係あるようですが。。
STLにはなんとなく苦手意識がww
まだ一個もやってません orz
「msgs[23]と書けてしまう単純さ」って素晴らしいです。
どうもありがとうございます m(__)m
さらにググってみたところ、 CR = キャリッジリターン = '\r' LF = ラインフィード = '\n' CR-LF = "\r\n" ということが判明。 で、上の文は、テキストモードで開かれてるファイルは CR-LF が LF に変換されてるって書いてあるようですね。 でも、わざわざ「場合があります」って書かれてるってことは、 結果は環境によって異なるってことかなぁ。
>>370 実装及び実行時依存なんだと思う。
例えば先頭からバイナリ読み込みの典型であるfread()やテキスト読み込みの典型であるfgets()、
1バイト読み込みであるfgetc()で読み進んだ場合のftell()は変換後の(先頭からの)オフセットを返すが、
読み込みを全く伴わない終端からのfseek(SEEK_END)の後のftell()では変換前のオフセットを返すとか。
しかし、面倒だからCrLfの解説しないで様子見てたんだけど、辿り着ける人はちゃんと解説に辿り着けるんだねぇ。
ちょっと>370に感心した。
ネタで言ってるんだよな?おまえら
クラスのこと考えるのが一番辛いです・・
作り間違ったら、後々大幅修正しなきゃいけないし。
>>371 うはー、複雑。
ちゃんと両方のモードに対応した関数を作っといてほすぃ。。
一段落したら std::ifstream をがんばってやってみようかなぁ。
どうやらバイナリかテキストを選択できるみたいですし。
読み込んだサイズを計る関数ぐらいありますよね。
>>372 めちゃめちゃ大まじめですけど o(T_T)o
fopen でもバイナリ、テキスト選択できる
ひどい低レベルなRPG作成スレになってきてるな。
低水準と言いたまえ
システムコールは流石に使わないよな 低水準であっても
>ひどい低レベルなRPG作成スレ 最初から最後までレベルが高いなんて有り得ないと思われ。 それは仕方がないから傍観汁。
一気にレベル上がったww ワロス
382 :
デフォルトの名無しさん :2005/08/09(火) 00:05:28
素朴な質問:C言語だけでRPGってできますか?
できんじゃないの? ってかできない理由がわからない
たぶんあれだな。 C++にはRPGを作るためのいろんな機能が備わってると勘違いしてるな。
RPG言語なるものがあると知って歓喜したあの頃
>>385 業務でRPGにまわされたときにゲーム製作?と思って歓喜
↓
業務についたあと、自殺を何度も考える
>>385 おお!同志よ!
そして実態を知ったときのあの落胆。。。
388 :
382 :2005/08/09(火) 18:45:55
//いや、そう言うことを聞きたかったんじゃなくて… //C言語だと絵の表示や文字色の変更さえもできないから、 //それだけで作ったRPGってどんなふうなのかなと。 //C言語だけでもこれだけできるんだぞ、みたいな、 //参考になるゲームがあったら教えて欲しいかなとか思ったりしたんだけど
389 :
382 :2005/08/09(火) 18:47:25
思い切りageてしまった。ゴメン orz
>C言語だと絵の表示や文字色の変更さえもできないから できるから上のようなレスが付くわけで
391 :
382 :2005/08/09(火) 18:48:10
>>390 っえ?そうなの? マジに知らなかった… お馬鹿でゴメン!
393 :
382 :2005/08/09(火) 19:25:00
ゴメンナサイゴメンナサイゴメンナサイ orz っで。恥かきついでに教えて君させてください。 C言語だけで作った手本になるようなゲームってありますか? できればソースも見られるようなのだと助かるんですけど?
しゃあないDOSで作れ
>>393 質問がちょっと的外れな気がするなあ。
君は今どの程度Cを使えるんだい?
396 :
382 :2005/08/09(火) 22:16:16
どの程度と聞かれても「全く使えない」としか言えないぐらいです。 ちょっと前に初級シスアドを取ったので、 それじゃあ今度はプログラムを勉強してみようかなと。思い立って、 C言語の本を買って見たけど、特に何かをしたい訳じゃなかったので。 ゲーム造りは前に「カードワース」というのでやったことがあるので、 配列とかポイントとか作りながら覚えるのにゲームを作りながらやったら、 分かりやすいかなとか。思ったんだけど。――百年早い?
>>396 無理。いきなりRPG作ろうとか思うな。
まずちゃんとC勉強して来い。
もしくはRPGツクールで作れ。
とりあえずCUIで動く数当てゲームあたりからかな
399 :
382 :2005/08/09(火) 22:47:19
うい、もう少し勉強してから出直します… でもその前にちょっと質問。 文字色付けるのは見つけたんだけど、これでいいんでしょうか? #include <stdio.h> #define ESC ((char)0x1b) int main(void) { printf("hello, world\n"); printf("%c[31m赤色にしてみる%c[0m\n", ESC, ESC); printf("%c[4m青色にしてみる%c[0m\n", ESC, ESC); printf("%c[32m緑字にしてみる%c[0m\n", ESC, ESC); printf("%c[36m水色にしてみる%c[0m\n", ESC, ESC); printf("%c[45;36mピンク字に青文字にしてみる%c[0m\n", ESC, ESC); printf("%c[30m黒色にしてみる%c[0m\n", ESC, ESC); printf("%c[45;30mピンク時に黒色にしてみる%c[0m\n", ESC, ESC); printf("good-by\n"); return (0); } %c[以下のどの文字が何に対応しているのかとか、さっぱり分からないですけど。 この色とかってもしかして、機種依存になってますか? ってか、スレ違い?
401 :
382 :2005/08/09(火) 23:03:22
…そうか、これってDOSだからC言語から離れるんですね。。。度々ゴメン。 みなさん、お騒がせしまた。orz
おいおい まあ本人が納得してるならいいか。
>>399 激しく無駄なprintf()の使い方だな。
例えば
>printf("%c[31m赤色にしてみる%c[0m\n", ESC, ESC);
は
printf("\x1b[31m赤色にしてみる\x1b[0m\n");
でよい。
そもそもC言語には入出力機能は言語レベルで実装されていないので 画面への表示をやりたかったら、全てライブラリを使うことになる ANSIで決められた標準関数だけを使えば、どのコンパイラでも動くので 一見コンソール入出力関数群がC言語の組み込みコマンドのように見えるだけで ライブラリが無ければ本来、ファイルの読み書きすらC言語単体では出来ない 初心者にありがちな、 C言語=printf scanf っていう勘違いは入門書が悪いからだろうか? C言語でもWin32APIを使えばグラフィカルなゲームは作れる
C言語 = printf(), scanf() って考えは間違いじゃないでしょ。 >C言語でもWin32APIを使えばグラフィカルなゲームは作れる なかったら作れないじゃん、ない場合はC言語だけ使うってことだろうし。
Win32API無いなら GLUTでもSDLでも使えば? 大部分のコンピューターでグラフィカルなゲームが作れるぞ
>>405 だから
C言語≠標準関数
勘違いしている奴多すぎw
C言語つってもCの仕様通り実装されてる処理系は世の中にないのにね
>>408 規格に完全に準拠している処理系は存在しないって意味?
そんなことないと思うけど。
規格にも処理系は規格に合致したプログラムが問題なくコンパイルできる範囲で独自拡張しても良いと書いてあるはず。
スレタイみてしゃべろうぜ? べつにここじゃないと吐けない愚言でもなかろう。
規格をほぼ満たすのはVC2003ぐらいしかない boostスレ見ればわかるけど他はボロボロ
>>412 CとC++の区別もつかないのはどうかと思うよ。
C言語だけで作られたゲームなんて コンシューマにゃ無数にあるんじゃねえの? 昔すぎるとアセンブラがたくさん混じってるだろうし、 最先端だとC++やその他何か違うものも使ってたりするだろうけど。
低水準&停滞気味な私がきましたよ
http://49uper.com:8080/html/img-s/70913.zip なんとか村人をしゃべらせてみました。
Zでしゃべりかけて、Xで文字送りという不思議使用です
とにかくテキストを出す方法に疑問ありまくりなんですが、
私が考えた方法は
まずpFileBufferにファイルの全情報を読み込む
pTempBufferに表示したい分だけの文字列をpFileBufferから読み込む
テキストは4行なので、pDrawBuffer[4]を用意
(pDrawBuffer[0]は一行目、[1]は二行目・・ てな感じで使う)
pDrawBuffer[?]にpTempBufferから一文字ずつ入れて表示
という流れになってると思います。
細かい計算はなんとかするとして、特に疑問なのが、
一行にひとつずつバッファを用意するのは一般的なんでしょうか?
なにやら凄く無駄なことをしてる気がするのですが。
自力で改行をコントロールするのに、この方法しか思いつかなかった orz
あと、表示はTextOut()を使ってるのですが、これは大丈夫でしょうか?
DrawText()ってのも試してみたのですが、
自動改行がいまいちコントロールできなかったので、やめちゃったんですけど。
説明下手で申し訳ありませんが、
どなたかご意見お願いします m(__)m
>>379 すごいなあ (´・ω・`)
えーっと 行末の改行コードは消そう。TextOutで表示されちゃってるから。 まあ表示処理に関しては好きにしていいと思う。 思うが、文字列をpTempBufferに置いてあるとして、 DrawTextで、nCount(3番目のパラメーター)を一文字分ずつ 増やしていけば、改行で云々せずともかってに描画してくれる気もする。 という感想。あくまで感想であってアドバイスではない。
一応言っておくけど 『AR丸ゴシック体M』 なんてフォントは家のマシンには入っていない。
>>415 クラスの階層図と、もうちょっとソース中のコメントがほしいです
あとはクラスによって.hファイルが無い(もしくは他のファイルに含まれている)のがちょっと見難いかも
改行はうちの環境でも出ませんでしたよ
421 :
420 :2005/08/12(金) 00:17:49
あぁ、ちゃんとした台詞もあったんか… つまんない台詞でスクリーンショット撮っちゃったな orz
>>418 >>420 >>421 スクリーンショットまでとってもらってすみません
フォントは「MSゴシック」あたりが一般的かもですね。なんかよく聞くし。
選べるのが一番いんんでしょうが。
あと、ちゃんとした台詞はひとつもないのでww
>>419 階層図ってのは、
>>19 >>21 みたいなヤツでしょか?
継承してるのだけならなんとかなりそうなので、
どっかに書いときます。(ときたま自分でもわけわかめになりますから・・)
ヘッダーファイルは何をどこに入れればいいのかまだ研究中なので、
もうちょっと待ってください。
コメントは・・どうしよ。
お二方とも、ありがとうございます m(__)m
簡単でいんで、クラス図があれば全体がわかりやすいけどな。
クラス図ってどう書いたらいいの?
書いたこと無いよ(´・ω・`)
>>422 フォントは「MS ゴシック」か「MS 明朝」
どのWindowsにも、この2つは必ず入っている筈
Win95/NT4以降ならそれに加えて「MS Pゴシック」「MS P明朝」が入っている。
426 :
デフォルトの名無しさん :2005/08/12(金) 22:50:47
CやっててC++はやったことないんですが こんな感じのゲームを作るときってやっぱりクラスとかCにない機能を使ったりしますか?
Cじゃ作れないとでも言うのか?
クラス図自分で書くのがいやならDoxygenでも使っとけ。 それと、ゲームでまで等幅フォントは見たくないぞ。
ゲーム以外に等幅フォントが氾濫してるシーンなんてあるか? 2chもプロポーショナルやん。 あ、ソースが等幅フォントか・・・。
俺は等幅フォント好きだが。デスクトップのフォントもMS ゴシック。
ゲームって大体等幅じゃね? PCゲームはやらんから知らんけど
くだらん話が続いてるな
>>424 doxygen 使えばそれっぽいのは生成できる。
コメントのスタイルとしても doxygen に対応させておくのがお勧め。
435 :
デフォルトの名無しさん :2005/08/13(土) 01:58:44
>>430 は2chの世界がすべての池沼
>>430 はOutlookのデフォルトフォント設定のままの池沼
436 :
382 :2005/08/13(土) 02:27:40
#include <stdio.h> #include <stdlib.h> typedef struct _St{/* ココ ニ データ */ ; sturct _St * Prev, * Next}St; /* コノ コウゾウタイ ハ、 ヒツヨウ ニ オウジテ ヘンコウ シテクダサイ */ void ReleaseDataAll(St * data){St * fr; if(data){do{fr = data; data = data->next ,free(fr);}while(data);}}/* データ カイホウ ヨウ */ int LoadData(const char * fileName, St * data){FILE * fp; St * Save; if(!(fp = fopen(fileName, "rb"))/* バイナリ ヨミコミ センヨウ */{return -1;} Save = data = (St *)malloc(sizeof(St)); if(!data){fclose(fp); return -2;} data->Prev = NULL; while(fgets(data, sizeof(St)-sizeof(St *)*2, fp) != EOF){data->next = (St *)malloc(sizeof(St)); if(!(data->next)){ReleaseDataAll(Save);retrun -2;} data->next->prev = data; data = data->next;} data->next = NULL; fclose(fp); return 0; }/* シタ ノ カンスウ ガ セイジョウ ニ ドウサ スレバ ウゴク ハズ */ int SaveData(const char * fileName, St * data){FILE * fp; if(!(fp = fopen(fileName, "wb+"))/* バイナリ シンキ ヨミカキ モード*/{return -1;} do{fputs(data,fp); fseek(fp,-(sizeof(St*)*2), SEEK_CUR); data = data->next}while(data); close(fp);, return 0; }/* コノ カンスウ ハ ドウサ ノ ホショウ ハ ナシ */
>>436 処理がmain関数に集中しているので見通しが良くなるように
関数に分割してみよう。
static int flag_rand = YES;
元ソースでも可だけど、ここでは意味を明瞭にしたほうが良いと思う。
ランキングはスコアの配列(優れた順に並ぶ)を用意して、表示するだけ。
スコアと名前を構造体を使ってセットにする等、適宜工夫して。構造体や
配列の操作の良い練習になるはず。
セーブ・ロードはその配列をファイルに入出力するだけ。
C ファイル操作でぐぐれ。
440 :
382 :2005/08/14(日) 00:10:49
情報が高校の教科に入ったせいか、最近がんばる人がふえてうれすぃい
>440 #define YES 0に違和感。 真偽値を表すとき、慣例は真は0以外の値、偽は0にする。
それ以前にYES/NOじゃなくてTRUE/FALSEにしようぜ。 #define TRUE 1 #define FALSE 0 大抵の人はコレを使う。他の言語でも似たような意味で使われるから。
445 :
382 :2005/08/14(日) 12:35:52
なるほど、そんな慣習があったんですか。 ではその辺りも変更しながらやってみます。 で、あとは自力、か他スレで聞いて勉強して、 RPG作れるようになったら、また来ます! (`・ω・´) みなさん、色々ありがとう、おじゃましました!
ガンガレ ノシ
>>445 この短期間でめちゃめちゃ上達してますね。
末恐ろしい・・がんばってください。
>444 慣習だと #define TRUE (!0) #define FALSE (0) だよ しかも if(ほにゃらら==TRUE)って使い方はしない if(ほにゃらら) って使う
YES/NO的には #define YES 1 #define NO 0 だろうな
最近の賢いコンパイラは==TRUEが勝手に消えるね。
それはないだろ
>>448 >#define TRUE (!0)
>#define FALSE (0)
>だよ
これは間違いないが
>しかも if(ほにゃらら==TRUE)って使い方はしない
>if(ほにゃらら)
>って使う
これってどうなん?
あまり好きじゃないな
if(はにゃーん==TRUE){ } else if(はにゃーん==FALSE){ } else{ ここに来ることがある } ので、==TRUE は使いたくない
454 :
デフォルトの名無しさん :2005/08/15(月) 02:18:56
( ゚д゚)ポカーン
テストif ((a == b) == TRUE) は(TRUEが1であるかぎり)期待したとおりの結果を返す。しかしバカ げたことである。 一般にTRUEやFALSEを相手に明示的にテストするこ とは望ましくない。 なぜならライブラリ関数の中には(有名なのは isupper()、isalpha()など)条件が 成立したときに非0の値を返すが、 その値は必ずしも1ではないものがある(さらに、 もし君が「if((a == b) == TRUE)」が「if(a == b)」の改良版であると信じるのなら、 な ぜそこで止めるのか。なぜ「if (((a == b) == TRUE) == TRUE)」を 使わないのか)。 おおまかな目安としては、TRUEとFALSEを(あるいは 似た物を)ブール値をあらわす 変数に代入する際や、関数の引数、ブー ル値を返す関数の戻り値としてだけ使うこと。 けっして比較に使って はいけない。
>448 #define TRUE (1==1) #define FALSE (1!=1)
>>457 そっちへ誘導するなよ
低レベルの話はここでやってもらったほうがいい
isupper()とかisalpha()をTRUEと比較する方がおかしいだろ… if ((a == b) == TRUE)なんて書かないだろ…
フォントが等幅なのはレンダリングが楽だからじゃないの?
レンダリングって自分でやることなん? スーファミとかの話か?
>>461 何も考えずにBG面に描こうとするとそうなるな(スーファミとかの話)
最近はBG面にプロポーショナルで描くソフトも増えてるが(GBAとかの話)
プロポーショナルにすると、改行位置の調整が面倒くさいってのもあるんじゃないすかね
プロポーショナルだと、横に書いたドット数数えないとダメだからな。 等幅だと文字数だけだから楽だし。
てか、昔のテキストモードスクリーンで プロポーショナルフォントなんてありえない話だったから。 プロポーショナルフォントって単に文字幅が文字毎に異なるだけじゃなくて 前後の文字の組み合わせによっても字間が変わるような面倒なこともしてる。
RPG で難しいのは 攻撃力と守備力の関係ではないでしょうか。 勇者の攻撃力が 10、魔物の守備力が 3 なら 単純に 10 − 3 = 7 が魔物に与えるダメージってわけにはいかないような。 たとえばドラクエとかではどうなってるんでしょうか。 攻撃力−守備力> HP なら絶対 1 発で倒せるのか、とか考えると そうでもないような。 ほかにもすばやさとか属性、魔法の効き目なんかを考えると ややこしい。 当方 C++ 初心者でコマンドプロンプトで動く RPG を勉強しながら作ってるんですが 一番悩むのは上記ほか経験値をどのくらい稼いだら次のレベルに上がるか レベルが上がると HP、MP がどのくらい上昇するか、 それに応じてどこに行けるようになるか、どのくらいの強さの魔物と戦うか、 ということなんですが。
戦闘の計算式とバランス調整は難しいと思います 私は、とりあえず適当に作ってますがw
いかりのひでよしvsラッシュやまのて を思い出す俺ももう歳だな
どのくらい経験値稼げばレベル上がるか・・・っていうのは どういうゲームにしたいかによるでしょ レベル上げ必須なのか、サクサク進むのか、程よいのかって 全体的に自分の理想から指針を練っておくといいね あとはテストプレイのみ
市販ゲームの攻略サイト漁れば?
472 :
デフォルトの名無しさん :2005/08/19(金) 17:02:29
スレの勢いが失速しはじめたね
何書き込んでも的外れなバカ意見しか聞けないからな
もともと2chの意見にはあまり質を期待できない上、 ゲームと名が付く話題は特に馬鹿ばっか集まってくるからな。
的外れな意見しか書けない&完全に停滞中の私がきましたよ
みんなどうやってモチベーションとか維持してるんだろうか orz
http://49uper.com:8080/html/img-s/72602.zip 無理やりパーティーキャラーを出してみました
当たり判定はつけてないんですが、
こいつらは無くてもいいですよね・・(バグりそうでつけるのが怖い・・)
次は戦闘に行くのが筋のような気がするのですが、
最近まんねり気味で、なんか新しいことがやりたいので、あえて音楽に挑戦してみます。
噂によると、MCIというのを使うと、比較的簡単に鳴らすことができるらしいので。。
>>465 早くバランス調整とかで悩んでみたいです (T_T)
>475 MCIは確かMCIデバイスを開いてコマンドを(テキストで)送って制御するはず。言うなればCDプレーヤーの再生、停止、早送り、 トラック選択のボタン操作をコマンドに置き換えているようなもので、細かい制御には不向き。(MP3はActiveMovieの機能を使えば・・・) 勝負はどんな音楽を使うかなんだけどね。 スクリプトなら多少は相談に乗ります。でも自分だとADV仕様+RPG対応な物を作るかも。
>>475 おぉ、台詞枠もゴージャスになったネ
クラスも増えてきて、もはや解析する気が起きねーぜバーローwww
>みんなどうやってモチベーションとか維持してるんだろうか orz
セックル
マジレスするとやっぱり絵だって。さすがに全部自作は無理があるだろう。
誰かに頼むか素材使ったほうがいいんじゃね?
しかし素材使うと、「どっかで見たことある感じで萎え...orz」ってことになりかねない諸刃の剣
>478 ソース眺めてみた… 継ぎ接ぎだらけのフランケンシュタインに見えた… ガンガレ
まずはMCIより簡単そうなPlaySound()関数を使ってみました
http://49uper.com:8080/html/img-s/72687.zip 二行書いたら音が鳴ったのにびっくりです。
まだ複数ファイル同時再生の方法がわからないので、
もうちょっと調べてからMCIに移行しまっす。
音はフリーのを盗ってきました。
>>476 スクリプト!スクリプト!
今は取り掛かる気力が無いんですが、
戦闘とマップエディタを作ったあとにでも、ぜひ指南してくださいませ〜。
音楽はどっかでフリーのを パク(ry してきます ^^
>>477 > クラスも増えてきて、もはや解析する気が起きねーぜバーローwww
うはwwやぱ、クラス増えてきたら解読困難になってきますよね。
私も自分で組んでて、ちょくちょく
「あれ?これはどっからつながってるんだ??」ってなりますし・・
C++は集団作業に向いてるって思ってたんですが、
実はCより把握が難しい気がしてきた。。
セックルと「絵を誰かに〜」ってのは無理っぽい ^^ ので、
絵はどっかのフリーの素材を パク(ry してくるしかないか。
RPGツクール系の絵を公開してるサイト様はいくつか見つけたのですが、
絵のサイズが違うので拡大しなくちゃです。
でも拡大するとあからさまに絵が崩れちゃって、描いた人に申し訳ないし。
さて、どうしようか。
>>478 タイトル画面がやたらとカッコよすww
MCI再生は参考にさせていただくかもー。
いっしょにがんばりましょう (`・ω・´)
>>215 今ごろですが、オーバーライドの方法を参考にさせていただきました
m(__)m
新しいことをやったので、
ちょっとモチベーション上がってきたかな
上の方でだれかが言ってましたが、
すぐ結果の出るのをやり続けるのがいいかもねー。
教えがいの無い人間だ
>>483 mciSendStringのほうが簡単。そりゃもうsndPlaySound並みに。
もしかしたらできることの範囲が狭くなるかも(?)しれないけど。
>>484 (:D)| ̄|_
>>485 おお、そっちはもっと難解そうで即スルーしたんですが、
食わず嫌いだったか。。
今度はstringの方をやってみます。
なんとか実用に耐えるものを作らねば!
>>485-486 ゲームはBGMだけじゃなく効果音も同時に鳴るので
多チャンネルを視野に入れておいた方がいいと思う。
確かDirectSoundを使うと多チャンネルも使えるようになるみたいだが、
MCI関係で多チャンネルが使えるかどうかは不明。
出来ないようなことを誰かが言っていたような気もする。
とりあえず
>>483 のソースに手を入れて多チャンネルの実験してみる。
MCIは同時再生できるよー 環境依存かもしれんが…
ヒント:ポインター
いまMCIに飲まれ中でして、同時再生どころでは・・
>>487 さんに超期待!
>>490 飲まれるほど難しくないぜ
int main()
{
mciSendString("open a.mid alias test",NULL,0,0);
mciSendString("play test",NULL,0,0);
getchar();
mciSendString("close test",NULL,0,0);
}
a.mid のところを適当に変えて実行してみれ。(wav でも mid でも OK)
>>491 おお、普通に鳴りました。
てゆか、stringの方は変数いらないんですか。
・・・乗り換え決定ww
ファイル名にスペ-スがあったら鳴らないみたいです。
命令をスペースで区切ってるからかな?
ヒント:クォーテーション
>>492 とりあえず同時再生は出来が、サウンドカード依存もありそう。
昔の初期SoundBlasterとかPCM1チャンネルの場合は鳴らないような気もするが、
最近はサウンドカード自体が多チャンネル持っていると思うので
あまり神経質にならなくてもいいのかもしれない。
しかし、MCIのループはちょっと問題ありかも。
ループするときにちょっと空白時間があるので、ループ前提の曲の場合は
空白時間が気になるかも。曲を空白前提で作れば問題とならないが。
改行多すぎなので2つに分割
下記は効果音再生にPlaySoundを使ったサンプル
>>483 に追加
LRESULT CALLBACK WinProc (
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam)){
case 1:
PlaySound("コイン音 貯金箱に一枚 coin08.wav",
NULL, SND_ASYNC | SND_FILENAME);
break;
}
break;
case WM_CREATE:
//ボタン配置
CreateWindow("BUTTON", "効果音",
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN | BS_PUSHBUTTON,
0, 128, 64, 24, hWnd, (HMENU)1,
(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL);
}
MCIのループはりアルタイムゲームで使うなら致命的 RPGやノベルなら気にならないかもしれんが… DirectX使うかMIDI再生を自前で書くかした方がいいw
たしかにこういう短いサウンドの繰り返しだと、ループの区切れ目が目立つね…
同時に鳴らせるようになったのは2000からじゃなかった?
うむ。kmixerが勝手にミキシングするな。
>>497 いや別に使えと強制してるわけでもなんでもなく
使えたら使ってね程度の素材なんで、全く気にする必要ないです。
ループの区切れ問題はとりあえずそのままにしておいて
その他が組み上がった後に、もう一度他の道を検討する方針が良いのでは?と思った。
今から参加するぜ! BCC Developerインスコとウィンドウの表示が(猫みながら)できた マップ歩くぐらいまで出来たらうpしたいと思う
mciSendString()関数にはファイルバッファは入れられないみたいですね
勘違いしてました orz
>>503 コンパイラ入れるのと、ウィンドウ表示が一緒なんて早すぎです。
おおいにがんばってください。
私はもう疲れた・・
曲ループの空白を解決するクラスを作りました。
mciよりも下位レベルのwaveOut系APIを使用して
再生時にループフラグを指定しています。
>>483 のソースに手を加えたmainと
ループするBGMと単発の効果音を担うようにCSoundクラスを作りました。
wavファイルは
>>483 のファイルを使用しているので
同じフォルダーに置いてください
http://gamdev.org/up/img/3053.zip 起動時にBGM(その2_02.wav)を延々と鳴らし続け、
「効果音」ボタンで「コイン音」
「一時停止/再生」ボタンでBGMの一時停止と再開
BGMボタンが沢山並んでいますが適当なループするwavを同フォルダに配置し、
そのファイル名をWinMain.cppの適切な箇所で書き換えれば
ボタンを押す事によって対応したBGMに切り替わるはず。
と、今アップしたソースの確認をしたら改行コードがCR(Mac)になっていたので
VC++でコンパイル出来なかった。改行コードをMac(CR)からWin(CR+LF)に変えてください。
嗚呼、迷った。
>>501 氏が言う通り、ループの区切れ問題はそのままにして
他の事をするべきだと思ったケドも、何をすればイイのか分からない。
現状(
>>497 )を見て、次に何をすればイイのか
アドバイスをくれると本当に嬉しい。
でも、スクリプトとかマップ関係は出来ない悪寒。
>>503 ガンガレ、期待してる。
>>505 今度、コードを移植させるカモ。
>>506 現状芝生のみのマップにもうちょっと絵を描いてみてはどうだろう
せっかく沢山のチップを用意しているのだから勿体ない。
絵が描かれると同じ歩くにも気分が良くなるし。
マップエディタ使わなくても方眼紙に色塗って作れる。
絵を描いたら次は建物への当たり判定を作るとか。
>>505 低レベルAPI高レベルプログラム キタ━(゚∀゚)━!!!
私が雑魚すぎて、ソース見てもなにがなんだか・・
音とは全然関係ないのですが、CSoundにやたらとvirtualがあるのはなぜですか?
派生させてオーバーライドして使うんでしょか?
waveOutは私もやろうかとは思ってるのですが、
鳴るまで一ヶ月ぐらいかかりそうで手が出せないです (T_T)
>>508 CSoundはそのままで使えますが、やたらとvirtual付けているのは
クセみたいなもんなのであまり気にしないで良いと思います。
今のCSoundではvirtualの使い方の参考にはならないでしょう。
waveOutはwavファイルの入力をやってくれないので
CSoundのほとんどはwavファイルからヘッダを分離しPCMデータのみを取り出す処理です。
PCMデータを取り出したら、あとはwaveOutキューにWAVEHDRを
送り込んであげれば鳴ってくれます。
同じ物を1つ1つ作るのも面倒なので、CSoundが使えるようだったら
そのまま使ってかまいません。
つか、そのまま使えるように他の処理系に依存しないようになっているはず。
>>505 乙。俺も使わせてもらうかも。
CSoundに効果音の機能を付けてしまってるのは良くないと思う。
機能が完全にクラスから独立してるから、別クラスで実装すべき。
サンプルとしてはこれで構わないかもしれないけど。
ところでWinMain.cppに「製作者:シープラ勉強中◆ryjMYLsfPA」って書いてあったから
シープラ勉強中さんが作ったのかと勘違いしてしまったよ。
紛らわしいから次からは消してくれ…。
>>509 いくつかお小言。
・BOOLなんていう、MSローカルなアナクロint型はやめて素直にboolを使おう。
・それが見易いと信じているなら止めないが、型名の後のTabコードは却って醜い。
・0以外を返す予定がない関数はvoidにしよう。
・PausedBGM()はIsPausedBGM()とでもしたほうが判りやすくないか?
#ついでに言うなら、bool IsPausedBGM() const {return pausedFlag;}でよさそうだが。
・アンダーバー二つで始まる識別子は予約されているから避けよう。
・上でも書いたが、内部の変更を伴わないメンバ関数はconstにした方が使いやすい。
・コンストラクタも分けるほどのものかなぁ。default引き数を使えば一つで済むが。
#まぁ、お好みで。一つで済ますとInitialise()も同梱できるおまけ付き。
・malloc()/free()ではなくnew/deleteを使おう。
・上でも書いたが、ただのゲッターはインライン化を期待して宣言に入れては?
#もしくはinline指定をしておくか。
512 :
511 :2005/08/22(月) 18:24:00
あー忘れてた。確かに>510の言う通りBGM系とEffect系はクラスを分けたほうがすっきりするね。
http://aploda.com/dl.php?mode=pass&file_id=0000022065 サウンド再生クラスの途中経過です。sciSendString()使いました。
ヤバいのができそうですww
今後は
○seとbgmのクラス作る
○サウンド再生スレッド作る(猫でも見ながらやってみます)
○sciSendCommand()のバージョンも作ってみる
という流れでいってみます。
週末までかかりそうう。。
>>509 どうもありがとうございます。
もし万が一私がwaveOut()に挑戦することがあれば、
最大限参考にさせていただきます m(__)m
あと、私も WinMain.cppの上の名前だけは消してほしかった ^^
514 :
503 :2005/08/23(火) 14:26:52
515 :
デフォルトの名無しさん :2005/08/25(木) 01:57:55
よくわからんが二人ともがんばれ
乙。皆開発速いな。。_| ̄|○
今開発してるのって何人ぐらいいるんだ?
5人はいるんじゃね? 5人で協力すると、結構すごいもの作れるんじゃね?
3人じゃないのか? シープラ勉強中 ◆ryjMYLsfPA デフォルトのたぬきさん 503 以上3名だと思う。
>>518 1+1=2にならないところがソフトウェア開発の難しいところだ。
ヒロシです('A`) 居るのに勘定に数えてもらえなかったとです ヒロシです('A`)
これで四人と。 ほかにはいませんかー ゚∀゚)ノ
応援してるぜ ・シープラ勉強中 ◆ryjMYLsfPA ・デフォルトのたぬきさん ・503 ・ヒロシ
俺もRPG作ってるけど、作れば作るほど作らなきゃ行けないところが 増えていく感じで無間地獄になってるw RPG作るのって難しいね。
台風クルー!! 心なしか、ウチの中が普段より水っぽい気が・・
湿気でパソコンが壊れないか凄く心配です。
>>514 ウィンドウだしてから、凄いスピードで絵動かすとこまで行ってますね。
がんばってください。
>>515 >>524 どもども ^^
>>525 歓迎超歓迎
人の見ると刺激になりますよん。
>>526 あー、わかりますわかります。途中からゴールが見えなくなるww
_、_ ( ,_ノ` )y━・~~~ あの頃は若かった… マップクラスの大まかな設計 ↓ マップエディタを作る ↓ エディタの開発に合わせてマップクラス拡張 ↓ (´∀`)マップクラス肥満化 ↓ 編集機能の拡張 ↓ (´∀`)クラス間結合のスパゲッティ化 ↓ ゲーム本体に取り掛かる ↓ マップクラスに足りないインターフェースがあるのに気付き、拡張 ↓ (´∀`)肥(ry ↓ マップクラスの拡張に合わせて、エディタのほうも修正 ↓ クラス間依存関係の混沌により、小さな修正も一苦労 ↓ (´∀`)吐血 ↓ _、_ ( ,_ノ` )y━・~~~ 封印 そして今年、デザインパターンが俺に悟りを開かせた 封印が解かれる…
>>530 NT系でエスケープシーケンス使うには色々条件が必要
おおコマンドプロンプトでこんなでっかく作ってるのかー 俺もコマンドプロンプトでRPG作ってるけど半角でたった16*32だ。ちっちぇー
533 :
503 :2005/08/25(木) 22:16:19
>>534 次のステージがおまいを待ってるぜ (D風味)
>>534 Cygwinでコンパイルしたら次の傷害が発生しました。
・makefileが通らない。
*一般的なmakefileではセパレータはタブなんですが、bccでは空白でもいいようですな。
*どっちみち、bcc限定になっているので使いようがありませんでしたが。
・実行すると>534のスクリーンショットと似た画面でSegmentationFaultを起こす。
*mapが出てない。
*入力プロンプトもない。
未だソースは見てないので参考までに。
何もしてない漏れが言うのも何だけどさ、
例えば シープラ勉強中のメッセージウィンドウやNPC、マップ関係とかを
デフォルトのたぬきさんのウィンドウ/タイトル画面と合わせたらRPGにググッと近づくんじゃね?
それに
>>503 とか ◆382ingG3ec も協力すれば、作業の分担とかもできそうだし。
>>520 が言ってる通りに 1+1=2 見たいに上手くは行かないと思うけど
このスレ住人達なら、何とかなりそうだとオモタ。
ガンガレ!
まぁ、本当にできる奴はこんなとこにこないで、一人でせっせと作ってるんだけどな。
sourceforge.jp あたりでプロジェクト立ち上げてやってみたら?
>>534 エスケープシーケンスのかわりは猫でもわかる。
ほれ #include <windows.h> int main( void ) { HANDLE hStdout = GetStdHandle( STD_OUTPUT_HANDLE ); for ( int lpc = 0; 15 > lpc; lpc++ ) { COORD pos; pos.X = pos.Y = lpc; SetConsoleCursorPosition( hStdout, pos ); SetConsoleTextAttribute( hStdout, lpc + 1 ); WriteFile( hStdout, "H", strlen("H"), 0, 0 ); } return 0; }
1+1=0 となる時もあれば 1+1=3 となる時もある。 それが、プログラムの世界。
>>541 WriteFile()だとファイルにリダイレクトされたときに落ちるから
WriteConsole()の方が無難だと思われ。
キタ━━━━━━(゚∀゚)━━━━━━ !! 神様ありがとう! さっそく組み込んできます! (`・ω・´) 共同制作は、面白そうなんだけど、 C言語覚え始めの私は、他の人のソースが読めないんでムリポ… orz 標準ライブラリの関数だけでも頭が混乱気味なのに、 <windows.h>が入ってくると、まるで呪文にしか見えません。 でもでも、みんなで協力してできたら勉強になるだろうし楽しそうだから、 中心になる人がいたら、企画立ててみると面白いかもしれませんね。
共同開発は顔見知りのほうがいいなぁ、俺は。 って顔見知りに(時間のある)プログラマはいないわけだが。
NT系でのエスケープシーケンス対策
ttp://kasai86.ld.infoseek.co.jp/dos/esc.htm でもダメだった・・・
>546、他
企業の仕事は統率が取れてこそ意味があるもの。
なぜ統率が取れるかといえば、指揮系統がしっかりと存在していて、仕事の計画が
しっかりと出来ていて、仕様書や関係資料がしっかりと揃えられているから。
これはゲーム製作もプログラミングも同じこと。
構想・概要→企画立て→仕様決め→仕様詳細決め&関連資料・素材集め→(プログラミング・ゲーム本体の製作)→仕上げ
大体使うルーチンの仕様やクラス決めは仕様の段階で決めておき、なるべく余分なものは追加しないように。
仕様詳細の段階で関数の細かい仕様(関数リファレンスに書いてあるようなこと)とかクラスのメンバーとかは極力固定する。
データのフォーマットもこの段階で固定すべきだろう。
今になってこんな事言うのは酷かもしれないが、つぎはぎだらけだとどこか頓挫するので、そのときは最初からやり直したほうが良い。
(>546)
>windows.h
何人ものプログラマーが何ヶ月も話し合ってきた仕様から作られたんでしょ?
もっともあれはWindowsのプログラムを組むのに必要な「おまじない」だし・・・
MS発祥らしいハンガリアン記法(変数型1〜2文字+変数名)はその前からだけど。
Cは分かるがC++の段階ですでに呪文。継承や多態性の当たりでモウダメポ。
WindowsAPIなんてリファレンス読みながら使うもんじゃないかと思う。
>>546 >同意。<windows.h>なんてマジ呪文です呪文。
>どこの天才があんなにいっぱい特殊な型作ったんだよまったく。
1年後の君もたぶん呪文を書いてます。
ある程度大きいプロジェクトなら必然的にたくさんの型ができるわけで。
>>547 > 今になってこんな事言うのは酷かもしれないが
なに先走ってんのよ(笑
ここじゃ誰も共同制作してないし、誰も「やる」とは言ってない。
>シープラ勉強中 ゲーム中にはまだ使われてなかったから気付かなかったが、 Player04.bmp 見るとけっこう人物の絵も進んできてるな。感心w
みんなに、いいことをおしえてあげよう。 妄想している時が 一番楽しい。 作ってる時が 一番長く、、 バグッた時が、 一番分けがわからず、 諦めた時が、 一番むなしい。 だが、作り上げた時に 手にする物に比べれば”上の物”などゴミなのですよ。
>>553 追加
ここをこうしろあーしろと言われるときが一番むかつく
完成品としてマスターCDを納入したときには、もう見たくない。
製品を手にしたときになって初めてお疲れさんと自分で思う。
そしてスタッフロールに自分の名前を見て泣く
プロなの?
自分の名前すら載らないのが大半だがな
>>553 なかなかの名言だ。
次スレのテンプレにしよう。
それはちょっと嫌だ
561 :
503 :2005/08/27(土) 22:21:52
>>561 の実行ファイルが動かなかったのは私だけ?
ごめん、どうしても分からなかったんで教えて。
>>561 のを起動すると、【msvcr80.dllが見つかりません】って出てしまうんです。
で、どうもVisual Studio をインストールしないといけないらしいんですけど、
私のマシンだと旧式で貧弱なんでムリらしいんです。
で、必要な.dll だけ手に入れる方法とか、なにか別の方法ありますか?
リソースで引っかかってるのかなあ。 そんなヤバそうな関数使ってるようには見えないけど。
cygwinでソース(一部cyg用に修正して)からコンパイルして動いたよ。 新しいコンパイラはランタイムにも新しいものが必要なの鴨
>msvcr80.dll VisualStudio2003 or VisualC++2003でWindowsAPIを直接使用しない関数使ってるなら 使用ライブラリを全てスタティックリンクにでもしない限り使われると思うけど・・・ 設定変更で古いdll使うように出来ない?そういう設定があると思うんだけど・・・
#pragma comment(lib, "msvcr80")
570 :
503 :2005/08/28(日) 21:12:37
どうも、.dllなしの表示はでなくなりました。 けど、プログラムが始まる前(?)に閉じてしまいました(涙 例えるなら初めて作った"Hello,world"の.exeをクリックした時のように… DOSのコマンドからやってみても警告も何も起こらないで終了してしまいました。 う〜ん、なんででしょうね? 私のが98だからなのかなぁ…さっぱり分からない。
動きました。ただしバグが・・・ ・ある程度以上、左側に歩くとタイル表示の出方がまばらになり、さらに左へ歩くとアプリケーションエラーで異常終了 ・ある程度以上、上に歩くとパタパタといった感じで地面のタイルが置かれていく。見た目に良くない
>>571 ども
9x系ダメなのかなぁ
一応95でも大丈夫なようにAPI選んでます
TransparentBltとかは避けたのに意味なかったかー!!
もうちょっと調べてみます
>>572 スタート地点が表示できる一番左上なんです
それ以上左や上にいくと配列の添え字にマイナスが渡され・・・・(((( ;゜Д゜)))ガクガクブルブル
ちょっと酷いバグなんで直します(^^;
自分のプログラムが激しく暗礁に乗り上げてるので、
ちょっと気分を変えるために503さんのを改変してみました。
動きはまったく変わってないのですが、
>>566 さんが指摘されてたリソース部分をできるだけ抜いてみました。
http://aploda.com/dl.php?mode=pass&file_id=0000023966 //★★--
//------
で囲まれてる部分が改変部分です。
とりあえず動いたのですが、、
なぜか実行するとCPU使用率が100%に!!
重いアルゴリズムではないので、100%なんてありえないと思うのですが・・。
>>570 のは5%ぐらいでしたし。なぞです。
誰か、どうして100%になるのか教えてください〜 (T_T)
>>575 Timerのインターバル変えたらどうなる?
それか、MainLoop()でSleepしてみるとか。
#私ゃMFC使いだからよく判らんが、WndProc()に連続して突入しているなら後者で変化があるはず。
>>574 9xではUNICODEでビルドした奴は実行不可。
>>575 どこでどう違って負荷が違うかは知らないが、
単純に処理が重いだけ。タイマーインターバルを
もっと大きく取ると負荷が減るのが分かると思う。
ちなみに俺では
>>570 のも余裕で100%
私の環境だと>575でも50%ジャスト。 Celeron1.2GHz256MBメモリWin2K
飽きっぽい俺も参加してみる
WIN32APIは一昨日から勉強中
Cは入門書読んで足し算するだけのコンソールアプリ作ってウホウホ喜んだ程度
開発環境はMinGW + 萌ディタ
カーソルキーを押すと丸緑が現れて動きます
残像が残るのは影分身です
ttp://gamdev.org/up/img/3094.zip 言い訳:
コードは7割丸写し(でも手打ち)&中途半端
が、数学の宿題がほぼ白紙なので、そっちが落ち着いてからゆっくり直すつもり
引くに引けない状況をつくって三日坊主対策、ということでご容赦ください
いらっしゃい
>>503 氏の3080.zip付属のソースを再描画関連をメインに改変してみました。
改悪かもしれませんが、少しでも参考になれば幸いです。
ちなみに、同梱のEXEはVC++6&non UNICODEでビルドしましたので、
9x系OSの方でも実行できるかと思います。
ttp://gamdev.org/up/img/3095.zip 開発者の皆さんガン(・∀・)ガレ!!
582 :
503 :2005/08/30(火) 06:13:35
http://gamdev.org/up/img/3096.zip dllなしでも動き9xにも対応してると思われる版
設定いじってました。どうやらmsvcr80.dllなしで起動できたっぽい
・/MDを/MTに変更
UNICODEはNGと577氏にアドバイスをもらったのでそこからいろいろ調べてました
・2000/XPは内部がUNICODEなのでUNICODEを使ったほうが変換処理がいらないので動作が速い
・9x系は起動できないケースがある
・tchar.hを使えばMBCSとUNICODEで同じソースにできる
charの変わりに_TCHARを使う
文字列を_T(〜)で囲む
オプション変更でMBCSとUNICODEどっちにでも出来る
というわけで大収穫です。みなさんありがとう。ちゃんと動かないほうが勉強になっていいですね(^^;
>>575 結構重いですよね〜
減色やFPS減らす前にもうちょっと見直してみるつもり
ツクール素材なので2倍にしなくてはならずStrechBlt使うともっと重くなりそう
>>579 しっかり動いてました。がんがれー!
ところで美乳ってなんですか?w
>>581 スクロールしてない場合はキャラクタと文字だけ画面更新してるんですね
知らないAPIもあったので調べながら読んでます
583 :
579 :2005/08/30(火) 11:55:10
>>582 美乳はおまじないです。萌ディタの文字コード判別が弱いので
一昔前からHTMLなど書いてる人には懐しい言葉かもしれません
ただEUC-JP用の呪文らしいのにSJISのファイルに効く理由は不明
デバッグ用にMessageBox仕掛けたら大量ダイアログ。
ぶぁぁぁぁあって出るの。恐い!きもい!
きんもーっ☆
585 :
↑ :2005/08/30(火) 14:37:47
の元ネタ何?
>>582 OKです!
動いています、スムーズです。スムーズ過ぎて酔いそうです(笑
ってか。みんなの話についていけない…… orz
winAPIの海を泳ぎ中、マルチスレッドで溺れ死にかけました。
http://aploda.com/dl.php?mode=pass&file_id=0000024434 未だに音楽再生やってます。
_beginthreadex()でスレッドを作成、mciString()で鳴らしてます。
サンプルが全然見つからなかったので、もうてきとーにやっちゃったんですが、
ゲームのメインスレッドは作ったらゲーム終了まで永遠にwhileループして、
その中でSleep()でウェイトとってFPSコントロールして・・
って感じでいいんでしょか?
あと、私は_beginthreadex()でスレッド作ったんですが、
windowsだとCreateThread()を使ったほうがいいんでしょうか?
すみませんが、どなたかよろ m(__)m
>>576 >>577 >>578 16*16のマップチップを40*30個敷き詰めて、FPSは 1000/20=50 でぐらい?
で100%はちょっとおかしいと思ったのですが、そうでもないんでしょかねぇ。
ちなみに
>>577 さんのスペックはどんな感じなんですか?
>>579 いらっさい♪
>>587 実は私は
>>382 さんぐらいできるなら、もうwindowsプログラムに進んだほうがいいと思ってます。。
>>588 _beginethreadexの方がいい
CreateThreadだとメモリリークすることがある
>>589 お、ありがとうございます m(__)m
てゆか、メモリリークてw
マルチスレッドは不思議がいっぱいです。
591 :
579 :2005/08/30(火) 20:39:02
あ、up0020.zipでした
CreateThreadはWin32APIなのでCランタイムの初期化をしないというか範疇外であり、 そのままではCランタイムがマルチスレッドを考慮しない状態になってしまうため 新しいスレッドでCランタイムライブラリを使う場合はCランタイムライブラリに入ってる(とはいってもMS独自の関数だが) _beginthreadex(_beginthread)を使う必要があるという話とはまた違うのかな?
>593 そう、それの事 だから、スレッド内でCランタイム関数を全く使わずに Win32APIのみ使うならば問題は起きないけど、 スレッド内でCランタイム関数を使うと 結果的にメモリリークを引き起こすという話
ただしCランタイムにDLLを使えばDllMainが通知を受け取れるから平気とか書いてあったような気がしないでもない。
598 :
503 :2005/08/31(水) 05:11:42
http://gamdev.org/up/img/3108.zip 速度UPしまくりんぐでCPU使用率低減
WM_PAINTじゃなくてもBMPの読み込みや作成が出来るみたい
なので起動後に一度だけするように変更しました
ウィンドウにマウスカーソル乗ってる場合だけ
CPU使用率がやたら高くなる場合があるけどなぜだ〜
>>583 Yahooにアクセスしたときに京って返してくる謎がやっと解けた……
>>586 ネイサン、事件です!
ぐぐったら同じネタ思いついた奴イパーイいた(´・ω・`)ショボーン
>>587 今回もっと凄いです!
>>588 ラグとかないです〜
>>591 快適に動いてます。透過勉強中です〜ヽ(・∀・)人(・∀・)ノナカーマ
>>596 windows2000で動いてます。凄い!!
すまん勘違いだった。使用メモリが単調増加してるように見えたので。
601 :
503 :2005/09/01(木) 07:53:43
http://gamdev.org/up/img/3113.png マップチップの拡大できたぜイヤッハー!!
マップチップ1枚ごとにStretchBltで拡大してみたけど遅すぎて無理
高速化のため起動時に拡大したビットマップを作った
メモリは余分に使うことになったが、メインループでStretchBltを使わずに済んだ
おかげで以前と変わらぬ速度をキープ
>>561 で作る気になっていたマップエディタにはまだまだ着手できねぇええええええええ
603 :
503 :2005/09/01(木) 23:27:32
http://gamdev.org/up/img/3118.png 透過勉強中
モノクロビットマップの作成に成功
BitBltを使う時にSetBkColorを設定すれば特定の色を白、それ以外を黒にできて便利
さらにのNOTSRCCOPYを使えば白と黒を反転できるのでスクリーンショットのようになる
いかにもゲーム作ってる気分になってきた
604 :
503 :2005/09/02(金) 00:53:54
>>604 ちゃんと透過処理出来てますね。
あとは工夫してCPU負荷を抑えることができれば。
608 :
579 :2005/09/02(金) 20:40:37
コテハン記憶してなかった 上のは俺です ビットマップハンドルをどこで管理すればいいのか
みんなスゴイなぁ… 私は自分のソース見ていてちょっぴり鬱になったので、土日で書き直しをする予定です。 スパゲティはキライです、でも、ワケワカメはもっとキライです。orz
もう9月4日か orz
612 :
579 :2005/09/04(日) 21:14:00
ヘッダファイルに実装書くなよ。
ぎくぅ(|| ゚Д゚)
書きまくりんぐww
614の流れ弾が各地に甚大な被害を……
ひどいコードだな。 うちの委託先のバカコードより、輪をかけてひどいな。
おいおい、プロと比べるなよ
プロなんてピンキリだぜ…
添削してやれよ 口だけってことにされちゃうぞ
実際口だけだからそれは無理w
なにか気付いたなら具体的に指摘してあげなよ。 否定だけの意見なんて非建設的だよ。
だから口だけの人にそんな「むずかしい」要求しちゃダメだって。
>>625 おつです。でもファイル増えたら管理めんどくさくなるぅ (^_^;
なんか初々しい 100行程度の何もしないウィンドウに驚いてた頃の俺みたいだ 将来的に何千何万行のコードを自分で書くというのに
何千万行ってすごいですね 一日に何行ぐらい書いてますか?
一日何行てww
毎日1000行書いたとすると、1年で30万行、10年で300万行、30年で1千万行くらいだな。
ソース再利用コピペもカウントしていいんだよな
殆どコピペからスタート。 寧ろ、次にそうできるように心がけて作品を作る。
普通リファクタリングで成果として残る行数自体は小さくなるけどね。 何年かかけて100万行くらい書いたつもりだけど 残ったのは20万行いかない。
634 :
579 :2005/09/07(水) 21:51:43
ヘッダファイルと実装を分けた 4方向スクロールができるようになった (スクロール量が)多い日も安心、(チップが)ズレない(配列外に)漏れない *予定 週末までにソースをできるだけ綺麗にする マップエディタ作りたくなってきた
ほんとは
>>175 見たいなのが、スレを引っ張っていってくれるといいんだがな。
今の流れはRPGつくるスレというよりWin32API&C/C++のお勉強スレだもんな。
>>635 あ〜、ゴメン。私は思いっきり「C言語の勉強のため」にやってます(^^ゞ
>>638 APIが難しいならMFCを使えばいいじゃない。
#少なくとも横着はできる。
RPGを作るスレっていうのも想像できないなー 絵描いたりシナリオ組み立てたり? いつかやるんだろうけどまだプログラムがなぁ
RPGのエンジンを作るスレでいいじゃない
別にどんなスレか決めなくてもいい
>>639 でも、APIを理解しないままMFC使うっていうのも、結構苦痛な気がするな。
http://aploda.com/dl.php?mode=pass&file_id=0000027244 最近503さんが透過処理をしてたのを見て私もやってみました。
背景透過は難しそうだったから、ずーっとほっぽってたので・・
まだ実用には耐えらるデキではないのですが。
お勉強がてら絵も動かしてみました。
作ってる途中、こういう捨てクラスをてきとーに作ってもC++力は
上がらないんじゃないかと考えてしまって鬱に orz
>>639 C#とかMFCは楽ちんそうなので、
いずれやってみようとは思ってるんですけど。
ただ今は簡単なAPIもよくわからないので、
せめて子ウィンドウぐらいはちゃんと作れるようになってからと思ってます。
あー、道のりは長いです。。ども。
>>640 そうそう、プログラムがねぇ。
素材サイト様の絵は凄く綺麗なので、動かすとなんだか楽しくなりますね。 自分のプログラムレベルが上がったような気になるよ。錯覚ですけど。 絵が描ける人はみんな尊敬しちゃう。
646 :
デフォルトの名無しさん :2005/09/08(木) 22:58:30
>>644 マリオ作れそうだな。こういうふうにちっさいプログラムたくさん作るほうが勉強にはなると思う。
しかしクラスは使ってるものの、まだまだ構造化プログラミングの域を脱してない感じでござるよ、忍忍。
もうちょっと機能ごとに関数やクラスを細かく分けてもいいんジャマイカ。
たとえばCPlayer::Moveとかね。でかすぎ。関数名から連想される範囲の挙動ではないよ。詰め込みすぎ。
あと、小さいプログラムとは言え、マジックナンバー多すぎ。ちゃんと定数定義しろよぅ…
俺がピー子なら、たぶんあなたの鼓膜破れるね。
647 :
579 :2005/09/08(木) 23:09:19
648 :
646 :2005/09/08(木) 23:55:11
ドヒャヒャヒャ!脳みそ!ズル出してやるッ! >if (!(scrollDirection % 2)) { //DIR_UP or DIR_DOWN こんな、定数の値に依存した判定してたんじゃ、マジックナンバー使うのと変わらんから 定数といっしょにマクロ(or関数)定義しとけよ… #define IS_HORZ(dir) ((dir)%2==1) #define IS_VERT(dir) ((dir)%2==0) みたいな。 あと、CGame::GetKeyの名前は変えたほうがいいと思う… あと、WM_PAINT以外のところで BeginPaint 使っちゃダメだよ… あと、CMapの変数を外部から直接いじってんじゃねーー!クラスの意味ねーだろ禿げ!ボケ!美乳!m9(^Д^)プギャー 構造体として使うスタンスならいいけどさ…理解しにくいよ…
DirectXでRPG作るってことではなくて?
そりゃダメ出しっていうより煽りだな
またsscanf厨か
>>646 ひぃー、耳がああぁぁー!! (((;゚Д゚)
マジックナンバーは行き当たりばったりで作ったフラグとか、
行き当たりばったりで作ったアニメチップ指定用番号とか、
行き当たりばったりで作ったウェイトなんかが全部それかと。。
CPlayer::Move()が長くなったのは、
最初は左右に移動する程度の動きしかもたせないつもりだったのですが、
行き当たりばったりでジャンプとかつけたせいでどんどんどんどん長くww
構造化プログラミングってのは始めて聞いた単語だったのでwちょとググってみたのですが、
飛ばし読みしまくったためか特徴がイマイチよくわからず orz
上から順番どおりに処理するとか (入力→動作→表示みたいな・・)
gotoをあんま使わないとか、ごく普通のことが書かれてたような。。
欠点は通過する処理が多くなるとかなんとか・・
>>579 美乳さん、着実に進化してますね。綺麗にスクロールしました!
今後はCGameクラスにゲームで使いそうなオブジェクト達を集めるんでしょか?
なんか私と違う組み方っぽいので興味津々。
てゆか、私がおかしいのか。。
653 :
646 :2005/09/09(金) 21:20:12
>>652 いや、アニメチップとかは仕方ないねん。ウェイトもまぁ気にしないねん。
フラグ管理が糞やねん!絶対自分でも忘れるだろこのド低脳がーーー!!!
ビット演算なんかちまちま使ってねーで種類ごとにboolなりintなりlong longなり使いやがれ。
それで速度がコンマ何%変わることに何の問題があるかって話だ。
あと、ひとつのメソッドで何もかも処理してたんじゃクラス使う意味がねーんだよー。
言葉で伝える自身はねーからソースを示してやる。
http://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0028.txt >構造化プログラミングってのは始めて聞いた単語だったのでwちょとググってみたのですが、
>飛ばし読みしまくったためか特徴がイマイチよくわからず orz
ごめんなさい、構造化って言ってみたかっただけです。俺もよくわかってません。
要するにオブジェクト指向には程遠いよ、ってことだす。
654 :
646 :2005/09/09(金) 21:21:41
ソース訂正 isPushed→isPushing
一応突っ込みいれておくけど、構造化とオブジェクト志向は共存し得る概念だからね。
656 :
646 :2005/09/09(金) 22:25:54
俺の脳も破裂した
>>655 というかメソッド内では結構構造化してると思う
658 :
579 :2005/09/09(金) 23:29:33
>>648 耳から脳漿が噴出したくらいで済みました
GetKeyは入力回りを書き換ようかと思ってるのでなくなると思います
CGameからCMap::MoveやCChar::Move(予定)を呼んで各自で判定するような方向で
ほかはざっくり修正しました
>>652 >CGameクラスに〜
今のところは漠然とそんな方針です
オブジェクト指向的なのかどうか分からないので急に方向転換するかもしれませんが
・マップとかの仕様を適当に決めた、というか実装を書いたあとから泣く泣く仕様変更する
・1日に書いたコードを書き直す確率が150%。一度書き直してもう一度書き直す確率が50%の意味
>>653 なるほど、入る処理と入らない処理が明確で凄くわかりやすい!
細かく関数化しといたほうが柔軟性も高そう!
激しく参考にしまっす。どもありがとー。
>>652 君が構造化プログラミングだと思っているのは構造化定理だ。
プログラムの停止性検証とかの話題がホットだった頃のものだ。
停止性ってのは、プログラムの無謬性を検証するための一分野。
構造化プログラミングというのは、乱暴に言えば、高凝集疎結合を目指すテクニックのこと。
オブジェクト指向言語で開発していて「構造化できていない」と言われたら、クラス間の依存関係が強すぎるということで、カプセル化がなってない。
661 :
579 :2005/09/11(日) 17:59:23
Javaから始めるのも手だ
そこでJavaを出す意味がわからない。
構造化はルーチンを部品化して、その組み立てで様々なソフトを簡便に組めるように するとともに各部品をブラックボックス化することで保守を容易にする。 オブジェクト指向はオブジェクト(制御する項目やリソースなど。GUIのWindowやアイコン、ボタン、表示など)を中心にプログラムを組むこと classは構造化を容易にし、オブジェクト指向なプログラムを組みやすくするのに必要。 とはいえ継承や多態性は少々面倒かもしれない(習得しないclass使いこなせないけど)
>>661 えーと、検索できるようにキーワードを出してあげたというくらいのつもりなのだけれども。
667 :
579 :2005/09/13(火) 00:02:57
>>666 いきなり停止性とか無謬性とか言われて面喰らってしまったわけです
透過できた
CSurfaceと派生クラスを整理した
windresの使い方を理解した
>>663 Javaは俺が作ってるから要らないよ
C++でやらなきゃすみわけが出来んでしょ
定期上げです。「c:使う」コマンドを作りました。あと$の所でアイテムもらえます。
http://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0031.lzh 今後の課題
・敏捷UPの効果が永続的なのはマズイですよね?
・敵をてきとうに復活させたいなぁ(動かすのはムリポ)
・メッセージの整理(ソースに直書きした方がいい?)
・全体的なソースの整理
今後の予定
・とりあえずソース整理からかな…
>>663 >>668 あ〜。私の場合はPCの性能的にJavaはムリポなので、
やるとしても C++ & Win32api になると思います。
けど、今はC言語(の標準ライブラリ)で精一杯なんで… orz
とりあえず、あれこれ見てみて、
構造化とか色々な概要は分かった、ような気がします。
この手のノウハウって色々応用できそうだけど、
理解したとしても実践するのは難しそうですね。
JavaはOpenGLやDirectXを標準で使うから無理ってことは無いけどな Win32APIで画像処理するくらいならJavaのが速い
速いか?
Javaが遅いのは起動だけ
計算も遅い
いまさらJavaなんて遅い。
今はVB9がナウイ
Javaを毛嫌いしてる人は何もかもがスペック不足に見えるからな 最速目指すならD言語使っとけ
ネイティブコンパイラ使っても遅いの?>Java
別にJavaを毛嫌いするわけじゃないが、そこまで執着するほどの可能性も見出せない。
JIT使うJavaがCより演算で劣るということはないよ(どっちもネイティブ) どちらにしろこのスレはC++で作るスレなんだから、話を戻そうや
言語厨が混じるとこうなる
言語の速度を言うなら、C++はCの95%ほどの速度だと言われてる。
どうでもいい
クラス図は無いの?
甘えるな
685 :
684 :2005/09/16(金) 00:29:43
ゴメン誤爆した
絶妙だなおいww
速度、速度って…
リベンジしていい? クラス図は無いの?
>>689 int main(void)
{
(void)Clear();
ここまで読んだ。
何このキャスト? lint ツール使ってんの?
>>19 >>22 は作り方にちょっと疑問を感じる。
描画や音声はコントロールされる側なんだよな。
実際にコントロールするのはシナリオ、入力、イベントの3つのはず。
「進行スクリプト」という名のルートシナリオがまずあって
「シーン」という場面を切り替えてゲームを進行する。
シーン毎に「シナリオ」、「入力」、「イベント」のコントローラーがあって
それらコントローラーは黙々と「チップオブジェクト」や各種「データ」を生成、管理する。
そのためシーンはオブジェクトを管理するための「スクリーン」を持つ必要がある。
しかし "スクリーンは" あれこれ付け替えると描画処理に負担がかかるから
一定の規則を持った "複数レイヤーの配列としてルートオブジェクトにする" べきである。
したがってシーンが持つべきはスクリーンを掃除する「大道具」である。
「照明」さんや「音響」さんは「アクター」の演技によって生じる「SE」を「タイミングイベント」によって鳴らし
シーンの終わりに「幕担当」さんが彼ら裏方(大道具、照明、音響)と一緒にシーンを切り替える。
優れたシナリオが"描け"れば、優れたゲームエンジンにランデブれるぜ・・・!?
なんか途中で魔が差して変になった。ま、いいか
しゃれか
モデル:スクリーン、シーン、チップ、データ等 ビュー:描画、音声、ファイル出力等 コントローラ:シナリオ、入力、イベント この分類の仕方で行けば使いやすいエンジンに育て上げることができるよ。 シナリオクラスをどう仕上げるかが一番の腕の見せ所。
>>695 「ドアに話しかける」がどうしてまずい設計なのか良くわからないな
>会話の必要なクラスはすべて「NPC」クラスの下に派生されるようになっていた のに >「ドア」と会話する必要が出て くると、 >「ドア」クラスが「NPC」クラスとはまったく異なった「枝」に継承されていた ときまずいんでないの
>>697 うん、でも継承させればいい話。
話しかけるって言うのはいわば方言で
そのオブジェクトに対して「普通一般的に行う行動」を
Talkというメソッドにしてるだけでしょ?
×うん、でも継承させればいい話。 ○うん、でも「NPC」クラスに継承させればいい話。
>>696 ,698
「ドアに話しかける」は設計じゃなくて仕様に含まれる挙動。
その挙動を自然に表せなかった設計(単一継承ツリー)が悪いって話。
最初そうではなかったのだが、あとから仕様として追加されたってことかな? 全てのチップオブジェクトにMeddle(action)を追加するようにすればこんな問題にはならないな。 ※Meddle 弄くる、干渉する
>>701 あははー。浅はか過ぎる。 >695 のリンク先読んでから言ってんの?
読んでから言ってるけど?actionに対するパーサを節となるベースクラスが拡張すれば良いだけ。対応してなければ無視。
>>703 すべての基底となるベースクラスに Do(action) を追加すれば、もっといいってこと?
確かに各オブジェクトが action に対するパーサを拡張するだけで何でもできる。
>>704 そう、すべての基底となるベースクラスがprotectedなパーサクラスをコンポジットしてる。
単なる岩だってこちらから触ることは出来るでしょ。反応がない=触れないじゃない。
Doそのものをパーサとしたほうがいいかw
>>705 自由に作成できる action や拡張可能なパーサを設計するのは、簡単な話なの?
問題が action やそれに対するパーサの設計に移っただけな気がする。
talk (Tip* tip) { tip->Do(this, ACTION_TALK); } Do(Tip* tip, action) { if (tip->GetGroup() != group) { System.Message("噛み付かれた。"); System.AttackResult(this,tip,MSG_ATACK); } }
おりもやってみていいですか。
MSG_ATACKって何だろw BITE_ATTACKとかそんなんか、Skillクラスあたりだな
talk() { Tip *tip = System.CurrentPos(this, direction); if (tip != NULL) { tip->Do(this,ACTION_TALK); } } こっちでいいか。汎用的になった。
tipなのかchipなのかハッキリしてくれ。
それはいい指摘だ
vip
pip
エレキ版!
チップが鼻が黒い方、デールが鼻が赤い方。
ガタガタ逝ってないで、クラス図晒せる輩は居ないの?
素朴な質問:クラス図作らずにRPGを作るのは無謀ですか?
ってか。あいかわらず話についていけてません… orz
>>690 キャストは飾りです。
作りはじめの時に自作関数が目立つようにくらいの軽い気持ちで付けてただけです。
……無意味なので、こんど消しときますね。
ちなみにlintツールは使っていません。作製環境は BCC + HC_Editor です。
ところで最近ちょっと気になってるんですが、getsを使いまくっているのは邪道ですか?
いや、ダメ出しされても既に直す気力が湧かないくらい使いまくってるんですけど。
それなりに対処しているつもりなんで、いいですよね? イイトイッテクダサイ orz
BOOSTのインストールがうまく行かない… こういうことあるとJavaを褒めたくなるな
>>720 >作りはじめの時に自作関数が目立つようにくらいの軽い気持ちで付けてただけです。
#define call
call Clear();
>ところで最近ちょっと気になってるんですが、getsを使いまくっているのは邪道ですか?
邪道って…意味わかってんのか?
>いや、ダメ出しされても既に直す気力が湧かないくらい使いまくってるんですけど。
ラップすれば直すのは簡単だろ。
こういうの↓作って
char *gets10(char *buf)
{
char* p;
fgets(buf,10,stdin);
p=strchr(buf,'\n');
if(p)*p='\0';
return buf;
}
ファイル全体の gets を gets10 に一括置換すればいいだけの話。
クラス図書くのにいいツールない?
Flash
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | 時代はインタラクティブUMLですよ \  ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ・∀・) ∧ ∧ < 手間かかるもん作らせんな ( ⊃ ) (゚Д゚;) \____________  ̄ ̄ ̄ ̄ ̄ (つ_つ__  ̄ ̄ ̄日∇ ̄\| BIBLO |\  ̄ ======= \
いやFlashはGIFやPNGを吐き出すのにも使えるから便利だよ 拡大縮小絞込みなどが出来るUMLってのも興味あるけどw
ベクタとして保存したいわけだが。
swfはめっさベクター。
FLASH以外になに試した?
普通にEXCELでええやん?
開発者減ってね?
732 :
684 :2005/09/21(水) 17:34:15
むしろ増えてる
今何人?
JavaはUML⇔ソースの変換が出来るツールがあるけど C++だと無いんだよな
>>722 そうか! そういう手がありましたね!
んじゃ、そんな感じで直しいれてみます。
邪道って使い方おかしかったですか?
深刻なバグになりかねない gets を使うのはプログラマ失格だみたいな、
鼻息の荒い意見を見たもので、ちと鬱になってたんですよ。…グチってゴメン。
>>733 ノシ はいはいはい、点呼1です!
ちなみにC++ならよりちゃんとしたラッパを作れる。 //<cstdio>使ってgetsは名前空間stdに収められていることが前提。 template <std::size_t N> char *gets(char (&buf)[N]) { std::fgets(buf, N, stdin); if (char *p = strchr(buf, '\n')) *p = '\0'; return buf; }
定期上げです。ゲームらしくしてみました。曾の所で依頼を受けてください。
http://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0033.lzh gets の直しは、判定部分ではなく入力部分で直せたので、ラクに済みました。
教えてもらったのと違うようにやってみたんですけど、これでもだいじょうぶですよね?
レイアウトの関係上、半角30字以上は入れられたくないので
(実際、それだけの入力が必要な場面も想定していないので)
入れた場合は強制終了するようにしてあります。
/*-------------------------------------------------------------------*/
訂正前の抜粋・こんな感じ・Game.c 内 void WriteScreenInputArea(void)
{
char get_s[50];
gets(get_s);
if (strlen(get_s) > 30)
Err("WriteScreenInputArea// 入力文字数が多すぎます"); //←ゲームの強制終了
}
/*-------------------------------------------------------------------*/
訂正後の抜粋・こんな感じ・Game.c 内 void WriteScreenInputArea(void)
{
char get_s[30+3];
int mojisuu;
mojisuu = strlen(fgets(get_s,30+3,stdin));
if (mojisuu > 30+1)
Err("WriteScreenInputArea// 入力文字数が多すぎます"); //←ゲームの強制終了
else
get_s[mojisuu-1] = '\0';
}
/*-------------------------------------------------------------------*/
あ、エラーの時のコメントは表示されても見えないと思うけど、それもまぁいいですよね?(^^ゞ
>>737 fgets() の第二パラメータはsizeofを使うのが常道。
>>736 Cから継承した標準関数はグローバルが実体で
std の中に using されてる実装が多く、おそらく
グローバルな定義では意図したとおりに置き換わらない。
「ちゃんとしたラッパ」は自分で作った名前空間に収めるべき。
>>737 fgets は NULL を返すことがあるからチェックしてから strlen に渡そう。
743 :
503 :2005/09/22(木) 20:23:38
>>733 ノシ 点呼2!!
マップエディタは全然ゲームと作り方が違うので時間かかってるよ
RPGツクールのマップチップって思ったより複雑(隣接チップによっての変化やアニメーション)
いっそツクールが吐いたデータを読み込んだほうが楽かもしれない(軽く解析済み)
フレームワークのための設計だと多少の無駄は覚悟しなきゃならんね 例えばforを3回まわす所を5回まわすハメになってもFPSを維持できるなら見過ごすとか
メインループだけで完結できる設計にはならんってこと
>>733 点呼3 ノシ
実はそろそろやめたくなってますが・・
たまに見る、ラッパーライブラリとか言う言葉は、
なにか既存の関数をラッピングするように包んでるから
そう呼ばれてるんですね。
見るたびに、「ラッパーってなんだろ?」とか思ってました。
一段落したらDirectXを包んでるやつとか使ってみたいな。
>>737 ひし形の敵に殺られちゃいましたww
328さん、完成に向けてものすごいスピードで進んでますね。
その情熱を見習いたい。
>>743 ツクールのマップデータって、プログラム解析しなくても読めるんですね。
驚愕です。
ファイル操作で壁にぶち当たってる私とはえらい違いだわ。
マップチップのアニメーションとかも考えなきゃいけないのかぁ orz
>マップチップのアニメーションとかも考えなきゃいけないのかぁ orz 別になくてもいいと思うけど。
できたとこまで晒し -_-
http://aploda.com/dl.php?mode=pass&file_id=0000031631 自力では完成させる自信がまったく無いマップエディタです
セオリーとか知らないので、思うままにやりましたw
なんか無意味に大きくしすぎたかも。。
http://aploda.com/dl.php?mode=pass&file_id=0000031632 ↑の絵にちゃんとなってるでしょうか?
実行したら即ファイルを読み込む仕様なので、
それが失敗した場合即エラーがでるかもです。
構造体のサイズがコンパイラによって違ったりするらしいですし、
私のとこ以外の環境でちゃんと動くのか激しく疑問。
これからの予定
○名前を指定してセーブ&ロードができるようになりたい
(あのお決まりのダイアログボックスみたいなのはどうやって出すんだろ・・)
○ラジオボタンとかチェックボタンとかも出したい
○スクロールバーもあると便利かも
○絵以外も貼れるようになりたい(フラグとか)
win32の勉強がまだまだ不足なので、相当時間かかりそうです。
美乳さんのエディタはどうなってるんだろうか。
>>748 余裕があったら、川とか海の2パターンアニメをがんばって入れてみます。
マップチップはツクール素材を使ってしまおうかなぁ。
>>749 つ ダイアログボックス(モーダル)(VCの場合)
751 :
579 :2005/09/24(土) 14:54:44
>>739 &
>>742 Σ(゚Д゚;)
そうだよね、うん、手持ちの本にも書いてありました…orz
ありがとう、直してきます。
>>747 >>749 ありがとう。情熱というよりも、暇人なんですよw
>>749 は、win98でOK、画像どおりに表示されていますよ!
んでも、画面のチラつきが目立つのは、PC性能のせいなのかな?
>>644 はすごくスムーズだったんだけど…?
>>751 いや、かなり進んでいるように見えるんですけど?
マウス操作とかグラフィック関係は、
ざっと調べただけでも、すごく複雑そうですよね。
みなさん、がんばってください!
(私は手を出さないで正解だったとか思ってるのは内緒です。)
そういえば、音(BGMとかSEとか)っていうのが全然ないなぁ。 大して難しくないから?
今作ってる奴は作るだけじゃなくて、ノウハウをためて公開しろよ。 (なんかWikiみたいのがなかったっけ?) じゃないと単なるオナニーで終わるだろ。
755 :
デフォルトの名無しさん :2005/09/25(日) 17:54:20
オナニー? できたゲームが楽しけりゃ立派なセックルだよ。
>>753 サウンドは
>>457 あたりで話されていてMCIやwaveOutを使用した
コードが出ている模様。…まーそれなりに真面目に見ると
データのパック、暗号化、ストリーミング処理、Oggフォーマット対応、
DirectSoundによる複数音発声や一元管理などが無いんで少し物足りないけど。
757 :
756 :2005/09/25(日) 17:57:53
俺もうMyKeyboardクラスにほとんどの時間を掛けてるw おかげでいいのができそうだけど、こんなんで完成するのはいつの日か
761 :
デフォルトの名無しさん :2005/09/26(月) 03:20:35
しつもーん! C言語って標準でスタック用意してないの?
うわー!スレまーちがーえたー ごめんなさーい!!
| | |_|ω・`)< 乙でつ。漏れも頑張ってまつ。 |柱|⊂ ノ | ̄|-u'
自力で双方向リストを組むんだ!
>>755 ゲーム作って終わりならゲ製逝けよ。
ここはム板なんだから。
766 :
デフォルトの名無しさん :2005/09/27(火) 22:12:28 ID:0
最近技術的なことも語られてないし、こんなスレいらないんじゃない。 ゲ製の糞スレで十分だ。
いらなくなれば、自動的に落ちていくさ。
マップエディタ作るの飽きてきたので、自動生成マップにしようと思っている俺ガイル
ノマネコの大冒険〜1000回遊べるインスパイア〜
そういえばティルナローグはシナリオもマップも自動生成だったね。
>>766 だな。
ほとんど初心者のC/C++、Win32API勉強会になってるし。
質問スレだけで全然事足りる内容。
(たまにちゃんとしたのが出てくるが)
それで作るときのノウハウもためられないようじゃ全然意味なし。
得意げに汚いコードだけ晒し続けてる奴の心理がよく分からん。
そうやって盛り上げるからこの手のスレがなくならない ひょっとしておたくらが仕掛け人?
なにこの根暗な展開
ゲ製作はこれが普通
しったかが多いスレでつね
♪マーチったらしったかたー更新だー
777 :
デフォルトの名無しさん :2005/09/28(水) 11:28:36
>>775 マトモな奴は、来ない。
へタレで他人にえばりたい奴だけが来る。
∧_∧ / ̄ ̄ ̄ ̄ ̄
( ´∀`)< オレモナー
( ) \_____
| | |
(__)_)
>>771 わからないなら放っておいてくれないか
民族浄化みたいな真似しなくても誰も君の居場所を奪ったりしないから
ぬうう、ちょっと反省するところがありそう。
スレを活用するためには、ちょっと迷ったら
アドバイスを求めた方がいいんですかね?
動かし方とかいっぱいあるだろうし。
でもまだWin32ができないしなぁ。
>>751 Haskellっての見にいってみたら凄い呪文が!
なんじゃありゃ。
移動不可地形はすごい難しいっすよね。
マップエディタを待ってます・・。
>>760 三角の敵に殺られました。
店で買った皮の鎧が紙のようでしたよ。
あがいてもあがいても復活できないのは仕様ですかw
>>771 >得意げに汚いコードだけ晒し続けてる奴の心理がよく分からん。
こ、これはひょっとして私のことですか?(汗
えっとですね。私が晒しつづけているのは、
定期上げをすることで自分がダレないようにするためと、
誰かのツッコミを待っているってのがあるんですよ。
自分のコードがキレイだなんてハナから思っていないから、
とりあえず動かすだけのコードが書ければいいや、ってなると、
汚いままのコードしか書けないままになるかなって。
だからといって、「私のコードを添削してくれ!」なんて、
言える相手も場所もないから、ここに晒しておいたら、
奇特な人が見てくれないかなぁ、という希望的観測があるんです。
(自己中ですか? すみません)
それと、私が技術的な話に加わらないのは、
話が出来るだけの知識がないからです。
質問しようにも何が分からないのか分からないことが多いしね。
と、以上。自己心理分析、というか、言い訳でした。
>>779 いつもありがとう〜。
ごめん、今はプログラムを組むのに手一杯で、
ゲームバランスまでは手が回っていません。 orz
「あがく」だけでは復活できないので、薬とか使ってください。
瀕死状態では移動はできないけど[c]コマンドは使えるはずなので。
乙
ソース付けてなきゃ、誰も実行してくれないよ ここをどこだと思ってるの?
うわっ、ソース要求したよこの人。
それがどうかしたのか?
いや、 人のプログラミング能力を見るのにはソースコードを見るのが一番 バイナリだと、いくらでも小細工できて真の実力が分からんからな で、ソースコードを出せない香具師は口だけちゃんが多いね
まともにバイナリ動いてても口だけって理想主義者かよwww
つーかその程度で実行したくなきゃしなきゃいいだけだが。
理由が子供っぽい
バイナリだけじゃ本当にオナヌーじゃんかよ。
作りたい人が作って経過を見たい人が見る。 それで良いと思うがな。
二行目以外は余計
>>791 じゃあ今までに上がったソースの問題点とか指摘してみてくれよ
ソースを読んで実力を見るとか言っといて 好みの問題で済むようなどうでもいい書き方のお作法しか指摘できなかったら笑う
>795 ここでは、それがデフォですよ
最近いくつかあったアフォ発言は同一人物のしわざか
ぜんぶアフォに見えるんだが
799 :
デフォルトの名無しさん :2005/09/30(金) 22:41:07
どいつもこいつもヒットラー
800 :
デフォルトの名無しさん :2005/09/30(金) 22:48:56
マップ自動生成に挑戦中 棒倒し法以外になんかある?
なんかいろいろあるらしい tp://www5d.biglobe.ne.jp/~stssk/maze/make.html
宣伝乙。
いや、実際にいいよ。それと↓もいいと思う。
http://www.vector.co.jp/games/soft/win95/game/se190983.html?site=n でも、やはり本格的に一本ゲームを作ろうと思うなら、
マップエディタも自作した方がいいかな。
レイヤーの数、入出力データ形式、ツールバーの感じとか、
他人のだとどうしてもしっくり来ないし。
後、ツクール2000タイプの素材を使いたいときに、
境界線の自動処理の部分をどうするかだね。
普通に16X16で表示していては、ツクールと同じように表示できない。
展開したパターンを予め作っておくか、
ゲーム中に裏ビットマップに作って表示するか。
それとも、ツクール2000タイプ以外の素材を使うか。
しかし、その素材は殆ど無いんだよな。
805 :
デフォルトの名無しさん :2005/10/01(土) 17:47:18
これって仮に完成したとして、作ってる人は面白いと思ってるの?
冷やかししかできない人は、人生何をやっても面白くないだろうな。
冷やかししかできない人は、人生冷やかしだけやってれば面白いのだろう
冷やかしが生きがいのクダラナイ人生
参加することに意義があるのだよ
忠告・質問を冷やかし・煽りとしか取れない頭の弱い人たちがいるスレ。
ご忠告ああああああああありがとうございますかく
そろそろ埋めるか?
そろそろ忠告質問厨はスルーでよろしく。>ALL
814 :
デフォルトの名無しさん :2005/10/01(土) 23:56:53
自分で作ったゲームを楽しめない奴が作ったゲームはつまらない だが、自分で作ったゲームを楽しめる奴が作ったゲームが面白いとは限らない
ゲ製作だとおもしろさを研究するようなスレは自治が止めに入るから ついつい言及したくなっちゃうんだよスマソ なんでも「つくれつくれ」でやんなっちゃう
ここはム板なんで、面白さ・ゲーム内容よりも設計開発技術に重点をおいたほうがいい。 まぁ、まだ設計開発技術を云々いえるほどのものはできてこないわけだけど。
つーか面白さを追求する余裕があるほどゲーム作りに慣れたつもりなのか
>>815 スレタイを1000万回読んだらゲハ板に帰れ
ゲハは板違い 無責任な誘導やめろよマジで
ゲハがお似合いだってことさ
このスレはゲ製に立てるべきだな。 ま、今のレベルじゃゲ製でも相手にしてもらえないと思うけど。
ここはきもいインターネットですね
マップエディタの部品をプラグインで入れ替えできるようなのを、ここで案をよく練って作ってくれ。そんなにむずかしくないはずだ。
824 :
デフォルトの名無しさん :2005/10/05(水) 12:22:22
>マップエディタの部品 詳しく!
825 :
デフォルトの名無しさん :2005/10/05(水) 16:49:25
dllで機能を分解するの。 たとえばマップエディタだと、ウインドウをクリックしてチップ置くなんてのは共通なんだから、そのクリックイベントを他の人が作ったプログラムでキャッチできるようにするの。 上の例が適切かどうかはわからないがそんなかんじ。
自分でぜんぶ作るのとあんま変わらんな。
>>825 いいこと言ってる気がするのでもっと詳しく頼む
>>816 設計開発技術ってRPGだからといって特別なことある?
マップエディタエディタになりそうだな
極端な話、ベースはフォトショップでもいいよな
俺はコンバータ派。 気合入れてマップエディタ作ったのに 「フォトショップの方が使いやすい」 なんて言われた日にゃぁ orz...
1枚絵のマップってことか?
いや、フォトショップのプラグインって結構自由にできるからベースにするだけ 基本機能が段違い(UNDOやヒストリー、アクションだけでもフリーではありえないレベル)なので マップエディタとしてはありがちな機能をその上に乗せただけでも今までにないものになる (特にアクションがあれば派生機能が作れるし)
お前らマップエディタに何を求めて(ry
マップエディタを作るためだけに(使うためだけに)、Photoshopを購入する。 そんな風に考えていた時期が私にもありました。
その昔、本末転倒という言葉があったそうじゃ・・・・。
今でもあるし。
はぁ? フォトショぐらい無かったら仕事になんねーだろww
誰もそんな話はしていない。
せめてPaintShopProでも使えるプラグインにしてくれ。
誰にでも使えて誰にでも開発できるのがいいな フォトショプラグインはいちいち登録してsdkひろってこないとだめだから面倒じゃん
フォトショは高い 出版でもするのかと
GIMPがもっと安定してればねぇ…
PaintShopProにはアクションやヒストリーパレットが ないからベースにする意味がない
ネタだろ。
今までで一番使い易いマップエディタどれ?(市販、フリー全部合わせて) 来週の試験終わったら作り始めるし今のうちに研究しておきたい
ペイント
おお!ペイントで作る技があるのか? 詳しく教えてくれ!!!
拡大して一ドットごとに点を打って、bmpで保存して読み込むのか?
そんなわけないだろ
>>847 はきっとスゲー技を持ってるに違いない!!
>>847 スゲー技を教えてほしいワクワクテカテカ
なになに?スゲー技があるって聞いたんですが。
俺普通にペイントで拡大してドット絵書いてるけど・・・。 ドット絵勉強用に買った本がペイント使ってたもんだから・・・。
>>853 それはマップエディタとしてではなく単なるペイントツールだろ。
マップエディタってのはチップに付随する情報なども設定できなきゃ意味がない。
色の定義の仕方によっちゃ充分できるんじゃない?
プログラム”A”で適当なウインドウ”B”を用意→Aでペイントのウインドウハンドルを取得しリアルタイムでキャプチャ→ピクセルのカラー情報に基づいてBにマップを表示
>>856 その場合「マップエディタ」と呼ばれるのはプログラム”A”であり、
ペイントは単なるお絵かきツールでしょ。
おまいら的に理想のマップエディタとかこんな機能が欲しいとか こんなのが作りたいってないの?
859 :
デフォルトの名無しさん :2005/10/08(土) 17:38:53
出力フォーマットが自在にカスタマイズできるやつが欲しい
>出力フォーマットが自在にカスタマイズできるやつ つか、ソース公開しとけば ええんでないか?
いちいちコンパイルするのめんどくせー
頭に念じるとマップを用意してくれる奴。
ソース公開されてるマップエディタある?
あるよ
あるよじゃねーよバカチンが
質問には正しく答えてると思うぞ
結構です、で契約成立すると言ってるぐらい暴論
>>865 ,867
そんなことじゃ、コンパイラが吐くエラーメッセージの冷徹さに耐えられないんじゃないか?
コンパイラはいつも根拠を示す
コンパイラの根拠なんて当てにならん。せいぜい行番号ぐらい。
行番号だって大嘘じゃねぇか
まあつまりあれだ、あると分かったなら自分で探せってこった
知らないことは恥ずかしいことじゃないですよ でも次からは書き込む前に少し考えてみてください
876 :
864 :2005/10/10(月) 22:44:10
クレクレくんばかりだな(哂 あとは自分で探せw
教える義理も何にも無いのになw 自分が要求したものは皆すぐにくれるとでも思ってやがるのか。
みんなのものはおれのもの。 おれのものはおれのもの。
きみのものはきみのもの おれのものはきみのもの
なんか全然書き込みないけどみんな試験勉強中? 俺も終わるまで出来ないけど
882 :
デフォルトの名無しさん :2005/10/12(水) 19:53:35
RPG作ってるんだけど、タイトル画面、ゲーム画面、ゲームオーバー画面などにシーンを分けて、タイトル画面でボタンが押されたらゲーム画面に進む、みたいにするのってどうやる?
改行
変数に今タイトル画面とかゲーム画面だとか覚えさせておいて switchでそのサブルーチンを呼んでる 変数にオブジェクト入れてそれを入れ替える方法とか関数ポインタでもいいらしいけど
二週間ぶりに自作ソースを見たら見事なワカメスパゲティに熟成されていてお腹一杯です、こんばんは。
>>882 C言語の標準関数しか知らない素人のやり方だけど…
タイトル画面、ゲーム画面、ゲームオーバー画面、それぞれの表示用関数を用意して、
それと別に画面を全部消去する関数も用意して、
タイトル画面の【スタート】ボタンにイベント仕込んで、
そこをクリックされたら、画面消去→ゲーム画面の順に関数呼び出せば、
何とかなるんじゃないかな?
ところで、マップエディタが流行っているみたいだけど、
マップチップに最低限必要な要素とか、規格みたいのを先に決めないで、
作れるものなのかな?
と、素朴な疑問が湧いたのですが…私だけでしょうか?
っつか、独り言うざいですね。おやすみなさい。
>規格みたいのを先に決めないで、作れるものなのかな? 作れるものなんですよ、奥さん。
エディタの仕様に沿って規格が固まることもなきにしもあらずさ、母さん。
最初に規格を作ると、規格を作っただけでおなかいっぱいになる。 最初に規格を作らずぶっつけで作ると、形にはなるが拡張する時に泣く。 好きなほうを選べ。
まだにその通り・・。
まだに→まさにorz。 昔は後者で、今は前者かな。 規格を考えている時は楽しいからいいけど、 プログラムを組んでから時間が経つと飽きてくるから、 プログラムの方で時間が掛からないようにしている。 大正漢方が食べる前に飲むなら、プログラムは飽きる前に作るだね。 また、回数毎にどういうプログラムを作っていくかも大事だと思う。 作りたい作品である事は当然だが、 ちょうど自分の力量より少し難しいぐらいのにすると、 製作時間とレベルアップのバランスがちょうどいいから。
なるほど。含蓄ありますね。 ってか。いまロード&セーブで悪戦苦闘してるんですけど、 覚えたことも一気に忘れてしまったようで、 いいかげんヤになってきました(涙
>セーブ&ロード 必要なパラメーターをセーブ・ロード用の構造体にまとめて、単純にファイルに書き込む→セーブ 単純にセーブ・ロード用の構造体に読み出して、それを振り分けなおす→ロード もしくはもっと単純にパラメータ用の構造体を用意しておき、それを単純に読み書きすれば良い。 複数データ保存ならベースのファイル名+番号を自動生成すれば良いだけ(sprintf()でできるはず) >マップチップに最低限必要な要素とか、規格みたいのを先に決めないで、 >作れるものなのかな? 現在有るものを参考にする。(RPGツクールとか) それで足りなければ拡張すれば良い。 一から自分で造るのはすごく面倒だろうし、コンバートすら面倒なものが出来る可能性がある。
ありがとう、!
>複数データ保存ならベースのファイル名+番号を自動生成すれば良いだけ(sprintf()でできるはず)
この辺と、どのデータを保存するかで、ワケワカメになっていました。(涙
んで、なんとかできたので、久々の定期上げです。
http://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0037.lzh とりあえず、ゲームの最初にロードして、最後に保存するようにしました。
岩を動かしたりで地図を変えながら進めるようにしたので、
これだと明らかにハマリや不都合がおきるので、
セーブ場所を固定化するような形でシナリオを作らないとダメポですね。orz
その辺は、これから考えてみます。
マップエディタは、上のほうでカスタマイズの話が出ていたので、不思議だったんです。
完成したエディッタの拡張機能って、どの程度、作れるものなのかなぁと。
まぁ、私には作れそうにないので、素朴な疑問なんですけどね。(苦笑)
%.obj: %.c $(CC) -o $@ -c $< Game.obj: Game.c nullme.h
普通の2DのRPGなら、 とりあえず必要なマップ情報は、 ・マップ自体の識別コード(名前)・構成量(縦×横×階層)・構成目(マップチップデータ〈階層分〉) ・四辺の外設定〈階層分〉 ・ループや自動移動の有無〈階層分〉 ・メモ用空き ・内容(チップNo) ぐらい? 移動の可否・戦闘用データは、チップデータ依存とする。
まともなmakeを使え。
生成規則って便利機能があるので使ってみと言いたかった。
BCCならこんな感じかなあ
#↓生成規則: .cファイルから.objファイルを生成するには
#↓このコマンドを実行しる
.c.obj:
$(CC) $(CFLAGS) -c $< # ←行頭の4文字の空白はタブ文字に置き換えてくれい
#↓依存関係を書く。コマンドは書いてないけど先に決めたルールがあるので生成される。
Game.obj: Game.c nullme.h
こういう書き方あるから・・・記憶の片隅にいれといても損はしないかもザマス。
ちなみに
>>895 のはGNUMake用の書きかた
空白消えちゃうね。訂正。 $(CC) $(CFLAGS) -c $< # ←行頭にタブ文字を入れてくれい
901 :
デフォルトの名無しさん :2005/10/21(金) 03:14:34
なあ、このスレはVCを使うヤトゥーラはいないのん?
つかってるお
むしろVCだらけだと思ってた
VCを使えないのは私ぐらいかもしれないorz
>>898 バカにしないでください
まともなmakeが何か分かっていたら使っています! …だっけ?
>>899-900 ありがとう!
教えてくれた方法でできました!
っで。ついでに色々弄っていたら、↓の方法でも動いたのですが、
この方法でも問題ないのでしょうか?
nullme.h の指定をしていないのにできてしまっているのが、なんか不安なんですけど?
============================
CC = bcc32
OBJ = game.obj move.obj rest.obj goods.obj \
time.obj shop.obj save.obj
.c.obj :
$(CC) $(CFLAGS) -c $< #
Game.exe : $(OBJ)
$(CC) $(OBJ)
============================
>904 インクルードファイルは勝手にインクルードされるから指定はしなくてもいい。 但し、インクルードファイルに関する依存関係が指定されていないと言うことは、 当然インクルードファイルを修正してもmakeを実行してもコンパイルはされないと言うこと。 インクルードファイルの依存関係を正しくmakefileに反映させたいなら、mkmfを使うのも手だが、 #includeをgrepでリストアップして自分で書いても大した手間じゃない。 即ち、nullme.hの例で言えばgrep -l nullme.hで見つかったソースファイルが仮にgeme.cだとすると gem.c: nullme.h のように依存関係をmakefileに書いておけばいい。
bccのmakeにはヘッダの依存関係を自動で検出するオプションがあった気がする。
>>906 ど、どこに!? …見つけられませんでした(涙
>>905 ありがとう、インクルードファイルの修正が反映されないのは、困ります!
ってか。気付かなかった私って…お間抜け?
で、今度は下のように変更してみました。
最適化オプションとかあったので、足してみたりしたんですけど、
これで平気でしょうか?
===============
CC = bcc32
HEAD = nullme.h
OBJ = game.obj move.obj rest.obj goods.obj \
time.obj shop.obj save.obj
.c.obj :
$(CC) $(CFLAGS) -c -O1 -O2 -w4 $< #
Game.exe : $(OBJ)
$(CC) $(OBJ)
$(OBJ) : $(HEAD) *.c
================
ってか。なんかスレ違いっぽいかも?
しまった、タブが消えちゃいましたね。見難くなってゴメン。
.autodepend だったかな。
2ch にpost するときには、空白とかTABの変わりに、全角の空白を使うといいよ。
それより のほうがよくないか
>>911 半角スペースはそれでいいだろうが、
Makefile のTABはコピペしたときに
手で修正が必要だとわかるように全角空白がいい。
bccのmakeは半角スペースでも受け付けてくれた気がする。
RPGと関係ねーだろ c++質問板逝きな
>>914 ローグやってるみたいな感じで面白い。
移動は、一回一回Enterを押すのがめんどくさいから、
aaaaとか入力すると一度に4歩移動できるとか、
kbhit、getchを使ってEnterを省略できるようにするといいかも。
後、鋼の鎧を買って装備すると、装備できないと出るが、
あれは、敏捷が負になるとダメという事?
a4で4歩移動できるぽい
ホントだ。サンクス。
>>915 だよね、ゴメン。だけど、C++は私が分かりません(涙
なので、こんどbcc32のスレで聞いてみます。orz
>>916 ありがとう! 鎧はそうです、敏捷がマイナスだと着られません。
あと、レベルとスキルが足りない物も使えないようにする予定です。
っていっても今はプログラム組むのに精一杯なので、
シナリオやゲームバランスには手が回ってません。orz
>>917 ありがとう! いいかげんに仕様書も作っておかないとマズそうですね。orz
乙。開発者一人か?
だってゲ製の開発状況報告スレと中身変わんねーもん だったらここでやる必要ねーべ
しまった。装備を整えたら「盗賊の」の金が足りなくなった。 Aの敵でも強いし、1E1Gだからな・・。 でも難易度が高い方が好き。FCのドラクエ1や2みたいな。
・ちゃんとした技術とやる気を持っている奴がひっぱていく ・開発時のノウハウをまとめて、Webサイトなどで公開する ・ものを作るよりも設計・技術に重点をおく ↑これをきちんとやればム板でも盛り上がります。
>>924 不満があるなら君がやろうよ。
言うだけじゃクレクレ君と変わらない。
やってる奴はいたが文句ばっかりいわれて消えたいったな そういう奴らへの牽制のつもりなんだろ
>>921 あれ作っているのは一人です。
他の人は休止中、かな? それとも移動しちゃいましたか?
>>922 一理ある。けど、どうせだから私は1000レス行くまでは、ここにいます。
>>923 あ〜。ごめん。よく考えないで価格設定していました。
って、今はテスト中なので、激安でもよかったんですよね。
>>924 一理ある。んじゃ、とりあえず仕様書かきをがんばってみます。
っていっても。月末からまた少し消えるかも?だけど…
>>925 いや、真っ当な忠告だし不満って訳でもないんじゃないかなとか思ったり。
>>926 消えたって… もう戻ってこないのでしょうか? サミシイヨゥ… orz
・開発時のウハウハ
ひっそりと参加してみる。
コテハンなんて考える暇があったらコーディングしろよハゲ。
トリップまで頑張って・・・orz
ゲ製作の土日スレ行ったりしてプログラミングは続けてますよ 今はデータベース勉強中でMMORPG製作目指してる
936 :
デフォルトの名無しさん :2005/11/08(火) 08:03:07
保守。 と言いつつ、既にこのスレは要らないのかな?ともおもいはじめていたり・・・・。
俺もいらないと思う。ゲ製でやればいい。
ちょwwwwwwwwうpしようと作りかけてた俺はwwwwwwwww
板違いならスレ移転かスレストかかるからここでやっていいんだと思ってる
ここDelphiもあり?
え?
>>941 この状況でボケるオマイさんが好きだ!!
だが、スレタイを読めば、駄目だと思うよ。でも 【メール欄】
ゲ製に行くならどのスレになるんだろう。 今はちょっと忙しいけど、少ししたら時間が出来るから挑戦したいんだけど その頃にはこのスレ埋まってそうだしなぁ。
1ドット単位のスクロールしようと思ってるんだけど スクロール方向のチップ分大きな画面と、最終的に合成された画面の 二つの裏画面が必要だよね? ページフリッピングとかできない場合、最終的に合成された画面って 表示される画面と一緒だから、メモリ勿体無いなと思うんだけど 裏画面一つで上手くやれる方法ってないの?
946 :
デフォルトの名無しさん :2005/11/09(水) 23:42:53
.NETとSDKどっち使ったほうがいいかなー?
>>943 なんともならないのかよ!w
ってか、ゴメン、仕様書が書けない。というか、ゲーム内容が決まらない orz
今まではプログラムの勉強として、一般的なゲームに使いそうな部品の組み方を試行錯誤していたので、
ゲームとしての形になるような仕様を、ほとんど決めていなかったんです。(TT)
ローグ系より魔法の塔みたいのが好きだけど、パズル考えるのが苦手だからどうしようとか。
基本的な部分さえ未だ決まっていないので、もしかしたら、
今まで書いたコードを全部書き直すことになるかもしれません。orz
ってか。いいかげん標準関数以外のものも勉強しようかと、迷っています。
あと、話に出てた次スレは、私的にはゲームを完成させることを目的にしていないので、
ゲ製よりここの方が居やすいのですけど、もしも移動した方がいいのなら、
■自主製作ゲーム:開発状況報告スレVer0.4■
http://pc8.2ch.net/test/read.cgi/gamedev/1125306375/ 辺りに移動しようかと思っています。
RPGの場合だとバックバッファつくって毎秒何FPSって描画するのと 描き変えがあるたびに描画しなおすのはどっちがいい?
949 :
デフォルトの名無しさん :2005/11/10(木) 23:43:36
書き換えのデータ量とアルゴリズムによる
>>946 おまいさんが、普通の奴ならSDKつか、どっかから持ってきたライブラリー。
変態趣味があるなら、.net。
.netは、使えない奴も多いし、なによりもへんなバグがちらほら見つかってるから今は待ちだと思う。
sage
952 :
デフォルトの名無しさん :2005/11/23(水) 19:51:55
RPGツクール2000みたいに、キャラが3パターンでアニメーションする場合 パターン順に、0, 1, 2, 1, 0, 1, 2, 1 みたいな順番で繰り返すんだけど 0, 1, 2, 1っていう風に数が繰り返す式が思いつかないんだけど、どんな式書けば良いんでしょうか? 今は仕方なく配列に入れてやってます。
>>952 struct anime_node
{
954 :
953 :2005/11/23(水) 20:00:49
途中で送信しちゃったけど、配列として持つほうがスマートで正しいと思うよ
d[0] d[1] d[2] d[3] d[3]=d[1] } それか 0 1 2 ではなくて -1 0 1 と考える -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 (t-1) t (t+1) と見ると (t+1)=-(t-1)
>>952 内部的には1==3とする4パターンのアニメーションにすれば
スマートに扱えると思う
その場合はパターンの更新は
i = ++i&3
の一行で済む
957 :
956 :2005/11/23(水) 20:26:03
あ、上のは副作用が二箇所あった。 こう読み替えて i=i+1&3
958 :
955 :2005/11/23(水) 21:05:43
俺ももう少し考えてみた (t+1) = -(t-1)+2 x = -(t-2)+2 「1つ前の変数」、の名前を入れておくところをx[1] 2つ前をx[2]、現在の式に使われるものをx[0]として int x[3] = {0, 1, 2}; //初期化必須 x[0] = -(x[2])+2 ここでx[0]の絵を表示 x[2] = x[1]; x[1] = x[0];
int x[3] = {0, 1, 2, 1}; もしくはsin使うとかw
>>959 その配列で現在やってるって書いてあると思うが・・・
私も考えてみた、けど。やっぱり素直に char pic[4] = {'A','B','C','B'}; test = (test + 1) % 4 ; でやるのが一番効率が良さそうですね。
>>962 なんか恐ろしく面倒なシステムだね
せめてカーソルキーで移動できないと厳しいんでない?
あ〜、ゴメン。実はカーソルキーの検出方法が分からないんです(^^ゞ サイト検索して説明を捜してみたけど、複雑で私の手におえそうになかったので、 もう少し基礎的なプログラムに慣れるまで、敬遠させてください。orz
DirectInput使え。 ついでにフォースフィードバックにも対応だ。
966 :
デフォルトの名無しさん :2005/11/27(日) 16:32:15
カーソールキーでなくとも、エンター押さなくても検出できるように出来ればいいんじゃない。
>>968 >>967 のリンクみたいに自分でコンソールとやり取りするのは大変・・・
なのでよかったらこれドゾー
//MapVirtualKey用
#include <windows.h>
//getch or getche用
#include <conio.h>
int my_getch(void)
{
unsigned char c = _getch();
if(c != 0 && c != 0xe0) return -1;
c = _getch();
return (int)::MapVirtualKey((UINT)c,1);
}
getchがスキャンコードを返してきたときだけ仮想キーコードにして返す関数でつ。
普通の'a'とか'1'なんかだと-1が返ってきまつ。ちなみに矢印キーとかの仮想キーコードはこれ。
VK_PRIOR(PageUp) -> 0x21 VK_NEXT(PageDown) -> 0x22
VK_END -> 0x23 VK_HOME -> 0x24
VK_LEFT -> 0x25 VK_UP -> 0x26
VK_RIGHT -> 0x27 VK_DOWN -> 0x28
あと、MapVirtualKeyはuser32.dllに入ってるのでuser32.libのリンクをお忘れなく。
VC使ってるならこんな感じ。他はシラネ。
cl test.cpp -link user32.lib
これならWinAPIのMapVirtualKey一つ使うだけなんでAllocConsole系よりかはまだ使いやすいかと。
968じゃないけどありがとう
GetKeyStateなんかもあるなああ:::
APIは引数多いからね…。最小でやるとこう? HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE); INPUT_RECORD ir; DWORD len; ReadConsoleInput(hStdIn, &ir, 1, &len,); ir.EventType == KEY_EVENT であれば、 ir.Event.KeyEvent.wVirtualKeyCode にキーコードが入ってくる。 キー押下時のみ処理する場合は ir.Event.KeyEvent.bKeyDown をチェックする。
んー、相変わらずの良スレぶりですね。
>>968 なんかうまく動作しない。
画面上にいくつか数値があって、画面下にテスト・データとあって、
Enterを押すと、かみつきとか特技やアイテム名が表示されていく。
中身みるとそれでうまく動作しているようだ
>>975 サンクス。
memo.txtの基本動作の所にA.移動 (←)+(歩数)
みたいに書いてあるが、今後の予定みたいなのかな。
>>968 memoより
>大事なデータは勝手に変更されないように、外部宣言を避けて、
>関数を通して弄るようにした方がいいと、
いいと思う。それかmain関数に宣言するか。
978 :
969 :2005/11/29(火) 01:09:38
>>977 test.cの37〜40行目の判定はキーボ−ドによってはうまくいかないかも。
スキャンコードって確かキーボード依存だったので、人によっては返ってくる値が違うことが・・・(´・ω・`)ショボーン
でも、俺のキーボードと同じ値を返してるみたいなんで意外と大丈夫なのかも。。。
そろそろ次スレ立てようか。 どこに立てれば良い?
もちろんゲ製に決まっておる
あそこは止めたほうがいい。 ゲ製作技術板はゲーム作成のプロが集結する板だと勘違いしたゲーハー厨が 跳梁跋扈する板なんで、下手にゲーム作成するなんて言い出すと厨房がたかる。
今まで通りプログラム板?
>>981 どのスレを見てるんだ?全然そんなことないぞ。
あっちはゲーム製作の視点でやらないと板違いになる。
>>42 みたいな感じでプログラムの話ばかりだし、ここでいいと思うよ。
988 :
デフォルトの名無しさん :2005/11/30(水) 11:30:49
989 :
デフォルトの名無しさん :2005/11/30(水) 15:18:17
途中で作るの辞めた私が言うのもなんだけど、このスレ超良スレだよ。 今積極的に作ってるのは382さんだけかな。 がむばってほすぃわぁ。
990 :
デフォルトの名無しさん :2005/12/01(木) 08:45:27
ume
うめ
ume-
産め
995 :
デフォルトの名無しさん :2005/12/02(金) 09:22:11
ume
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< ぱいそんぱいそん! \_/ \_________ / │ \ ∩ ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぱいそんぱいそんぱいそん! ぱいそん〜〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
997 :
デフォルトの名無しさん :2005/12/02(金) 15:05:51
997
998
666
1000 :
デフォルトの名無しさん :2005/12/02(金) 15:40:29
1999
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。