前の記事の問題2つをクリアしたよ。
まず問題①
これは『苦C』の力を借りました。
乱数生成の際、出来るだけ意図できない数字を計算に含める事で解決します。
意図できない数字に、現在時刻を利用する方法。
まず、time.hをインクルードしておく。
そんでランダム関数を下のように書き換え。
static型でフラグを定義する事で、プログラム実行した際、最初の1回だけ時間の要素をランダム計算に混ぜ込みます。
毎回やると処理が重くなるそうです。(苦Cより)
static型の変数は関数を抜けた後も確保される(この場合、フラグの状態が残る)そうです。
し、知らなかったよ。
勉強になるなあ・・・。
次に問題②
これはキーの状態を判断するフラグを作ることで解決できるなと、直感的にわかった。
で、ソースを書き換え。
よし、OK!
と思い、実行すると何も変らない・・・汗。
よーくソースを見て流れを追ってみた。
なるほど、これじゃループ1回したらフラグは降りてしまう。
って訳で修正。
キーが押されたかの判断を先にして、そこに対してelseでフラグを降ろす処理を入れる。
これで、キーが押されていない状態が出来て初めてフラグが降りるので、キーの押しっぱなしは無効になった。
やろうとしている事はあっていても、コードの流れをよく読んで挿入しないと、機能しなかったり、おかしな動きをしたりする。
これは良い例じゃないだろうか。
乱数を得る①
2匹で一組のぷよを、Zキーを押すたびに組み合わせを変えて表示するプログラムを書こうとして、壁に当たった。
この処理は毎回落ちて来るぷよの組み合わせを変えるために、欠かせない処理だ。
しかし、僕の今までの勉強で乱数を得る処理は通っていなかった。
こんな時『苦C』の出番。
サイトの目次を見ると、ありますよー、乱数の項目が!
取り合えず、一番簡単な乱数生成方法を関数にして実装。
そのソースがこれだ。
#include "DxLib.h"
#include < stdlib.h >
int GetRandom ( int min, int max ); //乱数用関数のプロトタイプ宣言
int g_puyoimage[6];
int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC) {
ChangeWindowMode( TRUE );
if( DxLib_Init() == -1 ) return -1;
LoadDivGraph( "puyo.bmp",6,6,1,32,32,g_puyoimage );
//1組目の組み合わせを乱数で決める
int puyo1 = GetRandom( 1, 4);
int puyo2 = GetRandom( 1, 4);
SetDrawScreen( DX_SCREEN_BACK );
while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 ) {
ClsDrawScreen();
int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if( key & PAD_INPUT_A ) { //Zキーが押されるたびに組み合わせを乱数で変える
puyo1 = GetRandom( 1, 4);
puyo2 = GetRandom( 1, 4);
}
DrawGraph( 288, 224, g_puyoimage[puyo1],TRUE );
DrawGraph( 320, 224, g_puyoimage[puyo2],TRUE );
ScreenFlip();
}
DxLib_End();
return 0;
}
//乱数を得る関数
int GetRandom( int min, int max) {
return min + ( int )( rand()*( max-min+1.0 )/( 1.0+RAND_MAX ) );
}
無事に動いたけど、問題もある。
問題① 乱数の返す値が毎回同じになる。
問題② Zキーの押しっぱなしが有効になってしまって、一瞬押しただけで数回組み合わせが変る。
この問題を解決してみよう。
あ、そうそう、ぷよの色と対応する数字は合わせてあります。
赤、青、黄、緑の順に1、2、3、4で。
よって、1~4の間で乱数を得るプログラムになっていますヨン。
目標地点は一人用のシンプルなぷよぷよ。(対戦とかは、まだ無理っしょ)
演出とか、グラフィックとか、音楽とか、外面を再現する趣旨では無いのでよろしく。
あくまで、本質のゲーム性の部分を作ってみようってことだ。
まず、ぷよぷよについてwikiで調べてみた。
なんせ遊んだのは相当昔のことなんで、ぷよって全部で何色だったっけとか、何個くっついたら消えるんだっけとか、縦横何マスのフィールドだったっけとか、ごく基本的なことを調べる必要があったのだ(笑)。
ここをメモ帳がわりに書いておこう。
フィールドは横6マス、縦12マス。
ぷよの色は4色で赤、青、黄、緑。
上下左右4方向で4個以上同色がつながると消える。
消えたマスには上のぷよが落ちてきて、そこでまた4個以上がつながると消える(連鎖)。
こんな感じ。
グラフィックハンドルや配列管理の都合上、色を数字で表現しておく
赤 = 1
青 = 2
黄 = 3
緑 = 4
で、非常に簡単にぷよのドット絵も描いた。
すいません・・・ま、ゲーム性の再現が目的ですので、絵はこんなレベルで勘弁してください(笑)。
ちなみに一番右のは消えるときに破裂する感じの絵です。微妙ですが・・・。
で、このぷよ達を画面中央に表示するプログラムを書いてみました。
このソースではまだ色と番号があっていません。
ここから全てが始まる・・・かもしれない。
とりあえず、明日は家族でディズニーランドなんで、もう寝ます。
この1週間、平均睡眠時間は3時間くらいかと。
みごとにハマってます。
空いた時間はほとんどPCと睨めっこ(笑)。
プログラムしてる時は集中しているから平気なんだけど、仕事中がやばい・・・。
本職に影響しない程度にしとかないとね。
で、迷っていた今後の方向なんだけど。
取り合えずテキストの方はいったん中断する事にした。
2つの事を同時に進められる時間も脳みそも無いし、素直にやりたい方を取った方がモチベーションもキープできるだろってことで。
テキストの方はアクションゲームを題材にしているので、実際アクションゲームを作る時が来たら(来るのか?)また進めてみようと思っております。
ま、それ以外にも調べたいことがある時のリファレンスとしても使えるだろうし。
と言うわけで、ぷよぷよの再現にチャレンジしてゆこう!
おそらく壁に当たりまくるだろうけど、そのつど調べて知識を得てゆけば力も自然についてくるだろう。
と言っても、僕の持っているテキストは今回買ったやつだけなんで、C言語の知識の引き出しを先に見つけておいた。
1つは導入したDXライブラリのHP。
もう1つはネットしてて見つけた『苦しんで覚えるC言語』と言うサイト。(ブログのリンクに追加しておいたので、知らなかった方は覗いて見てください。かなり有難いサイトです。)
ゲームで使う色々な関数が書かれたcppファイルをダウンロードして使うってのが楽ではあるんだけど、いずれこの中身を自分で解析してみないと、自分の力にはならないかと。
ちなみに、前の記事で書いたベクトル計算も、アニメーションも、1フレームの時間管理も、この関数ファイルがやってくれている。
甘えすぎじゃなかろうか・・・。
まあ、わずらわしい事は置いてといて、ゲーム作りの根幹部分に集中させるって意図だと思うんだけど。
で、昨日書いたテキストとは別のゲーム制作なんだけど。
とりあえず最初は既存のゲームを再現してみようかなと思っています。
もちろんテキストの便利ライブラリは極力使わない方向で。
シンプルなものが良いと思うので、落ち物パズルなんかどうだろ。
『テトリス』か『ぷよぷよ』か迷うとこなんだけど、テトリスは中学生か高校生のころBASICで再現しようとして挫折したトラウマがあるので、今回は回避しようと思います(笑)。
ってわけで、ぷよぷよが第一候補。
出来るかな・・・。
出来そうな気はするんだよなあ。
連鎖時も含めて同じ色がつながった時の判定がうまく出来るかが肝だと思う。
これが出来れば完成できるだろうし、出来なきゃテトリスと同じ道を・・・w。
とりあえず、どんな要素でゲームが構成されているか思いつく限り書き出して、一つ一つコードでの表現方法を考えてみよう。
テキストの方は急いでやるけど、こっちはのんびり進めます。
- 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 |
- 最新コメント
- プロフィール
はい。
- ブログ内検索
- カウンター
- アクセス解析