ぷよぷよっぽいゲーム開発1日目
5/26の出来事について書いています
今日からゲームの開発に取り組む。
どのようなゲームを作るのか?
ぷよぷよ的なゲームを作りたいと思っている。今頻繁に遊んでいる『ぷよぷよesports』に「とことんぷよぷよ」(一人でひたすら連鎖を作るモード)が搭載されてないため、自分で作りたいと思った。
構想
いきなり本格的なぷよぷよの再現をするのは難しいだろう。なので以下のような簡易版のぷよぷよを作ってみたいと思う。
- まずは一つずつぷよを降らせる形にしようと思う(本来は2つで一組のぷよが降ってくる)。
- いわゆる13段目(最上段の見えないところ)は再現せず12段目までにする
- 本家ぷよぷよで見られる細かい挙動(ぷよどうしがぶつかると揺れるなど)の再現はとりあえず目指さない
とりあえず構想について今思いつくのはこれくらい。
今日やったこと
とりあえずこんな感じのソースコードを書いた
#include "DxLib.h" using namespace std; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //フルスクリーンの表示をやめる ChangeWindowMode(true); // DXライブラリ初期化 if( DxLib_Init() == -1 ) return -1 ; //画面の解像度などを設定 SetGraphMode( 640 , 480 , 16 ) ; //画像ハンドルの宣言 int StageHandle,KiroHandle,AkaHandle,AoHandle,MidoriHandle; //ステージ画像の読み込み StageHandle=LoadGraph("stage2.png"); //ぷよの画像の読み込み KiroHandle=LoadGraph("kiro.png"); AkaHandle=LoadGraph("aka.png"); AoHandle=LoadGraph("ao.png"); MidoriHandle=LoadGraph("midori.png"); //ステージ画像のサイズを取得 int stagew,stageh; GetGraphSize(StageHandle,&stagew,&stageh); //ステージ画像を拡大 double stager=(double)480.0/stageh; stagew=stagew*stager; stageh=stageh*stager; //ステージの左端の位置 int a=150; //ぷよ画像のサイズを取得 int puyow,puyoh; GetGraphSize(AkaHandle,&puyow,&puyoh); //ぷよ画像を拡大 double puyor=(double)stagew/6.0/puyow; puyow=puyow*puyor; puyor=(double)stageh/12.0/puyoh; puyoh=puyoh*puyor; //ステージの各列の高さ int hi[6]; for(int i=0;i<6;i++) hi[i]=11*puyoh; //ぷよの初期位置 int inix=a+2*puyow; int iniy=-puyoh/2; //ぷよの位置の変数 int x,y; //ぷよに関するフラグ int puyoflag=0; int puyoxflag=0; //test int puyox[78]; int puyoy[78]; int ipuyo=0; //描画先を裏画面に設定 SetDrawScreen( DX_SCREEN_BACK ) ; while(1){ //画面をクリア ClearDrawScreen() ; //ステージ画像の処理 { //ステージ画像を拡大して表示 DrawExtendGraph(a,0,stagew+a-0.5,stageh,StageHandle,false); } //ぷよの処理 { //ぷよを操作し終わったら新しいぷよを降らせる if(puyoflag==0){ x=inix; y=iniy; DrawExtendGraph(x,y,x+puyow,y+puyoh,AkaHandle,true); puyoflag=1; } else{ //キーボードから入力に応じてぷよを動かす if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ){ if(puyoxflag==0){ x-=puyow; puyoxflag=7; } } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ){ if(puyoxflag==0){ x+=puyow; puyoxflag=7; } } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 12 ; //壁際の処理 if(x<a)x=a; if(x>a+5*puyow)x=a+5*puyow; //着地したら操作フラグをしまう if(y>hi[(x-a)/puyow]){ y=hi[(x-a)/puyow]; puyox[ipuyo]=x; puyoy[ipuyo]=y; hi[(x-a)/puyow]-=puyoh; ipuyo++; puyoflag=0; } //ぷよを横方向に小刻みに動かすための処理 if(puyoxflag!=0) puyoxflag--; DrawExtendGraph(x,y,x+puyow,y+puyoh,AkaHandle,true); //堆積したぷよの描画 if(ipuyo!=0){ for(int i=0;i<ipuyo;i++) DrawExtendGraph(puyox[i],puyoy[i],puyox[i]+puyow,puyoy[i]+puyoh,AkaHandle,true); } } //自由落下 y+=1; } //ゲームオーバー if(hi[2]==-puyoh){ ScreenFlip(); break; } //表画面への描画 { ScreenFlip(); } //仮の終了処理 { // Windows特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ; } } //ゲームオーバーの処理 DrawString(0,0,"ゲームオーバー",GetColor( 255 , 0 , 0 )) ; ScreenFlip(); WaitTimer(5*1000); // DXライブラリ使用の終了 DxLib_End() ; // ソフトの終了 return 0 ; }
- ぷよ(ただの四角形)とステージの画像を読み込むようにした
- ぷよを操作できるようにした
懸念点
- どんどんとたまっていくぷよの情報を配列に格納しているが、いまの配列サイズのままだと連鎖してぷよが消えた時にオーバーフローしてしまう。どうしたらよいか?
- ぷよの上にぷよを乗せる処理がうまくできていない
- ぷよを設置した時に画面がちらつく
展望
懸念点の解消と降ってくるぷよの色をランダムにしたい。明日できれば連鎖の実装まで行きたい。
実行ファイル
Debug-20200527T123220Z-001.zip - Google ドライブ
windows用のexeファイルを格納したzipファイルがダウンロードできます。未完成です。