トップページ⇒tech
1001コメント372KB

C/C++言語でRPGを作ってみるスレ2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/09(土) 15:12:42
作りたい人がきてください。

まとめサイト
http://himatanuki.hp.infoseek.co.jp/
まとめサイト(Wiki)
http://gamdev.org/w/?%5B%5BC%2FC%2B%2B%B8%C0%B8%EC%A4%C7%A3%D2%A3%D0%A3%C7%A4%F2%BA%EE%A4%C3%A4%C6%A4%DF%A4%EB%A5%B9%A5%EC%5D%5D

前スレ
C/C++言語でRPGを作ってみるスレ
http://pc8.2ch.net/test/read.cgi/tech/1114834076/

0153デフォルトの名無しさん2005/07/17(日) 18:04:27
まあまあ。経験者はいろいろツッコミ入れたくなるだろうけど
アドバイス程度にしておこうよ。
0154シープラ勉強中2005/07/17(日) 18:20:42
>>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%なので、
パソにやさしそうなのでこれ使ってます。
最終的にはマルチスレッドというのをやりたいと思ってます。

ご指摘ありがとうございました。
01551272005/07/17(日) 18:53:39
>>149
CPU率が高いかな。

RPGとか動きの少ないゲームは、移動とかしない時は、FPS4でいいと思うけどな。
3枚の視界サイズのメモリビットマップに、視界の全キャラの全足踏みパターンを
書いておいて、WM_TIMERで250ミリ秒毎に0→1→2→1と描画するだけ。

キャラが移動した時、画面がスクロールした時には、
3つの歩行パターン全部に更新部分を描画する。
0156デフォルトの名無しさん2005/07/17(日) 19:12:22
RPGプログラミングの書籍とかないかなぁ…
0157デフォルトの名無しさん2005/07/17(日) 19:18:40
>>155
俺の環境だとCPU利用率が1%ぐらい。
01581572005/07/17(日) 20:38:48
勘違いされると困るから一応言っておくけど、
俺のマシンのスペックは今となっては高くない。
CPUはPentium3 900MHz
グラフィックはVIAのオンチップで
0159デフォルトの名無しさん2005/07/17(日) 21:31:04
>>158
OSは?
01601572005/07/17(日) 21:35:51
Windows 2000
メモリは256M
0161デフォルトの名無しさん2005/07/17(日) 21:50:04
>>149
>// 開放(この開放のしかたはいいのか?)
>void Free ();

よくねーよボケー!!!
Free(); としましょう。それじゃ宣言止まりです。
0162デフォルトの名無しさん2005/07/17(日) 22:01:12
ワロタw
それじゃ解放処理呼ばれて無いわw
メモリリークしまくりんぐ
0163デフォルトの名無しさん2005/07/18(月) 07:33:37
おいらも参戦するっす
まだカーソルキーでスプライトを動かせるだけですが、マルチスレッド使ってます
画像データに、シープラ勉強中◆ryjMYLsfPAさんのものを使わせてもらっています
あと、コードはいろんなところからパクってます:-)
ttp://gamdev.org/up/img/2912.zip
0164デフォルトの名無しさん2005/07/18(月) 09:11:05
>>156

http://www.google.co.jp/search?as_q=RPG+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&num=100
0165デフォルトの名無しさん2005/07/18(月) 09:54:21
>>156
http://pc8.2ch.net/test/read.cgi/gamedev/1086023829/
推薦図書/必読書のためのスレッド in ゲ製作技術
0166デフォルトの名無しさん2005/07/18(月) 13:14:38
>>157
うちは600MHzぐらいorz。すごく重いとかいう意味ではなくて、
一般的にfpsが高い方が作品としてすぐれているみたいに考えられているけど、
RPGや、ゲームではないけどテキストエディタとかは、
描画の回数を減らせるなら減らした方がいいのではという意味で書いた。

>>163
まずは、基本的な移動という感じですな。
お互いレベルアップできるようにがんばりましょう。
0167シープラ勉強中2005/07/18(月) 14:40:07
>>155
おお、そんな技もあるのかあ。
プログラムはどんどん重くなっていきますし、
いずれはそんな方法も使ったほうがいいのかなあ。
ちょっと難しそう・・どうもありがとうです。

>>156
わたしも欲すぃ。
町の人のセリフとか、どうやって個々に持たせるのか
全然思いつかないし (T_T)
あと、イベントとか、ホントどうするんだろうか・・。

>>161
うはwwほんとだwwww
いちおうFree()の中で開放してるやつは
全部デストラクタにも入ってるので
このプログラムではあんま結果は変わらないのですが、
過去のヤツでは問題アリアリのもあったかも。。
てゆか、たぶんFree()作ったときからそのヘンテコ記述でしたよぉ。
気づいてくれて、ありがとうございます m(__)m

>>163
おー、なんか私の知らない未知のテクノロジーがいっぱいww
絵はどう使っても問題ないんですよ。
でも、、ホントにあんなんでいいんですかね ^^
改変とかもバシバシやっちゃっても全然かまわないので。。

マルチスレッドうらやますぃ。
0168デフォルトの名無しさん2005/07/18(月) 15:30:29
>>163
クリティカルセクションをコンストラクタとデストラクタで
ロック/アンロックしてる部分は知らなかったんで「なるほど」と思いますた。
定石なのかもしれませんが・・。

wineからMSIMG32.dllの部分だけとって使おうと思ったら、
まだ実装すんでないのね。
0169デフォルトの名無しさん2005/07/18(月) 15:32:39
と思ったらyaneSDKのものだったんすね。<CriticalSection
ふむふむ。
0170デフォルトの名無しさん2005/07/18(月) 15:59:30
>168-169
御指摘通り、yaneSDKからパクってます(;´Д`)
コードを抜き出して組み込んでも良いと書かれていたので、
そうさせてもらってます:-)
(他の部分もコードを読んでいるんですが、
yaneSDKの中身はおいらにとっては難しすぎますorz)

使えるオープンソースは使っていこうという方針っす
0171デフォルトの名無しさん2005/07/18(月) 16:11:16
ロック/アンロックじゃなくて生成/破棄だね。

CriticalSectionはEnter回数をWin32側がカウントしているんじゃなかったけ。
そもそも動作しているスレッドがロックしているとか、ロック回数を保持するとか
必要あるのかな?
0172デフォルトの名無しさん2005/07/18(月) 17:44:10
>>171
ソース読んでない&&Java屋の戯言だから間違っているかもしれんが...
コンストラクタでロック、デストラクタでアンロックしているようだから>>168で合ってるはず。
再帰ロックすると、単純にデストラクタでDeleteCriticalSectionを実行するとバグるからだと思う。
0173デフォルトの名無しさん2005/07/18(月) 23:27:26
ゲームの場合、スレッドよりコルーチンの方が使いやすい希ガス。
WinでもConvertToFiber(うろ覚え)みたいなAPIで使えるよね。
ライブラリでも拾えるし。
0174デフォルトの名無しさん2005/07/18(月) 23:38:01
そもそも初心者スレだし、
無理してスレッドやらコルーチンやら使わなくてもいい希ガス。
0175デフォルトの名無しさん2005/07/19(火) 00:44:11
ttp://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0010.lzh
本当は出したくなかったんですが参考になればと思って出します。

数年前に某所で発表したものです。
見た記憶のある人は黙っておくこと。

問題があるソースだということは分かっています。
いまさら作り直すのも手間ですし、時間もかかるのでパス。
あと、バグがありますが消してません。場所も特定済みですが。

マップチップは前スレの852あたりから拝借。
マップエディタ、NPCエディタ、イベントエディタは…公開しない。
0176デフォルトの名無しさん2005/07/19(火) 02:16:24
>>175
わお!スクリプト記述キター!
やはりゲームシステムとゲーム内容は分離すべきですね。

なんかちょっとやる気出てきたゾ。
01771752005/07/19(火) 06:33:50
言い忘れ。
マップが適当なのは組み立て方が
良く分からなかったのと面倒だったから。

ソース自体は素敵処理が満載で、
まんま使ったりしようとすると恐らく
痛い目にあうからやめた方が無難。
ただし、スクリプトの実現や、
NPCの実現の一つの手法としては
もしかしたら参考になるかもしれない。
0178デフォルトの名無しさん2005/07/19(火) 19:03:03
>>175
うあっ、また未知のテクノロジーがw
NPCエディタとか、イベントエディタとか
やぱ作らなきゃいけないのかぁ。
どこまでできるかな。。
0179デフォルトの名無しさん2005/07/19(火) 19:16:45
作らなきゃいけない、とゆーことはない。
作った方が楽できることもあるし、ゲームよりもエディタの方が
大掛かりになってしまうこともある(後者はある意味本末転倒)。
それに、一口にエディタといってもコンバータに毛が生えたようなものから
GUIベースの凝ったものまで色んな形があり得る。

エディタはプレイヤーには見えない(ゲーム開発者だけが使う)道具だから、
「何がしたいか」をはっきりさせて手抜きできるところは手を抜かないと。
何から何まで本格的にやってたらとてもじゃないけど完成しないよ。
0180デフォルトの名無しさん2005/07/19(火) 20:33:55
やっぱり、人のソース見るとやる気出てくるわ…
がんばろっと…
0181デフォルトの名無しさん2005/07/19(火) 21:50:32
やること満載なのがわかって、落ち込む人もいます orz
0182デフォルトの名無しさん2005/07/19(火) 21:51:59
夢が広がりんぐwww
0183デフォルトの名無しさん2005/07/19(火) 21:58:56
あんまり全体ばっかりを見て途方にくれるより
今できそうなことを着実にこなして、脳内を快感物質で満たし続ける方がいいよ
そうすればやる気も持続しやすくなるはず
0184デフォルトの名無しさん2005/07/19(火) 22:10:40
RPGはひとつひとつのルーチンは簡単だけど
全体の量が多くなるからねぇ…
0185デフォルトの名無しさん2005/07/20(水) 08:43:08
>>184
基礎だけなら、シューティングやシュミレーションなんかとそれほど変わらんとおもうが、
大抵、RPGはドラクエとかFFみたく凝りたがる人が多いからね。

とりあえず、Rogueのソース読みこなせればいっきに世界が広がるよ
と言ってみるテスト。
0186デフォルトの名無しさん2005/07/20(水) 11:24:43
Rogueやってみた。

ソース以前に操作方法でつまづいた orz
0187デフォルトの名無しさん2005/07/20(水) 16:34:12
スクリプトの作り方なんて激しく人に依りけりだからなぁ。
まずは外部依存でイベントを実行できるアドベンチャーを作ってみるとか。
0188デフォルトの名無しさん2005/07/20(水) 20:09:45
まずは2DマップでWizardryのシステムを作ったほうがいい気がする。
本家#1のやつね。あれはイベントスクリプトなんてものはないし、
そもそもNPCがいないし。フラグ管理もアイテムのみだ。

NPC以外の全てが詰まってるステキなゲーム。
0189デフォルトの名無しさん2005/07/20(水) 20:20:12
本家#1って?
0190デフォルトの名無しさん2005/07/20(水) 20:25:05
>>175
SUGEEEEEEEEEE
やっぱレベルが違うわ
自分はまだマップ読み込み+表示レベルっす

あと、スクリプト初心者な俺には
ttp://www4.nasuinfo.or.jp/~hobby/index.shtml
がかなり参考になった。AVGだし、C言語だけどね。
0191デフォルトの名無しさん2005/07/20(水) 20:39:53
>>189
一番最初のシナリオ。ASCIIの外伝とかじゃないやつ。
Wizardryはシナリオごとに#1、#2〜と番号が振ってある。
0192デフォルトの名無しさん2005/07/20(水) 20:41:57
I see.
0193デフォルトの名無しさん2005/07/20(水) 22:52:12
Wizardryって何
0194デフォルトの名無しさん2005/07/20(水) 23:50:13
おおっと! テレポーター
0195デフォルトの名無しさん2005/07/21(木) 00:48:55
石の中にいる
0196デフォルトの名無しさん2005/07/21(木) 16:45:17
なにやら面白そうなスレ
>>149が落とせなかったんで現状把握が出来てないのだが、
今どこまで進んでて、どの辺りが詰まってるん?
0197デフォルトの名無しさん2005/07/21(木) 16:53:55
きみょうなウサギは3かいかみついた
せんし1のくびをはねた
せんし1はまひした
せんし1はどくにおかされた
せんし1はいしになった
せんし1ははいになった
せんし1のレベルが7さがった

どうする?
0198デフォルトの名無しさん2005/07/21(木) 17:15:45
>せんし1ははいになった

それでも生きてるのか…?
0199デフォルトの名無しさん2005/07/21(木) 17:40:37
「くびをはねた」の時点で死んでる。
Wizには死より悪い状態がある。それが灰。
灰よりさらに悪い状態もあって、それがロスト。
0200デフォルトの名無しさん2005/07/21(木) 17:44:19
>>196
>>149は、プレイヤーらしきキャラが画面上を歩くだけのプログラムです。
今はフィールドのプレイヤーと町の人の共通の処理を、
なんとかクラスにまとめられないかを考え中です。

動きうんぬんよか、どういうクラスにするのかが難しい。
早くゲームっぽい動きを考えるとこまで行きたいよぉ。


>>188さんの提案は凄く魅力的。
まずはイベントとか無いのを作るほうが、
モチベーションを維持できそうな気がする。

スクリプトってなに?
0201デフォルトの名無しさん2005/07/21(木) 18:18:43
>スクリプトってなに?

たとえば王様のイベントがあったとして、

event.cpp
----------
void king()
{
 if(dead){
  msg("おおぅ、勇者のくせに死んでしまうとは情けない");
  msg("明日から来なくていいよ");
  sound("derodero.wav");
 }
}

↑こんな風に直接コーディングするのではなく
↓こういうテキストを用意して、プログラムからこのテキストを解析することにより
 上のコードと同じような動作を再現させる。

event.txt
----------
event king
 if $dead
  msg おおぅ、勇者のくせに死んでしまうとは情けない
  msg 明日から来なくていいよ
  sound derodero.wav
 endif
endevent
0202デフォルトの名無しさん2005/07/21(木) 19:13:11
>>201
げっ、マジですか?
それってメチャ難しそうなんですけど・・
たまにサイトとかで「独自のスクリプトを組んで〜」みたいなのを
見かけるのですが、コレのことだったのかぁ。

こりゃ無理ですわ orz
0203デフォルトの名無しさん2005/07/21(木) 19:15:10
>>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;
};
0204デフォルトの名無しさん2005/07/21(木) 19:17:02
改行多すぎたので分割、インデントが付けられないので醜くなってしまった

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{
..その他、小爆発アニメーションなど
};
0205デフォルトの名無しさん2005/07/21(木) 20:26:21
ぶっちゃけ、スクリプトはなくてもどうにかなる。
けれども、自由にNPCを追加したりするときに重宝する。
マップとスクリプトあれば、同じシステムでいくらでもゲーム作れるからね。
まあ、それがRPGツクールなんだけど。

何も完全構文である必要はない。@eとか@nとか、プレフィックス+1文字で
どうにかするとかもできる。
0206デフォルトの名無しさん2005/07/21(木) 20:44:10
大規模ゲームになると、スクリプトがないとやってられないよ。
RPGならどうしても大規模ゲームになるよね。
0207デフォルトの名無しさん2005/07/21(木) 20:46:26
>>202

スクリプトは、バイナリの簡単な仮想マシンにすると実装は楽だね。
大きなスクリプト書くのはしんどいがw
02082072005/07/21(木) 21:15:22
小規模なRPGの場合、スクリプトなし、あるいはバイナリベースのスクリ
プトシステムに簡易アセンブラ(ラベルのアドレス化と簡単なニーモック、
フラグレジスタの変換程度)、といった形が現実的かも。

実行時にテキストを読み込んで処理するのはちょっとしんどいし、配布
にも不利だからね。
0209デフォルトの名無しさん2005/07/21(木) 21:19:08
まあスクリプトの処理方法が皆目分からないヤシはAhoのドラゴン本でも読んでなさいってこった。
0210シープラ勉強中 ◆ryjMYLsfPA 2005/07/21(木) 21:23:10
http://49uper.com:8080/html/img-s/67378.zip

定期です。
本格的に>>149と変わってないのですが。
当たり判定で、ちょっとハマってしまいまして。。

>>203
私のプログラムでは、
CObjectBase ってのが MoveableObject に当たると思います。
てゆか、ベースクラスのメンバ変数を protected のとこで宣言すると、
派生クラスで直接使えるのにびっくりしてしまった。

あー、C++を覚えながらRPGを作るのは、やぱ無謀だったか。

>>203と>>204に仮想関数がやたらと多いのは、
いったいなぜでしょうか?
アフォな質問で申し訳ありませんが、
お願いします m(__)m
0211デフォルトの名無しさん2005/07/21(木) 21:24:40
>>209
それはちょっと大袈裟すぎ…
0212デフォルトの名無しさん2005/07/21(木) 21:25:26
派生クラスでオーバーライドするから
0213デフォルトの名無しさん2005/07/21(木) 21:37:44
プログラマがスクリプト書くならLuaみたいな
既存の組み込みスクリプトでええじゃないか。
0214デフォルトの名無しさん2005/07/21(木) 21:39:41
構文解析の処理とかプログラミングの基礎だろ?
ゲーム作りたがる人は地味だから、これを飛ばしたがるけどねw
簡易電卓をまず作ってみるといい
0215デフォルトの名無しさん2005/07/21(木) 21:45:57
>>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()に制御がまわる。
使う側はその実際のクラスがなんであれ基底クラスとして扱えば
実際の制御は派生クラスで行ってくれるという感じ。

詳しくは派生クラスとバーチャル関数辺りを調べれば出てくると思う。
0216デフォルトの名無しさん2005/07/21(木) 21:46:04
>スクリプト
BulletMLみたいにXML使ってもよかですかい?
0217デフォルトの名無しさん2005/07/21(木) 21:51:34
>>214
>これを飛ばしたがるけどねw
飛ばすもなにも、自己流で勉強した人はまず、そんなプロセス通らないだろ。

役に立つのは確かだから俺からもオススメするが。
なによりも知的好奇心が気持ちよく満たされる。
02182072005/07/21(木) 21:54:01
>>216
「状態の設定」には良いんだけどね>XML。
処理の「流れ」をどう表現するか……。

結局、XMLに記録するものがまた「テキストスクリプト」になる気がw
0219デフォルトの名無しさん2005/07/21(木) 21:56:43
>>215
誤: static MoveableObject spriteTable[MAX_SPRITE_COUNT];
正: static MoveableObject *spriteTable[MAX_SPRITE_COUNT];
0220デフォルトの名無しさん2005/07/21(木) 22:00:52
>>217
自己流でやっていて、Cを覚えようとして、
BASICインタプリタ作った俺はなに?
0221デフォルトの名無しさん2005/07/21(木) 22:01:38
神
0222デフォルトの名無しさん2005/07/21(木) 22:02:29
ttp://wisdom.sakura.ne.jp/programming/cpp/cpp31.html
0223デフォルトの名無しさん2005/07/21(木) 23:47:07
WideとHeightとかWi、Hei、Ceeate、Oll、Animaあたり
0224(-_-;)2005/07/22(金) 05:38:41
前スレとちがって、なかなか面白くなってきたけど、今受験に専念したい自分には2ch自体が甘い誘惑。

だれか、このスレのLogを取って置いてくださいませ。
来年の4月には取りに着ますので。
よろしくお願いします。
0225デフォルトの名無しさん2005/07/22(金) 06:58:57
VC++6.0 Standerdで、Cはコンパイル出来るんですーか?
そもそも、VC++6.0 Standerdってなんですか?Yahooで調べてみたけど、いまいちよく分からん。
というより、Cで3DRPGを作れるの?聞く話によると、Javaの方がいいという。
まったく初心者の俺は、これだけで混乱してしまう。
だれか、厨房と思わずに教えてくれー!!
0226デフォルトの名無しさん2005/07/22(金) 07:10:02
>Cで3DRPGを作れるの?
>聞く話によると、Javaの方がいいという。

言語なんて飾りです
エロい人にはそれが分からんのです

・・・つまり
センスがある人ならCだろうがJavaだろうが作ってしまう
センスが無い人は、どの言語を選ぼうが作れない
ただそれだけのこと
0227デフォルトの名無しさん2005/07/22(金) 07:33:32
>>225
VC++6.0 Standerd とは マイクロソフト製のC言語、C++言語でプログラミングをする統合開発環境
Cで開発する場合、画像を表示する窓(ウィンドウ)から作らなくてはならない
Javaで開発する場合は、その窓を作らなくてもよい
3Dゲームを作る場合は、すでにあるライブラリーを使う場合が多いけどその時はCのほうがライブラリーを使いやすく、使用例が多くあります
0228デフォルトの名無しさん2005/07/22(金) 09:53:58
>>227の律儀なレスに全米が泣いた。
0229デフォルトの名無しさん2005/07/22(金) 11:02:16
>>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の内容は村人の移動とともに書き換えることになる。
絵付きで細かく説明しないとわかりにくいかもしれないが、ご容赦。
0230デフォルトの名無しさん2005/07/22(金) 11:13:43
>>229
訂正
誤:この場合CMap::m_pbyMapの内容は村人の移動とともに書き換えることになる。
正:この場合CMap::m_pbyMapの上位8ビットは村人の移動とともに書き換えることになる。
0231シープラ勉強中2005/07/22(金) 17:56:03
>>215
なるほど。一つのインターフェイス、複数のメソッドってやつですかね。
う〜ん、でも効果的な使い方が思い浮かばないです orz
>>215のを利用すると、プレイヤーキャラと町の人をソートして、
上から順番に表示するプログラムとか、やりやすそうに
なるような気がしなくもないですけど、、うーん。
もうちょっと考えて見ます。
ども!

>>229
おー、それはいいかもです!
マップチップの種類はそんなに多くならなそうですし、
8ビットのうち、1ビットは進入可能か不可能かの判定フラグにしてもいいですね。
村人の移動で書き換えるのも良いさげ!
でもそれだと、もう一個フラグが必要になるかなあ。

マップチップデータはunsigned short型にして、上位8ビットには
なんか他のデータを入れようかと思ってました。
敵の出現情報とか(川の向こうとこっちじゃ出てくる敵の種類が違う、みたいなやつ)は、
マップチップに持たせたほうがいいんですかね?
0232デフォルトの名無しさん2005/07/22(金) 18:57:27
>マップチップデータ

構造体の配列にするといいと思う。

struct CHIP{
 int image;
 int movable;
 int enemy_type;
};

class CMap {
 CHIP *m_pbyMap;
 …
}
02332072005/07/22(金) 19:23:37
>>231
>敵の出現情報とか(川の向こうとこっちじゃ出てくる敵の種類が違う、みたいなやつ)は、
>マップチップに持たせたほうがいいんですかね?

それは別にした方が良い(出現情報自体が、地形情報とは異質の一つの
マップになるから)のでは?

配列で持つなら

地形(表示用マップチップ)
遭遇する敵
イベント情報(イベント番号)

はそれぞれ別にする方がわかりやすいと思う。
0234デフォルトの名無しさん2005/07/22(金) 19:50:54
さて、色々といわれる速度ですが簡単な測定exeを作ってみました。
GDI+については良く分かってないもので適当ですが多分もっと早くなると思う。
DirectDrawとGDI_DDBが早いのはデバイス依存形式で
ビットマップを使っていて、かつビデオメモリにイメージがあるからです。
ttp://himatanuki.hp.infoseek.co.jp/cgi-bin/uploader/src/up0011.lzh
0235デフォルトの名無しさん2005/07/22(金) 22:58:58
>>234
GDI+はどうやっても速くならないと思う
0236デフォルトの名無しさん2005/07/22(金) 23:48:54
GDI+対応のアクセラレータが無いからGDI+は滅法おそい、って誰の話だったか
0237デフォルトの名無しさん2005/07/23(土) 00:55:37
MMOに挑戦してみてるんだが、こりゃ大変だわ・・・。
微妙にチャットできるようになったらUPします。
0238デフォルトの名無しさん2005/07/23(土) 05:19:34
>>232 >>233
どうもです。
そうか、構造体って手段がありましたね。
そのほうがわかりやすそうです。
マップエディタ作るまえに、最終的な仕様を決めとかないと
あとで大変なことになりそうですね。。
イベント情報もマップデータが持つのか。

マップチップ構造体
○絵
○敵のタイプ
○イベント情報
○なんか1ビットずつのフラグ

こんな感じになるのかなあ。
↑のやつだと、全部BYTE型ですみそうですけど、
念のためint型で宣言しといた方がいいのかなあ。
でもそれだとメモリいっぱい使いそうだし。

>>234
おつです。
やっぱ、けっこう差があるんですね。
ウチでもDirectDrawのビデオメモリverが異常に早かったようです。

>>237
うはww なんか、高レベルな感じ。
がんばってください。
0239デフォルトの名無しさん2005/07/23(土) 06:21:09
>>235
ttp://lamoo.s53.xrea.com/develop/gdiplus/gdiplus_blt.html
GDI+はここのBitmap-OFF と Bitmap-ONの状態で、
Cache-OFF Cache-ONを使えば1.5倍ぐらいになるのは目に見えてる。
内部はDIBだと思うのでその程度の速度にはなるはず。

基本的にGDI+はゲームにつかうためのものじゃ無いとは思うけど。
0240デフォルトの名無しさん2005/07/23(土) 06:37:00
>>238
仮に1チップあたり贅沢に16バイト使うとしても
たとえば50x50チップの町を表現するのに 40KBytes。
これは256色ビットマップ200x200程度の容量。ぜんぜん気にならない。

ちなみに SFC の RPGツクールでは、世界マップが 256x256 だった。
これだとちょうど 1MBytes 必要になるな…。今の PC なら気にならんだろうけど。
(それに1チップ16バイトも使わないだろう)

設計さえしっかりしてれば
メモリの節約なんて、完成の1歩手前でも十分間に合うから、
今は作りやすさを優先したほうがいいと思う。
0241デフォルトの名無しさん2005/07/23(土) 11:19:21
>設計さえしっかりしてれば
>メモリの節約なんて、完成の1歩手前でも十分間に合うから、


通常、それは設計がしっかりできていないというんだよ。
0242デフォルトの名無しさん2005/07/23(土) 11:56:53
ちゃちゃ入れるなや。勉強中なんだからどのくらいっつー感覚ないだろうしな。
それにちっと位贅沢設計でも問題ないだろ。
仮に出来上がったものが1Gbyte以上必須だとしても、それはそれで面白い。
ま、1Gは大げさだが256M位だったら問題なしだろ。
0243デフォルトの名無しさん2005/07/23(土) 13:32:20
いまどき設計でメモリのことなんかちまちま考える必要はない
それより重要なことがある

設計者として節約の感覚はあったほうがいいとは思うが、
ゲームやるPCのメモリは潤沢だろ
0244デフォルトの名無しさん2005/07/23(土) 13:45:00
大富豪プログラミング
0245デフォルトの名無しさん2005/07/23(土) 13:46:49
大貧民プログラミング
0246デフォルトの名無しさん2005/07/23(土) 14:44:08
だからまともなやつが育たない
0247デフォルトの名無しさん2005/07/23(土) 14:46:02
大富豪はな
0248デフォルトの名無しさん2005/07/23(土) 15:45:31
>>241
設計がしっかりしているとメモリの節約さえ柔軟にできないのですか?(ニヤニヤ
0249デフォルトの名無しさん2005/07/23(土) 15:51:34
日本語編だなあぁ。
設計がシッカリしているのがまるで悪いことのように思える文章だ。
0250デフォルトの名無しさん2005/07/23(土) 15:56:54
>>249
>>241
0251デフォルトの名無しさん2005/07/23(土) 16:02:26
ぐだぐだと御託を並べても始まらない。
まずは、完成させることが大事であるわけだが。
0252デフォルトの名無しさん2005/07/23(土) 20:09:17
>>251がイイ事言った。
■ このスレッドは過去ログ倉庫に格納されています