忍者ブログ
Profile
HN:gp-hss

職業:高校生

趣味:3DCG

言語:C全般

環境:VC++ 2008 EE

3DCG:Softimage Mod Tool

自己紹介:
ゲームプログラマー目指して勉強している者です。
現在 C++ 修得にむけて頑張っています。

Began study since 2009/8/21

Latest CM
[06/28 soulmorning]
Latest TB
(02/25)
1  2  3  4  5  6  7  8 
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

author : gp-hss ×

RPG_MAP(.zip)

とりあえず大元のマッププログラムは完成しました。
あとはこれに敵を配置していったり、新たな階を増やしていったり、ミニマップを作ったりするだけですね。
ちなみにキングの部屋への扉は閉ざされているのですが、クイーンのいる部屋にいくことで開かれます。
あと障害物がやけにないですが、これはまだマップの外形だけしかつくっていませんのでご勘弁。

クイーンの部屋はパッと見シンメトリーなんですが、どうしてもキングの部屋はシンメトリーにできませんでした。
ちょっとキングを表す文字が 2 バイト文字なんでバランスがどうしてもね・・・。
あと、キングの部屋はものすごくハデにしてあります。
完成版ではクイーンを倒すことでキングの部屋にいけるようになり、キングを倒すことで新たな階にいけるようにしたいと思っています。
ちなみに階段の現れる場所はランダムに変化させようと目論んでいます。
キングを倒しても次は階段を探さなければいけないちょっとめんどくさいゲームとなっております。
まぁでも 3 × 3 のブロックしかない、ものすごくダンジョンゲーとしてはマップの小さいものとなっておりますのですぐ見つかるはずです。
( 3 × 3 のブロックとは図にするとこんな感じ ↓
 □ □ □
 □ □ □
 □ □ □
このブロック内に表示されるマップを書いていくわけですね。
あくまでイメージではですけど。)

最近なかなか更新が遅れがちですね~。困ったもんだ。
簡単に何かわかりにくい関数だとかの説明でもしておきますかな。

ちなみに関数形式マクロはしっていますよね。
あれは一見関数そのものなんで値渡ししてるように見えますがそうではないですよ。
あれは渡されたものをそのまんま指定されたとおり置き換えるだけです。
詳しくはお手持ちの参考書かご自分でお調べしてください。

特に MoveMap は関数で実現すべきかなと思ったんですが、マクロの方が本当にちょっとだけですけど楽だったんでそのままマクロで実現しました。
もし関数で実現するのなら引数として関数へのポインタを渡さなければいけないことはわかりますよね。
( void (*p_func)()    これで何も返さない関数へのポインタ p_func を宣言したことになります。
ちなみに変数の宣言の仕方・解読に関して詳しくは「C言語 ポインタ完全制覇」をオススメします。
また、普通にインターネットでも調べることができますが、「こう宣言すれば~を宣言したことになる」なんていう浅い理解ではなく、「なぜそれを宣言したことになるのか」までちゃんと理解することをオススメします。
この点において上記の書籍は最良だと思います。)
ちなみにプログラム中 fanc などとなっていますがもちろん func です。
間違っていました。すいません。


マップを描画するところでは行単位で文字列に変換してから文字列として出力しています。
このほうが描画速度は1文字ずつ表示するよりも圧倒的に早くなります。
マップのブロック単位での移動のところについても同様の処理させています。

マップの取得では文字として1文字ずつ取り込んでいますが、改行文字と EOF に関しては空白に変換してます。
でないと 1 バイト分塗りつぶされた感じのが表示されてしまいます。
また、マップの取得に関してはマップの形しか取得していません。
つまり敵の配置などは後から別に行う必要があるため、敵の座標位置に関する情報などはまた別のファイル( map_info\map?.txt )に保存しておく必要があります。
ちなみに、マップの取得はブロック単位で取り込んでいますが、最終てきには1つにまとめています。
これがこの階の全体マップとなるわけです。

プレイヤーの移動制御では四方に障害物がある場合(四方が空白で無い場合)は動けないことを表す 0 を返し、1 バイト分動けるのであれば 2 を返し、マップの端にいるのであれば 3 を返し、何も引っかからなければ 1 を返します。

プレイヤーの移動処理では、まず始めに動けるかどうか判断する関数を呼び出し、結果を変数に記憶させておきます。
ここを通過すれば少なくともプレイヤーが動くことになるので、まずプレイヤーの表示を視覚的に消します。
ここで動く方向に応じた処理があるのですが、ここで使われているのが先ほどちらっとでてきた MoveMap マクロです。
こいつは、(引数といっていいかどうかわからないけど)第1引数と第2引数が等しければ第3引数で指定された関数を実行し、そのまま return します。
まさにこの関数用につくられたマクロです。
例えば、マップの上端にいてさらに上へいこうとしたらマップを上に移動させる関数を呼び出します。
プレイヤーの表示はそれらの関数が受け持っているのでそのまま return します。
敵の動きに関しては過去の記事を参照してください。

ちなみに、今回のプログラムでは継ぎ目アニメーションは行われることはありませんが、新規作成したものなので過去に紹介したものとはかなり異なります。
まぁ気になる方はご自分で実行させてみてください。

なにか関数の解説ではなく単なる説明になってしまいましたが、たぶん解読できるのではないかと思いますので頑張ってください。
ではまた今度。

拍手[0回]

PR
author : gp-hss ×

RPG_BATTLE(.zip)

とりあえずバトルプログラムは完成しました。
ということなので今回はソースファイルも公開していますが、ぼくが思いついたら作って、思いついたら作っての繰り返しでコーディングしていったものなので、読み手にはやさしくないし実現方法もバカだしグローバル変数は乱用してるし簡潔でないしもう何がなんだかわからないしで最悪なのは保障します。
また改めて注釈もきちっとつけて無駄をなくしよりわかりやすくしたものを公開したいと思いますので、いまのところはこれでお願いします。
本当は後から手直しするんじゃなくて常に良質なプログラミングができるのが理想なんだけどね。
あぁ、あと不具合などがあるかもしれませんが後で直すつもりなのでがまんしてください。
例えば、確か防御力強化アイテムを何個か使って、さらに「ぼうぎょ」を選択するとダメージが文字化けして「/」や「・/」とかになってしまいますが、だいたい察しはついていますので大丈夫です。

えぇ~では気を取り直して、今回はアイテムの項目を仕上げました。
いろいろと凝ってます。
獲得できる経験値やダメージなどのゲームバランスは最後に調整したいと思いますので悪しからず。
ちなみに経験値は、まず純粋な経験値があってそこからいろいろと引かれていくようになっています。
例えばどれだけのターンが経過したかや、使用したアイテム数などなど。
今回は敵が3体いるのですが、ふつうに戦ったら必ず負けます。
ちゃんとアイテムなどを考えて使えば楽勝です。がんばってください。
ちなみに相手はポーン(このゲーム上最弱の敵)なので、自分の仲間が倒されるとひるんでこちらは連続で攻撃できますのでそのへんもよく考えてください。

あと、このプログラムを実行するときはできるだけ他のアプリケーションなどは終了してから実行してください。
動作に大変影響を受けますので。
特にこの僕のパソコン(昔のビジネスモデルのPC)はシングルコアのCPUにメモリが1GBもなく、かつ古いので他のプログラムを終了してないと重くてカクカクの動画を見ているような感じになってしまいます。

ようやくこれからはマップ作りに専念できますね。
どうにか2月までには完成させたかったのですがちょっと難しそうですね~。
まぁ2月15日までに完成できれば一応ノルマは達成なのでなんとか頑張りたいです。
ではまた今度。

拍手[0回]

author : gp-hss ×
RPG_BATTLE_TEST(.zip)

どうもです。
今回は前回の予告どうり「ぼうぎょ」「アイテム」の項目を完成の一歩手前までつくりました。
案外楽にできたのは、ほとんど既につくってある関数を流用しているからなのです。
しかし、プログラム自体はけっこう複雑になってきて不具合などがあるかもしれませんのでご了承ください。

そういえば前回の記事では言いそびれていましたけど、HPステータスの表示と明示的なグラフみたいなのも作っています。
HPの変動に連動して変化します。
あとコメントの表示はENTERなどを押すことである程度スキップできます。
また、最終コメント表示後はENTERもしくは → , ↓ を押さないと先に進めません。
どれが最終コメントなのかは完成版では判断がすぐにつくようにしたいと思っています。
(例えば、点滅カーソルの表示の切り替えなどで)

あと今回ではレベルアップしたときにどのステータスがどうくらい伸びたか表示します。
ちなみにアイテムは現在ポーションしか正常に作動せず、ほかのアイテムを使うと強制的に相手のターンになってしまいます。

そういえば一番大事なことを忘れていたのですが、実行ファイルがVCランタイムか実行環境がないと起動できないということです。
ゲームなんていう配布目的なものをつくっているのでなんとかしたいのですが、まだVC++2008EEでビルドだとかしたことがほとんど無い状態なのでどうしていいか分からず彷徨っています。
たしかリンカオプションの全般で「ランタイムライブラリに依存」のところを「いいえ」にすればファイルが大きくなるかわりにランタイムなしで起動できるときいたので、ソースを新たに作ったプロジェクトのファイルにコピペしてビルドしようとしたが警告だとかエラーがわんさかでてお手上げ状態です。

1つの要因としてはファイルのオープンなのですが、ファイル名ではなく、直接パスとファイル名を書いているにもかかわらず警告でて、ちゃんとできたのかどうかわからない状態。
("c:\\xxx\\xxx.txt" みたいな感じにしてやっているんですがね~・・・。)
あとはそれによって連鎖的にでてきたエラーなど。
一回簡単なプログラムでいろいろ試してやってみようと思うので、とりあえず起動したいかたは実行環境をインストールしてください。
申し訳ないです。
でも確かWin32コンソールアプリケーションならランタイムなしで起動できたような気がするだけどなぁ~。

そういうことなのでそろそろこの Battle プログラムも終わらせつつちゃんとファイルを起動できるようにしたいと思います。
ではまた今度。

拍手[0回]

author : gp-hss ×

RPG_Battle_test(.zip)

やぁ~どうもです。
けっこう今回はがんばりましたね。
まず、コメント枠内にコメントを表示するためにそれ専用の char * 型の配列を用意して、自作関数をもって表示などの作業をするということにしたのですが、大きな穴がありました。
それは printf のように "%d", get_exp みたいな感じで変数のもっている数値を表示できないということです。
用意している配列は文字列へのポインタでしかないので、中に変換指定を記入したところでそれ自体を文字と認識してしまいます。
そこでけっこうがんばったわけですが、例えば

printf("経験値%dを得ました。", get_exp);

とする場合、まず変数の持っている数値などを表示するところを空白にします。

"経験値 を得ました。"

そしてこの空白を目安にして、この文字列を二つの文字列に分割します。

"経験値"
"を得ました。"

次に変数のもっている数値を文字列に変換します。
アスキーコード表によれば、

0 = 48(10進数)
9 = 57

ですので、上の位の数から順に文字列配列に

str[0] = (char)(get_exp % 100 + 48)

のように代入していき、最後に終端文字を代入します。
あとは、 strcat() 関数を用いて文字列を連結していきます。
しかし、ここで注意しなければいけないのが、この文字列は不必要になるまで記憶域に存在している必要があります。
そこで空いている領域から文字列分の記憶域を確保します。
不必要になれば free でその記憶域を開放してやります。


この方法を思いつくのにけっこうがんばりました。
この関数はもちろんポインタ・配列・文字列のところをきちっと理解していないと作れません。
初めて勉強してたときもこの分野が一番きつかったもんなぁ~。
正直ポインタ単体の理解に苦しんでいたらわからなさすぎてストレスが半端ないと思う(笑)
言いすぎか・・・・・。
まぁー僕自身何回か読み返して理解できるまでいろいろと試験プログラムつくったりしてがんばったww
性格からして勉強に関してはちょっと完璧主義なところがあるので、本当に理解できるまで勉強した。
例えば、こうすればこうなるなんていう浅い理解じゃなくて、なんでそうなるのかというしくみをいつも理解しようとしてたな~そういえば。
数学の勉強もそうだけど、公式なんかはしくみを理解したほうが断然いい。
まる暗記なんか役にたちやしないからね。
それにしくみを知ってれば加法定理以外は自分で作れるようになる!!
まぁ経験が命だけど。数学もプログラミングも・・・。
まぁ雑談はこのぐらいにしておいて、他になにかあったかなぁー・・・・あっ、ソースファイルはちゃんと整えたら公開しますので少々お待ちを。
いますごく酷くて・・・とても見せられたもんじゃないww

えぇ~とっ、次はとりあえず防御の項目を完成させて、アイテムの項目もある程度は手をつけたいと思います。
ていうか一般的には小規模なんだろうけど、僕にとってはこんな大規模なプログラミングは初めて。
だってこのプログラムだけで 1600 ぐらいあるから、 RPG.h を加えると軽く 2000 は越す。
まぁもちろん最終的にはヘッダーはわかりやすく分けますけどね。
あとヘッダーの使い方は普通はプロトタイプ宣言とかだけだと思うので真似しないように。
どうもライブラリの作り方がわからないのでとりあえず関数本体もヘッダーにぶち込んでる。
分割コンパイルはめんどくさいので。
exturn とか・・・。
いまさら書き加えるのは無理ww

ということで次回には Battle プログラムは完了させたいと思いますので、ようやくマップ作りに取り掛かれるかと思います。
はたしてどんなダンジョンにしようかな。
ではまた今度。







ていうか、うわっ!
まてまておいおい・・・・・。
またかよ。なんでこんなに難しく作っちゃうんだよ~・・・。
あんな分割とか連結とかしなくていいじゃん。
それ専用の自作関数を用いて、

void OutObj(char *str, int obj)
{
        printf(str, obj);
}

これで文字列の中に変換指定があったとしても普通に問題なく表示されるじゃないか!!
またこのパターンかよ。
はぁ~あ。
しかも無駄に記憶域確保しなくてもいいし、簡潔じゃないか。
まぁーとりあえずこのゲームでは上記で紹介しためんどくさい実現方法でやっていきますが、みなさんは真似しないように。
あれはあれで使えるんだろうけどね・・・。

拍手[0回]

author : gp-hss ×

僕んちは Panasonic のレコーダー(?、録画もDVDも再生できるやつ)を使っているのだが、外部入力からの録画も対応していることに今気がついた。
つまりゲームをするときなんかはだいたい入力切換しますよね。
そうです、僕が言いたいのはゲームのプレイ動画が録画できるということです。
実況はできませんが。まぁするつもりもありませんがね。

 HDMI で入力はできないみたいなので、D端子(D4)はあるのでそれでレコーダーに入力し、レコーダーとテレビは HDMI で接続されているので画質を保ったままテレビにて出力されます。
ある程度(確かD4って 720p とかまでだっけ?)の画質で公開できそうな気が。
ちなみにPCに落とすには一度 DVD にダビングして PC のドライブで読み込まなければいけず、案外めんどくさいうえ時間がかかります。

ていうかそういえば録画された動画ってファイル形式どうなってんだろ。
変換とかが容易にできるようなやつだったらいいけど・・・。

ということでさきほど Wii のスーパーマリオブラザーズでテストしたらうまくいきましたので、今後検討したいと思います。
ではまた今度。



とこのまま終われば最高だったのだが・・・・・。
最大の勘違いに気がついた。
D端子のやつ入力じゃなくて出力だった・・・。
まぁいいか、三色ケーブルで我慢するさ。

拍手[0回]

author : gp-hss ×
忍者ブログ | [PR]
 | PAGE TOP
write | reply | admin