コード:
//宣言部
#include "DxLib.h" //DXライブラリの使用
#include "stdlib.h" //ランダム使用
#include "stdio.h" //基本関数使用
#include "math.h" //数学的関数使用
#include "windows.h" //総合的な関数使用
#include "regex" //正規表現使用
#include "string.h" //文字列型使用
#include "iostream" //クラス等オブジェクト使用
#define tama_kazu 16
#define PI 3.141592654f
#define teki_kazu 100
int suitti;
int i,n,nn,mod,tasikame; //制御用変数
bool porse;
long score,highscore;
typedef struct{
double X,Y,count,size,idouX,idouY;
bool fulg,patan;
int HP,sizeX,sizeY,Graph,kazu,score;
}teki_s;
bool atarisikaku(double X1, double Y1, int sizeX1, int sizeY1,
double X2, double Y2, int sizeX2, int sizeY2){
//sizeXは横幅の意、sizeYは縦幅の意。
if (abs((X1 + sizeX1 / 2) - (X2 + sizeX2 / 2) ) <= (sizeX1 + sizeX2) / 2)
if (abs((Y1 + sizeY1 / 2) - (Y2 + sizeY2 / 2) ) <= (sizeY1 + sizeY2) / 2)
return true;
else
return false;
}
bool atarimaru(double X1,double X2,double Y1,double Y2,double R1,double R2){
/*
R1:円形1の半径
R2:円形2の半径
X1:円形1のx座標
X2:円形2のx座標
Y1:円形1のy座標
Y2:円形2のy座標
*/
if((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2) <= (R1+R2)*(R1+R2)){
return true;
}else{
return false;
}
}
teki_s teki_S[teki_kazu];
struct{
double X[tama_kazu] , Y[tama_kazu];
int sizeX , sizeY ;
int Graph;
int boor[tama_kazu];
int Leftboor[tama_kazu],Rightboor[tama_kazu];
int Flag;
double Up , Down , Left[tama_kazu] , Right[tama_kazu];
}tama;
struct{
int count[500];
}damage;
struct{
int sizeX[500] , sizeY[500];
int Graph;
double color;
int kazu;
}teki;
struct main{
//必要変数宣言部
double X , Y;
int sizeX , sizeY;
int Graph;
double color;
int boor[500];
double bairitu;
double gamen34;
}
haikei,ziki,gamen,
title,start,stop,sentaku,
hinanjo,titleS,zanki,zankiS,
bom,bomS; //struct main変数
void teki_ugoki(int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa){
static bool patan;
/*座標が一致科の確認*/
if(zahyo == haikei.sizeY){
if( patan == false ){
patan = true;
}
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == false && patan == true){
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
patan = false;
teki_S[n].fulg = true;
break;
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == true){
if(teki_S[n].HP <= 0){
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
teki_S[n].fulg = false;
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for(i=0; i<tama_kazu; i++)
if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
tama.X[i],tama.Y[i],tama.sizeX,tama.sizeY) == true
&& tama.boor[i] == true){
teki_S[n].HP--;
tama.boor[i] = false;
}
DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
}
}
void menyu(void){
DrawGraph(title.X , title.Y , title.Graph , true);
DrawGraph(start.X , start.Y , start.Graph , true);
DrawGraph(stop.X , stop.Y , stop.Graph , true);
DrawGraph(start.X , start.Y , start.Graph , true);
DrawGraph(sentaku.X , sentaku.Y , sentaku.Graph , true);
/*フルスクリーン処理
ChangeWindowMode(false);*/
if(CheckHitKey(KEY_INPUT_DOWN)&& suitti == 0)
suitti = 1;
if(CheckHitKey(KEY_INPUT_UP)&& suitti == 1)
suitti = 0;
switch(suitti){
case 0 :
sentaku.Y = start.Y + start.sizeY / 2 - sentaku.sizeY / 2;
break;
case 1 :
sentaku.Y = stop.Y + stop.sizeY / 2 - sentaku.sizeY / 2;
break;
}
WaitTimer(10);
}
void men1(void){
//内容
//画面3 : 空白1
//画面の中には背景、自機
//空白の中には下から
//現スコア、ハイスコア、ボム、残機、タイトル
//自機の座標はX=画面の半分 Y=画面下
char sukoa[10],haisukoa[10];
sprintf(sukoa,"%d",score);
sprintf(haisukoa,"%d",highscore);
DrawExtendGraph(0,-haikei.sizeY,gamen.gamen34,haikei.Y,haikei.Graph,true);
DrawGraph(ziki.X,ziki.Y,ziki.Graph,true);
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -45,sukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -110,haisukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -65,"今スコア",(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -130,"ハイスコア",(255,255,255));
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60,bomS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60,zankiS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60 -20 -130,titleS.Graph,true);
mod++;
if(mod == 120)
mod = 0;
if(haikei.sizeY > 0 && mod % 3 == 0){
haikei.sizeY--;
haikei.Y++;
}
}
void syoki(void){
//必要分の初期設定のサブルーチン
//使用画像取得
ziki.Graph = LoadGraph("ziki.png");
ziki.Graph = LoadGraph("自機.png");
teki.Graph = LoadGraph("teki.jpg");
tama.Graph = LoadGraph("tama.png");
haikei.Graph = LoadGraph("背景.jpg");
title.Graph = LoadGraph("タイトル.jpg");
bomS.Graph = LoadGraph("tama.png");
zankiS.Graph = LoadGraph("tama.png");
titleS.Graph = LoadGraph("tama.png");
start.Graph = LoadGraph("スタート.bmp");
stop.Graph = LoadGraph("終わり.bmp");
sentaku.Graph = LoadGraph("やじるし.png");
//画像のサイズ取得
gamen.sizeX = 640;
gamen.sizeY = 480;
gamen.color = 32;
GetGraphSize(ziki.Graph,&ziki.sizeX,&ziki.sizeY);
for(i=0; i<500; i++)
GetGraphSize(teki.Graph,&teki.sizeX[i],&teki.sizeY[i]);
GetGraphSize(tama.Graph,&tama.sizeX,&tama.sizeY);
GetGraphSize(haikei.Graph,&haikei.sizeX,&haikei.sizeY);
GetGraphSize(title.Graph,&title.sizeX,&title.sizeY);
GetGraphSize(start.Graph,&start.sizeX,&start.sizeY);
GetGraphSize(stop.Graph,&stop.sizeX,&stop.sizeY);
GetGraphSize(sentaku.Graph,&sentaku.sizeX,&sentaku.sizeY);
//自由計算場(コメントで説明を書いてね)
gamen.gamen34 = gamen.sizeX * 3 / 4; //画面の3分の4の大きさの取得
haikei.Y = gamen.sizeY;
gamen.bairitu = gamen.gamen34 / haikei.sizeX;
//画像の座標取得
ziki.X = gamen.gamen34 / 2 - ziki.sizeX / 2;
ziki.Y = gamen.sizeY - ziki.sizeY - 10;
title.X = gamen.sizeX / 2 - title.sizeX / 2;
title.Y = gamen.sizeY / 4 - title.sizeY / 2;
start.X = gamen.sizeX / 2 - start.sizeX / 2;
start.Y = gamen.sizeY / 2;
stop.X = gamen.sizeX / 2 - stop.sizeX / 2;
stop.Y = start.Y + start.sizeY + 20;
sentaku.X = start.X - sentaku.sizeX - 10;
for(i=0;i>tama_kazu;i++){
tama.X[i] = ziki.X + ziki.sizeX / 2 - tama.sizeX / 2;
tama.Y[i] = ziki.Y + 15;
tama.boor[i] = 0;
}
//倍率
//内容
//画面3 : 空白1
//画面の中には背景、自機
//空白の中には下から
//現スコア、ハイスコア、ボム、残機、タイトル
//自機の座標はX=画面の半分 Y=一番下から登場時に+10
}
void player(void){
//自機の移動用サブルーチン
if(!CheckHitKey(KEY_INPUT_LSHIFT)){
if( CheckHitKey(KEY_INPUT_UP) == 1 &&
ziki.Y > 0){
ziki.Y -= 3;
}
if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
ziki.Y < gamen.sizeY - ziki.sizeY){
ziki.Y += 3;
}
if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
ziki.X > 0){
ziki.X -= 3;
}
if( CheckHitKey(KEY_INPUT_RIGHT) &&
ziki.X < gamen.gamen34 - ziki.sizeX){
ziki.X += 3;
}
}else if(CheckHitKey(KEY_INPUT_LSHIFT)){
if( CheckHitKey(KEY_INPUT_UP) == 1 &&
ziki.Y > 0){
ziki.Y--;
}
if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
ziki.Y < gamen.sizeY - ziki.sizeY){
ziki.Y++;
}
if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
ziki.X > 0){
ziki.X--;
}
if( CheckHitKey(KEY_INPUT_RIGHT) &&
ziki.X < gamen.gamen34 - ziki.sizeX){
ziki.X++;
}
}
}
void syotto(void){
// Zキーを押した場合は処理を分岐
if( CheckHitKey( KEY_INPUT_Z ) ){
// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
for( i = 0 ; i < tama_kazu ; i ++ ){
// 弾iが画面上にでていない場合はその弾を画面に出す
if( tama.boor[i] == 0 ){
// 弾iの位置をセット、位置はボール君の中心にする
tama.X[i] = ( ziki.X + ziki.sizeX / 2 - tama.sizeX / 2);
tama.Y[i] = ( ziki.Y + 15);
// 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する
tama.boor[i] = 1 ;
// 一つ弾を出したので弾を出すループから抜けます
break ;
}
}
}
// 弾の数だけ弾を動かす処理を繰り返す
for( i = 0 ; i < tama_kazu ; i ++ )
{
// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
if( tama.boor[i] == 1 ){
// 弾iを5ドット上に移動させる
tama.Y[i] -= 20 ;
// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
if( tama.Y[i] < 0 ){
tama.boor[i] = 0 ;
}
// 画面に弾iを描画する
DrawGraph( tama.X[i] , tama.Y[i] , tama.Graph , true ) ;
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(true);
SetGraphMode(gamen.sizeX , gamen.sizeY , gamen.color);
DxLib_Init(); // DXライブラリ初期化処理
syoki();
while(1){
if(CheckHitKey(KEY_INPUT_Z)&& suitti == 0)
break;
if(CheckHitKey(KEY_INPUT_Z)&& suitti == 1)
goto a;
ClearDrawScreen(); // 画面を消す
menyu();
}
while(1){
if(porse == false){
if(CheckHitKey(KEY_INPUT_RETURN)){
//Enter二回で強制終了
break;
}
if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == false){
WaitTimer(100);
porse = true;
}
highscore = score;
//数値確認
printfDx("%d\n%d\n%d\n%d\n%d\n%d\n"
,haikei.sizeY , tasikame , teki_S[4].HP , teki_S[0].fulg , teki_S[1].fulg , teki_S[2].fulg);
ClearDrawScreen(); // 画面を消す
men1();
player();
syotto();
/*敵の出現座標は一面の初期値:haikei.sizeY(1525)から引いて計算する
例)haikei.sizeY == 1525 : 最初っから出てくる
haikei.sizeY == 775 : 一面が半分まで言ったら出てくる
haikei.sizeY == 0 : 最後で出てくる*/
teki_ugoki(1500,0,0,1,1,50,teki.Graph,50);
DrawGraph(ziki.X , ziki.Y, ziki.Graph ,true);
ScreenFlip(); //裏画面を表画面に反映
}
if( porse == true ){
ClearDrawScreen(); // 画面を消す
DrawString(240,240,"一時停止中",(255,255,255));
if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == true){
WaitTimer(100);
porse = false;
}
ScreenFlip(); //裏画面を表画面に反映
}
}
a:;
DxLib_End(); // DXライブラリ終了処理
return 0;
}