配列関数でフィールドを管理する部分と、各当たり判定とか、いっきに書いて実行したら、わけわからん動きをするようになった。
コンパイルでエラーは出ないから、どこか数字とか不等号の向きとかをミスってると思われるけど、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 )って形で初期値を設定する。
それ以外は前の記事のソースと一緒。
前の記事の問題2つをクリアしたよ。
まず問題①
これは『苦C』の力を借りました。
乱数生成の際、出来るだけ意図できない数字を計算に含める事で解決します。
意図できない数字に、現在時刻を利用する方法。
まず、time.hをインクルードしておく。
そんでランダム関数を下のように書き換え。
static型でフラグを定義する事で、プログラム実行した際、最初の1回だけ時間の要素をランダム計算に混ぜ込みます。
毎回やると処理が重くなるそうです。(苦Cより)
static型の変数は関数を抜けた後も確保される(この場合、フラグの状態が残る)そうです。
し、知らなかったよ。
勉強になるなあ・・・。
次に問題②
これはキーの状態を判断するフラグを作ることで解決できるなと、直感的にわかった。
で、ソースを書き換え。
よし、OK!
と思い、実行すると何も変らない・・・汗。
よーくソースを見て流れを追ってみた。
なるほど、これじゃループ1回したらフラグは降りてしまう。
って訳で修正。
キーが押されたかの判断を先にして、そこに対してelseでフラグを降ろす処理を入れる。
これで、キーが押されていない状態が出来て初めてフラグが降りるので、キーの押しっぱなしは無効になった。
やろうとしている事はあっていても、コードの流れをよく読んで挿入しないと、機能しなかったり、おかしな動きをしたりする。
これは良い例じゃないだろうか。
- ABOUT
- カレンダー
06 | 2025/07 | 08 |
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 |
- 最新コメント
- プロフィール
はい。
- ブログ内検索
- カウンター
- アクセス解析