今まで文字列の処理ーだとか、winsockでデータを飛ばす方法ー。とか
そんな事ばっかりしてたのでゲーム制作は新鮮でした
DXライブラリの関数を調べる作業含め製作時間は10時間くらい。
内容はシャボン玉をポチポチして消すだけのゲームです。
こんなクソげーでもエフェクトに凝るとか、アイテムを登場させるとかもっと構成を膨らませると少しはましになるかもしれない。
そしてスマホ向けに作れたら楽しいだろうなーー、Javaわかんないですがww
作りながら構成を考えたので最後になってクラス設計を失敗したと感じました。
やっぱりゲーム全体を管理するタスククラスを作って、
ターゲットの抽象クラスを作り、それを派生させて各色のシャボン玉を作った方がやりやすいと思った。
最後はFEみたいなSRPG作ってみたいなぁ(これが目標)
► スポイラーを表示
#include "DxLib.h"
#include
#include
#define BubleMax 50
typedef struct{
int X;
int Y;
}Pos;
//タスククラス
class Task{
public:
static int nScore;
static int nScene;
static int ReleaseWait;
static int nBadScore;
static int nSound;
static int nBGM;
};
int Task::nScore = 0;
int Task::nScene = 0;
int Task::ReleaseWait = 100;
int Task::nBadScore = 0;
int Task::nSound;
int Task::nBGM;
//ターゲットクラス
class Buble : public Task{
private:
int nHandle; //画像ハンドル
Pos BubPos; //泡の位置
int nAlpha; //α値
bool bEndFlag; //消す準備
int nScore; //スコア
int nScope; //寿命
int bBadFlag; //消去失敗フラグ
static int nRelease; //リリースウェイトをため込むカウンタ
public:
Buble();
bool bDrawFlag; //描写しているかどうかのフラグ
void Initial();
void PosChange();
void Hit();
static void ReleaseTask(Buble *);
static void ChangeTask(Buble *);
static void HitTask(Buble *);
static void ShowScore();
};
int Buble::nRelease = 0;
//スコア表示
void Buble::ShowScore(){
char szScore[64];
char szBad[64];
sprintf(szScore,"Score = [%d]",Task::nScore);
DrawString(0,0,szScore,RGB(255,255,255),0);
if(Task::nScore > 1000) Task::ReleaseWait = 95;
if(Task::nScore > 3000) Task::ReleaseWait = 90;
if(Task::nScore > 5000) Task::ReleaseWait = 80;
if(Task::nScore > 10000) Task::ReleaseWait = 49;
if(Task::nScore > 15000) Task::ReleaseWait = 46;
if(Task::nScore > 35000) Task::ReleaseWait = 40;
if(Task::nScore > 50000) Task::ReleaseWait = 38;
if(Task::nScore > 150000) Task::ReleaseWait = 37;
sprintf(szBad,"BadScore = [%d]",Task::nBadScore);
DrawString(450,0,szBad,RGB(255,255,255),0);
}
//あたり判定管理
void Buble::HitTask(Buble *b){
for(int x = 0;x Task::ReleaseWait){
if(b[x].bDrawFlag == false){
b[x].Initial();
nRelease = 0;
}
}
}
}
//ターゲットの移動
void Buble::PosChange(){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, nAlpha );
DrawGraph(BubPos.X,BubPos.Y,nHandle,true);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
BubPos.Y -= 1;
if(bEndFlag == true){
if(nAlpha >= 0){
nAlpha -= 16;
if(nAlpha BubPos.X && MousePos.X BubPos.Y && MousePos.Y 608) nTemp -= 32;
BubPos.X = nTemp;
bDrawFlag = true;
bEndFlag = false;
bBadFlag = false;
nAlpha = 255;
}
Buble::Buble(){
//画像の読み込み
switch(rand()%(3-0+1)+0){
case 0:
nHandle = LoadGraph("画像/red.png");
nScore = 100;
break;
case 2:
nHandle = LoadGraph("画像/blue.png");
nScore = 200;
break;
case 3:
nHandle = LoadGraph("画像/white.png");
nScore = 300;
break;
default:
nHandle = LoadGraph("画像/white.png");
nScore = 300;
break;
}
bDrawFlag = false;
}
#define Title 0
#define GAME 1
#define GAME_OVER 2
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
DxLib_Init(); // DXライブラリ初期化処理
ChangeWindowMode(true);
SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定
SetMouseDispFlag( TRUE ) ;
static Buble CBuble[BubleMax];
Task::nSound = LoadSoundMem("画像/sound.mp3");
int nPhase = 0,nPhase2 = 0;
int nTitleHandle = LoadGraph("画像/title.png");
const char *lpTitle ="右クリックでスタート";
char szEnd[64];
Task::nScene = Title;
while(true){
switch(Task::nScene){
case Title:
DrawGraph(180,140,nTitleHandle,true);
DrawString(250,360,lpTitle,RGB(255,255,255),true);
if(GetMouseInput() == MOUSE_INPUT_RIGHT){
Task::nScene = GAME;
}
break;
case GAME:
ClearDrawScreen(); // 画面を消す
Buble::ReleaseTask(CBuble);
Buble::ChangeTask(CBuble);
Buble::ShowScore();
nPhase2 = nPhase;
if((nPhase = GetMouseInput()) == MOUSE_INPUT_LEFT && nPhase2 != MOUSE_INPUT_LEFT){
Buble::HitTask(CBuble);
}
if(Task::nBadScore > 30){
Task::nScene = GAME_OVER;
}
break;
case GAME_OVER:
ClearDrawScreen(); // 画面を消す
DrawString(280,200,"GAME OVER",RGB(255,255,255),0);
sprintf(szEnd,"Score %d",Task::nScore);
DrawString(280,300,szEnd,RGB(255,255,255),0);
break;
default:
break;
}
if( ProcessMessage() != 0 ){ // メッセージ処理
break;//ウィンドウの×ボタンが押されたらループを抜ける
}
ScreenFlip();//裏画面呼び出し
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}