海底有五条鱼,其中四条来回随机游动,由玩家用键盘W A S D控制另外一条游动。

要求如下:

  1. 游戏初始界面如下图。
  2. 来回游动的四条鱼,从屏幕左边游进来,均已一个随机速度水平游动。从屏幕右侧游出去,很快又从屏幕右侧游出来,就这样来回游动。
  3. 玩家用WASD键控制一条鱼向上、左、下、右方向游动。松开按键时,玩家的鱼就停止游动。
  4. 玩家的鱼游到屏幕边界时,不能继续往前游。

 代码如下:

LessonX.h

#ifndef _LESSON_X_H_
#define _LESSON_X_H_
//
#include <Windows.h>
#include <vector>
using namespace std;/
//
// 游戏总管类。负责处理游戏主循环、游戏初始化、结束等工作
class   CGameMain
{CSprite* m_pFish;CSprite* m_pMyFish;private:int                m_iGameState;               // 游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中vector<CSprite*>    m_vFish;//float m_fScreenLeft;       //屏幕左边界值float m_fScreenRight;      //右float m_fScreenTop;        //上float m_fScreenBottom;     //底float        m_fSpeedLeft    ;// 鱼4个方向的速度float       m_fSpeedRight   ;float      m_fSpeedTop     ;float      m_fSpeedBottom  ;public:CGameMain();            //构造函数~CGameMain();           //析构函数  void OnKeyUp(const int ikey);void OnKeyDown(const int ikey,const int iAltPress,const int ishiftpress,const int iCtrlPress);CSprite* FindSpriteByName(const char*szName,const int iColSide);void           Swimming();// Get方法int              GetGameState() { return m_iGameState; }// Set方法void         SetGameState(const int iState) { m_iGameState = iState; }// 游戏主循环等void         GameMainLoop(float  fDeltaTime);void            GameInit();void         GameRun(float fDeltaTime);void          GameEnd();//处理世界边界碰撞,建立自定义函数void            OnSpriteColWorldLimit(const char* szName, const int iColSide);};/
//
extern CGameMain    g_GameMain;#endif // _LESSON_X_H_

LessonX.cpp


#include <Stdio.h>
#include "CommonClass.h"
#include "LessonX.h"//
//
CGameMain       g_GameMain;//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{//m_pFish = new CSprite("yu_0");m_pMyFish=new CSprite("yu_3");m_iGameState = 1;   //游戏状态,0:结束或者等待开始;1:初始化;2:游戏进行中m_fScreenBottom          =  0.f;m_fScreenLeft           =  0.f;m_fScreenRight          =  0.f;m_fScreenTop            =  0.f;m_fSpeedBottom=    0.f;m_fSpeedLeft=  0.f;m_fSpeedRight= 0.f;m_fSpeedTop=   0.f;
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
}//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop(float  fDeltaTime)
{switch (GetGameState()){// 初始化游戏,清空上一局相关数据case 1:{GameInit();SetGameState(2); // 初始化之后,将游戏状态设置为进行中}break;// 游戏进行中,处理各种游戏逻辑case 2:{// TODO 修改此处游戏循环条件,完成正确游戏逻辑if (true){GameRun(fDeltaTime);}else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态{SetGameState(0);GameEnd();}}break;// 游戏结束/等待按空格键开始case 0:default:break;};
}
//=============================================================================
//void CGameMain::GameInit()
{//在GameInit获取世界边界的值,同时设置  鱼的边界限制  和初始速度://获取屏幕边界值m_fScreenLeft = CSystem::GetScreenLeft();m_fScreenRight = CSystem::GetScreenRight();m_fScreenTop = CSystem::GetScreenTop();m_fScreenBottom = CSystem::GetScreenBottom();//设置精灵世界的边界值m_pFish->SetSpriteWorldLimit(WORLD_LIMIT_NULL, m_fScreenLeft, m_fScreenTop, m_fScreenRight, m_fScreenBottom);//m_pFish->SetSpriteLinearVelocity(0, 0);//m_pMyFish->SetSpriteLinearVelocity(50, 0);m_pFish->SetSpriteLinearVelocity(30, 0);//这个函数是用来设置精灵的线性速度for(int i=0;i<4;i++){char szName[128];float fPosX,fPosY;float fSpeedX;//将szName的值赋为“fish”加I级循环因子sprintf(szName, "fish%d" ,i);CSprite*tmpSprite=new CSprite(szName);tmpSprite->CloneSprite( "yu_1" );fPosX=CSystem::RandomRange(m_fScreenLeft+10.f,m_fScreenRight-10.f);fPosY=CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);tmpSprite->SetSpritePosition(fPosX,fPosY);tmpSprite->SetSpriteWorldLimit(WORLD_LIMIT_NULL,m_fScreenLeft-20.f,m_fScreenTop,m_fScreenRight+20.f,m_fScreenBottom);fSpeedX=CSystem::RandomRange(10,20);tmpSprite->SetSpriteLinearVelocity(fSpeedX,0);m_vFish.push_back(tmpSprite);}}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun(float fDeltaTime)
{
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
}//
void CGameMain::OnSpriteColWorldLimit(const char* szName, const int iColSide)
{bool   bFlip;float fSpeedX;if(strcmp(szName, "yu_0")==0){if(iColSide == 1)  // 右边{bFlip = true;fSpeedX = -15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}else if(iColSide == 0)   // 左边{bFlip = false;fSpeedX = 15.f;m_pFish->SetSpriteLinearVelocity(fSpeedX, 0);m_pFish->SetSpriteFlipX( bFlip);}}if(strstr(szName,"fish") != NULL){float fPosY;if(iColSide == 1)  // 右边{bFlip = true;fSpeedX = -CSystem::RandomRange(10, 20);}else if(iColSide == 0)   // 左边{bFlip = false;fSpeedX = CSystem::RandomRange(10, 20);}CSprite* tmpSprite=FindSpriteByName(szName,iColSide);FindSpriteByName(szName,iColSide)->SetSpriteFlipX(bFlip);FindSpriteByName(szName,iColSide)->SetSpriteLinearVelocity(fSpeedX, 0);fPosY=CSystem::RandomRange(m_fScreenTop+10.f,m_fScreenBottom-10.f);//因为有不同的鱼,因此随机生成Y方向的速度后需要分配给不同的//鱼,这样多条鱼就不会重复了FindSpriteByName(szName,iColSide)->SetSpritePositionY(fPosY);}/*tmpSprite->SetSpriteFlipX(bFlip);/*tmpSprite->SetSpriteLinearVelocity(fSpeedX, 0);
*/}CSprite* CGameMain::FindSpriteByName(const char* szName, const int iColSide)
{for(int i=0;i<m_vFish.size();i++)if(strcmp(szName,m_vFish[i]->GetName())==0)return m_vFish[i];return 0;
}void CGameMain::OnKeyDown( const int iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )
{/* float   fPosX=0.f, fPosY=0.f;switch(iKey){case KEY_W:     fPosY = -10.f; //向上的时候Y方向速度为负的break;case KEY_A:fPosX = -15.f; //向左的时候X方向的速度为负值break;case KEY_S:   fPosY = 10.f; //向下的时候Y方向的速度为正值break;case KEY_D:fPosX = 15.f;//向右的时候X方向的速度为正值break;}*/switch(iKey){case KEY_W:     m_fSpeedTop = -10.f;break;case KEY_A:m_fSpeedLeft = -15.f;        break;case KEY_S:   m_fSpeedBottom = 10.f;break;case KEY_D:m_fSpeedRight = 15.f;      break;}/*if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX( false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX( true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);*/Swimming();
}
void CGameMain::OnKeyUp( const int iKey )
{/* float   fSpeedX, fSpeedY;switch(iKey){case KEY_W:case KEY_A:case KEY_S:case KEY_D:fSpeedX = 0.f;fSpeedY = 0.f;}m_pMyFish->SetSpriteLinearVelocity(fSpeedX, fSpeedY);*/switch(iKey){case KEY_W:     m_fSpeedTop = 0.f;break;case KEY_A:m_fSpeedLeft = 0.f;        break;case KEY_S:   m_fSpeedBottom = 0.f;break;case KEY_D:m_fSpeedRight = 0.f;        break;}/*if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX( false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX( true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);*/Swimming();
}
void CGameMain::Swimming()
{if((m_fSpeedLeft + m_fSpeedRight) > 0)m_pMyFish->SetSpriteFlipX(false);else if((m_fSpeedLeft + m_fSpeedRight) < 0)m_pMyFish->SetSpriteFlipX(true);m_pMyFish->SetSpriteLinearVelocity( m_fSpeedLeft + m_fSpeedRight, m_fSpeedTop + m_fSpeedBottom);
}

Main.cpp

#include "CommonClass.h"
#include "LessonX.h"///
//
// 主函数入口
//
//
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR     lpCmdLine,int       nCmdShow)
{// 初始化游戏引擎if (!CSystem::InitGameEngine(hInstance, lpCmdLine))return 0;// To do : 在此使用API更改窗口标题CSystem::SetWindowTitle("LessonX");// 引擎主循环,处理屏幕图像刷新等工作while (CSystem::EngineMainLoop()){// 获取两次调用之间的时间差,传递给游戏逻辑处理float  fTimeDelta = CSystem::GetTimeDelta();// 执行游戏主循环g_GameMain.GameMainLoop(fTimeDelta);};// 关闭游戏引擎CSystem::ShutdownGameEngine();return 0;
}//==========================================================================
//
// 引擎捕捉鼠标移动消息后,将调用到本函数
void CSystem::OnMouseMove(const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉鼠标点击消息后,将调用到本函数
void CSystem::OnMouseClick(const int iMouseType, const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉鼠标弹起消息后,将调用到本函数
void CSystem::OnMouseUp(const int iMouseType, const float fMouseX, const float fMouseY)
{// 可以在此添加游戏需要的响应函数}
//==========================================================================
//
// 引擎捕捉键盘按下消息后,将调用到本函数
// bAltPress bShiftPress bCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键
void CSystem::OnKeyDown(const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress)
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyDown(iKey,bAltPress,bShiftPress,bCtrlPress);
}
//==========================================================================
//
// 引擎捕捉键盘弹起消息后,将调用到本函数
void CSystem::OnKeyUp(const int iKey)
{// 可以在此添加游戏需要的响应函数g_GameMain.OnKeyUp(iKey);
}//===========================================================================
//
// 引擎捕捉到精灵与精灵碰撞之后,调用此函数
void CSystem::OnSpriteColSprite(const char* szSrcName, const char* szTarName)
{
}//===========================================================================
//
// 引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
// iColSide : 0 左边,1 右边,2 上边,3 下边//iColSide 该变量的类型为整型,它用来表示精灵与世界边界碰撞的方位。
void CSystem::OnSpriteColWorldLimit(const char* szName, const int iColSide)
{//g_:       全局变量(global)g_GameMain.OnSpriteColWorldLimit(szName, iColSide);}

Funcode海底世界c++(vc6)相关推荐

  1. c语言funcode空格消失的函数,01北科大暑期计算机实践FunCode游戏设计+C++课程设计 - 海底世界 - 图文...

    C++语言课程设计一海底世界 一.实验内容 海底有五条鱼,其中四条来回随机游动,由玩家用键盘W A S D控制另外一条游动. 要求如下: 1. 游戏初始界面如下图. 2. 来回游动的四条鱼,从屏幕左边 ...

  2. funcode实验--海底世界(c++实现)

    C++语言课程设计一海底世界 一.实验内容 海底有若干条鱼,其中若干条相同的鱼向一个方向游动,另一条来回随机游动,由玩家用键盘W A S D控制另外一条游动. 要求如下: 1. 来回游动的鱼,从屏幕左 ...

  3. 中国电子学会青少年编程能力等级测试图形化一级编程题:海底世界

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 海底世界 1. 准备工作 (1)背景:U ...

  4. 电脑屏保海底世界_水下栖息地:人类能否在海洋中居住?真的有人住在海底吗?...

    慧缘开运讲坛:真的有人住在海底吗?对于这个问题,你肯定首先会想到美人鱼,对于未知的事物,我们并没有证据证明它们的存在. 人类如何居住海底呢?那首先需要一个密闭的生态环境供进入海底的人生活.我们可以称之 ...

  5. java小程序-画一幅海底世界的图

    老师让我们画一幅鱼在水中游动的图,完成了之后我又添加了一点天空啊山峰啊太阳啊小船啊,感觉挺有意思的.本来还想画云和鸟的,时间关系就没画了. 代码其实也就是画些圆和矩形不断的在那儿鼓捣,也就没添加注释了 ...

  6. 【电子学会】2020年12月图形化一级 -- 海底世界

    海底世界 1. 准备工作 (1)背景:Underwater 1: (2)角色:Fish.Starfish. 2. 功能实现 (1)如上图所示设置Fish初始位置为舞台上方的左侧,面向右:设置Starf ...

  7. 少儿编程scratch课程-海底世界

    引入 1.主题引入:今天学习的主题为海底世界,让小朋友们想一想海底世界应该有什么动物.植物.背景,它们都分别在做什么. 2.软件引入:使用一个新的软件scratch,利用图形化编程的思维了解软件和搭建 ...

  8. 海洋主题绘画_海底世界创意绘画作品欣赏

    绘画作为人们认知世界的一种方式,从人类社会诞生之初就发挥着它独特的作用.学习啦小编整理了海底世界创意绘画作品,欢迎阅读! 海底世界创意绘画作品图片展示 海底世界儿童画图片 海底世界儿童画作品 海底世界 ...

  9. 未来想象计算机图片儿童版,想象未来的海底世界儿童画作品大全

    想象未来的海底世界儿童画作品大全 导语:当海面上波涛汹涌的时候,海底依然是宁静的.那么,海底是否一点儿声音没有呢?下面是小编为您整理的儿童画,希望对您有所帮助. 海洋是生命的源泉,是人们生活中必不可少 ...

最新文章

  1. Python入门100题 | 第005题
  2. trackr: An AngularJS app with a Java 8 backend – Part IV 实践篇
  3. String类split方法
  4. 关于泛泛而谈和刻意练习的思考
  5. java基础----线程
  6. .Net Core3.0 日志 logging
  7. SX1301吞吐量是SX1276/8的多少倍?
  8. LeetCode 1497. 检查数组对是否可以被 k 整除(余数配对)
  9. freeMarker 遍历 list,map,listmap
  10. 【KDD20】主题模型在图模型中的应用专题
  11. Linformer 拍了拍 被吊打 Transformers 的后浪们
  12. php pdf打印横向,如何将pdfFactory打印调整为横向 - 应用技巧 - 常青藤软件工作室...
  13. matlab 图像处理之直线拟合
  14. 北斗卫星导航定位系统应用及发展前景
  15. 资源网址合集的合集,上千个链接!
  16. Class类的使用和背后实现的原理
  17. 网页服务器转化app,无需第三方软件,网页在线转换视频格式使用教程
  18. 现身说法,如何给上司送礼物
  19. 阿里巴巴-新加坡南洋理工大学成立联合研究院 开展全方位AI合作
  20. html防止恶意广告,如何拦截恶意网页和弹窗广告?解决方法

热门文章

  1. 高数不定积分72题解答
  2. 如何解决httpclient调用https请求报错
  3. VS Code设置头文件和源文件切换快捷键
  4. 神器!用Python轻松搞定验证码!
  5. 大一考初级会计早不早啊?
  6. html怎么设计为中文字体,CSS font-family中文字体设置方法
  7. Scala报错 java.lang.NoSuchMethodError:scala.collection.immutable.HashSet$.empty()Lscala/collection/
  8. 2020考研数学视频
  9. Python学习笔记:第十站 水晶球不调用不动
  10. 1.1 Go语言简介