いや、本当に細かい数値のミスだった。
for文の繰り返し回数を間違えていたり、1X を 0Xって打ち間違えていたり、フィールドの枠表示と実際のフィールドの位置がずれていたり。
注意してやってても、細かいミスは出てくるもんだ。
問題はプログラムが問題無く実行されてしまう事だ。
文法上の問題じゃないから、当たり前なんだけど、コンパイル段階で出るエラーの方が原因が特定しやすくて楽だわ。
結局、今回実装した関数の呼び出し部分全てに、いったんコメントマークを入れて無効化し、1つずつコメントマークを外して動きを確かめながらデバッグした。
疲れた・・・。
今回のバージョンから、落下したぷよはフィールドに蓄積されてくようになった。
フィールドの状態を管理するのに2次元配列変数を使っている。
GameField[x][y]って感じで、xは8、yは14。
中身は初期状態でこんな感じ。
60000006 y0
60000006 y1
60000006 y2
~中略~
60000006 y11
60000006 y12
66666666 y13
ゼロの部分がフィールドの空白を現している。
ぷよが着地すると、その時点でぷよの位置と色が配列に記録される。
例えば右下に黄色、赤と縦に置いた場合、
60000006 y0
60000006 y1
60000006 y2
~中略~
60000036 y11
60000016 y12
66666666 y13
配列内はこうなる。
あとは、配列内容を調べてその通りに表示するだけだ。
また、落ちてきたぷよがいられる場所は空白のみなので、配列内では0の部分になる。
これを利用して落下中のぷよの当たり判定も全て配列変数を利用する形にした。
つまり、落下中のぷよの座標で配列内を調べて、0より大きい数が入っていれば当たり判定が発生すると言うような具合だ。
かなりゲームらしくなってきました。
ただ、今は積み上げられてゆくのみ・・・。
実行ファイルも置いときます。いつもどうりzipですので、解凍してからフォルダ内のexeファイルをダブルクリックで実行できます。
リリース構成でのデバッグの意味もいまいちよくわからないで使っているので、ダウンしたファイルが動かないと言う方がいたら、コメントいただけると有難いです。
(対処できるかどうかは別ですが・・・w)
http://u7.getuploader.com/game/download/44/%E3%81%B7%E3%82%88%E5%86%8D%E7%8F%BE%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%EF%BC%838.zip
矢印キーの左右、下で落下中のぷよ移動
Zキーで回転
ESCキーを押すか、左から3番目の列が上まで積まれるとプログラムを抜けます。
その後、何かキーを押せばプログラムが終了します。
さあ、あと残った大きな実装は、ぷよを消す処理だ!
配列関数でフィールドを管理する部分と、各当たり判定とか、いっきに書いて実行したら、わけわからん動きをするようになった。
コンパイルでエラーは出ないから、どこか数字とか不等号の向きとかをミスってると思われるけど、4時間近くソースを睨んでも何が悪いのかまったくわからん。
配列関数の扱い方が悪いのかなあ。
本当にわからん。
こりゃ、時間がかかりそうだ。
何か致命的なミスがあるんだろうなあ。
下手したら、設計から見直して、最初から作り直しになるかも・・・。
もう眠いし、集中力切れたから、今日はあきらめる。
http://u7.getuploader.com/game/download/43/%E3%82%BD%E3%83%BC%E3%82%B9.txt
一応、ソースのテキストをアップしときます。
左右、下移動、ぷよ回転の操作を実装
地味ーに作業を進めてる。
取り合えず操作に関する部分が出来たので、関数にしてメインループ部分から分けた。
それに伴って、操作するぷよ2匹のデータを構造体変数化。
構造体に関しては、いまいち理解できてなかったので実践も兼ねてね。
あとは、実際のゲームのフィールドの床位置での着地処理を加えた。
と言っても今はまだ、着地したら新たな2組をランダムに選んで最初の落とし位置から落とすだけだけど・・・。
ここは、後々色んな処理が入ってくる(既にフィールドにあるぷよの上に落ちた場合とか、4つつながった場合とか)予定なので、今のうちから関数化して見通しを良くしといた。
あとは、今の時点で、ぷよのつながりや、連鎖の判定は、多次元配列変数を使うだろうなあってイメージがあるので、ぷよの座標を表す変数を仮想配列内の座標に変更しておいた。
縦12+見えない1、横5の配列変数になると思うので、実際のグラフィック表示の座標は配列変数内のx、yに32(キャラの大きさ)をかけて、中央寄せになるように適当なドット数を足した感じになってる。
うん、だんだんゲーム作ってる感じになってきたよ。
次くらいから、おそらくこのゲームを完成できるかどうかの肝となる、配列内のぷよの処理に手をつけるぞ!
つながったぷよや、その数の管理と処理については、いくつか頭の中にアイデアがあるので、紙に書いて一つ一つ検証してベストな方法を実装してみようと思ってる。
それでも、最初は動かないんだろなぁ・・・w。
関数のプロトタイプ宣言が増えて、構造体の定義も入ってます。
これで少しだけどメインループがスッキリしましたw
メインループから分離した関数の一部です。
今現在こんな感じで動いてます。
プログラム初心者の作るゲームの画面なんてこんなもんです。
すいませんw
あくまで、ゲーム性の再現を・・・コホンコホン。
プログラムの進行を時間で管理する。
ぷよが落ちるスピードを調整する時に、プログラム内のループの回数などをタイマーにすると、実行されるハードウェアの性能に左右されてしまう。
なので、あらゆるハードで絶対的な値である時間をプログラムのコントロールに使う事は、今回のゲームに限らず欠かせなくなってくると思うのね。
ならば、早めにマスターしておこうってことで、1秒でぷよが1マス落ちるプログラムを組んでみた。
前回、乱数を得る時にも使ったGetNowCount関数のお世話になろう。
タイマーをスタートさせた時の時間をcurtimeと言う変数に代入しておく。
んで、その後ループ内で現在の時間からcurtimeを引いた値が1秒になったら、ぷよを1マス落とす。
それだけ。
1秒の部分を変数にしておけば、そこを変えるだけで落下速度を変えられるわけだ。
たまには実行ファイルもアップしとこう。
http://u7.getuploader.com/game/download/38/%E3%81%B7%E3%82%88%E3%81%B7%E3%82%88%E5%86%8D%E7%8F%BE%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8.zip
キャラクターアクションの回と同じく、圧縮したZIPファイルです。
解凍してからフォルダ内のexeファイルを実行してください。
Zキー ・・・ ぷよの組み合わせ変更
ESCキー ・・・ プログラムの終了
よくよくDXライブラリの関数を調べたら、ちゃんと乱数を得るための関数も、時間管理の関数もあったよ。
よく調べなきゃいかんね。
と言うわけで、無駄にインクルードしてたtime.hを外して、DXライブラリの関数のみで処理するように書き換えた。
GetRand( int MAX )は、0~MAXの間で乱数を得る関数なので、ぷよの色番号1~4で乱数を得たい場合は、MAXを3にして、帰ってきた値に1を足せばオーケー。
あと乱数生成の初期値を意図できない値にするのも前の記事と同じで時間をつかう。
乱数の初期値を設定する関数はSRand( int RandMax )。
OS起動からの経過時間を得る関数はGetNowCount。
これを組み合わせてSRand ( GetNowCount )って形で初期値を設定する。
それ以外は前の記事のソースと一緒。
- ABOUT
- カレンダー
04 | 2025/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 最新コメント
- プロフィール
はい。
- ブログ内検索
- カウンター
- アクセス解析