/////////////////////////////////////////////////////////////////////////////////
//
//
//
//
/////////////////////////////////////////////////////////////////////////////////
#include <Stdio.h>
#include "CommonAPI.h"
#include "LessonX.h"
////////////////////////////////////////////////////////////////////////////////
int g_score ; //定义游戏获得的分数
int g_iMaxScore; //定义游戏的最高分
float g_fScreenLeft = 0.f; // 屏幕左边界值
float g_fScreenRight = 0.f; // 右
float g_fScreenTop = 0.f; // 上
float g_fScreenBottom = 0.f; // 下
float g_wuditime; // 设置无敌时间
//设置战机的上下左右的移动速度
float g_fSpeedTop = 0.f;
float g_fSpeedLeft = 0.f;
float g_fSpeedBottom = 0.f;
float g_fSpeedRight = 0.f;
int mybulletcount ;//定义我方战机产生子弹的数量
int dijicount ;//定义产生敌机的数量
float fPoX = 0.f;//定义战机的横坐标
float fPoY = 0.f;//定义战机的纵坐标
float g_myBulletTime ;//定义产生子弹的间隔时间
float g_dijitime ;//定义产生敌机的间隔时间
float g_dijizidantime1 ;//定义第一关产生子弹的间隔时间
float g_dijizidantime2 ;//定义第二关产生子弹的间隔时间
float g_dijizidantime3 ;//定义第三关产生子弹的间隔时间
int g_dijizidancount ;//定义产生敌机子弹的数量
//定义当战机碰撞到边界时按键是否可以获得速度
bool iscandong0;
bool iscandong1;
bool iscandong2;
bool iscandong3;
bool iswudi;
bool bossiskilled;
int bosslife;
int Id1;
int Id; //设置一个整型数据记录播放背景故事的音效的Id
int changjingqiehuan = 0; //场景切换
int guanqia = 1;//定义当前关卡数
int g_iGameState = 0; // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中
int g_zhanjilife ; // 战机生命
//定义敌机是否被击杀的数组
int iskilled [30];
int guanqia2_dijilife[30];
void GameInit();
void GameRun( float fDeltaTime );
void GameEnd();
void MyBulletCreate();
void DijiCreate(int guanqia);
void DijiZidanCreate();
//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void GameMainLoop( float fDeltaTime )
{
switch( g_iGameState )
{
// 初始化游戏,清空上一局相关数据
case 1:
{
GameInit();
g_iGameState = 2; // 初始化之后,将游戏状态设置为进行中
}
break;
// 游戏进行中,处理各种游戏逻辑
case 2:
{
// 战机的生命值大于0才能进行游戏
if(g_zhanjilife>0)
{
GameRun( fDeltaTime );
}
else
{
//将屏幕上显示的生命值改变为0
// 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
g_iGameState = 0;
GameEnd();
}
}
break;
// 游戏结束/等待按空格键开始
case 0:
default:
break;
};
}
//==============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void GameInit()
{
//初始化一些数据
bossiskilled = false;
bosslife = 50;
g_zhanjilife = 3;
mybulletcount = 0 ;
dijicount = 0 ;
iswudi =false;
iscandong0 = true;
iscandong1 = true;
iscandong2 = true;
iscandong3 = true;
g_wuditime = 5.0f;
g_dijizidantime1 = 2.0f;
g_dijizidantime2 = 2.0f;
g_dijizidantime3 = 2.0f;
g_myBulletTime= 0.4f;
g_dijitime= 2.0f;
g_dijizidancount = 0;
g_fScreenLeft = dGetScreenLeft();
g_fScreenRight = dGetScreenRight();
g_fScreenTop = dGetScreenTop();
g_fScreenBottom = dGetScreenBottom();
dSetSpriteWorldLimit("zhanji", WORLD_LIMIT_NULL, g_fScreenLeft, g_fScreenTop, g_fScreenRight, g_fScreenBottom);
for(int i=0;i<30;i++)
{
iskilled[i]=1;
guanqia2_dijilife[i]= 1 ;
}
dSetSpriteLinearVelocityY("boss",8.0f);
}
//==============================================================================
//
// 每局游戏进行中
void GameRun( float fDeltaTime )
{
//在屏幕上显示获得分数和剩余的生命数
dSetSpritePosition("now",-40.0f,-35.0f);
dSetSpritePosition("NowScoreText",-15.0f,-35.0f);
dSetSpritePosition("lifecounttext",8.496f,-35.0f);
dSetSpritePosition("lifecount",37.0f,-35.0f);
dSetTextString( "now", "当前分数");
dSetTextValue( "NowScoreText", g_score );
dSetTextString( "lifecounttext", "剩余生命");
dSetTextValue( "lifecount", g_zhanjilife );
//记录最高分
if( g_iMaxScore < g_score )
{
g_iMaxScore = g_score ;
// 写文件
// [Your Code]
FILE *pfp = fopen( "Score.dat", "wb" );
if( NULL != pfp )
{
fwrite( &g_iMaxScore, sizeof(g_iMaxScore), 1, pfp );
fclose( pfp );
}
// [End Your Code]
}
//计算产生子弹的时间
g_myBulletTime -= fDeltaTime;
if(g_myBulletTime <= 0 )
{
g_myBulletTime = 0.4f;
MyBulletCreate();
}
//计算产生敌机的时间
g_dijitime -= fDeltaTime;
if( g_dijitime <=0 )
{
g_dijitime = 2.0f;
DijiCreate(guanqia);
}
//计算产生敌机子弹的时间
switch(guanqia)
{
case 1:
g_dijizidantime1 -= fDeltaTime;
if( g_dijizidantime1<=0)
{
g_dijizidantime1 = 2.0f;
DijiZidanCreate();
}
break;
case 2:
g_dijizidantime2 -= fDeltaTime;
if( g_dijizidantime2<=0)
{
g_dijizidantime2 = 3.0f;
DijiZidanCreate();
}
break;
case 3:
g_dijizidantime3 -= fDeltaTime;
if( g_dijizidantime3<=0)
{
g_dijizidantime3 = 2.0f;
DijiZidanCreate();
}
break;
}
//计算战机无敌时间
if(iswudi==true)
{
g_wuditime -= fDeltaTime;
if( g_wuditime<=0)
{
g_wuditime = 5.0f;
iswudi = false;
dSetSpriteVisible("zhanji",1);
dSetSpriteVisible("donghua",0);
}
}
//关卡跳转
switch(guanqia)
{
case 1:
if( g_score >= 125)
{
g_iGameState = 0;
dSetSpritePosition("beijinggushi2",0.f,0.f);
Id=dPlaySound("beijinggushipeiyin2",0,1);
}
case 2:
if( g_score >= 250)
{
g_iGameState = 0;
dSetSpritePosition("guanqia2",0.f,0.f);
Id=dPlaySound("guanqia2",0,1);
}
break;
case 3:
if(bosslife == 0)
{
g_score += 50;
bossiskilled = true;
g_iGameState = 0;
dSetSpritePosition("guanqia3",0.f,0.f);
Id=dPlaySound("guanqia3_0",0,1);
}
break;
}
}
//==============================================================================
//
// 本局游戏结束
void GameEnd()
{
//将屏幕上显示的生命值改变为0
dSetTextValue( "lifecount", g_zhanjilife );
dSetSpritePosition("youxijieshu",0.f,0.f);
Id=dPlaySound("youxijieshu",0,1);
}
//==========================================================================
//
// 鼠标移动
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void OnMouseMove( const float fMouseX, const float fMouseY )
{
}
//==========================================================================
//
// 鼠标点击
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
if( (fMouseY < 4 &&fMouseY> -4 )&&( fMouseX > -8 &&fMouseX<8) && iMouseType == 0 && dGetSpritePositionY("youxijieshu") == 0.f)
{
dStopSound(Id);
dStopSound(Id1);
changjingqiehuan = 0;
g_score = 0;
dLoadMap("chushijiemian.t2d");
}
if((fMouseY < 8 &&fMouseY> 3 )&&( fMouseX > -36 &&fMouseX<-20) && iMouseType == 0 && changjingqiehuan == 0)
{
Id=dPlaySound("beijinggushipeiyin1",0,1);
dSpriteMoveTo("beijinggushi", 0.f, 0.f, 5.0f, 1 );
dSetSpriteVisible("kaishi",