#include 赞 踩 Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
funcode 综合教程拍飞虫(提高篇)_foncode拍飞虫
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
#include "CommonAPI.h"
#include "LessonX.h"
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
// true:一局游戏开始,一局false:游戏结束。
bool g_bStart = false;
int g_iGameScore = 0;
float g_fGameTime = 0.f;
float g_fOldRotation = 0.f;
float g_fRotateTime = 0.f;
float g_fScreenLeft = 0.f; // 屏幕左边界值
float g_fScreenRight = 10.f; // 右
float g_fScreenTop = 0.f; // 上
float g_fScreenBottom = 10.f; // 下
int g_iCount=0;
int flag=0;
int iHighScore[10];
bool cmp(int a,int b)
{
return a>b;
}
struct FlyBug
{
char szName[128]; // 飞虫名字
int iScore; // 分数值
} FlyBugs[30];
void AddFlyBugs()
{
for(int i=0; i<=11; i++)
{
printf("add %d\n",g_iCount);
if(i>=0&&i<=4)
{
sprintf(FlyBugs[g_iCount].szName, "feichong_%d", g_iCount);
FlyBugs[g_iCount].iScore = 1;
g_iCount++;
}
else
{
sprintf(FlyBugs[g_iCount].szName, "feichong_%d", g_iCount);
FlyBugs[g_iCount].iScore = 2;
g_iCount++;
}
dSetSpriteVisible(FlyBugs[i].szName,1);
}
}
void Flying(const char *szName)
{
int iDir = 0;
iDir = dRandomRange(0,3);
float fSpeed=dRandomRange(10,20);
float ideaFposX=dRandomRange(g_fScreenLeft,g_fScreenRight);
float ideaFposY=dRandomRange(g_fScreenBottom,g_fScreenTop);
switch(iDir)
{
case 0: // 左方
{
float fPosX=dRandomRange(g_fScreenLeft, g_fScreenLeft+5.f);
float fPosY=dRandomRange(g_fScreenBottom-5.f, g_fScreenTop+5.f);
dSetSpritePosition(szName,fPosX,fPosY);
dSpriteMoveTo(szName, ideaFposX, ideaFposY, fSpeed,false);
printf("%s ideax:%lf ideay:%lf v:%lf fromx:%lf formy:%lf l:%lf r:%lf t:%lf b:%lf\n",szName,ideaFposX,ideaFposY,fSpeed,fPosX,fPosY,g_fScreenLeft,g_fScreenRight,g_fScreenTop,g_fScreenBottom);
break;
}
case 1: // 下方
{
float fPosX=dRandomRange(g_fScreenLeft-5.f, g_fScreenRight+5.f);
float fPosY=dRandomRange(g_fScreenBottom, g_fScreenBottom+5.f);
dSetSpritePosition(szName,fPosX,fPosY);
dSpriteMoveTo(szName, ideaFposX, ideaFposY, fSpeed,false);
printf("%s ideax:%lf ideay:%lf v:%lf fromx:%lf formy:%lf l:%lf r:%lf t:%lf b:%lf\n",szName,ideaFposX,ideaFposY,fSpeed,fPosX,fPosY,g_fScreenLeft,g_fScreenRight,g_fScreenTop,g_fScreenBottom);
break;
}
case 2: // 右方
{
float fPosX=dRandomRange(g_fScreenRight-5.f, g_fScreenRight);
float fPosY=dRandomRange(g_fScreenBottom-5.f, g_fScreenTop+5.f);
dSetSpritePosition(szName,fPosX,fPosY);
dSpriteMoveTo(szName, ideaFposX, ideaFposY, fSpeed,false);
printf("%s ideax:%lf ideay:%lf v:%lf fromx:%lf formy:%lf l:%lf r:%lf t:%lf b:%lf\n",szName,ideaFposX,ideaFposY,fSpeed,fPosX,fPosY,g_fScreenLeft,g_fScreenRight,g_fScreenTop,g_fScreenBottom);
break;
}
case 3: // 上方
{
float fPosX=dRandomRange(g_fScreenLeft-5.f, g_fScreenRight+5.f);
float fPosY=dRandomRange(g_fScreenTop-5.f, g_fScreenTop);
dSetSpritePosition(szName,fPosX,fPosY);
dSpriteMoveTo(szName, ideaFposX, ideaFposY, fSpeed,false);
printf("%s ideax:%lf ideay:%lf v:%lf fromx:%lf formy:%lf l:%lf r:%lf t:%lf b:%lf\n",szName,ideaFposX,ideaFposY,fSpeed,fPosX,fPosY,g_fScreenLeft,g_fScreenRight,g_fScreenTop,g_fScreenBottom);
break;
}
}
}
///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 初始化游戏引擎
if( !dInitGameEngine( hInstance, lpCmdLine ) )
return 0;
// To do : 在此使用API更改窗口标题
dSetWindowTitle("Lesson");
g_fScreenLeft=dGetScreenLeft();
g_fScreenRight=dGetScreenRight();
g_fScreenTop=dGetScreenTop();
g_fScreenBottom=dGetScreenBottom();
g_fOldRotation=dGetSpriteRotation("paizi");
//dSpriteMoveTo("sample",-26.6,-17.3,25,true);
// 引擎主循环,处理屏幕图像刷新等工作
while( dEngineMainLoop() )
{
// float fPosX=dGetSpritePositionX("sample");
// float fPosY=dGetSpritePositionY("sample");
// printf("where:%s %lf %lf\n","sample",fPosX,fPosY);
// 获取两次调用之间的时间差,传递给游戏逻辑处理
float fTimeDelta = dGetTimeDelta();
dSetTextValue("time",g_fGameTime);
if(g_bStart) // 游戏开始
{
dSetSpriteVisible("kaishi",0);
g_fGameTime -= fTimeDelta;
dSetTextValueFloat("Time",g_fGameTime);
// float fsx=dGetSpritePositionX("feichong_0");
// float fsy=dGetSpritePositionY("feichong_0");
// printf("feichong_0 %lf %lf\n",fsx,fsy);
if(g_fGameTime > 0) // 游戏进行中
{
if(g_fRotateTime > 0)
{
g_fRotateTime -= fTimeDelta;
if(g_fRotateTime <= 0)
{
dSetSpriteRotation("paizi", g_fOldRotation);
}
}
}
else // 一局游戏时间到
{
printf("over\n");
g_bStart = false; // 设置游戏进入结束状态
}
}
else if(g_bStart== false)// 游戏结束
{
//printf("%d end\n",g_bStart);
for(int i=0; i<g_iCount; i++)
{
char szName[128];
sprintf(szName, "feichong_%d",i);
dDeleteSprite(szName);
}
g_iCount=0;
dSetSpriteVisible("kaishi",1);
flag=0;
iHighScore[5]=g_iGameScore;
g_iGameScore=0;
//dDeleteSprite("feichong_0");
}
// 执行游戏主循
sort(iHighScore,iHighScore+6,cmp);
for(int i=0;i<=4;i++){
char szName[128];
sprintf(szName,"Score%d",i);
dSetTextValue(szName,iHighScore[i]);
}
dSetTextValue("Score",g_iGameScore);
GameMainLoop( fTimeDelta );
}
// 关闭游戏引擎
dShutdownGameEngine();
return 0;
};
//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseMove( const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
if(g_bStart)
{
dSetSpritePosition("paizi",fMouseX,fMouseY);
}
OnMouseMove(fMouseX, fMouseY );
}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
if(!g_bStart || iMouseType!=0 || g_fRotateTime>0.f)
{
printf("return\n");
return ;
}
g_fRotateTime=0.2f;
dSetSpriteRotation("paizi", g_fOldRotation-10);
for(int i=0; i<g_iCount; i++)
{
float fPosX=dGetSpritePositionX(FlyBugs[i].szName);
float fPosY=dGetSpritePositionY(FlyBugs[i].szName);
//printf("where:%s %lf %lf :%lf %lf\n",FlyBugs[i].szName,fPosX,fPosY,fMouseX,fMouseY);
if(dIsPointInSprite("paizi",fPosX,fPosY))
{
g_iGameScore+=FlyBugs[i].iScore;
Flying(FlyBugs[i].szName);
}
}
OnMouseClick(iMouseType, fMouseX, fMouseY);
}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
// 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义
// 参数 fMouseX, fMouseY:为鼠标当前坐标
//
void dOnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY )
{
// 可以在此添加游戏需要的响应函数
OnMouseUp(iMouseType, fMouseX, fMouseY);
}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义
// 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下)
//
void dOnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{
// 可以在此添加游戏需要的响应函数
if(KEY_SPACE == iKey)
{
g_bStart = true;
if(flag==0)
{
AddFlyBugs();
g_fGameTime=15.0f;
flag=1;
}
//printf("dowm %d\n",g_iCount);
for(int i=0; i<g_iCount; i++)
{
if(FlyBugs[i].iScore==1)
{
printf("in1\n");
if(dCloneSprite("feichong_muban1",FlyBugs[i].szName)){
printf("yes1\n");
}
//printf("yes1\n");
}
else if(FlyBugs[i].iScore==2)
{
printf("in2\n");
if(dCloneSprite("feichong_muban2",FlyBugs[i].szName)){
printf("yes2\n");
}
//printf("yes2\n");
}
dSetSpriteWorldLimit(FlyBugs[i].szName,WORLD_LIMIT_NULL,g_fScreenLeft-10.0f,g_fScreenTop-10.0f,g_fScreenRight+10.0f,g_fScreenBottom+10.0f);
Flying(FlyBugs[i].szName);
}
}
OnKeyDown(iKey, iAltPress, iShiftPress, iCtrlPress);
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
// 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义
//
void dOnKeyUp( const int iKey )
{
// 可以在此添加游戏需要的响应函数
OnKeyUp(iKey);
}
//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞
// 参数 szSrcName:发起碰撞的精灵名字
// 参数 szTarName:被碰撞的精灵名字
//
void dOnSpriteColSprite( const char *szSrcName, const char *szTarName )
{
// 可以在此添加游戏需要的响应函数
OnSpriteColSprite(szSrcName, szTarName);
}
//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵的世界边界限制
// 参数 szName:碰撞到边界的精灵名字
// 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边
//
void dOnSpriteColWorldLimit( const char *szName, const int iColSide )
{
// 可以在此添加游戏需要的响应函数
if(strstr(szName,"feichong"))
{
for(int i=0; i<g_iCount; i++)
{
if(strcmp(szName,FlyBugs[i].szName)==0)
{
Flying(szName);
}
}
}
OnSpriteColWorldLimit(szName, iColSide);
}